[問題]LINUX I2C mmap R/W一問
OS: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;
}
-------------------------------------------------------
問題一:已知mmap是將fd映射於一虛擬位址,當我去printf(mem+offset)時,
每當我printf一次,每次出來的虛擬位址都不同,請問這樣為正確行為嗎?
問題二:如我想對I2C (0xdf02e000)的Register做讀寫,例如:
於0xdf02e000的offset 4h寫入0x30
於0xdf02e000的offset 0h寫入0x63等等,
請問該如何進行讀寫?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 101.9.211.65
※ 文章網址: https://www.ptt.cc/bbs/LinuxDev/M.1503646376.A.AA4.html
→
08/25 16:45, , 1F
08/25 16:45, 1F
→
08/25 17:01, , 2F
08/25 17:01, 2F
→
08/25 17:01, , 3F
08/25 17:01, 3F
推
08/25 20:48, , 4F
08/25 20:48, 4F
→
08/25 23:21, , 5F
08/25 23:21, 5F
推
09/19 14:30, , 6F
09/19 14:30, 6F
→
10/03 09:21, , 7F
10/03 09:21, 7F
→
10/03 09:22, , 8F
10/03 09:22, 8F
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章