Linux I2C
-
Linux内核将 I2C 驱动分为两部分:
- ①、 I2C 总线驱动, I2C 总线驱动就是 SOC 的 I2C 控制器驱动,也叫做 I2C 适配器驱动。
- ②、 I2C 设备驱动, I2C 设备驱动就是针对具体的 I2C 设备而编写的驱动。
-
对于 I2C 而言,不需要虚拟出一条总线,直接使用 I2C总线即可。
-
I2C 总线驱动重点是 I2C 适配器(也就是 SOC 的 I2C 接口控制器)驱动,这里要用到两个重要的数据结构: i2c_adapter 和i2c_algorithm,
-
Linux 内核将 SOC 的 I2C 适配器(控制器)抽象成 i2c_adapter, i2c_adapter 结构体定义在 include/linux/i2c.h 文件
-
i2c_algorithm 类型的指针变量 algo,对于一个 I2C 适配器,肯定要对外提供读写 API 函数,设备驱动程序可以使用这些 API 函数来完成读写操作。 i2c_algorithm 就是 I2C 适配器与 IIC 设备进行通信的方法
-
i2c_algorithm 结构体定义在 include/linux/i2c.h 文件
-
master_xfer 就是 I2C 适配器的传输函数,可以通过此函数来完成与 IIC 设备之间的通信
-
smbus_xfer 就是 SMBUS 总线的传输函数
-
I2C 总线驱动,或者说 I2C 适配器驱动的主要工作就是初始化 i2c_adapter 结构体变量,
-
然后设置 i2c_algorithm 中的 master_xfer 函数。
-
完成以后通过 i2c_add_numbered_adapter或 i2c_add_adapter 这两个函数向系统注册设置好的 i2c_adapter,
-
i2c_add_adapter 使用动态的总线号
-
i2c_add_numbered_adapter使用静态总线号
-
I2C 设备驱动重点关注两个数据结构: i2c_client 和 i2c_driver,
-
i2c_client 就是描述设备信息的, i2c_client 结构体定义在 include/linux/i2c.h 文件
-
i2c_driver 描述驱动内容,类似于 platform_driver。i2c_driver 结构体定义在 include/linux/i2c.h 文件
-
一个设备对应一个 i2c_client,每检测到一个 I2C 设备就会给这个 I2C 设备分配一个i2c_client
-
I2C 设备驱动编写人来说,重点工作就是构建 i2c_driver,构建完成以后需要向Linux 内核注册这个 i2c_driver
-
I2C 设备和驱动的匹配过程是由 I2C 核心来完成的, drivers/i2c/i2c-core.c 就是 I2C 的核心部分,
-
设备和驱动的匹配过程也是由 I2C 总线完成的, I2C 总线的数据结构为 i2c_bus_type,定义在 drivers/i2c/i2c-core.c 文件
-
i2c_transfer 函数最终会调用 I2C 适配器中 i2c_algorithm 里面的 master_xfer 函数,对于 I.MX6U 而言就是i2c_imx_xfer 这个函数