分析了两天的I2C驱动,发现每次解决一个问题的时候都会带来新的问题,当大致读完MMA7660驱动程序的时候发现,作为一个字符设备I2C驱动,并不存在有open,close等接口,而我们知道,在Linux的世界里设备即文件,也就是操作设备就相当于读写文件,而在一个简单的字符设备里总会实现一个file_operation的结构体以实现用户层的调用,那么当我们打开一个I2C设备的时候open在哪里呢?
从框架开始说起,在网上寻找I2C框架的时候,我在很多地方看到一张图
既然大家都喜欢拿图说事,那么我也尝试着拿这个图说事,也许会有偏差和错误,所以还望看到这博客的各位指正。首先我们要知道,我们写的驱动(或者说移植的驱动,其实我目前做的也是移植)到底属于那一层呢?答案是图中的driver驱动层,但为什么呢?硬件实验控制层所说的硬件控制指的是Soc上I2C控制器的控制,而这一部分一般是Soc生产商做好了的,毕竟他们最懂Soc上I2C应该怎么跑,而我们只要把连接在Soc的I2C外设的一些特性告诉硬件控制代码,它就能根据需要让外设工作起来。
回到这张图,很明显可以知道用户程序最开始接触到的是client,也就是之前我说到的设备,其实这个设备是被封装过的,封装之后很合适的挂载在内核虚拟的I2C总线上,并且和同样封装过的i2c_driver进行绑定(具体可以查看昨天提到的这两个结构体