通过 AUX 通道调试 DP Link Traning

DP Sink 内部有一组标准寄存器,称为 DPCD(DisplayPort Configuration Data)。当 DisplayPort Source 和 Sink 建立连接后,Source 会通过 AUX(Auxiliary)通道读取和配置 Sink 的 DPCD 寄存器,从而完成链路训练。

调试时最常关注三个区域:

DPCD 地址 作用
0x0000 ~ 0x000F Sink Capability
0x0100 ~ 0x010F Link Configuration
0x0200 ~ 0x020F Link Status

整个 Link Training 过程主要包括以下几个阶段:

1.1. 读取 DPCD Capability

Sink 通过 HPD (Hot Plug Detect) 引脚的高电平通知 Source 当前的连接状态。Source 检测到 HPD 信号后,通过 AUX (Auxiliary) 通道 读取 Sink 端的 DPCD (DisplayPort Configuration Data) 寄存器,从而获取 Sink 的核心链路能力。

1.1.1 核心配置参数

  • Lane Count (通道数)

    • 核心定义:DisplayPort 物理层中用于传输高速视音频数据的差分对(对线)数量。
    • 规格配置 :DP 标准允许灵活配置为 1 Lane、2 Lanes 或 4 Lanes。
  • Link Rate (链路速率)

    • 核心定义:单条 Lane 上每秒传输的原始数据比特率,决定单通道的数据吞吐率。
    • 常见规格 :
      • RBR (Reduced Bit Rate): 1.62 Gbps / Lane
      • HBR (High Bit Rate): 2.70 Gbps / Lane
      • HBR2 (High Bit Rate 2): 5.40 Gbps / Lane
      • HBR3 (High Bit Rate 3): 8.10 Gbps / Lane
  • Voltage Swing (电压摆幅)

    • 核心定义:差分信号正负峰值之间的电压差,决定了信号的绝对基准幅度。
    • DP 规格 :分为 Level 0 ~ Level 3 (对应差分峰峰值约 400mV 到 1200mV)。
  • Pre-emphasis (预加重)

    • 核心定义:一种高频补偿技术。对高频跳变信号(0 变 1 或 1 变 0 的第一个 Bit)进行瞬间电压放大,而对连续不变的低频信号进行物理衰减。
    • DP 规格 :分为 Level 0 ~ Level 3 (对应约 0dB 到 9.5dB 的高频增强)。

1.2 Clock Recovery(时钟恢复)阶段 - Sink 能否从数据流中恢复时钟

由于 DP 物理接口不包含独立的物理时钟线,接收端(Sink)必须通过内置的锁相环(PLL)从发送端(Source)的时序数据流中提取并恢复出同步时钟。本阶段是整个链路训练(Link Training)的基础第一步。

1.2.1 发送 TPS1

首先,Source 根据 Sink 的能力确定本次 Link Training 使用的 Lane Rate ,并从最低的 Voltage Swing 和 Pre-emphasis 组合开始。

确定训练参数后,Source 通过 AUX 通道向 Sink 的 DPCD 寄存器 0x0102(TRAINING_PATTERN_SET)写入 TPS1 配置 ,通知 Sink 进入 Clock Recovery 阶段。

完成配置后,Source 在 Main Link 上发送 TPS1 训练序列,Sink 开始尝试从接收到的数据流中恢复时钟。

1.2.2 Voltage Swing 和 Pre-emphasis 组合

DP 通常定义 4 个 Voltage Swing 和 Pre-emphasis 等级:

Level Voltage Swing Pre-emphasis
0 最低 最低
1 更高 更高
2 更高 更高
3 最高 最高

Voltage Swing 和 Pre-emphasis 不能任意组合,传统 DP Link Training 中要求:

Voltage Swing Level + Pre-emphasis Level ≤ 3

因此,有效的组合包括:

Voltage Swing Pre-emphasis 可选范围
0 0 ~ 3
1 0 ~ 2
2 0 ~ 1
3 0

例如,初始训练通常从:

复制代码
Voltage Swing = Level 0
Pre-emphasis  = Level 0

开始。

1.2.3 检查 Clock Recorvery 状态

Source 发送 TPS1 一段时间后,通过 AUX 通道读取 Sink 的 DPCD Link Status 寄存器:

复制代码
0x0202 → LANE0_1_STATUS
0x0203 → LANE2_3_STATUS

其中,各 Lane 的 CR_DONE 用于表示 Clock Recovery 是否完成。

DPCD 地址 Lane Bit 0 Bit 1 Bit 2 Bit 4 Bit 5 Bit 6
0x0202 Lane 0 CR_DONE CHANNEL_EQ_DONE SYMBOL_LOCKED --- --- ---
0x0202 Lane 1 --- --- --- CR_DONE CHANNEL_EQ_DONE SYMBOL_LOCKED
0x0203 Lane 2 CR_DONE CHANNEL_EQ_DONE SYMBOL_LOCKED --- --- ---
0x0203 Lane 3 --- --- --- CR_DONE CHANNEL_EQ_DONE SYMBOL_LOCKED

如果所有Lane的CR_DONE都为1则表示:Sink 已经成功从 Source 的数据流中恢复出时钟,Clock Recovery 完成。随后进入下一阶段。

1.3 通道均衡(Channel Equalization)

当 Clock Recovery 成功后,进入 通道均衡(Channel Equalization) 阶段。

此时继续使用 Clock Recovery 阶段确定的 Lane Rate、Voltage Swing和 Pre-emphasis 参数。Source 通过 AUX 通道向 DPCD 寄存器 0x0102(TRAINING_PATTERN_SET)写入对应的训练模式,然后在 Main Link 上发送 TPS2、TPS3 或 TPS4 中的一种训练序列。

Sink 接收到训练序列后,会对信号进行分析,检测高速信号经过传输通道后产生的失真,并通过内部 Equalizer 调整接收参数。

与此同时,Sink 会通过 DPCD 状态寄存器向 Source 反馈通道均衡的结果。Source 主要读取 DPCD 0x0202 和 0x0203 中各 Lane 的 LANEx_CHANNEL_EQ_DONE 状态位,用于判断对应 Lane 是否完成通道均衡。

当所有正在使用的 Lane 的 CHANNEL_EQ_DONE 均为 1 时,表示所有 Lane 均已完成 Channel Equalization,可以进入后续的 Symbol Lock 和 Inter-Lane Alignment 阶段。

1.4 符号锁定与 Lane 间对齐(Symbol Lock and Inter-Lane Alignment)

1.4.1 符号锁定 (Symbol Lock)

DP 使用特定的数据编码方式,Sink 需要从接收到的高速数据流中准确识别 Symbol Boundary(符号边界)。

当 Sink 成功完成符号锁定后,会在 DPCD 0x0202 和 0x0203 中设置对应的 LANEx_SYMBOL_LOCKED 状态位。表示对应 Lane 已完成符号锁定。

1.4.2 Lane 间对齐 (Inter-Lane Alignment)

对于多 Lane DP 链路,仅仅保证每个 Lane 独立工作还不够。

由于不同 Lane 经过的物理通道存在差异,各 Lane 到达 Sink 的时间可能不同。因此,Sink 还需要对不同 Lane 的数据进行延迟调整,使各 Lane 的数据重新同步。

这一过程称为 Inter-Lane Alignment(Lane 间对齐)。

Sink 通过 DPCD 0x0204(LANE_ALIGN_STATUS_UPDATED)反馈 Lane 间对齐状态,其中:

DPCD 0x0204 Bit 0 = INTERLANE_ALIGN_DONE

当:

INTERLANE_ALIGN_DONE = 1

表示所有使用中的 Lane 已经完成对齐。

1.5 视频流传输(Video Stream Transmission)

当上述所有 Link Training 步骤均成功完成后,表示 Source 与 Sink 之间的 DP Main Link 已经建立。

Source 通过读取 DPCD 0x0202(LANE0_1_STATUS)、0x0203(LANE2_3_STATUS)以及 0x0204(LANE_ALIGN_STATUS_UPDATED),确认各 Lane 的最终训练状态以及 Lane 间对齐状态。

确认训练成功后,Source 通过 AUX 将 DPCD 0x0102(TRAINING_PATTERN_SET)设置为 0,退出 Training Pattern。随后停止发送 TPS,并开始在 Main Link 上传输正常的 DisplayPort 视频数据。

2 AUX 信号采集

AUX 是低幅度的差分信号,普通逻辑分析仪的数字输入无法直接识别。

因此,需要先对 AUX 信号进行电平处理和整形,将差分模拟信号转换为逻辑分析仪可以识别的数字信号。

这里使用一块带有 Comparator(比较器) 的 STM32 开发板,通过 MCU 内部比较器对 AUX+ 和 AUX− 进行差分比较,将 AUX 信号转换成数字波形。

2.1 配置 STM32 Comparator

选择 COMP1 进行配置。

  • 勾选 Input+, 选择Input-信号为INM
  • 勾选 ExternalOutput,表示将比较结果输出到外部。

比较器的基本工作原理是:

  • Input+ > Input- → 输出高电平
  • Input+ < Input- → 输出低电平

将待测试的 AUX 差分信号分别连接到 STM32:

  • AUX+ → COMP1_INM (PA0)
  • AUX− → COMP1_INP (PA1)

再将 比较器输出信号 COMP1_OUT(PA6) 接入 Logic Analyzer。

生成代码后,在程序中启动 COMP1:

复制代码
HAL_COMP_Start(&hcomp1);

启动比较器后,AUX+ 和 AUX− 的差分电压经过比较器进行比较,原本的模拟差分信号就被转换成数字电平变化,随后即可使用 Logic Analyzer 进行采集。

2.2 AUX 信号电平处理

为了让 STM32 内部比较器能够可靠地处理 AUX 信号,这里采用 交流耦合 + 直流偏置 的方式对输入信号进行处理。

首先,通过电容进行交流耦合,隔离 AUX 信号中的直流电平,只保留信号的变化部分。

然后,通过电阻网络增加一个直流偏置,将比较器输入端的共模工作点设置在电源电压中间附近:

3.3 V / 2 ≈ 1.65 V

这样,经过处理后的 AUX 信号会以约 1.65 V 为中心上下摆动,同时 AUX+ 和 AUX− 之间的差分变化仍然可以被比较器检测到。

下面是具体的电路:

3 解码 AUX Channel 信号

3.1 安装 AUX Analyzer

采集到 AUX 的数字波形后,还需要对波形进行协议解析。这里使用开源的 AUX Analyzer 对 DisplayPort AUX Channel 进行解码。

首先下载 AUX Analyzer 扩展包:

https://github.com/Alex-the-Smart/DPAUXAnalyzer/tree/master/compiled/x64

将下载后的文件拷贝到 Logic 软件的 Analyzer 目录:

复制代码
Logic\resources\windows-x64\Analyzers

重新打开 Logic 软件,在 Analyzer 列表中可以看到 AUX Analyzer。

点击 Add Analyzer,添加 AUX Analyzer。

然后选择需要分析的 Logic Analyzer Channel。

完成配置后,Logic 就可以对采集到的 AUX 数字波形进行协议解码,将原始的高低电平转换成可读的 AUX Read / Write、地址以及数据等信息。

这样,后续就可以直接通过 AUX Analyzer 观察 DisplayPort 的 DPCD 读写、Link Training 以及其他 AUX 通信过程。

4 Native AUX 包格式

  • AUX request
Byte 位 字段 含义
Byte 0 [7:4] Command 操作类型
[3:0] Address [19:16] 地址高 4 位
Byte 1 [7:0] Address [15:8] 地址
Byte 2 [7:0] Address [7:0] 地址
Byte 3 [7:0] LEN 数据长度 - 1
Byte 4... Data Write 时的数据
Command 含义
0x80 Native AUX Write
0x90 Native AUX Read

示例:

字节 内容 含义
Byte 0 90 Native AUX Read
Byte 1 02 Address [15:8]
Byte 2 02 Address [7:0]
Byte 3 02 LEN = 2 → 读取 3 Bytes
  • AUX reply
Byte 字段 含义
Byte 0 Reply AUX Reply 状态
Byte 1... Data Read 操作返回的数据
Reply 含义
0x00 ACK,操作成功
0x01 NACK
0x02 DEFER,需要稍后重试

示例:

字节 内容 含义
Reply 00 ACK
Data 77 77 01 DPCD 数据
相关推荐
longlongzihan10 天前
LeetCode 1004.最大连续1的个数III 滑动窗口及动态规划题解
c++·算法·leetcode·dp·滑动窗口
惆怅客12313 天前
UVa11640 Mayor Election
dp·fft·icpc·uva·生成函数的乘法
语戚25 天前
力扣 1621. 大小为K的不重叠线段的数目:动态规划(Java 实现)
java·算法·leetcode·动态规划·力扣·dp
Tisfy25 天前
LeetCode 1477.找两个和为目标值且不重叠的子数组:滑动窗口 + 记录前值(动态规划)
动态规划·题解·dp·滑动窗口
Tisfy1 个月前
LeetCode 2472.不重叠回文子字符串的最大数目:动态规划(贪心)
动态规划·字符串·题解·贪心·dp·回文字符串
a187927218311 个月前
【算法】动态规划第四篇:背包收官——min 哨兵、计数世界与组合排列分水岭
算法·leetcode·动态规划·dp·01背包·算法讲解·决策合并
a187927218311 个月前
【算法】动态规划第三篇:背包第一课——贪心之死与正序倒序开关
算法·leetcode·动态规划·贪心·dp·暴力·算法讲解
a187927218311 个月前
【算法】动态规划第五篇:区间 DP——从“看什么都像背包“到“最后戳谁“
算法·leetcode·动态规划·dp·区间·区间dp·算法讲解
a187927218311 个月前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解