最近在做一个基于全志A33芯片的android移植时发现嵌入式设备很多都用到了I2C总线通信,比如说摄像头,G-sensor,触摸屏等,为此我觉得很好的理解I2C设备驱动在今后的嵌入式开发中是非常有好处的,而目前我也是处于学习阶段,便将这些学习的过程给记录下来,如果有存在的问题,还希望不吝指正。
我曾经用51单片机的IO口模拟I2C总线写过驱动,实现24C02存取数据还是非常简单的,100多行代码就能解决,但是Linux中的I2C框架却极为复杂,主要是在Linux下设备驱动都采用了分层的思想,在设备模型的框架下,实现一个驱动,对总线,驱动,设备的描述都将增大整个驱动的代码,然而这样的好处就是很方便的进行移植,当我们想要实现某一个硬件设备的驱动时,只需要做好最底层函数的实现就可以了,下面我以MMA7660(Freescale G-sensor)的驱动为例,分析一下I2C的驱动的挂载和绑定。
首先是
module_init(mma7660_init); //模块入口
module_exit(mma7660_exit); //模块出口
凡是接触过驱动的人都知道,当我们insmod一个驱动ko文件时,驱动的加载从上面第一个宏开始,那么分析驱动也从这里开始,由这个宏可以知道驱动入口是mma7660_init
static int __init mma7660_init(void) //为了简洁已经去掉所有debu