4. AUX 通道详解:事务协议、读写操作与 Native / I2C 区别
AUX(Auxiliary)通道是 eDP 链路中除主链路(Main Link)和热插拔检测(HPD)之外的第三条逻辑通道。它承担着链路训练参数协商、显示能力读取(EDID)、显示控制(DPCD 寄存器读写)以及 MCCS 命令透传等关键任务。本章将深入解析 AUX 事务协议、读写操作流程,并重点区分 Native AUX 与 I2C-over-AUX 两种模式。
核心要点:AUX 通道是 eDP 通信的“控制面”,所有链路训练参数(如电压摆幅、预加重、通道数、速率)均通过 AUX 写入 DPCD 寄存器。AUX 事务失败是导致黑屏、闪屏、无法训练的最常见原因之一。
4.1 AUX 通道物理层与事务协议
AUX 通道采用差分信号(AUX+ / AUX-),运行在 1 Mbps 固定速率(eDP 1.4 及之前版本)。其事务协议基于请求-应答模型,所有事务由 Source(主设备,如 SoC/GPU)发起,Sink(从设备,如 eDP 面板)响应。
4.1.1 事务帧结构
AUX 事务帧由 4 个部分组成:前导码(Preamble)、同步码(Sync)、数据包(Data Packet)和填充位(Stuffing)。其中数据包是核心,包含以下字段:
| 字段 | 位宽 | 说明 |
|---|---|---|
| 命令 (Cmd) | 4 bits | 定义事务类型:Native 读/写、I2C 读/写、I2C 写状态等 |
| 地址 (Address) | 20 bits | DPCD 寄存器地址(Native)或 I2C 从设备地址 + 偏移(I2C-over-AUX) |
| 长度 (Length) | 4 bits | 数据负载字节数(0~16),0 表示无数据(仅地址查询) |
| 数据 (Data) | 0~128 bits | 写事务时携带写入数据;读事务时由 Sink 在应答中返回 |
调试提示:逻辑分析仪抓取 AUX 总线时,重点关注命令字段和应答类型。常见的失败模式包括:NACK(从设备拒绝)、Defect(物理层错误)和超时(无应答)。这些通常指向面板未上电、HPD 未就绪或 AUX 线对短路/断路。
4.2 Native AUX 读写操作
Native AUX 是 eDP 标准定义的直接寄存器访问协议,用于读写 DPCD(DisplayPort Configuration Data)寄存器。DPCD 是 Sink 设备内部的一块地址空间,包含链路能力、训练状态、错误计数等关键信息。
4.2.1 Native AUX 写操作流程
- Source 发送请求:命令 = 0x8 (Native Write),地址 = 目标 DPCD 寄存器地址,长度 = N (1~16),数据 = 待写入的 N 字节。
- Sink 处理:将数据写入指定 DPCD 寄存器,完成后返回应答。
- Source 接收应答:若为 ACK,则写操作成功;若为 NACK,则需重试或检查地址合法性。
4.2.2 Native AUX 读操作流程
- Source 发送请求:命令 = 0x9 (Native Read),地址 = 目标 DPCD 寄存器地址,长度 = N (1~16),数据字段为空。
- Sink 处理:从指定地址读取 N 字节数据,封装在应答中返回。
- Source 接收应答:解析应答中的数据字段,若为 NACK 或数据长度不匹配,则视为读失败。
4.3 I2C-over-AUX 协议
I2C-over-AUX 是 eDP 标准中定义的另一种 AUX 事务模式,用于在 AUX 通道上模拟 I2C 总线协议。其主要用途是读取面板的 EDID(通过 I2C 地址 0x50)和 DDC/CI 命令透传。
4.3.1 I2C-over-AUX 事务类型
| 命令码 | 类型 | 说明 |
|---|---|---|
| 0x0 | I2C Write | 向 I2C 从设备写入数据,需指定从设备地址和寄存器偏移 |
| 0x1 | I2C Read | 从 I2C 从设备读取数据,需先通过 I2C Write 设置偏移地址 |
| 0x2 | I2C Write Status | 查询上一次 I2C 写操作的状态(用于长事务分段) |
| 0x4 | I2C Read (Mot) | 带中间应答的 I2C 读(用于 E-DDC 分段读取) |
4.3.2 I2C-over-AUX 读取 EDID 的典型流程
- I2C Write 设置偏移:Source 发送 I2C Write 请求,从设备地址 = 0x50 (EDID ROM),数据 = 目标偏移地址(如 0x00 表示 EDID 块 0 起始)。
- I2C Read 读取数据:Source 发送 I2C Read 请求,长度 = 128 (EDID 块大小),Sink 返回 128 字节数据。
- 分段读取(块 1 及以上):对于 EDID 扩展块,需先通过 I2C Write 设置偏移地址为 0x80(块 1 起始),再执行 I2C Read。
常见陷阱:I2C-over-AUX 单次事务最大数据负载为 16 字节,而 EDID 块大小为 128 字节。因此读取一个完整的 EDID 块需要拆分为 8 次 I2C Read 事务(每次 16 字节)。Source 必须正确处理分段和中间应答,否则会导致 EDID 读取不完整或校验和错误。
4.4 Native AUX 与 I2C-over-AUX 的区别
两种模式在地址空间、事务语义、使用场景上存在本质差异。下表从多个维度进行对比:
| 对比维度 | Native AUX | I2C-over-AUX |
|---|---|---|
| 地址空间 | DPCD 寄存器地址 (20 bits, 0x00000~0xFFFFF) | I2C 从设备地址 (7 bits) + 寄存器偏移 (8/16 bits) |
| 事务语义 | 直接寄存器读写,无中间应答 | 模拟 I2C 总线协议,支持起始/停止条件、中间应答 |
| 最大数据负载 | 16 字节/事务 | 16 字节/事务 |
| 主要用途 | 链路训练参数配置、状态查询、错误监控 | EDID 读取、DDC/CI 命令、MCCS 控制 |
| 应答类型 | ACK / NACK / Defect | ACK / NACK / Defect + I2C 中间应答 (MOT) |
| 地址冲突风险 | 无(DPCD 地址唯一) | 存在(多个 I2C 设备共享总线,需地址仲裁) |
| 调试复杂度 | 较低(直接映射寄存器) | 较高(需模拟 I2C 状态机) |
4.5 调试实践:AUX 事务日志分析
在嵌入式系统调试中,通过 AUX 事务日志可以快速定位链路训练失败的原因。以下是一个典型的 Native AUX 写操作日志示例:
[AUX] Cmd=0x8 (Native Write) Addr=0x00100 Len=1 Data=0x41
[AUX] Reply: ACK (0x00)
[AUX] Cmd=0x8 (Native Write) Addr=0x00101 Len=1 Data=0x06
[AUX] Reply: ACK (0x00)
[AUX] Cmd=0x9 (Native Read) Addr=0x00202 Len=1
[AUX] Reply: ACK Data=0x01 ← 链路训练成功 (CR=1, CE=1)
常见异常日志模式及排查方向:
| 日志模式 | 可能原因 | 排查方向 |
|---|---|---|
| 连续 NACK | DPCD 地址无效、面板未初始化、HPD 未拉高 | 检查 HPD 电平、面板上电时序、DPCD 地址范围 |
| Defect 应答 | AUX 物理层故障(短路、断路、电平异常) | 测量 AUX 差分对波形、检查连接器焊接 |
| 超时 (Timeout) | Sink 未响应、AUX 线对断开、面板未供电 | 确认面板电源、复位时序、AUX 线缆完整性 |
| I2C NACK 后重试 | EDID 读取时偏移地址错误、I2C 从设备忙 | 验证 I2C 地址 (0x50)、分段读取逻辑、重试次数 |
调试工具推荐:使用逻辑分析仪(如 Saleae、Kingst)抓取 AUX 差分信号,配合 eDP 协议解析插件,可以实时查看每个事务的命令、地址、数据和应答状态。这是排查 AUX 通信问题最直接有效的手段。