【type-c】DP协议通信过程
DP协议通信过程
- 前言
- CC通信
- cc1/2正反插确认
- source和sink确认
- PD充电协议确认
- VDM 消息
- DP协议
- 基本流程
- DPCD核心寄存器表
- LT8712 内部寄存器速查表(调试高频,配合 DPCD 0x202 定位黑屏)
- DPCD 0x202 详细 bit 定义(再次整理,抓包解码直接对照)
- CC 消息关键 VDM 报文(抓包过滤关键字,Ellisys/Acute 直接搜)
- Ellisys/Acute 抓包实战:Enter Mode 请求与 ACK 字段级解析
- 调试抓包判断逻辑(你定位黑屏 / 无信号 / 训练失败)
- 黑屏 / 无信号故障排查速查表
- 抓包仪触发建议(Ellisys CTA/Acute)
- LT8712 特有坑点(调试高频踩坑)
- 整体调试决策树(快速定位卡在哪一步)
- 总结
以LT8712SX,DP转两路HDMI口为例
前言
- 黑屏先查 Enter Mode ACK
- ACK 后无 AUX 查 SBU/MUX
- DPCD202=0x77 训练成功
- 0x00 查主链路/固件
- 0x07/0x70 查单 lane
- HDCP 失败但 0x77 查 HDCP key
本文以LT8712SX(DP 转双路 HDMI)为例,系统讲解 Type-C/DP 的完整通信过程:从 CC 线上的 PD 协商、VDM Alt Mode 建立,到 AUX 读 DPCD、链路训练,再到黑屏/无信号故障的抓包定位方法。内容面向正在调试 DP 转 HDMI 方案的硬件与嵌入式工程师,重点给出可直接对照抓包仪(Ellisys/Acute)的寄存器与报文特征,帮助你在实际项目中快速定位协商失败点。
CC通信
cc1/2正反插确认
如何确认哪根cc线进行通信,
source依据cc1和cc2的电平决定哪个cc线用于BMC通信,
保持高电平5v左右cc一般未使用,如果线材带有e-Marker芯片,即给这颗芯片供电
电压在1.68v左右,用于cc通信,BMC通信
原理:
sink的cc1或cc2带有下拉电阻Rd,而source的cc1和cc2都带有上拉电阻Rp
source和sink确认
充电角色可以分
source和sink角色
source (供电端):向外输出电源
sink(受电端):接收电源,负责端
DP角色也可以分
source和sink角色
DRP表示dual roal power 双角色端口,既能source供电,也能当sink取电
比如手机,或者lt8712
PD充电协议确认
PD源端发送 Source capabilities(VBUS供应协商),
从设备回复sink capabilities
这个能力指的是在确认谁做source后,source获取sink端的受电能力
VDM 消息
VDM是PD协议里厂商自定义消息,跑在cc线上,
普通的PD消息只是负责充电功能,VDM负责除usb外的替代模式(Alt Mode).如PD,PCIE等
VDM Discovery Identify
VDM Discovery SVIDs—— LT8712SX上报支持SVID=0xFF01(DP Alt Mode)
VDM Discovery Modes——LT8712SX上报DP Alt Mode 能力(lane 配置)
VDM Enter Mode:PC发送进去DP Alt Mode命令
LT8712SX内部MUX切换
:SUB1/SUB2——>AUX_P/AUX_N
高速差分脚切换为DP Main Link
DP协议
基本流程
1、LT8712SX检测到显示器HPD为高,LT8712SX发送Attention_H给到PC
2、PC启动AUX,写DPCD 0x100/101,链路训练,读DPCD0x202
3、中途,显示器重新上电,切换分辨率,HDMI HPD不变,LT8712SX向PC发送Attention_H
4、PC抓到HPD脉冲,触发AUX重读EDID,不会重跑CC VDM
AUX读DPCD 0x00~0x0D:读取LT8712的DP能力(max lane、max rate)
AUX读EDID(I2C-over-AUX):LT8712缓存了后端HDMI显示器EDID
AUX写DPCD 0x100 LINK_BW_SET 设置链路速率
AUX写DPCD 0x101 LANE_COUNT_SET 设置通道数(1、2、4lane)
AUX写DPCD 0x102 使能TPS1训练序列,关闭加扰
PC发送Main Link TPS1训练码型
AUX读 DPCD 0x202 (Lane0、1 Link Status)
AUX读 DPCD 0x203 (Lane2、3 Link Status)
判断CR_DONE、EQ_DONE、SYMBOL_LOCK、LANE_ALIGN
全部Lane状态位OK,进入TPS2/3均衡训练
训练完成,DPCD 写0x102退出训练,开启Scrambler
若开启 HDCP,LT8712 与 PC 做 HDCP 1.4/2.2 握手;HDCP 失败同样黑屏,但此时 DPCD 0x202 已为 0x77
开始正常视频传输,LT8712把DP主链路HDMI送给显示
下面是 PC(Source)与 LT8712(Sink)之间从 CC 通信到 HDMI 输出的完整交互时序图,包含关键报文与寄存器读写动作:
DPCD核心寄存器表
| DPCD 地址 | 名称 | 用途 |
|---|---|---|
| 0x0000 | DPCD_REV | DP 版本(LT8712 是 1.2,值 = 0x12) |
| 0x0001 | MAX_LINK_RATE | 最大速率:0x06=1.62G;0x0A=2.7G;0x14=5.4G |
| 0x0002 | MAX_LANE_COUNT | 最大通道数,LT8712 支持 2/4lane |
| 0x0100 | LINK_BW_SET | Source 写入,选定本次链路速率 |
| 0x0101 | LANE_COUNT_SET | Source 写入,选定本次使用 lane 数量 |
| 0x0102 | TRAINING_PATTERN_SET | TPS 码型选择、scrambler 开关 |
| 0x0103~0x0106 | LANE0~3 PRE_EMPH / SWING | 每 lane 电压摆幅、预加重配置 |
| 0x0202 | LINK_STATUS LANE0+LANE1 | Lane0、Lane1 训练状态寄存器(你问的 DPCD202) |
| 0x0203 | LINK_STATUS LANE2+LANE3 | Lane2、Lane3 训练状态寄存器 |
| 0x0204 | LANE0~1 ADJUST_REQUEST | Sink 反馈均衡调整请求 |
| 0x0205 | LANE2~3 ADJUST_REQUEST | Lane2/3 均衡请求 |
bler,进入正常视频传输
调试要点:抓包时看到 DPCD 0x102 从 0x01 → 0x02/0x03 → 0x00 的变化,就说明训练在正常推进;若一直停在 0x01 且 DPCD202 为 0x00,说明 CR 阶段就失败了。
LT8712 内部寄存器速查表(调试高频,配合 DPCD 0x202 定位黑屏)
以下为 LT8712SX 内部寄存器(I2C 从机地址 0x98/0x9A 等,具体以数据手册为准),用于在 DPCD 0x202 之外进一步定位黑屏根因。地址为示意,实际以 Lontium 数据手册为准。
| 地址 | 名称 | 读写类型 | 典型值 / 含义 | 调试用途 |
|---|---|---|---|---|
| 0x0000 | CHIP_ID | R | 芯片 ID,LT8712SX 固定值 | 确认 I2C 通路是否正常、芯片是否上电 |
| 0x0001 | FW_VERSION | R | 固件版本号(如 0x10 = v1.0) | 判断是否老固件导致 DPCD202 误报 0x77 |
| 0x0002 | MUX_CTRL | R/W | 0x00=CC 直通;0x01=切 AUX;0x02=切 DP Main Link | 确认 Enter Mode ACK 后 MUX 是否真正切换 |
| 0x0003 | HPD_CTRL | R/W | 0x00=HPD 低;0x01=HPD 高(内部模拟) | 手动拉高/拉低 HPD,验证 PC 是否触发 AUX 重读 |
| 0x0004 | HDCP_STATUS | R | bit0=HDCP1.4 完成;bit1=HDCP2.2 完成 | DPCD202=0x77 但黑屏时,查 HDCP 握手是否完成 |
| 0x0005 | HDCP_KEY_VALID | R | 0x00=key 未烧录;0x01=key 有效 | HDCP 失败黑屏时,优先确认 key 是否烧录 |
| 0x0006 | LINK_TRAIN_STATE | R | 0x00=未训练;0x01=TPS1;0x02=TPS2/3;0x03=完成 | 对照 DPCD202,确认 LT8712 内部训练状态机进度 |
| 0x0007 | AUX_ERR_FLAG | R | bit0=AUX 超时;bit1=AUX NAK | AUX 读 DPCD 超时时,定位是通路断还是协议错 |
| 0x0008 | EDID_CRC | R | 缓存 EDID 的 CRC 校验值 | 确认 LT8712 内部 EDID 缓存是否被正确写入 |
这些寄存器如何配合 DPCD 0x202 定位黑屏:
DPCD 0x202 是 PC 视角的「训练结果」,而 LT8712 内部寄存器是「芯片侧的真实状态」,两者对照才能快速收敛根因:
- DPCD202 恒为 0x00:先读
LINK_TRAIN_STATE,若为 0x00 说明 LT8712 根本没进入训练,查MUX_CTRL是否切到 DP Main Link、CHIP_ID是否正常;若LINK_TRAIN_STATE已到 0x03 但 DPCD202 仍为 0x00,则是固件上报异常(老固件坑点)。 - DPCD202=0x77 但黑屏:读
HDCP_STATUS,若 bit0/bit1 均为 0,说明卡在 HDCP 握手,再读HDCP_KEY_VALID确认 key 是否烧录;若 HDCP 正常,则查 HDMI 侧输出(非 DP 训练问题)。 - AUX 读 DPCD 超时:读
AUX_ERR_FLAG,bit0=1 说明 AUX 通路断(查 SBU/MUX),bit1=1 说明协议层 NAK(查 LT8712 固件/状态机)。 - HPD 相关黑屏:读
HPD_CTRL确认 LT8712 是否已拉高 HPD;若为 0 而 DPCD202 正常,说明 PC 根本没收到 HPD,不会发起 AUX,直接无信号。
DPCD 0x202 详细 bit 定义(再次整理,抓包解码直接对照)
8bit 寄存器,bit0=LSB
Bit 归属 含义 置 1 = 成功 Bit0 Lane0 CR_DONE 时钟恢复完成 1 Bit1 Lane0 CHANNEL_EQ_DONE 通道均衡完成 1 Bit2 Lane0 SYMBOL_LOCKED 符号锁定 1 Bit3 Lane0 LANE_ALIGN_DONE 通道对齐完成 1 Bit4 Lane1 CR_DONE 时钟恢复完成 1 Bit5 Lane1 CHANNEL_EQ_DONE 通道均衡完成 1 Bit6 Lane1 SYMBOL_LOCKED 符号锁定 1 Bit7 Lane1 LANE_ALIGN_DONE 通道对齐完成 1
✅ 正常训练成功(Lane0+Lane1 全部 OK)读到值:0x77
- 0x77 = 0b01110111
- bit0~3 = 0b0111(Lane0 CR、EQ、SYM_LOCK 完成;对齐完成)
- bit4~7 = 0b0111(Lane1 CR、EQ、SYM_LOCK 完成;对齐完成)
常见失败值:
- 0x00:CR 全部失败,AUX 通但高速主链路没抓到时钟;查 MUX、DP 差分、LT8712 供电 / 固件
- 0x07:Lane0 成功,Lane1 CR 失败,单 lane 训练
- 0x70:Lane1 成功,Lane0 失败
CC 消息关键 VDM 报文(抓包过滤关键字,Ellisys/Acute 直接搜)
DP Alt Mode VDM SVID=0xFF01
Discover Identity:LT8712 上报自身 IDDiscover SVIDs:返回支持 SVID 列表,包含 0xFF01Discover Modes:返回 DP Alt Mode Mode1 能力(lane 映射,Type‑C 引脚分配)Enter Mode:PC 发送 VDM,LT8712 确认 ACK,进入 DP Alt Mode,切换 MUX
这一步失败的话,后面完全不会有 AUX/DPCD 交互,直接无信号。
注意:LT8712 是 UFP,CC 上 LT8712 负责 VDM 应答;PC 是 DFP,发起 VDM。
Ellisys/Acute 抓包实战:Enter Mode 请求与 ACK 字段级解析
以 PC(DFP)发起、LT8712(UFP)应答的Enter Mode为例,抓包仪上按SVID=0xFF01过滤即可定位到这两条报文。下面逐字段拆解,并标注每个字段对应 LT8712 的哪个行为。
① PC → LT8712:Enter Mode 请求(DFP 发起)
| 字段 | 值 | 含义 | 对应 LT8712 行为 |
|---|---|---|---|
| VDM Type | 0x01(Enter Mode) | 请求进入指定 Alt Mode | LT8712 收到后校验自身是否支持该 Mode |
| Command Code | 0x06(Enter Mode) | 与 VDM Type 配合,标识这是一条进入命令 | 触发 LT8712 内部状态机进入 DP Alt Mode 流程 |
| SVID | 0xFF01 | DP Alt Mode 的厂商 ID | LT8712 比对自身支持的 SVID 列表,确认是 DP Alt Mode |
| Object Position | 0x01 | 请求进入 Mode1(DP Alt Mode 的 lane 映射配置) | LT8712 按 Mode1 配置切换 MUX:SUB1/SUB2 → AUX_P/AUX_N,高速差分切为 DP Main Link |
| VDO | 0x0001 | Mode1 能力描述(DP 引脚分配、lane 数) | LT8712 依据 VDO 决定 lane 映射与引脚复用方式 |
② LT8712 → PC:Enter Mode ACK(UFP 应答)
| 字段 | 值 | 含义 | 对应 LT8712 行为 |
|---|---|---|---|
| VDM Type | 0x01(Enter Mode) | 应答同一命令类型 | 表示 LT8712 已处理该 Enter Mode 请求 |
| Command Code | 0x06(Enter Mode) | 与请求一致 | 确认 LT8712 已进入 DP Alt Mode 状态机 |
| SVID | 0xFF01 | 应答同一 SVID | 确认 LT8712 接受 DP Alt Mode |
| Object Position | 0x01 | 应答同一 Mode | 确认 LT8712 已按 Mode1 完成 MUX 切换 |
| ACK/NAK | ACK | 应答结果 | ACK = MUX 已切换,后续 AUX/DPCD 才会出现;NAK = LT8712 拒绝,查固件/能力配置 |
实战定位要点:
- 抓包时若只看到请求、没有 ACK → LT8712 未应答,卡在 VDM 层,查 CC 电平、LT8712 固件是否支持 0xFF01
- 若 ACK 里 Object Position 与请求不一致 → LT8712 拒绝了 Mode1,查固件 lane 配置
- ACK 之后才应出现 AUX 读 DPCD 0x00~0x0D;若 ACK 后无 AUX → MUX 未真正切换,查 SUB/SBU 通路
调试抓包判断逻辑(你定位黑屏 / 无信号 / 训练失败)
- CC 层:有没有成功收到
Enter Mode ACK- 无 → 卡在 PD/Alt Mode 协商,DP MUX 没切,AUX 不会出现
- HPD:LT8712 是否拉 HPD 高;PC 检测 HPD 才会发起 AUX 读 DPCD/EDID
- AUX 读 DPCD 0x00~0x0D:PC 能否读到 LT8712 的 DP 能力,读超时 = AUX 断线(SBU 问题)
- 写 0x100/0x101:PC 配置速率和 lane;LT8712 是否 ACK
- 写 TPS1,发主链路训练码 → 读 DPCD0x202
- 读到 0x77:Lane0/1 训练 OK;继续 TPS2/3
- 反复读 DPCD202 一直为 0:高速 DP 主链路时钟恢复失败,优先查 LT8712 固件、Type‑C 走线、MUX 切换
- 训练失败后 PC 会降级重试:降 lane(4→2→1)或降速率(5.4G→2.7G→1.62G),抓包注意观察 LINK_BW_SET / LANE_COUNT_SET 是否被改写
- AUX 读 EDID(I2C-over-AUX):读超时 = DDC 通路问题,查 SBU 差分、LT8712 到 HDMI 的 DDC 走线;EDID 读不到 PC 会直接报无信号
- 链路训练全部完成后,LT8712 再做 HDMI 侧时序、HDCP 握手,推画面给显示器
黑屏 / 无信号故障排查速查表
| 故障现象 | 排查步骤 | 关键寄存器 / 报文特征 | LT8712 侧优先检查项 |
|---|---|---|---|
| CC 无 Enter Mode ACK | ① 抓包过滤 SVID=0xFF01,确认是否发出 Enter Mode 请求;② 检查 CC1/CC2 电平与 BMC 通信是否正常;③ 确认 LT8712 固件是否支持 0xFF01 | 只有请求、无 ACK;无后续 AUX/DPCD 交互 | 固件版本、CC 电平、MUX 是否未切换 |
| AUX 读 DPCD 超时 | ① 确认 HPD 已拉高;② 抓包看 AUX 是否有响应;③ 检查 SBU1/SBU2 差分通路 | AUX Read DPCD 0x00~0x0D 无 ACK / 超时 | SBU 走线、MUX 是否切到 AUX_P/AUX_N、供电 |
| DPCD202 恒为 0x00 | ① 确认已写 0x100/0x101 并发送 TPS1;② 抓包看主链路是否发出训练码型;③ 检查高速差分通路 | DPCD 0x202 反复读为 0x00,CR 全部失败 | 固件、DP 差分走线、MUX 切换、供电 |
| DPCD202 = 0x07 | ① 确认 Lane0 训练 OK、Lane1 CR 失败;② 检查 Lane1 差分走线与预加重配置;③ 观察 PC 是否降级为单 lane 重试 | 0x07 = Lane0 成功、Lane1 失败;LANE_COUNT_SET 可能被改写为 1 | Lane1 走线、PRE_EMPH/SWING 配置、固件 |
| HDCP 失败黑屏 | ① 确认链路训练已完成(DPCD202=0x77);② 抓包看 HDCP 1.4/2.2 握手是否完成;③ 检查 HDCP key 是否烧录 | DPCD202 已为 0x77,但 HDCP 握手无 ACK / 超时 | HDCP key、握手时序、固件 HDCP 支持 |
抓包仪触发建议(Ellisys CTA/Acute)
- 触发点 1:CC 上 VDM Enter Mode
- 触发点 2:AUX Read DPCD 0x202(你最关心的寄存器)
- 同步采集:CC1、CC2、SBU1、SBU2、HPD,时间轴对齐,方便看 CC Alt Mode 完成之后 AUX 才开始跑 DPCD
LT8712 特有坑点(调试高频踩坑)
- LT8712 固件版本会影响 DPCD 返回值;老固件链路训练状态上报异常,DPCD202 误报 0x77 但实际锁不住
- LT8712 内部 EDID 缓存:PC 读到的 EDID 是 LT8712 缓存 HDMI 显示器 EDID,不是 DP sink 原生 EDID
- 4K@60 场景:LT8712 DP1.2 最多 2lane 5.4G;如果 EDID 报 4k60,PC 会尝试 2lane 训练,DPCD0x202 就是 Lane0/1 状态
- HPD 是 LT8712 内部模拟,后端 HDMI 显示器拔插,LT8712 会重新 assert HPD,触发整套 DPCD 链路训练重跑
整体调试决策树(快速定位卡在哪一步)
总结
本文以 LT8712SX 为例,完整梳理了 DP 转 HDMI 的通信链路,核心要点可归纳为三层:
- CC 通信层:先通过 CC1/CC2 电平确认正反插与 source/sink 角色,再完成 PD 充电协商;随后通过 VDM(SVID=0xFF01)完成 DP Alt Mode 协商,
Enter Mode ACK是 MUX 切换、AUX 通路建立的前提——这一步失败,后面不会有任何 DPCD 交互,直接无信号。 - DPCD 训练层:PC 通过 AUX 写 0x100/0x101 配置速率与 lane,发 TPS1 训练码型后读 DPCD 0x202 判断训练结果。
0x77表示 Lane0/1 全部训练成功;0x00表示 CR 全部失败(查 MUX/差分/供电/固件);0x07/0x70表示单 lane 失败(查对应 lane 走线与预加重配置)。 - 故障排查层:按「CC → HPD → AUX → 训练 → HDCP」的顺序逐级定位,配合 Ellisys/Acute 抓包仪按 SVID=0xFF01、DPCD 0x202 触发,可快速锁定黑屏/无信号卡在哪一步。注意 LT8712 固件版本、内部 EDID 缓存、HPD 模拟等特有坑点。