楼主:
Eenie (Eenie)
2017-08-25 15:32:54OS:Linux code:C
小弟目前希望能于linux上读写soc板子定义好的I2C Memory Mapped Registers,目前已
知I2C的Memory Base Address为:0xdf02e000,因linux无法直接存取physical address
,故小弟利用开启/dev/mem及使用mmap映射/dev/mem至虚拟位址上,但对于R/W的方式并
不是相当熟悉,目前撰写code进行mapping如下:
int main(int argc, char** argv){
unsigned int base, basepage, baseoff, pagesize;
unsigned char* mem;
int fd;
fd = open("/dev/mem",O_RDWR);
if (fd < 0){
printf("device file open error !\n");
return 0;
}
pagesize = getpagesize();
base = 0xDF02E000;
baseoff = base % pagesize;
basepage = base - baseoff;
mem = (unsigned char*) mmap(NULL, 0x20FD1FFF, PROT_READ|PROT_WRITE,
MAP_SHARED, fd, basepage);
if (mem == (void *)-1){
printf("Error while maping memory\n");
return 0;
}
printf("%x\n",(mem+offset));
#if 0
这边是需做读写的部分。
#endif
close(fd);
munmap(mem, 0x20FD1FFF);
return 0;
}