分析Linux中的I2C驱动程序框架
I2C核心(i2c_core)
I2C内核维护i2c_bus结构,提供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 驱动,设置,注册i2c_board_info
方法二: 获取适配器以调用i2c_new_device
方法三: 通过设备树(devicetree)创建
方法1和方法2由平台创建. 这两种方法是在内核版本3.0之前使用的,因此在此不再详细描述. 方法3是最新方法. 3.0版之后的内核就是以此方式创建的. 本文后面的情况将遵循方法3.
2)i2c_adapter
I2C总线适配器,即SOC中的I2C总线控制器,硬件上的每对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总线驱动程序模型属于设备模型中的类. 类似地,struct i2c_driver结构继承自struct驱动程序. 匹配方法与设备模型中描述的方法相同. 在这里,为了匹配设备树,必须实现驱动程序成员的Of_match_table成员:
如果设备树匹配成功,则最好调用探测功能
实现文件操作的集合
如何读写i2c从设备?
在执行读写操作时,将使用重要的函数i2c_transfer(). 此功能由i2c内核提供给设备驱动程序. 通过它发送的数据需要打包为i2c_msg结构. 该函数最终将回叫. i2c_adapter-> i2c_algorithm-> master_xfer()接口将i2c_msg对象发送到i2c物理控制器.
以上是我对Linux中I2C驱动程序框架的分析和实际案例分析. 如果您有任何不足之处,请指出. 如果您对Linux驱动程序感兴趣,欢迎收集并关注!
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-203720-1.html