介绍
架构
I2C 驱动遵循 Linux 框架:i2c-core-base.c
、i2c-core-of.c
、i2c-dev.c
、i2c-boardinfo.c
。I2C 软件架构如下所示。
参考 I2C 获得 I2C 框架的更多细节。
实现
I2C 驱动程序实现为以下文件:
文件 |
描述 |
---|---|
|
I2C 驱动程序 Kconfig |
|
I2C 驱动程序 Makefile |
|
I2C 核心函数 |
|
I2C 主机函数 |
|
I2C 从机函数 |
|
I2C相关的函数声明、宏定义、结构定义以及其他引用的头文件 |
配置
设备树配置
I2C 设备树:
i2c0: i2c0@4200F000 {
compatible = "realtek,ameba-i2c";
reg = <0x4200F000 0x100>;
interrupts = <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&rcc RTK_CKE_I2C0>;
rtk,i2c-index = <0>;
rtk,use-poll-type = <0>;
rtk,i2c-clk = <100000>;
rtk,wait-timeout = <0x1000>;
rtk,i2c-reg-slave-num = <0>;
status = "disabled";
};
属性描述
属性 |
描述 |
可配置? |
---|---|---|
compatible |
I2C 驱动程序的描述:“realtek,ameba-i2c” |
否 |
reg |
I2C 设备的硬件地址和大小: <0x4200F000 0x100> |
否 |
interrupts |
I2C 设备的 GIC 编号: <GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH> |
否 |
clocks |
I2C 设备的时钟: <&rcc RTK_CKE_I2C0> |
否 |
rtk,use-poll-type |
0: 中断模式 (默认) 1: 轮询模式 |
0/1 |
rtk,i2c-clk |
指定 I2C 总线时钟(单位:赫兹) |
1~400000 |
rtk,wait-timeout |
设置为 0x1000 意味着 I2C 主设备将等待传输 4096 毫秒,然后超时 |
是 |
rtk,i2c-reg-slave-num |
在 I2C 总线上注册从设备
|
0/1/2 |
status |
是否启用设备
|
是 |
Pinmux
I2C 设备 |
端口号 |
引脚名字 |
pinctrl 描述 |
---|---|---|---|
I2C0 |
PA0 |
SDA |
<&i2c0_pins> |
I2C0 |
PA1 |
SCL |
<&i2c0_pins> |
I2C0 |
PA5 |
SDA |
应修改 i2c0_pins 中的引脚 |
I2C0 |
PA6 |
SCL |
应修改 i2c0_pins 中的引脚 |
I2C0 |
PA9 |
SDA |
应修改 i2c0_pins 中的引脚 |
I2C0 |
PA10 |
SCL |
应修改 i2c0_pins 中的引脚 |
I2C0 |
PA30 |
SDA |
应修改 i2c0_pins 中的引脚 |
I2C0 |
PA31 |
SCL |
应修改 i2c0_pins 中的引脚 |
I2C0 |
PB5 |
SDA |
应修改 i2c0_pins 中的引脚 |
I2C0 |
PB6 |
SCL |
应修改 i2c0_pins 中的引脚 |
I2C0 |
PB29 |
SDA |
应修改 i2c0_pins 中的引脚 |
I2C0 |
PB30 |
SCL |
应修改 i2c0_pins 中的引脚 |
I2C1 |
PA3 |
SDA |
应修改 i2c1_pins 中的引脚 |
I2C1 |
PA4 |
SCL |
应修改 i2c1_pins 中的引脚 |
I2C1 |
PA13 |
SDA |
应修改 i2c1_pins 中的引脚 |
I2C1 |
PA14 |
SCL |
应修改 i2c1_pins 中的引脚 |
I2C1 |
PA20 |
SDA |
应修改 i2c1_pins 中的引脚 |
I2C1 |
PA21 |
SCL |
应修改 i2c1_pins 中的引脚 |
I2C1 |
PA24 |
SDA |
应修改 i2c1_pins 中的引脚 |
I2C1 |
PA25 |
SCL |
应修改 i2c1_pins 中的引脚 |
I2C1 |
PB12 |
SDA |
<&i2c1_pins> |
I2C1 |
PB13 |
SCL |
<&i2c1_pins> |
I2C1 |
PB25 |
SDA |
应修改 i2c1_pins 中的引脚 |
I2C1 |
PB26 |
SCL |
应修改 i2c1_pins 中的引脚 |
I2C2 |
PA7 |
SDA |
应修改 i2c2_pins 中的引脚 |
I2C2 |
PA8 |
SCL |
应修改 i2c2_pins 中的引脚 |
I2C2 |
PA11 |
SDA |
应修改 i2c2_pins 中的引脚 |
I2C2 |
PA12 |
SCL |
应修改 i2c2_pins 中的引脚 |
I2C2 |
PA15 |
SDA |
应修改 i2c2_pins 中的引脚 |
I2C2 |
PA16 |
SCL |
应修改 i2c2_pins 中的引脚 |
I2C2 |
PA28 |
SDA |
应修改 i2c2_pins 中的引脚 |
I2C2 |
PA29 |
SCL |
应修改 i2c2_pins 中的引脚 |
I2C2 |
PB4 |
SDA |
应修改 i2c2_pins 中的引脚 |
I2C2 |
PB3 |
SCL |
应修改 i2c2_pins 中的引脚 |
I2C2 |
PB10 |
SDA |
<&i2c2_pins> |
I2C2 |
PB11 |
SCL |
<&i2c2_pins> |
备注
可以根据具体情况在 <dts>/rtl8730e-pinctrl.dtsi
中修改引脚复用设置。
参考 pinctrl 文档获取更多细节。
I2C 组
I2C 组有三个 I2C 设备,分别命名为 I2C0、I2C1 和 I2C2。I2C 设备的用法是相同的。
aliases {
i2c0 = "/ocp/i2c0@0x4200F000";
i2c1 = "/ocp/i2c1@0x400EF000";
i2c2 = "/ocp/i2c2@0x400F0000";
};
编译配置
选择
。如果需要使用 I2C 从模式,请进入 I2C 控制器驱动程序并启用 I2C 从设备驱动程序。

APIs
用户空间 API
主机模式
用户空间的 I2C 主接口由 <linux>/drivers/i2c/dev.c
提供。以下是一些用于控制 I2C 设备的常用 API。
接口 |
介绍 |
---|---|
i2cdev_open |
打开I2C设备 |
i2cdev_release |
释放I2C设备 |
i2cdev_ioctl |
配置 I2C 参数,控制 I2C 数据的读写 |
i2cdev_write |
调用 I2C 驱动程序发送消息 |
i2cdev_read |
调用 I2C 驱动程序读取消息 |
备注
请参考 I2C Device Interface v5.4 或 I2C Device Interface v6.6 的官方文档获取更多细节。
用户空间的 I2C 主控演示位于 <test>/i2c
。
从机模式
无。
内核空间 API
主机模式
内核空间的 I2C 主控接口由 <linux>/drivers/i2c/i2c-core-base.c
提供。以下是一些用于控制 I2C 主控设备的常用 API。
接口 |
介绍 |
---|---|
module_i2c_driver |
注册一个 I2C 客户端模块 |
i2c_transfer |
调用 I2C 驱动程序发送消息或读取消息。 msg->flags & I2C_M_RD = 1 // 读取 msg->flags & I2C_M_RD = 0 // 写入 |
备注
参考 Writing I2C Clients v5.4 或 Writing I2C Clients v6.6 获取更多细节。
从机模式
内核空间的 I2C 从属接口由 <linux>/drivers/i2c/i2c-core-slave.c
提供。以下是一些用于控制 I2C 从属设备的常用 API
接口 |
介绍 |
---|---|
i2c_slave_register |
注册I2C从机设备 |
i2c_slave_unregister |
注销I2C从机设备 |
备注
参考 I2C slave interface v5.4 或 I2C slave interface v6.6 获取更多细节。
I2C 从机演示位于 <test>/i2c-slave
。请注意修改 Property Description 中的 rtk, i2c-reg-slave-num
参数,以配置从属设备的 I2C 内核。