一文打通Rockchip DP调试:从原理到实战,覆盖RK3399/RK3576/RK3588全平台 电子说
嵌入式开发中,DisplayPort(DP)接口的调试常让工程师头疼 —— 不同芯片特性差异大、Type-C 与标准口配置不同、高分辨率输出异常、MST 多屏适配难… 尤其是 Rockchip RK3399、RK3576、RK3588 这三款主流芯片,DP 功能和调试逻辑各有侧重。
今天从原理→配置→代码→调试→排坑,手把手教你搞定全平台 DP 调试,新手也能快速上手!
调试前必须明确芯片能力,避免“功能不支持却硬调” 的无用功。先看三款芯片的 DP 核心参数对比:
|
特性
|
RK3399
|
RK3576
|
RK3588
|
|
DP 版本
|
1.2
|
1.4a
|
1.4a
|
|
最大分辨率
|
4K@60Hz(VOPB)
|
4K@120Hz
|
8K@30Hz
|
|
MST 多流模式
|
不支持
|
支持(3 路 Stream)
|
不支持
|
|
VOP 数量 / 能力
|
2 个(VOPB:4K;VOPL:2.6K)
|
3 个 Video Port(对应 3 路 Stream)
|
4 个 Video Port(仅 0-2 支持 DP)
|
|
PHY 类型
|
Type-C PHY(与 USB3.0 共用)
|
USBDP PHY(与 USB3.0 共用)
|
USBDP PHY(双 PHY)
|
|
特殊功能
|
支持 PHY 信号微调
|
支持 MST 菊花链 / HUB
|
支持双 DP 拼接(Split Mode)
|
|
内核版本适配
|
4.4 及以上
|
6.1
|
5.10/6.1
|
1.VOP 与 DP 的连接逻辑
◦RK3399:DP 可选择 VOPB(高分辨率)或 VOPL(低分辨率)作为输入,同一时间仅用 1 个 U-PHY(0 或 1);
◦RK3576:1 个 DP 控制器 + 3 路 Stream,Stream-0 对应 VOP Video Port0(4K)、Stream-1 对应 Port1(2K)、Stream-2 对应 Port2(1080P),MST 模式需按能力绑定;
◦RK3588:2 个 DP 控制器(DP0/DP1),各对应 1 路 Stream,仅 Video Port0-2 可输出到 DP,不支持 MST。
1.PHY lane 复用规则
三款芯片均与 USB3.0 共用 PHY,Type-C 接口下需通过 PD 协议协商 lane 映射(如 RK3399 支持 C/D/E 三种映射,RK3576/RK3588 支持正反插自动切换),标准口需手动配置 lane 序号(4 lane/2 lane)。
DP 配置核心分Type-C Alt Mode(Type-C 接口)和Legacy Mode(标准 DP 口),不同平台、不同内核版本配置差异较大,直接上可复用的实战方案。
无论哪款芯片,先确保内核编译选项开启:
# 必须开启的选项CONFIG_DRM_DP_AUX_CHARDEV=y # 支持DPCD读写CONFIG_DRM_ROCKCHIP=y # Rockchip DRM核心CONFIG_USB_TYPEC_TCPM=y # Type-C TCPM框架(5.10+内核)CONFIG_EXTCON_PD_VIRTUAL=y # RK3399 4.19及以下内核需开启(虚拟PD)
特殊固件:RK3399 DP 需加载微控制器固件,存放路径为/lib/firmware/rockchip/dptx.bin,缺失会导致驱动加载失败。
Type-C 接口需通过 PD 协议协商 lane 和 HPD,核心是配置DP 控制器 + PHY+PD 芯片,分平台示例:
# 1. 使能DP控制器,绑定VOPB(高分辨率)&cdn_dp {status = "okay";phys = <&tcphy0_dp>; # 关联PHY0};&dp_in_vopb { status = "okay"; }; # 用VOPB&dp_in_vopl { status = "disabled"; }; # 禁用VOPL# 2. 配置Type-C PHY(TCphy0)&tcphy0 {status = "okay";svid = <0xff01>; # DP固定SVIDorientation-switch; # 支持正反插port {#address-cells = <1>;#size-cells = <0>;# 正反插切换端点tcphy0_orientation_switch: endpoint@0 {reg = <0>;remote-endpoint = <&usbc0_orien_sw>;};# DP Alt Mode切换端点tcphy_dp_altmode_switch: endpoint@1 {reg = <1>;remote-endpoint = <&dp_mode_sw>;};};};# 3. 配置PD芯片(以fusb302为例)&i2c2 {usbc0: fusb302@22 {compatible = "fcs,fusb302";reg = <0x22>;interrupts = <&gpio3 RK_PB4 IRQ_TYPE_LEVEL_LOW>;vbus-supply = <&vbus5v0_typec>;status = "okay";usb_con: connector {compatible = "usb-c-connector";displayport = <&cdn_dp>; # 绑定DP控制器altmodes {altmode@0 {reg = <0>;svid = <0xff01>; # 对应DPvdo = <0xffffffff>;};};# 绑定PHY切换端点ports {port@1 {reg = <1>;dp_mode_sw: endpoint {remote-endpoint = <&tcphy_dp_altmode_switch>;};};};};};};
&dp { status = "okay"; };&dp0 { status = "okay"; };&dp0_in_vp2 { status = "okay"; };&usbdp_phy0 {status = "okay";orientation-switch;svid = <0xff01>;sbu1-dc-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;sbu2-dc-gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>;port {};};
&dp0 { status = "okay"; };&dp0_in_vp2 { status = "okay"; };&usbdp_phy0 {status = "okay";orientation-switch;svid = <0xff01>;sbu1-dc-gpios = <&gpio4 RK_PA6 GPIO_ACTIVE_HIGH>;sbu2-dc-gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>;};
标准 DP 口无需 PD 协商,但需手动配置HPD 引脚和lane 映射,以 RK3399(内核 5.10+)为例:
# 1. DP控制器配置(用U-PHY0,绑定VOPB)&cdn_dp {status = "okay";phys = <&tcphy0_dp>;pinctrl-names = "default";pinctrl-0 = <&dp_hpd>; # HPD引脚配置hpd-gpios = <&gpio4 RK_PD1 GPIO_ACTIVE_HIGH>; # HPD用GPIO4_D1};&dp_in_vopb { status = "okay"; };# 2. PHY lane映射(4 lane模式,按硬件原理图适配)&tcphy0 {status = "okay";rockchip,dp-lane-mux = <2 3 0 1>; # DP lane0→PHY2,lane1→PHY3,lane2→PHY0,lane3→PHY1};# 3. 配置HPD引脚&pinctrl {dp {dp_hpd: dp-hpd {rockchip,pins = <4 RK_PD1 RK_FUNC_GPIO &pcfg_pull_down>;};};};
注意:RK3399 内核 4.19 及以下需打HPD 通知补丁(extcon-pd-virtual 驱动),开启CONFIG_EXTCON_PD_VIRTUAL=y,具体补丁见官方指南 2.2.2 节。
调试时需修改驱动或 DTS,先记准各平台的核心代码位置:
|
模块
|
RK3399
|
RK3576/RK3588
|
|
DP 控制器驱动
|
drivers/gpu/drm/rockchip/cdn-dp-*.c
|
drivers/gpu/drm/rockchip/dw-dp.c
|
|
PHY 驱动
|
drivers/phy/rockchip/phy-rockchip-typec.c
|
drivers/phy/rockchip/phy-rockchip-usbdp.c
|
|
参考 DTS
|
arch/arm64/boot/dts/rockchip/rk3399-evb-ind.dtsi
|
RK3576:rk3576-evb1.dtsi;RK3588:rk3588-evb1-lp4.dtsi
|
|
PD 芯片驱动
|
drivers/usb/typec/tcpm/fusb302.c(通用)
|
drivers/usb/typec/tcpm/fusb302.c |
示例:若 RK3399 DP Link Training 失败,可查看cdn-dp-link-training.c中的cdn_dp_link_train()函数,添加日志打印协商过程;RK3588 PHY 异常则查phy-rockchip-usbdp.c的udphy_power_on/off()函数。
DP 调试的核心是 “先看状态,再查日志,最后硬软结合”,以下方法覆盖 90% 场景:
所有调试从“连接状态” 开始,通过/sys/class/drm节点快速判断:
# 1. 查看所有DRM设备(找DP节点,如card0-DP-1)ls /sys/class/drm/# 2. 查看DP使能/连接状态cat /sys/class/drm/card0-DP-1/enabled # enabled/disabledcat /sys/class/drm/card0-DP-1/status # connected/disconnected# 3. 查看显示器支持的分辨率cat /sys/class/drm/card0-DP-1/modes# 4. 保存EDID(用于分析显示器参数)cat /sys/class/drm/card0-DP-1/edid > /data/dp_edid.bin

解读:若status为disconnected,Type-C 口查 PD 协商,标准口查 HPD 引脚;若enabled为disabled,查驱动加载或 DTS 绑定。
当怀疑软件使能逻辑有问题时,强制开启 / 关闭 DP 验证硬件:
# 强制禁用DPecho off > /sys/class/drm/card0-DP-1/status# 强制使能DPecho on > /sys/class/drm/card0-DP-1/status# 恢复热插拔检测echo detect > /sys/class/drm/card0-DP-1/status
AUX_CH 是 DP 的 “控制通道”,读写 DPCD(DP 配置数据)可判断 AUX 是否正常:
# 前提:开启CONFIG_DRM_DP_AUX_CHARDEV=y# 读取DPCD(例:读0x00200开始的2个寄存器)dd if=/dev/drm_dp_aux0 bs=1 skip=$((0x00200)) count=2 status=none | od -tx1# 写入DPCD(例:向0x100写入0x0a、0x80)echo -e -n "x0ax80" | dd of=/dev/drm_dp_aux0 bs=1 seek=$((0x100)) count=2 status=none
正常标志:读取返回ret=0,异常则返回-110(超时),需查 AUX 时钟或硬件。
Type-C 口连接异常(如disconnected),优先查 PD 芯片和 TCPM 框架日志:
# 1. 查看PD/TCPM节点(以fusb302为例)ls /sys/kernel/debug/usb/ # 找fusb302-2-0022(PD芯片)、tcpm-2-0022(TCPM框架)# 2. 查看TCPM协商日志(关键看DISCOVER_IDENTITY/ENTER_MODE等阶段)cat /sys/kernel/debug/usb/tcpm-2-0022# 3. 查看Type-C正反插状态cat /sys/class/typec/port0/orientation # normal/reverse# 4. 确认DP Alt Mode是否识别(svid=0xff01为DP)cat /sys/class/typec/port0-partner/port0-partner.0/svid
正常流程:日志需包含
DISCOVER_IDENTITY→DISCOVER_SVIDS→DFP_TO_UFP_ENTER_MODE→ATTENTION,缺失则查 PD 芯片供电或 I2C 通信。
若 DP 输出花屏、闪屏,可能是 PHY 信号幅值 / 加重不足,需调整寄存器(UPHY0 基地址0xff7c0000):
# 1. 电压幅值调整(lane0,0x00最大,0x36最小)io -4 0xff7d0140 0x2a # 中等幅值# 2. 预加重调整(lane0,0xff最大,0x00最小)io -4 0xff7d0130 0x15 # 中等加重# 3. boost使能(增强信号,lane0)io -4 0xff7d0784 0x700 # 最大boost
MST 模式下需确认拓扑和带宽分配,通过以下命令排查:
# 查看MST拓扑、带宽、连接器路径cat /sys/kernel/debug/dri/0/DP-1/dp_mst_info
重点看MST Port Info(设备连接是否正确)和Atomic state info(带宽是否超限)。
4K@120Hz 输出需提高 VOP ACLK,验证是否生效:
# 查看VOP ACLK(需为800MHz)cat /sys/kernel/debug/clk/clk_summary | grep "aclk_vop"
当需要更详细的调试信息(如 ATOMIC 提交、DP Link Training),动态开启日志:
# DRM日志等级:0x10=ATOMIC,0x100=DP相关echo 0x110 > /sys/module/drm/parameters/debug # 同时开启ATOMIC和DP日志# 查看日志dmesg | grep -i "dp"
结合官方 FAQ 和实际项目经验,整理最常遇到的问题及解决方案:
现象:日志有clock recovery succeeded+channel equalization succeeded,但显示器无图像。
原因 & 解决:
•dclk 分配错误:日志中set dclk_vop2 to XXX, get YYY(请求值≠实际值),需查时钟树配置(cat /sys/kernel/debug/clk/clk_summary),联系 FAE 确认分频参数;
•未分配图层:执行cat /sys/kernel/debug/dri/0/summary,若无Esmartx-win0: ACTIVE,需用户空间分配显示缓冲区(如调用 DRM 接口创建图层)。

现象:status为disconnected,TCPM 日志无协商流程。
解决步骤:
1.查 PD 芯片供电:确认vbus5v0_typec是否正常(用万用表测电压);
2.提高 I2C 速率:在 PD 芯片节点添加clock-frequency = <400000>(默认 100K,提至 400K);
3.换认证 Type-C 线:部分线材不支持 DP Alt Mode,优先用原装线;
4.RK3399 内核 4.19 及以下:确认extcon-pd-virtual驱动已加载(lsmod | grep extcon_pd_virtual)。
现象:DPCD 读写超时,日志有failed to probe DP link: -110。
解决方向:
•aux16m 时钟异常:RK3576/RK3588 默认clk_aux16m为 15.84MHz,查cat /sys/kernel/debug/clk/clk_summary | grep "aux16m",异常则恢复 GPLL 为 1188MHz;
•DP dual mode 转接线:RK3588 不支持 dual mode(DP+HDMI TMDS),若用 “DP 转 HDMI” 线,需换 HDMI2.0 及以上版本线材;
•信号干扰:Type-C 直连时,断开 USB DP/DM 引脚测试,换屏蔽性好的线材。
现象:标准 DP 口插入显示器,status仍为disconnected。
解决:
•内核 5.10+:确认 DTS 中hpd-gpios配置正确,引脚电平是否随插拔变化(用gpiod_get_value命令);
•内核 4.19 及以下:打 HPD 通知补丁(extcon-pd-virtual驱动),开启CONFIG_EXTCON_PD_VIRTUAL=y,DTS 添加虚拟 PD 节点(见官方指南 2.2.3 节)。
现象:3 路 Stream 中某路无图像,dp_mst_info显示带宽充足。
解决:
•检查 Stream 与 VOP 绑定:必须按 “能力匹配” 绑定(Video Port0→Stream-0,Port1→Stream-1,Port2→Stream-2),DTS 中禁用不匹配的 endpoint;
•分辨率过滤:Stream-2 最大支持 1080P,若接 2K 显示器会被过滤,需限制用户空间输出分辨率。
1.RK3399:关注内核版本适配(TCPM/EXTCON)、PHY 信号微调、HPD 引脚配置;
2.RK3576:MST 模式需算带宽(总带宽≤7.97Gbps)、Stream-VOP 严格绑定、AUX 时钟检查;
3.RK3588:双 DP 配置区分 DP0/DP1、4K@120Hz 需提 VOP ACLK、避免 dual mode 转接线。
最后给个通用调试流程:先看连接状态→再查驱动日志→硬件测信号(PHY/AUX)→软件调配置(DTS / 时钟) ,按层排查,DP 问题很快就能定位!
全部0条评论
快来发表一下你的评论吧 !