我正在使用Raspberry Pi B +,并且我试图mmap /dev/mem
的两个不同部分 - 第一个能够设置两个引脚'函数从位置0x2020 0004
(0x04
字节长),另一个来操作位于0x2021 4000
(0x1C
字节长)的Pi上的BCM2835芯片上的BSC从模函数。
static uint32_t * initMapMem(int fd, uint32_t addr, uint32_t len)
{
return (uint32_t *) mmap((void*)0x0, len,
PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_SHARED|MAP_LOCKED,
fd, addr);
}
int initialise(void) {
int fd;
fd = open("/dev/mem", O_RDWR | O_SYNC) ;
if (fd < 0)
{
fprintf(stderr, "This program needs root privileges. Try using sudo.\n");
return 1;
}
pinReg = initMapMem(fd, 0x20200004, 0x4);
bscReg = initMapMem(fd, 0x20214000, 0x1C);
close(fd);
if (bscReg == MAP_FAILED)
{
fprintf(stderr, "Bad, mmap failed.\n");
return 1;
}
if (pinReg == MAP_FAILED)
{
fprintf(stderr, "Bad, mmap failed.\n");
return 1;
}
return 0;
}
{p> initialise()
来自main()
。使用gdb
逐步执行该计划后,我发现bscReg
位置正确,但pinReg
返回MAP_FAILED
(又名0xFFFFFFFF
)并设置了errno
到EINVAL
。在pinReg
第一次或第二次MAP_FAILED
时,mmap
总是发现自己为pinReg
,这与它完成的方式无关。
如何将{{1}}设为有效值?
答案 0 :(得分:2)
第一个mmap()
失败,因为您尝试映射的偏移量(0x20200004
)未进行页面对齐。在0x20200000
创建一个大小至少为8的映射,然后以0x4
的偏移量写入它。