通过 AUX 通道调试 DP Link Traning
1. Link Traning 流程DP Sink 内部有一组标准寄存器称为 DPCDDisplayPort Configuration Data。当 DisplayPort Source 和 Sink 建立连接后Source 会通过 AUXAuxiliary通道读取和配置 Sink 的 DPCD 寄存器从而完成链路训练。调试时最常关注三个区域DPCD 地址作用0x0000 ~ 0x000FSink Capability0x0100 ~ 0x010FLink Configuration0x0200 ~ 0x020FLink Status整个 Link Training 过程主要包括以下几个阶段1.1. 读取 DPCD CapabilitySink 通过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/ LaneHBR(High Bit Rate):2.70 Gbps/ LaneHBR2(High Bit Rate 2):5.40 Gbps/ LaneHBR3(High Bit Rate 3):8.10 Gbps/ LaneVoltage 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 寄存器0x0102TRAINING_PATTERN_SET写入 TPS1 配置通知 Sink 进入Clock Recovery阶段。完成配置后Source 在 Main Link 上发送 TPS1 训练序列Sink 开始尝试从接收到的数据流中恢复时钟。1.2.2 Voltage Swing 和 Pre-emphasis 组合DP 通常定义 4 个 Voltage Swing 和 Pre-emphasis 等级LevelVoltage SwingPre-emphasis0最低最低1更高更高2更高更高3最高最高Voltage Swing 和 Pre-emphasis 不能任意组合传统 DP Link Training 中要求Voltage Swing Level Pre-emphasis Level ≤ 3因此有效的组合包括Voltage SwingPre-emphasis 可选范围00 ~ 310 ~ 220 ~ 130例如初始训练通常从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 地址LaneBit 0Bit 1Bit 2Bit 4Bit 5Bit 60x0202Lane 0CR_DONECHANNEL_EQ_DONESYMBOL_LOCKED———0x0202Lane 1———CR_DONECHANNEL_EQ_DONESYMBOL_LOCKED0x0203Lane 2CR_DONECHANNEL_EQ_DONESYMBOL_LOCKED———0x0203Lane 3———CR_DONECHANNEL_EQ_DONESYMBOL_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 寄存器 0x0102TRAINING_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 Alignment1.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 AlignmentLane 间对齐。Sink 通过 DPCD 0x0204LANE_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 0x0202LANE0_1_STATUS、0x0203LANE2_3_STATUS以及 0x0204LANE_ALIGN_STATUS_UPDATED确认各 Lane 的最终训练状态以及 Lane 间对齐状态。确认训练成功后Source 通过 AUX 将 DPCD 0x0102TRAINING_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 差分信号分别连接到 STM32AUX → COMP1_INM (PA0)AUX− → COMP1_INP (PA1)再将 比较器输出信号 COMP1_OUT(PA6) 接入 Logic Analyzer。生成代码后在程序中启动 COMP1HAL_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 requestByte位字段含义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数据长度 - 1Byte 4...DataWrite 时的数据Command含义0x80Native AUX Write0x90Native AUX Read示例字节内容含义Byte 090Native AUXReadByte 102Address[15:8]Byte 202Address[7:0]Byte 302LEN 2 →读取 3 BytesAUX replyByte字段含义Byte 0ReplyAUX Reply 状态Byte 1...DataRead 操作返回的数据Reply含义0x00ACK操作成功0x01NACK0x02DEFER需要稍后重试示例:字节内容含义Reply00ACKData77 77 01DPCD 数据