Skip to main content
互联集成电路(I2C)是一种双向 2 线总线,是由 Philips 于 20 世纪 80 年代开发的高效 IC 间控制总线。总线上的每个设备都有自己唯一的地址(在由 Philips 牵头的 I2C 管理机构注册)。I2C 核心支持多控制器模式、10 位目标地址和 10 位可扩展地址。有关 I2C 的更多信息,请参阅 https://www.i2c-bus.org/fileadmin/ftp/i2c_bus_specification_1995.pdf

I2C 通信序列概述

下图显示了 I2C 中控制器与目标设备之间的通信序列。
I2C 数据流

图:I2C 控制器与目标设备通信序列

例如,任何设备都不能使用 I2C 规范中列出的 1111-0XX,以及时钟频率为 3.4 MHz 的高速模式。 以下是 I2C 模式及支持的速度。
  • 标准模式:100 kbps
  • 快速模式:400 kbps
  • 增强快速模式(Fast mode plus):1 Mbps
支持的最大带宽为 1 MHz。

I2C 数据包格式

控制器发送 7 位或 10 位地址,如下图所示。除地址外,还会发送 1 位读/写位,指示操作类型。数据以 8 位为单位在 SDA 线上按序传输。每传输一个字节,接收数据的设备都会回发一个 ACK 位(共九个时钟脉冲)。
  • ACK 位为低电平:已接收数据并准备好接受下一个字节。
  • ACK 位为高电平:已接收数据但无法接受更多数据。控制器随后使用 STOP 序列终止传输。
I2C 数据包

图:I2C 数据包

I2C 时序

当 SCL 为高电平时,SDA 必须保持稳定,不能变化。只有当时钟线为低电平时,数据线才能变化。但有两个例外:START 和 STOP 序列。
I2C 时序

图:I2C 时序

I2C 功能

本节介绍 I2C 串行引擎传输模式以及每种模式适用的不同场景。下表列出了各 I2C 子系统驱动程序中启用的传输模式。 表:I2C 传输模式
子系统传输模式描述
Linux
  • FIFO(低速)
  • CPU DMA(高速)
  • GSI
  • 支持 100 kHz、400 kHz 和 1000 kHz 总线速度
  • 支持符合 I2C 规范的 7 位目标地址
BootFIFO
aDSP/Qualcomm TEE/SDCFIFO

I2C 接口组件

本节提供有关子系统驱动程序、内核设备树节点及相关文档的信息。 表:I2C 接口:Linux
文件类型描述
设备树源
Pinctrl 设置
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
表:I2C 接口:Boot
文件类型描述
QUP v3 串行引擎配置
  • 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
  • GPIO 配置:/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-pinctrl.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
表:I2C 接口:aDSP/SLPI/SDC
文件类型描述
QUP v3 串行引擎配置
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_common/config/<chipset>/adsp/ssc/qup_devcfg.c
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_fw/config/<chipset>/fw_devcfg.c
  • settings/buses/qup_common/config/<chipset>/adsp/ssc/qup_devcfg.json
固件配置设置
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_fw/config/<chipset>/fw_devcfg.c
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/ADSP.HT.5.5.c8/adsp_proc/core/settings/buses/qup_fw/config/<chipset>/fw_devcfg.xml
表:I2C 接口:Qualcomm TEE
文件类型描述
QUP v3 串行引擎配置
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/i2c/qupv3/config/<chipset>/tz/i2c_devcfg_user.h
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/i2c/qupv3/config/<chipset>/tz/i2c_devcfg_user.c
  • /firmware/qualcomm-linux-spf-1-0_ap_standard_oem_nomodem/TZ.XF.5.0/trustzone_images/core/settings/buses/i2c/qupv3/config/<chipset>/tz/i2c_devcfg.xml
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

I2C API

本节列出了以下子系统的 I2C API。

I2C 软件设备树配置

本节提供有关 I2C 设备树配置的信息以及设备节点的文档。

Linux

有关配置设置文件,请参阅以下 DTSI 文件。 有关更多详细信息,请参阅 https://github.com/torvalds/linux/blob/master/Documentation/devicetree/bindings/i2c/qcom%2Ci2c-geni-qcom.yaml 中的 i2c-geni-qcom.yaml 文件,以及 https://github.com/torvalds/linux/blob/master/drivers/i2c/busses/i2c-qcom-geni.c 文件中的 I2C 驱动程序。
有关 GPIO pinctrl 配置的内核文档,请参阅以下文件。 QUP v3 串行引擎 GPIO 的相应配置存在于 pinctrl.dtsi 文件中并已完成映射。
QUPAC_Access.c 文件中,确保指定协议的特定串行引擎配置是针对 I2C 协议的。Qualcomm TEE 构建:
修改所需设置,或参考为 QUP v3 串行引擎实例分配的默认设置。以下示例配置在 I2C 中默认启用。

Boot

  1. 在 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
注意:有关 boot 中的配置设置,请参阅 Boot
  1. 在 UEFI 的 /QcomPkg/SocPkg/<chipset>/LAA/Core.fdf 中启用 I2C 协议。
  2. 应用程序启用 I2C 接口。然后,应用程序通过 I2C 接口执行读写操作。有关 I2C 函数用法的信息,请参阅 boot_images/QcomPkg/QcomTestPkg/I2CApp/I2Ceeprom.c
  3. 在代码中按顺序添加 i2c_open->i2c_read/i2c_write->i2c_close
  4. 在调用 I2c_open 之前,通过验证设备/UEFI 启动日志,确保 GpiDxe.infI2C.efi 文件已加载。

aDSP/SDC

在 aDSP 子系统的启动序列期间,会随 SSC QUP 执行固件加载。配置文件位于 aDSP 构建中的以下位置:
以下配置是加载 I2C 固件的 SSC QUP SE1、SE2 和 SE3 设置的示例。
GPIO 配置:QUP v3 通用驱动程序中的每个串行引擎都配置了默认 GPIO 配置。QUP v3 通用驱动程序根据串行引擎中加载的协议获取 GPIO 配置。文件路径:
默认 GPIO 配置可按如下方式覆盖。
TLMM_MAP 是用于初始化活动和睡眠状态 GPIO 配置的宏。例如,TLMM_MAP 宏的示例用法。

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。文件路径:
QUPAC 访问控制:来自 Qualcomm TEE 子系统的固件加载和访问控制权限在以下 QUPAC 访问文件中配置:

配置 I2C 接口

本节提供有关 I2C 软件驱动程序内核配置和设备树节点更改的信息。

Linux

支持 I2C 接口需要以下驱动程序内核配置。 需要启用以下内核配置。
  • CONFIG_QCOM_GENI_SE=y
  • CONFIG_I2C_CHARDEV=m
  • CONFIG_I2C_QCOM_GENI=m 用于配置用户空间应用程序
  • CONFIG_QCOM_GPI_DMA=m 用于启用 GSI 支持
要启用 I2C DT 节点进行验证,请将以下补丁应用于 /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 要交叉编译工具,请执行以下操作。
  1. https://cdn.kernel.org/pub/software/utils/i2c-tools/i2c-tools-4.3.tar.gz 下载 i2c-tool
  2. 从下载的 tar 文件中解压该工具。
  3. 将当前目录切换到 i2c-tool 路径。
  4. 安装该工具。
  5. 设置交叉编译环境。
  6. 编译该工具。
    二进制文件生成在 <i2c-tool-path>/tools/ 中。
通过在 SSH shell 中检查 dev 节点(/dev/i2c-0/dev/i2c-1)来验证驱动程序,或使用 ADB shell。有关如何运行 SSH 的更多信息,请参阅使用 SSH 部分。 验证 I2C 驱动程序
  1. 要验证 I2C 驱动程序,请执行以下操作:
    1. 在 permissive 模式下打开 SSH shell,或使用 ADB shell。
    2. 挂载文件系统。
    3. 使用 SCP 或类似工具传输文件。 例如,scp i2cdetect root@10.92.162.185:/bin
    4. 分配执行权限。
  2. 使用 i2cdetect 工具验证 I2C 设备。例如,./i2cdetect -y -r <i2c_instance_num>
    将显示以下输出。
查看 I2C detect 帮助 有关 I2C 检测及其使用方法的更多信息,请运行以下命令。
将显示以下输出。
识别 DUT 中已探测的设备 要识别从 DUT 探测到的设备,请运行以下命令。
输出:
从设备读取 I2C 数据 要从设备读取 I2C 数据,请运行以下命令。
输出:

调试 I2C 问题

本节介绍 I2C 软件驱动程序的默认日志记录方法,以启用 I2C 传输失败的日志记录。

Linux

I2C 驱动程序日志通过内核动态调试方法启用。在以下文件中启用 CONFIG_DYNAMIC_DEBUG 以支持内核驱动程序的动态调试。
要在内核日志(dmesg)中启用并查看 I2C 驱动程序日志,请运行以下命令。
要调试驱动程序协议加载失败的错误消息 [ 8.583248] geni_i2c a94000.i2c: Invalid proto 1,请执行以下操作。
  1. 识别板类型。 示例:QUPV3_1_SE5 板类型详细信息
  2. 从内核日志中,在以下位置找到平台 ID 和子类型相关的详细信息:
  3. 获取 Qualcomm TEE QUPAC_Access.c 文件配置。
  4. 识别特定于该串行引擎的配置。
  5. QUPAC_Access.xml 文件中找到平台 ID 类型。
  6. 将此平台 ID 类型映射到 QUPAC_Access.c 文件中相应的 qupv3_perms 结构。
  7. 验证 QUPAC_Access.c 文件中的协议和模式配置。

I2C 示例

有关上游设备树参考的信息,请参阅以下 DTSI 文件。 有关 Qualcomm Linux 硬件 SoC 的设备树节点的信息,请参阅以下 DTSI 文件。