剖析Linux中的I2C驱动程序框架
I2C核心(i2c_core)
I2C内核维护i2c_bus结构sogou pinyin linux,提供I2C总线驱动程序和设备驱动程序的注册和取消方式,维护I2C总线驱动程序和设备链接列表,并实现设备和驱动程序匹配监测.这部份代码由Linux内核提供.
I2C总线驱动程序
I2C总线驱动程序维护I2C适配器数据结构(i2c_adapter)和适配器的通讯方式数据结构(i2c_algorithm).为此,I2C总线驱动程序可以控制I2C适配器以生成启动,停止,ACK等.这部份代码由特定的芯片制造商提供,比如Samsung和Qualcomm.
I2C设备驱动程序
I2C设备驱动程序主要维护两个结构:i2c_driver和i2c_client,它们实现与用户交互的文件操作集合fops和cdev.这部份代码是开发人员须要完成的.
描述Linux内核中I2C的四个核心结构
1)i2c_client-挂在I2C总线上的I2C从设备
每位i2c从设备都须要通过i2c_client结构来描述linux驱动,i2c_client对应于实际的i2c化学设备设备.
然而i2c_client不是由我们自己的程序创建的,而是由以下常见方式手动创建的:
方式一:分配linux驱动linux文本编辑器,设置,注册i2c_board_info
方式二:获取适配器以调用i2c_new_device
方式三:通过设备树(devicetree)创建
方式1和技巧2由平台创建.这两种方式是在内核版本3.0之前使用的i2c linux驱动,因而在此不再详尽描述.方式3是最新方式.3.0版以后的内核就是借此方法创建的.本文前面的情况将遵守方式3.
2)i2c_adapter
I2C总线适配器,即SOC中的I2C总线控制器,硬件上的每对I2C总线都对应一个用于控制它的适配器.在Linux内核代码中i2c linux驱动,每位适配器都提供了一个描述它的结构(结构i2c_adapter),之后通过i2c核心层将i2c设备与i2c适配器相关联.主要用于完成与i2c总线控制器有关的数据通讯.芯片制造商提供的代码中保留了这些结构.
3)i2c_algorithm
I2C总线数据通讯算法,通过管理I2C总线控制器来实现在I2C总线上发送和接收数据的操作.也可以将其理解为与I2C总线控制器(适配器适配器)相对应的驱动程序.每位适配器对应一个驱动程序.它用于描述适配器和设备之间的通讯方式.它是由芯片制造商施行的.
4)i2c_driver
用于管理I2C驱动程序和i2c设备(顾客端)的匹配监测,以实现与应用程序层交互的文件操作集fops,cdev等.
应用示例,实现mpu6050驱动,读取气温
在设备树中描述I2C设备信息
最后,内核会将设备树的节点解析为i2c_client结构,并将其与i2c_driver结构进行匹配.
编撰驱动程序代码
分配,设置,注册i2c_driver结构
i2c总线驱动程序模型属于设备模型中的类.类似地,structi2c_driver结构承继自struct驱动程序.匹配方式与设备模型中描述的方式相同.在这儿,为了匹配设备树,必须实现驱动程序成员的Of_match_table成员:
假如设备树匹配成功,则最好调用侦测功能
实现文件操作的集合
怎么读写i2c从设备?
在执行读写操作时,将使用重要的函数i2c_transfer().此功能由i2c内核提供给设备驱动程序.通过它发送的数据须要打包为i2c_msg结构.该函数最终将回叫.i2c_adapter->i2c_algorithm->master_xfer()插口将i2c_msg对象发送到i2c化学控制器.
以上是我对Linux中I2C驱动程序框架的剖析和实际案例剖析.倘若您有任何不足之处,请强调.倘若您对Linux驱动程序感兴趣,欢迎搜集并关注!