打印

linux i2c 设备驱动该怎么搞?我记录一下我搞的过程

[复制链接]
3768|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
飞鹰嵌入式|  楼主 | 2013-1-6 11:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 飞鹰嵌入式 于 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,这个查看一下芯片手册可以写个寄存器就能搞定,或者寄存器的某一位,




相关帖子

沙发
ymind| | 2013-1-6 13:25 | 只看该作者
algorithm层不是必须的,我记得是用GPIO模拟I2C时序时才用。
关于楼主问题心得,我个人觉得有点误导人。因为对i2c驱动,EBUSY, EAGAIN错误码涉及多线程初始化/访问设备,代码重入,i2c多master, 硬件驱动不佳,等多种因素。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:

46

主题

452

帖子

4

粉丝