1.I2C子系统架构
- Linux下IIC的架构模型大概可以分为3层:
- 第一层是I2C的从设备驱动,它包含图中的device driver和i2c-dev。device driver需要用户编写,i2c-dev由内核实现,包含了I2C设备的通用方法,但是用户不能直接使用这个驱动,需要编写一个用户层驱动,它们2个合起来才可以实现一个驱动程序。
- 第二层总线驱动,它又叫做总线控制器驱动,比如说芯片内部的I2C控制器的使用需要实现一个驱动程序,比如所需要往I2C总线上传输数据它需要什么方法,需要实现那些函数等等。它包含图中的i2c-adapter和adapter-agio。
- 第三层是i2c-core,I2C总线和I2C设备驱动的中间枢纽,它提供了I2C总线驱动和设备驱动的注册、注销方法等
2.I2C总线驱动
- 图中我们可以知道编写i2c驱动有2种实现方法。
- 第一种是用户自己完全写一个i2c的驱动程序。
- 另一种方法是使用i2c的通用驱动i2c-dev,然后自己设计一个i2c用户模式驱动。
- 对于第一种情况,应用程序读写i2c设备的流程是比较明了的。
- 对于第二种情况的读写流程稍微有点复杂,我们先来介绍另一个比较重要的地方,就是i2c控制器驱动,i2c adapter/algorithm。它是直接操作i2c设备的。里面包含2部分的东西,一个是adapter,适配器的意思,另一个是algorithm,算法的意思。
- 我们先来分析adapter,打开Linux源代码,搜索i2c_adapter:
/*
* i2c_adapter is the structure used to identify a physical i2c bus along
* with the access algorithms necessary to access it.
*/
struct i2c_adapter {
struct module *owner;
unsigned int id;
unsigned int class; /* classes to allow probing for */
const struct i2c_algorithm *algo; /* the algorithm