尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

RK3576 HDMI显示调试实战:HPD搭错线与DDC接反排查全记录

RK3576 HDMI显示调试实战:HPD搭错线与DDC接反排查全记录 做嵌入式这几年我越来越确信一个道理90% 的疑难杂症最后都会走到“你回头看看硬件是不是接错了”这一步。这不这次在 RK3576 平台上调 HDMI从开机黑屏到找出真凶前后折腾了大半天结果就是底板上 HPD 搭错线、DDC 两根线还被掉了包。说出去可能就像个笑话但排查过程中丢掉的时间是真的。我把整套思路和踩坑点写下来给正在调 RK3576 或者其他 RK 平台显示输出的人做个参考——尤其是手里拿着另一套平台原理图、想快速改成新项目的朋友这篇应该能帮你少走好几次弯路。1. 项目背景与故障现象一块能开机的板卡为什么 HDMI 没画面1.1 RK3576 的显示输出方案RK3576 在显示这一块其实挺能打的带多路显示输出控制器常见的有 HDMI、DP、MIPI DSI 等接口面向工控、商显、小型主机这类场景完全够用。项目里我采用的是“核心板 自研底板”的常规玩法显示主控在核心板上HDMI 信号从板对板连接器引出再走底板到标准 Type-A 母座目标输出分辨率是 4K60Hz操作系统基于 Linux 内核显示链路走的是 DRM/KMS 这套框架。这类方案的好处是核心板已经帮你搞定了芯片电源、DDR 布线、时钟树这些麻烦事底板只需要关心外设和连接器。但代价也很明显你手里必须有一份准确的核心板接口手册把每个脚位的信号定义搞清楚。我这次恰恰就是在这个环节上吃了大亏。1.2 上电第一天的故障现场硬件工程师给板子焊好、上电之后串口终端能正常进入系统Qt 应用也能跑起来看起来一切都好。但 HDMI 接上 4K 显示器屏幕直接黑屏没任何反应。现象非常稳定插拔 HDMI 线的时候屏幕偶尔会闪一下但始终没有画面输出。我第一反应是软件问题毕竟这种“系统起来了但外设不干活”的故障很多时候是设备树没配好、驱动没绑定、或者显示通道没接通。于是我开始按常规套路排查查连接器状态、翻 dmesg、看设备树配置。结果一圈下来内核里 HDMI 驱动加载正常但连接器状态始终是 disconnected根本没有进入真正的显示链路初始化流程。1.3 一个没怀疑到的前提这个项目并不是从零开始画的底板而是参考了一块已经在量产的旧 RK 平台底板原理图直接改出来的。旧平台和新核心板都用了相同的板对板连接器封装我当时想着“都是 RK 平台显示接口大差不差”就沿用了原来的 HDMI 部分接线。这个“想当然”的决策是整个翻车现场的地雷引信。现在回过头看不同平台的核心板即便物理封装一样引脚定义也不一定按你熟悉的顺序排列。拿到新核心板手册之后不做逐脚核对省下的那点时间后面都会加倍还回去。2. 软件做先锋DRM 状态、内核日志与设备树核对2.1 先确认连接器到底检测到了什么在 Linux 的 DRM 框架下HDMI 连接器状态会直接反映到一个 sysfs 文件里这是排查显示问题第一眼应该看的东西。在板子的串口终端里执行cat /sys/class/drm/card0-HDMI-A-1/status正常情况下插着显示器应该输出connected拔掉则输出disconnected。我这边插着显示器的时候看到的还是disconnected拔掉线再看也一样。这个状态由硬件 HPD 引脚的电平决定驱动只是负责把电平翻译成状态。既然软件这边读取状态是稳定的“未连接”那就说明底层 HPD 信号根本没有给到 SoC。如果你手上有多块 HDMI 输出控制器路径名可能会是card1-HDMI-A-1之类具体以实际枚举顺序为准。先记住这个文件路径后面排查一直会用到。2.2 dmesg 里能读到什么信息接着查看内核日志里 HDMI 驱动的启动情况dmesg | grep -i hdmi日志里能看到 HDMI 控制器初始化、PHY 初始化、DRM 绑定这些过程。如果你看到类似 “hdmi: failed to get edid” 或者反复出现 connector 状态 change 的事件那往往意味着硬件链路已经通了问题出在 DDC 总线或者数据通道上。但我这台设备的情况是驱动初始化干净利落完全没有报错也完全没有检测到线缆插入的动作。从这里基本可以下一个阶段性结论不是驱动没加载不是设备树没使能而是硬件物理链路上 HPD 检测就没生效。2.3 modetest 与强制输出试验为了排除显示模式和帧缓冲的问题直接用 DRM 调试工具 modetest 看当前所有连接器和模式modetest -M rockchip -c输出里同样只有disconnected的 connectormode list 自然也是空的。不死心我又尝试强制指定分辨率往 HDMI 上推modetest -M rockchip -s 连接器ID:3840x216060具体参数格式跟你板子上安装的 libdrm 版本有关。结果可以预见驱动那边根本没有可用的显示模式强制设置也推不出画面。这个试验倒不是指望它能成功而是要确认“软件能做的都做了该轮到硬件给证据了”。2.4 软件排查小结软件侧排查下来可以排除的项包括设备树里 HDMI 节点未使能、驱动加载失败、DRM 管线绑定错误、显示时序配置问题。剩下的怀疑对象集中在硬件要么是 HPD 检测链路有问题要么是核心板到连接器的走线出了岔子。这里多说一句软件排查的意义不是证明软件没问题而是把问题的范围缩小。到这一步我敢确定问题就在硬件侧只是没想到坑会那么浅又那么深。3. 硬件来断案HPD 和 DDC 的现场测量与分析3.1 先搞懂 HPD 到底是个什么信号HPDHot Plug Detect是 HDMI 接口里负责“插入检测”的信号。标准 HDMI 连接器一共 19 个引脚其中第 18 脚是主机输出给显示器的 5V 电源第 19 脚就是 HPD。工作机制大致是这样的主机通过第 18 脚持续给显示器提供 5V 电压显示器检测到这个电压后通过第 19 脚把 HPD 拉高告知主机“我已经连上了你可以开始通信了”。换句话说在主机这一侧HPD 是一个输入信号。很多第一次画 HDMI 电路的人会把这个方向搞反总觉得“我要给显示器发一个信号告诉他我开机了”。实际上恰恰相反。RK3576 的 HDMI HPD 引脚通常复用自某个 GPIO核心板厂商会在设备树里把这个引脚的检测功能配好。底板要做的只是把核心板对应的 HPD 引脚准确无误地连到 HDMI 连接器的第 19 脚。3.2 万用表实测 HPD电平完全不符合常理给板子上电用万用表直接量 HDMI 母座第 19 脚对地电压。注意HDMI 母座的引脚编号从第 1 脚开始在母座背面会有一排引脚第 19 脚在左侧最远端对着一端数过去就能找到。正常板子不插显示器的状态下第 19 脚应该是 0V 或者被主板上拉后的一个较低电平插上显示器之后应该能被显示器主动拉高到 2.4V 以上。我实测的结果是不插线的时候第 19 脚电压 5V插上显示器之后照样是 5V纹丝不动。这立刻引起了我的警觉。HPD 脚上如果有个恒定 5V说明它根本就不是被显示器拉高的而是被板子内部接到了某个电源网络上。也就是说这个引脚确实是“躺在”一个电平为 5V 的网络里但那个网络大概率不是 HPD 自己的电路。为了进一步确认我又量了一下核心板连接器上对出去的 HPD 引脚发现同样是被电源拉住的电平。到这一步基本可以断定底板原理图里 HDMI_HPD 这个网络连到的根本不是核心板上的 HDMI_HPD 功能脚而是接到了另一个电源相关引脚上。3.3 翻原理图网络名没写错但脚位对不上回到原理图把 HDMI_HPD 这个网络顺着连线找下去果然发现问题。由于底板是参考旧平台改来的旧平台在同一编号连接器位置上的那个引脚是一个 3.3V 电源输出脚而新核心板在这个位置上的信号定义已经变成了 HDMI 相关引脚。原理图里网络名我还写着 HDMI_HPD但实际接到的核心板连接器物理位置上新核心板手册标注的是电源脚。换句话说核心板真正的 HDMI_HPD 功能脚在底板上根本没人去接处于悬空状态而板上标注为 HDMI_HPD 的那根走线其实接在了一个恒定电源上。所以 SoC 侧看到的就是一个永久高电平永远认为自己连上了显示器。但连接器 HPD 针上没有正确的信号所以实际插线拔线状态没有任何变化。修法不复杂把 HDMI_HPD 网络从错误的电源焊盘上断开用飞线引到核心板连接器上真正的 HDMI_HPD 引脚上并在 SoC 检测脚附近加一个 10kΩ 上拉电阻到 3.3V再并联一个小容量滤波电容。重新上电后插拔 HDMI 线时连接器状态终于能正确切换了。但新的问题立刻浮出水面系统终于检测到显示器连接了可 EDID 一直读不出来。3.4 第二处掉包DDC 的 SCL 和 SDA 接反了HDMI 主机需要读取显示器内部的 EDID 数据才能知道显示器支持哪些分辨率。EDID 走的是 DDC 通道本质是一条 I2C 总线。标准 HDMI 连接器上第 15 脚是 DDC_SCL第 16 脚是 DDC_SDA。修好 HPD 之后系统已经能报connecteddmesg 里也能看到驱动开始尝试读取 EDID但始终报错读不到有效数据。我用 i2c-tools 直接扫一下 DDC 挂载的总线i2cdetect -y 总线号显示器 EDID 的 I2C 地址固定是 0x50正常情况下能在扫描结果里看到对应地址。但我这边 0x50 始终不在线说明 DDC 总线物理上就没通。用逻辑分析仪分别抓连接器第 15 脚和第 16 脚的波形发现两个通道上都有 I2C 活动——但仔细看第 15 脚上的波形更像 SDA 数据信号第 16 脚上的波形反而带着规律的时钟脉冲。这就把“SCL 和 SDA 接反了”这件事锤死了。问题根源和刚才 HPD 一样底板原理图是从旧平台继承过来的旧平台上 HPD 附近的 DDC 总线连接顺序和新核心板不一致。相当于连接器第 15 脚物理上被接到了核心板的 SDA 网络第 16 脚接到了 SCL 网络软件再怎么配置也不可能凭空翻转物理总线。确认之后我用飞线把这两个网络交叉调回来。再扫描0x50 已经能正常出现系统也顺利读到了 EDID。4K 显示器终于点亮画面正常输出。3.5 为什么 DDC 接反这么隐蔽SCL 和 SDA 接反之后逻辑分析仪上其实两个通道都有波形如果你只看“有没有信号在跑”很容易放过它。但 I2C 的时序里 SCL 是始终由主机驱动的时钟SDA 则是数据线数据线上的变化总是以完成的时钟周期为节拍。抓住这个特征来判断哪根线是时钟、哪根线是数据而不是看信号幅值或者密度才不容易翻车。另外I2C 总线上的两根线默认都有上拉电阻静态都是高电平这就让“接反”在万用表下看起来毫无破绽。真正有效的验证手段就是逻辑分析仪抓时序或者干脆用飞线交叉验证一次立竿见影。4. 差分信号通道另一个容易“搭错”的重灾区4.1 HDMI 的通道构成与命名规则HDMI 的数据传输靠三对 TMDS 数据差分线和一对 TMDS 时钟差分线。三对数据线在逻辑上分别对应蓝、绿、红三个颜色通道时钟通道负责传输像素时钟。连接器层面这四对差分线分布在引脚 1~9 附近每对都由一个正极和一个负极组成比如通道 0 由第 1 脚和第 3 脚组成差分对第 2 脚和第 4 脚是各自对应的屏蔽地。板上走线命名一般会写成 TX0_P/TX0_N、TX1_P/TX1_N、TX2_P/TX2_N、TXCLK_P/TXCLK_N其中 P 代表正极N 代表负极。很多人在原理图阶段对“P 和 N 接反了”没有概念总想着反了就反了呗远端能自适应。这句话在某些速率下是成立的但 HDMI 到了 4K 甚至更高分辨率时信号余量已经很紧张极性一旦反了轻则花屏重则直接黑屏。关键是低速分辨率下它可能“看起来正常”这个伪装性非常强。4.2 极性接反的症状能显示和不能显示之间的一线之隔我见过一个比较典型的案例同一块板子1080p60Hz 显示完全正常一切换到 4K60Hz 就黑屏。排查了软件、时钟、供电一堆地方最后发现是其中一对差分线的 P/N 极性画反了。为什么会这样TMDS 是高速串行差分信号接收端靠差分电压恢复数据。P 和 N 反接之后差分信号的有效幅度没变但逻辑意义上的“0”和“1”被翻转了。HDMI 接收端在低速时会做一定程度的极性纠正让图像勉强能出到了高速率信号眼图本来就没多少余量再加上极性错误带来的编码混乱接收端再也恢复不出来结果就是黑屏或者严重花屏。这个故障的隐蔽性在于它不像 HPD 那样直接导致“检测不到”图像偶尔能亮让你不断往软件、驱动、时序方向怀疑。实际排查手法也不难在原理图里把四对差分线的 P/N 网络名全部列出来跟核心板手册一个个核对有条件的用示波器看接收端差分波形正负极交叉时波形相位关系明显不对。4.3 通道映射错乱的表现除了极性通道顺序也很容易出错。三对数据通道在逻辑上有明确分工通道 0 负责蓝色分量以及行场同步信号通道 1 负责绿色分量通道 2 负责红色分量。如果底板接线把通道 0 和通道 2 对调画面表现通常是颜色完全错乱或者根本没法同步。在 RK 平台核心板的板对板连接器上这几对差分线的排列顺序并不一定和 HDMI 逻辑通道编号一致。有的核心板会把 TX2 放在连接器比较靠前的位置TX0 放在靠后的位置完全是按芯片封装的走线便利来排的。如果你拿着老原理图直接抄不看新手册的引脚顺序恰好就把通道顺序搞错了。这类故障在低分辨率下可能显示出一张颜色怪异的画面但大多时候是直接无显示或者花屏反而容易被误认为硬件损坏。4.4 转接板设计阶段的核对方法对付这类问题最笨也是最有用的办法就是建一张信号对照表。把核心板连接器的引脚位置、核心板手册里的信号名、底板连接器的信号名、HDMI 标准连接器的引脚号全部列出来逐项打勾核对。尤其要注意那些名字相似但功能不同的信号比如 HDMI_TX0_P 和 HDMI_TX1_P差一个数字就全乱了。防呆设计上也有一点值得分享四对差分线在转接板/底板上尽量成组走线对内等长控制在 5mil 以内对外等长控制在 50mil 以内并且每对线都要保证连续的差分参考平面。这种设计没法在动态调试时讨好你但能保证你调完 HPD 和 DDC 之后差分通道不会突然给你来个回马枪。5. 踩坑总结、排查速查与防呆建议5.1 这次踩坑的根因分析复盘下来这次 HPD 搭错线、DDC 线序调包根子上就一句话太相信旧经验没有把新核心板手册当回事。旧平台原理图能跑量产不代表新平台可以原样照搬。板对板连接器的物理封装一样不代表里面每个脚的信号定义一样。我这次同时踩了电源引脚当 HPD、SCL/SDA 反接两个坑本质都是参考设计校验做得不够。做嵌入式硬件调试很多问题并不是别人故意埋了雷而是你在某个环节的“想当然”被现实无情纠正。这种纠正通常是善意的至少不是烧板级别的故障但浪费的时间足够让人记一辈子。5.2 HDMI 调试三步走速查表结合这次经历我整理一个 HDMI 调试速查表按现象去查原因效率会高很多故障现象优先检查项常用排查手段修复动作连接器状态一直 disconnected插拔无变化HPD 检测链路万用表测连接器第 19 脚核对核心板连接器引脚定义修正 HPD 网络接线补上拉电阻connected 但读不到 EDIDDDC 总线 SCL/SDAi2cdetect 扫 0x50逻辑分析仪抓第 15/16 脚波形检查 SCL/SDA 是否反接飞线对调EDID 能读到但高分辨率黑屏/花屏差分线极性或通道顺序核对四对差分网络命名示波器看差分波形修正 P/N 极性、通道映射个别分辨率正常切高分辨率无信号信号完整性余量不足检查差分对内等长、阻抗、参考平面优化走线降低分辨率测试边界5.3 新手避坑我的六条实操心得第一拿到核心板手册的第一件事就是把所有显示相关信号整理成表格。别嫌麻烦这份表格能让你在画原理图、检查 PCB、调试硬件三个环节反复受益。表格里至少包含信号名、核心板连接器引脚号、你底板网络名、连接器目标引脚号。第二HPD 电路的设计方向一定要记牢。在主机侧它是输入不是输出。设计上建议先串联一个 1kΩ 电阻再进 SoC电阻后端再放一个 10kΩ 上拉。这样就算外部 HPD 线被接错也不容易直接烧毁 SoC 引脚。第三DDC 总线建议预留串阻。在 SCL 和 SDA 上各串一个 0Ω 或者 10Ω 电阻对调试来说就是个救命口。发现线序接反时直接撬掉串阻飞线验证比重新打板快得多。第四调试分辨率一定要从低往高拉。先锁定 1080p60Hz确认图像稳定输出再往 4K 拉。这能帮你把“接线问题”和“信号完整性”区分开。假如 1080p 正常但 4K 黑屏大概率是差分走线质量不够而不是逻辑错误。第五软件排查只能缩小范围不能替你证明硬件没问题。sysfs 里是 disconnected不代表驱动有毛病只能说明 HPD 没给它一个正确的电平。同样的道理读不到 EDID是 DDC 物理链路问题还是控制器配置问题需要靠硬件测量来定案。第六准备一台逻辑分析仪。HDMI 调试里很多问题比如 DDC 线序、通道极性、EDID 时序异常逻辑分析仪一看波形就全明白了。有条件就选带差分探头的示波器看 TMDS 信号的话比万用表管用太多。最后再分享一个小技巧修复之后不要急着上电看画面先用万用表把所有关键引脚的电平测一遍尤其是 HPD、SCL、SDA 这几个。静态测量做完基本心理就有底了再上电验证效果。节省的其实不只是时间更是反复插拔显示器时对自己耐心的消耗。
返回列表