我想通過mmap
訪問我的ARM(https://4donline.ihs.com/images/VipMasterIC/IC/ATML/ATML-S-A0001248554/ATML-S-A0001248554-1.pdf)上的物理地址寄存器,但我不知道要放多長。
例如,如果我有一個地址爲0xFFFFFCE8
的寄存器,其中我可以訪問32位。
我應該在mmap size_t
中輸入什麼?
謝謝你的幫助!
編輯:
Here和here我們可以看到,他們把4096,並在第一個它是一個SAM9幾乎和我一樣。
那麼,他們爲什麼要放4096?
也許是因爲如果我這樣做:地圖大小和mmap無效的參數錯誤
#include <unistd.h>
long sz = sysconf(_SC_PAGESIZE);
printf("%ld",sz);
釷的答案是4096 ...
編輯2:
基於this post我可以這樣寫:
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
#define PIOD_START_ADDR 0xFFFFFA00
#define PIOD_STOP_ADDR 0xFFFFFC00
#define PIOD_SIZE (PIOD_STOP_ADDR-PIOD_START_ADDR)
#define PIO_WPMR_OFFSET 0xE4 // PIO Write Protection Mode Register Bank D
#define PIO_PUER_OFFSET 0x64 // PIO Pull-Up Enable Register Bank D
#define PIO_PUSR_OFFSET 0x68 // PIO Pull-Up Status Register Bank D
#define LED7_ON 0xFFDFFFFF // LED7 Mask ON
#define LED7_OFF 0xFFFFFFFF // LED7 Mask OFF
#define DESABLE_WRITE_PROTECTION_BANK_D 0x50494F00 // Desable write protection
int main(void) {
volatile void *gpio_D_addr;
volatile unsigned int *gpio_pullup_enable_addr;
volatile unsigned int *gpio_pullup_status_addr;
volatile unsigned int *gpio_enable_write_addr;
int fd = open("/dev/mem", O_RDWR|O_SYNC);
if (fd < 0){
fprintf(stderr, "Unable to open port\n\r");
exit(fd);
}
gpio_D_addr = mmap(0, PIOD_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, PIOD_START_ADDR);
gpio_addr = mmap(0, GPIO1_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO1_START_ADDR);
if(gpio_D_addr == MAP_FAILED){
handle_error("mmap");
}
gpio_enable_write_addr = gpio_D_addr + PIO_WPMR_OFFSET;
gpio_pullup_enable_addr = gpio_D_addr + PIO_PUER_OFFSET;
gpio_pullup_status_addr = gpio_D_addr + PIO_PUSR_OFFSET;
*gpio_enable_write_addr = DESABLE_WRITE_PROTECTION_BANK_D;
*gpio_pullup_enable_addr = *gpio_pullup_status_addr & LED7_ON;
return 0;
}
但是我有一個mmap: Invalid argument
錯誤。 - >但是通過改變,像這樣的mmap(感謝這個thread):mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, PIOD_START_ADDR & ~MAP_MASK);
有:
#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)
我不再有錯誤,但什麼都沒有發生......
任何想法?
謝謝你的幫助。我已經看過這一章,但看到我的帖子上面編輯。 – Tagadac
我不知道4096的價值..需要更多的研究來了解這一點。但現在,工作要求:( – TomServo
通過這樣做'#包括 長SZ =的sysconf(_SC_PAGESIZE); \t的printf( 「%LD」,SZ),'我們'4096'所以頁面的大小。 4096。 –
Tagadac