Re: [问题] I2C LINUX mmap R/W一问

楼主: F04E (Fujitsu)   2017-08-30 13:10:26
关于 User space 与 Kernel space 请自行 Google.
假设你的kernel版本为3.10.X以上
实作一个I2C device driver的步骤如下:
1. 修改pinctrl, 路径为
kernel/drivers/pinctrl/
目录下应该要有一个.c是对应到你的SOC
看你的I2C是用哪个IO pin,就改成那样.
2. 修改device tree, 假设你的SOC为arm, 那路径是
kernel/arch/arm/boot/dts
找到你 board 的 .dts, 加入 POE ic 的 slave address.
看你POE是接在哪个I2C channel, 就加在那下面.
3. 实作POE driver
POE的spec应该有描述I2C通讯, 像是该怎么读取register值等等。
source code可以参考
kernel/drivers/leds/leds-lp5521.c
还可参阅
kernel/Documentation/driver-model/
下的文件
大guy4这样
※ 引述《Eenie (Eenie)》之铭言:
: 不好意思,因为接触这块还没有很长时间,不太了解你所述的意思,
: 我是要读取连接于i2c的POE电压电流值,但需读取POE时,
: 需要于i2c memory base address上之不同Offset做一些前置动作,
: 如i2c memory base address+4h(offset)上要写入30h等等,
: 故我将DF02E000 mapping到一虚拟位址然后去做R/W,
: 而大大你说的于User space做这件事是指什么意思?
: 大大如方便的话麻烦给予小弟一些指点 谢谢!!!!
※ 引述《Eenie (Eenie)》之铭言:
: 开发平台(Platform): (Ex: Win10, Linux, ...)
: LINUX
: 问题(Question):
: 小弟目前希望能于linux上读写soc板子定义好的I2C Memory Mapped Registers,目前已
: 知I2C的Memory Base Address为:0xdf02e000,因linux无法直接存取physical address
: ,故小弟利用开启/dev/mem及使用mmap映射/dev/mem至虚拟位址上,但对于R/W的方式并
: 不是相当熟悉,目前撰写code进行mapping如下
: 预期的正确结果(Expected Output):
: 由linux读写I2C register
: 程式码(Code):(请善用置底文网页, 记得排版)
: 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;
: }
: 补充说明(Supplement):
: 问题一:已知mmap是将fd映射于一虚拟位址,当我去printf(mem+offset)时,
: 每当我printf一次,每次出来的虚拟位址都不同,请问这样为正确行为吗?
: 问题二:如我想对I2C (0xdf02e000)的Register做读写,例如:
: 于0xdf02e000的offset 4h写入0x30
: 于0xdf02e000的offset 0h写入0x63等等,
: 请问该如何进行读写?

Links booklink

Contact Us: admin [ a t ] ucptt.com