目录
目录
数据收发流程
驱动层 收发接口
驱动层注册
smbus控制器
i2c控制器
协议接口使用
总体流程
数据收发关键数据结构
使用示例--eeprom的读写
使用示例--smbus的读写接口
数据收发流程
驱动层 收发接口
首先了解,驱动层向协议(算法)层注册的接口。
注释写的清楚:
1)如果不支持I2C 层级的访问,则设置i2c收发接口master_xfer为空,否则设置I2C控制器的接口;
2)如果控制器支持smbus协议,则对应的驱动设置收发接口smbus_xfer.
驱动层注册
对于此数据结构的使用,内核i801(intel smbus控制器)和 imx i2c 驱动,给出了示例:
smbus控制器
i2c控制器
协议接口使用
对于注册接口的不同,在 drivers\i2c \ i2c-core-smbus.c __i2c_smbus_xfer 接口可以看出。
总体流程
图 1 i2c /smbus 数据传输路径
数据收发关键数据结构
以上描述了i2c smbus从应用层到驱动控制器的数据流转路径。
本章描述在此路径上流转所采用的数据载体形式。在整个i2c 驱动中采用了如下数据结构,此数据结构表示一帧 i2c/smbus数据。
使用示例--eeprom的读写
假设我们采用的eeprom 地址是16位的,eeprom期望的时序(报文协议)如下:
可以看到此处有两个START,则需要两个i2c_msg数据结构分别携带此两段数据。其中:
- 第一个start,为写,i2c_msg的字段填写为:
- 第二个start,为读, i2cmsg的字段信息填写为
使用示例--smbus的读写接口
i2cdetect程序里面提供了一套读写接口,最终调用驱动的代码。此处采用两个i2c_msg,即可以支持读,又可以支持写。通常读采用两个i2c_msg完成;写采用一个,可以看到默认msg[1].len=0。
在smbus的协议中,不论是读,还是写,都存在一个command字段,例如写字节的协议报文
此协议只是I2C协议的具体实现,因而其中的command code字段也占用结构体i2c_msg中的buf字段,为buf[0] ,明确这点后就更容易理解i2cdetect的代码实现。
command code既可以表示某个寄存器偏移量,例如要访问slave device 的寄存器 0xa,则在向slave device 发送命令时,此处command code字段填写 0xa.