本帖最后由 飞鹰嵌入式 于 2013-1-6 11:31 编辑
首先认识到I2C驱动的分配- 第一层:提供i2c adapter的硬件驱动,探测、初始化i2c adapter(如申请i2c的io地址和中断号),驱动soc控制的i2c adapter在硬件上产生信号(start、stop、ack)以及处理i2c中断。
- 第二层:提供i2c adapter的algorithm,用具体适配器的xxx_xferf()函数来填充i2c_algorithm的master_xfer函数指针,并把赋值后的i2c_algorithm再赋值给i2c_adapter的algo指针。
- 第三层:实现i2c设备驱动中的i2c_driver接口,用具体的i2c device设备的attach_adapter()、detach_adapter()方法赋值给i2c_driver的成员函数指针。实现设备device与总线(或者叫adapter)的挂接。
- 第四层:实现i2c设备所对应的具体device的驱动,i2c_driver只是实现设备与总线的挂接,而挂接在总线上的设备则是千差万别的,eeprom和ov2715显然不是同一类的device,所以要实现具体设备device的write()、read()、ioctl()等方法,赋值给file_operations,然后注册字符设备(多数是字符设备)。
第一层和第二层都不用做了,一般都是由内核和芯片厂商做好了,
我们要做的就是第三层和第四层,
1、先看一下第三层
第三层就是通过一个i2c_add_driver()添加一个i2c设备,然后通过attach_adapter 把client和adapter关联起来,第三层就算做完了
2、第四层就是注册一个字符设备,字符设备的open、read、write、ioctl这个就不用说了吧,然后在字符设备中调用i2c_transfer(),就这样搞定了
中间遇见的问题:
1、如果没有设备,或设备地址不对的时候就会出现忙超时,这个是在adpter中做的,是芯片厂商做的,可以进里面把忙等待延时缩短(不建议做)
2、出现忙等待的时候必须再重新操作一次设备,也就是再发一个i2c_transfer(),这个还没仔细研究什么原因,我想应该是adpter中处理的机制问题吧,现在暂时按再发一次处理的
3、如果设备一直在忙等待,无妨在忙等待的时候对芯片的I2C模块进行reset,这个查看一下芯片手册可以写个寄存器就能搞定,或者寄存器的某一位,
|