> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# I3C

export const tdA = {
  border: "1px solid #ddd",
  padding: "10px 14px",
  textAlign: "left",
  verticalAlign: "top"
};
export const thA1 = {
  border: "1px solid #ddd",
  padding: "10px 14px",
  textAlign: "center",
  backgroundColor: "#f5f5f5",
  fontWeight: "600",
  color: "#333",
  width: "20%"
};
export const thA2 = {
  border: "1px solid #ddd",
  padding: "10px 14px",
  textAlign: "center",
  backgroundColor: "#f5f5f5",
  fontWeight: "600",
  color: "#333",
  width: "80%"
};
export const tblA = {
  borderCollapse: "collapse",
  width: "100%",
  fontSize: "14px",
  tableLayout: "fixed"
};

改进型互联集成电路（I3C）接口的开发目的是为连接的 I3C 设备提供快速、低成本、低功耗的 2 线数字接口。I3C 接口旨在改进 I2C 接口的功能，同时保持向后兼容性。

这种 2 线串行接口支持高达 12.5 MHz。传统 I2C 设备可共存于同一总线上。I3C 总线支持带内（in-band）支持、热加入（hot join）、同步时序支持和异步时间戳。在写操作期间，转换位（transition bit）是 8 位数据的奇偶校验位。在读操作期间，控制器使用转换位来决定继续读取下一个数据还是中止读取。

数据阶段可以是推挽（push-pull）或开漏（open-drain），具体取决于设备的 I3C 能力（对于混合总线，I3C 控制器可以寻址 I2C 目标设备）。

* START 条件之后的地址为开漏（仲裁阶段）。
* 重复 START 条件之后的地址为推挽。

下图展示了 I3C 硬件和软件实体。

<Frame>
  <img src="https://mintcdn.com/qualcomm-prod/rpHTx_a6zriKQll9/System/Interfaces/images/I3C_block_diagram.png?fit=max&auto=format&n=rpHTx_a6zriKQll9&q=85&s=12720e8a846e5428edf7a27e134214bf" alt="I3C 框图" width="529" height="304" data-path="System/Interfaces/images/I3C_block_diagram.png" />
</Frame>

<p align="center"><strong>图：I3C 框图</strong></p>

I3C 架构的主要特性如下：

* I3C 控制器驱动软件：具有软件特权的实体，能够进行枚举和总线配置。
* I3C 客户端软件：使用 I3C 总线对设备进行读/写的软件实体。

### **I3C 数据包帧结构**

一个帧以 START 开始，依次为命令（8 位）、数据（8 位）、转换位（1 位）和 STOP。

<Frame>
  <img src="https://mintcdn.com/qualcomm-prod/rpHTx_a6zriKQll9/System/Interfaces/images/I3C_packet_frame.png?fit=max&auto=format&n=rpHTx_a6zriKQll9&q=85&s=31e40f76b4b443d0a21111f597ae6c84" alt="I3C 数据包帧" width="577" height="91" data-path="System/Interfaces/images/I3C_packet_frame.png" />
</Frame>

<p align="center"><strong>图：I3C 数据包帧</strong></p>

其中：

* ACK：应答（SDA 为低电平）
* S：起始条件
* Sr：重复起始条件
* P：停止条件
* T：替代 ACK/NACK 的转换位

<Frame>
  <img src="https://mintcdn.com/qualcomm-prod/rpHTx_a6zriKQll9/System/Interfaces/images/I3C_sequence.png?fit=max&auto=format&n=rpHTx_a6zriKQll9&q=85&s=e8802e91e549335045b3367f8ea3a485" alt="I3C 时序" width="687" height="192" data-path="System/Interfaces/images/I3C_sequence.png" />
</Frame>

<p align="center"><strong>图：I3C 时序</strong></p>

### **I3C 总线初始化**

I3C 总线初始化过程如下：

1. I3C 控制器驱动软件初始化 I3C 控制器（固件和配置设置）。
2. I3C 控制器驱动软件读取 I3C 配置和设备数据库，包括：
   * I2C 静态地址设备列表。
   * I3C 静态地址设备列表。
   * 预期的 I3C 动态设备列表：供应商 ID、设备 ID、预定义动态地址和关联的驱动程序。
   * 可选的允许热加入的设备（供应商 ID、设备 ID 和预定义地址）。
3. 驱动程序使用 I3C 控制器软件枚举总线上的设备（设置本地地址）。
4. I3C 控制器驱动软件将所需设备和总线特性信息写入 I3C 控制器：
   * 工作频率
   * 纯/传统 I2C 模式
   * SDR/HDR 启用/禁用（及类型）
   * 支持 IBI 的设备和预期数据字节
5. I3C 客户端软件栈接收关于 I3C 配置和设备数据库的以下信息。
   * I2C 静态地址设备列表。
   * I3C 静态地址设备列表。
   * 预期的 I3C 动态设备列表：供应商 ID、设备 ID、预定义动态地址和关联的驱动程序。
   * 可选的允许热加入的设备（供应商 ID、设备 ID 和预定义地址）。

## **I3C 功能**

aDSP/SDC I3C 子系统支持以下功能。

* 地址阶段频率为 400 kHz。
* 数据阶段频率为 12,500 kHz。
* 与传统 I2C 向后兼容。
* 目标设备的动态寻址。
* 单倍数据速率（SDR）模式。
* 符合 MIPI I3C 规范的 CCC 命令

## **I3C 接口组件**

aDSP/SLPI 软件中的 I3C 用例支持传感器设备通信。

<Note>
  注意：I3C 不支持 Linux 用例。
</Note>

下表列出了用于设备通信的 I3C 功能的软件驱动程序和配置支持。

<p align="center"><strong>表：aDSP/SLPI/SDC</strong></p>

<table style={tblA}>
  <thead>
    <tr>
      <th style={thA1}>文件类型</th>
      <th style={thA2}>描述</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td style={tdA}>QUP v3 串行引擎配置</td>

      <td style={tdA}>
        <ul>
          <li><code>/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</code></li>
          <li><code>/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</code></li>
          <li><code>/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.json</code></li>
        </ul>
      </td>
    </tr>

    <tr>
      <td style={tdA}>固件配置设置</td>

      <td style={tdA}>
        <ul>
          <li><code>/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</code></li>
          <li><code>/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</code></li>
        </ul>
      </td>
    </tr>

    <tr>
      <td style={tdA}>公共 API</td>

      <td style={tdA}>
        <ul>
          <li><code>api/buses/i2c\_api.h</code></li>
          <li><code>api/buses/qup\_common.h</code></li>
        </ul>
      </td>
    </tr>
  </tbody>
</table>

## **I3C 软件 GPIO 配置**

QUP v3 串行引擎的 I3C 固件在启动序列期间随 SSC QUP 一起加载。配置文件位于 aDSP 构建中。为特定 QUP v3 串行引擎实例启用 I3C 配置的源代码路径是 `/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`。

以下是加载 I3C 固件的 SSC QUP SE0 或 SE1 的示例。

```text theme={null}
se_cfg se0_cfg = { 0x80000, SE_PROTOCOL_I3C,    GSI,     TRUE, TRUE  };
se_cfg se1_cfg = { 0x84000, SE_PROTOCOL_I3C,    GSI,     TRUE, TRUE  };
```

**GPIO 配置**：QUP 通用驱动程序中的每个串行引擎都配置了默认 GPIO 配置。QUP 通用驱动程序根据串行引擎中加载的协议选择 GPIO 配置。特定 I3C 串行引擎实例的 GPIO 配置的源代码路径是 `/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_instance_mapping.c`。

默认 GPIO 配置可按如下方式覆盖：

```text theme={null}
{ .instance_id = 1 , //Instance ID
.qup = QUP_SSC, //QUP Type
.se_index = 0, //SE ID
.se_data = NULL, //devcfg_map
.protocol_io_cfg = {
TLMM_MAP(TLMM_GPIO_KEEPER ,TLMM_GPIO_2MA,TLMM_GPIO_KEEPER ), // SLEEP CFG
TLMM_MAP(TLMM_GPIO_NO_PULL,TLMM_GPIO_6MA,TLMM_GPIO_KEEPER ),  //SPI CFG
TLMM_MAP(TLMM_GPIO_NO_PULL,TLMM_GPIO_2MA,TLMM_GPIO_NO_PULL), // UART CFG
TLMM_MAP(TLMM_GPIO_PULL_UP,TLMM_GPIO_2MA,TLMM_GPIO_NO_PULL), //I2C CFG
TLMM_MAP(TLMM_GPIO_PULL_UP,TLMM_GPIO_2MA,TLMM_GPIO_KEEPER ) //I3C CFG
},
.se_exclusive = TRUE,
}
```

TLMM\_MAP 是用于初始化活动和睡眠状态 GPIO 配置的宏。例如，TLMM\_MAP 宏的示例用法如下：

```text theme={null}
TLMM_MAP (active state pull type, drive strength, sleep state pull type)
```
