这次来研究内核自带I2C驱动的代码,在深入代码之前,首先简单了解一下I2C核心数据结构的相互关系。由此来展开,也许能够对驱动代码有更好地理解。软件数据结构的设计、数据结构之间的关系就至少应该描述硬件物理连接的这种组织关系。Linux的i2c 框架中各个部分的关系如下图所示:
内核中 i2c 相关代码可以分为三个层次:
1. i2c 框架:i2c.h 和i2c-core.c 为i2c 框架的主体,提供了核心数据结构的定义、i2c 适配器驱动和设备驱动的注册、注销管理,i2c 通信方法上层的、与具体适配器无关的代码、检测设备地址的上层代码等;i2c-dev.c 用于创建i2c 适配器的/dev/i2c/%d 设备节点,提供i2c 设备访问方法等。
2. i2c 总线适配器驱动:定义描述具体i2c 总线适配器的i2c_adapter 数据结构、实现在具体i2c 适配器上的i2c 总线通信方法,并由i2c_algorithm 数据结构进行描述。
3. i2c 设备驱动:定义描述具体设备的i2c_client 和可能的私有数据结构、借助i2c 框架的i2c_probe 函数实现注册设备的attach_adapter 方法、提供设备可能使用的地址范围、以及设备地址检测成功后创建i2c_client 数据结构的回调函数。
I2C主要数据结构如下:
1. 一个 i2c 设备的驱动程序由i2c_driver 数据结构描述,定义于include/linux/i2c.h: