介绍

架构

I2C 驱动遵循 Linux 框架:i2c-core-base.ci2c-core-of.ci2c-dev.ci2c-boardinfo.c。I2C 软件架构如下所示。

../../rst_linux/8_i2c/figures/i2c_software_arch.svg

参考 I2C 获得 I2C 框架的更多细节。

实现

I2C 驱动程序实现为以下文件:

文件

描述

<linux>/drivers/rtkdrivers/i2c/Kconfig

I2C 驱动程序 Kconfig

<linux>/drivers/rtkdrivers/i2c/Makefile

I2C 驱动程序 Makefile

<linux>/drivers/rtkdrivers/i2c/rtk-i2c-core.c

I2C 核心函数

<linux>/drivers/rtkdrivers/i2c/rtk-i2c-master.c

I2C 主机函数

<linux>/drivers/rtkdrivers/i2c/rtk-i2c-slave.c

I2C 从机函数

<linux>/drivers/rtkdrivers/i2c/i2c-realtek.h

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: I2C 主机

  • 1/2: I2C 从机编号

0/1/2

status

是否启用设备

  • disabled

  • okay

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";
};

编译配置

选择 Drivers for Realtek > I2C controller driver。如果需要使用 I2C 从模式,请进入 I2C 控制器驱动程序并启用 I2C 从设备驱动程序。

../../rst_linux/8_i2c/figures/i2c_driver_for_rtk.png
../../rst_linux/8_i2c/figures/i2c_controller_driver.png

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.4I2C 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.4Writing 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.4I2C slave interface v6.6 获取更多细节。

I2C 从机演示位于 <test>/i2c-slave。请注意修改 Property Description 中的 rtk, i2c-reg-slave-num 参数,以配置从属设备的 I2C 内核。