I2C 通信序列概述
下图显示了 I2C 中控制器与目标设备之间的通信序列。
图:I2C 控制器与目标设备通信序列
例如,任何设备都不能使用 I2C 规范中列出的 1111-0XX,以及时钟频率为 3.4 MHz 的高速模式。 以下是 I2C 模式及支持的速度。- 标准模式:100 kbps
- 快速模式:400 kbps
- 增强快速模式(Fast mode plus):1 Mbps
I2C 数据包格式
控制器发送 7 位或 10 位地址,如下图所示。除地址外,还会发送 1 位读/写位,指示操作类型。数据以 8 位为单位在 SDA 线上按序传输。每传输一个字节,接收数据的设备都会回发一个 ACK 位(共九个时钟脉冲)。- ACK 位为低电平:已接收数据并准备好接受下一个字节。
- ACK 位为高电平:已接收数据但无法接受更多数据。控制器随后使用 STOP 序列终止传输。

图:I2C 数据包
I2C 时序
当 SCL 为高电平时,SDA 必须保持稳定,不能变化。只有当时钟线为低电平时,数据线才能变化。但有两个例外:START 和 STOP 序列。
图:I2C 时序
I2C 功能
本节介绍 I2C 串行引擎传输模式以及每种模式适用的不同场景。下表列出了各 I2C 子系统驱动程序中启用的传输模式。 表:I2C 传输模式| 子系统 | 传输模式 | 描述 |
|---|---|---|
| Linux |
|
|
| Boot | FIFO | |
| aDSP/Qualcomm TEE/SDC | FIFO |
I2C 接口组件
本节提供有关子系统驱动程序、内核设备树节点及相关文档的信息。 表:I2C 接口:Linux| 文件类型 | 描述 |
|---|---|
| 设备树源 |
|
Pinctrl 设置 |
|
| Qualcomm TEE 设置 |
|
| 文件类型 | 描述 |
|---|---|
| QUP v3 串行引擎配置 |
|
| Qualcomm TEE 设置 |
|
| 文件类型 | 描述 |
|---|---|
| QUP v3 串行引擎配置 |
|
| 固件配置设置 |
|
| 文件类型 | 描述 |
|---|---|
| QUP v3 串行引擎配置 |
|
| Qualcomm TEE 设置 |
|
I2C API
本节列出了以下子系统的 I2C API。- Linux:
- Boot:boot_images/boot/QcomPkg/Include/i2c_api.h
- aDSP/SDC/SLPI:adsp_proc/core/api/buses/i2c_api.h
- Qualcomm TEE:trustzone_images/core/buses/api/i2c/qupv3/i2c_api.h
I2C 软件设备树配置
本节提供有关 I2C 设备树配置的信息以及设备节点的文档。Linux
有关配置设置文件,请参阅以下 DTSI 文件。- QCS6490 和 QCS5430:https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi
- Dragonwing IQ-9075:https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi
- Dragonwing IQ-615:https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git/tree/arch/arm64/boot/dts/qcom/qcs615.dtsi?h=arm64-for-6.16
i2c-geni-qcom.yaml 文件,以及 https://github.com/torvalds/linux/blob/master/drivers/i2c/busses/i2c-qcom-geni.c 文件中的 I2C 驱动程序。
pinctrl 配置的内核文档,请参阅以下文件。
- QCS6490 和 QCS5430:https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi
- Dragonwing IQ-9075:https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi
- Dragonwing IQ-615:https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git/tree/arch/arm64/boot/dts/qcom/qcs615.dtsi?h=arm64-for-6.16
Documentation/devicetree/bindings/pinctrl/qcom,<chipset>-tlmm.yaml
pinctrl.dtsi 文件中并已完成映射。
QUPAC_Access.c 文件中,确保指定协议的特定串行引擎配置是针对 I2C 协议的。Qualcomm TEE 构建:
Boot
- 在 UEFI 中配置 I2C。可从以下位置访问配置文件。
- QUP v3 串行引擎:
/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/BOOT.MXF.1.0.c1/boot_images/boot/Settings/Soc/<chipset>/Core/Buses/qup_common/<chipset>-qupv3.dtsi - Qualcomm TEE 设置:
/firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/<chipset>/QUPAC_Access.c
- QUP v3 串行引擎:
注意:有关 boot 中的配置设置,请参阅 Boot。
- 在 UEFI 的
/QcomPkg/SocPkg/<chipset>/LAA/Core.fdf中启用 I2C 协议。 - 应用程序启用 I2C 接口。然后,应用程序通过 I2C 接口执行读写操作。有关 I2C 函数用法的信息,请参阅
boot_images/QcomPkg/QcomTestPkg/I2CApp/I2Ceeprom.c。 - 在代码中按顺序添加
i2c_open->i2c_read/i2c_write->i2c_close。 - 在调用
I2c_open之前,通过验证设备/UEFI 启动日志,确保GpiDxe.inf和I2C.efi文件已加载。
aDSP/SDC
在 aDSP 子系统的启动序列期间,会随 SSC QUP 执行固件加载。配置文件位于 aDSP 构建中的以下位置:Qualcomm TEE
用于 I2C 的 QUP v3 串行引擎可按如下方式配置。文件路径:ENABLE_I2C_<num> 中的编号基于串行引擎的序号(从 0 开始)。例如,如果有两个 QUP:QUPV3_0 有七个串行引擎,QUPV3_1 有八个串行引擎,则用户必须启用 QUPV3_2_SE2。该宏应为 ENABLE_I2C_08。
GPIO 配置:驱动强度和上拉/下拉按引脚配置,SDA 位于索引 0,SCL 位于索引 1。文件路径:
配置 I2C 接口
本节提供有关 I2C 软件驱动程序内核配置和设备树节点更改的信息。Linux
支持 I2C 接口需要以下驱动程序内核配置。- 驱动程序源代码:https://github.com/torvalds/linux/blob/master/drivers/i2c/busses/i2c-qcom-geni.c
-
内核
defconfig文件路径:
CONFIG_QCOM_GENI_SE=yCONFIG_I2C_CHARDEV=mCONFIG_I2C_QCOM_GENI=m用于配置用户空间应用程序CONFIG_QCOM_GPI_DMA=m用于启用 GSI 支持
/arch/arm64/boot/dts/qcom/<chipset>.dtsi 文件。
注意:您应编译内核配置和设备树更改。编译后,可以将镜像加载到设备上以验证接口。有关接口验证的信息,请参阅验证 I2C 接口部分。
验证 I2C 接口
本节介绍 I2C 驱动程序和 Qualcomm 驱动程序的验证过程和测试结果。Linux
有关上游 I2C 内核测试应用程序,请参阅 https://cdn.kernel.org/pub/software/utils/i2c-tools/i2c-tools-4.3.tar.gz。 要交叉编译工具,请执行以下操作。- 从 https://cdn.kernel.org/pub/software/utils/i2c-tools/i2c-tools-4.3.tar.gz 下载
i2c-tool。 - 从下载的
tar文件中解压该工具。 - 将当前目录切换到
i2c-tool路径。 - 安装该工具。
- 设置交叉编译环境。
- 编译该工具。
二进制文件生成在
<i2c-tool-path>/tools/中。
dev 节点(/dev/i2c-0 和 /dev/i2c-1)来验证驱动程序,或使用 ADB shell。有关如何运行 SSH 的更多信息,请参阅使用 SSH 部分。
验证 I2C 驱动程序
- 要验证 I2C 驱动程序,请执行以下操作:
- 在 permissive 模式下打开 SSH shell,或使用 ADB shell。
- 挂载文件系统。
- 使用 SCP 或类似工具传输文件。
例如,
scp i2cdetect root@10.92.162.185:/bin - 分配执行权限。
- 使用
i2cdetect工具验证 I2C 设备。例如,./i2cdetect -y -r <i2c_instance_num>。将显示以下输出。
调试 I2C 问题
本节介绍 I2C 软件驱动程序的默认日志记录方法,以启用 I2C 传输失败的日志记录。Linux
I2C 驱动程序日志通过内核动态调试方法启用。在以下文件中启用CONFIG_DYNAMIC_DEBUG 以支持内核驱动程序的动态调试。
dmesg)中启用并查看 I2C 驱动程序日志,请运行以下命令。
[ 8.583248] geni_i2c a94000.i2c: Invalid proto 1,请执行以下操作。
- 识别板类型。
示例:QUPV3_1_SE5 板类型详细信息
- 从内核日志中,在以下位置找到平台 ID 和子类型相关的详细信息:
- 获取 Qualcomm TEE
QUPAC_Access.c文件配置。 - 识别特定于该串行引擎的配置。
- 在
QUPAC_Access.xml文件中找到平台 ID 类型。 - 将此平台 ID 类型映射到
QUPAC_Access.c文件中相应的qupv3_perms结构。 - 验证
QUPAC_Access.c文件中的协议和模式配置。
I2C 示例
有关上游设备树参考的信息,请参阅以下 DTSI 文件。- QCS6490 和 QCS5430:https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/sc7280.dtsi
- Dragonwing IQ-9075:https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi
- Dragonwing IQ-615:https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git/tree/arch/arm64/boot/dts/qcom/qcs615.dtsi?h=arm64-for-6.16
- QCS6490 和 QCS5430:https://git.linaro.org/kernel-org/linux-next.git/tree/arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts
- Dragonwing IQ-9075:https://github.com/torvalds/linux/blob/master/arch/arm64/boot/dts/qcom/sa8775p.dtsi
- Dragonwing IQ-615:https://git.kernel.org/pub/scm/linux/kernel/git/qcom/linux.git/tree/arch/arm64/boot/dts/qcom/qcs615.dtsi?h=arm64-for-6.16

