首页 / 资讯中心 / 文章详情

RK3576 HDMI黑屏:排线错位导致HPD/DDC失效的调试实录

RK3576 HDMI黑屏:排线错位导致HPD/DDC失效的调试实录 ★ FEATURED ARTICLE
1. 一块转接板、一根杜邦线、一次从下午开始的“点亮”测试这块板子点不亮的时候我第一反应是怀疑驱动配置第二反应是查设备树折腾了一个多小时才意识到问题根本不在软件而是我在RK3576的HDMI测试接口上搭错线了。对就是最基础的杜邦线连接错误电平全乱却差点把一次十分钟能完成的点亮测试变成加班。如果你也准备把RK3576的HDMI信号引到转接板或者正在做显示从处理器到连接器的链路调试这篇实录值得慢慢看完。我想先说结论这次没有复杂的信号完整性玄学没有需要重新流片才能修复的缺陷纯粹是排线两侧的引脚定义参照方向不一致导致HPD、DDC、5V这几个关键位全部错位。可正因为错得“低级”它把从黑屏到定位的完整过程还原得非常典型很适合当作嵌入式硬件调试的入门案例来参考。1.1 测试环境和最初的“想当然”硬件方面我手头是一块RK3576核心板目标是在原型验证时把HDMI输出接到标准显示器上。核心板没有直接引出HDMI Type-A座只留了一个12Pin排针。第三方给的一块转接底板上有标准HDMI座旁边也配了一排12Pin排针。按常规操作我用杜邦线把两端一对一接起来。当时我犯的第一个错误就是理所当然地认为两端排针的引脚定义是一致的。左边是1到12右边也是1到12那我按1对1、2对2的顺序接总不会错吧我甚至用万用表通断档验证过“左1到右1导通左2到右2导通”觉得链路肯定没问题。但我忽略了排针座本身的方向性。PCB上丝印的“1”朝哪个方向看决定了这个脚位对应的是哪个物理位置。两块板子如果分别从正面和背面标注编号同一根排线虽然物理上连通了两端对应的信号却完全是另一回事。这里不是“线断了”或者“杜邦线质量问题”而是最典型的物理层错位。1.2 现象清单系统活着、显示器黑了、状态节点喊“disconnected”接好线上电结果在意料之外又特别典型串口启动日志完整系统正常起来没有任何崩溃或异常重启显示器全程黑屏HDMI口不断搜索信号最终显示“无信号”内核里能看到HDMI相关驱动注册和中断初始化的日志但始终没有hotplug事件产生查看DRM状态节点/sys/class/drm/card0-HDMI-A-1/status一直返回disconnected用modetest查看连接器只看到HDMI-A类型的名字没有绑定任何分辨率模式。这条清单说明软件整体是活的。系统能开机显示控制器正常工作HDMI驱动也加载了问题只可能出在“物理链路检测”和“EDID通信”这两个环节。但当时我并不知道这一点于是先一头扎进了软件排查。2. 先查软件的一个半小时设备树没问题驱动也醒来就是没信号2.1 设备树检查HDMI节点没有缺席嵌入式工程师看到显示点不亮第一反应就是翻设备树这是肌肉记忆我也不例外。我把设备树里HDMI相关节点完整过了一遍hdmi { status okay; pinctrl-names default; pinctrl-0 hdmi_hpd_pin, hdmi_cec_pin; };status是okaypinctrl引脚的复用配置存在HPD和CEC都有对应引脚。时钟、电源域、复位控制这些在启动日志里也都看到了成功信息。我甚至用/proc/device-tree和调试文件系统去确认节点确实被系统加载而不是设备树编错导致的静默失败。结果就是驱动层面应该是健康的。RK3576的HDMI控制器确实在运行中断也注册了。它能检查HPD电平也能通过DDC读取显示器信息。问题在于它没有收到有效的物理层事件。设备树检查到这一步其实已经到头了再往下调设备树属于浪费时间。2.2 内核日志只给了半条线索接下来看内核日志。过滤HDMI相关关键词后能看到这样几行hdmi: failed to get edid hdmi: read edid fail第一眼看到failed to get edid直觉反应是EDID读取失败可能是I2C控制器时序问题也可能是驱动初始化顺序不对。但我注意到一个细节日志里EDID读取的尝试次数很少而且hotplug状态始终没有出现有效的高电平变化。如果是软件时序问题驱动通常会反复触发HPD中断、反复尝试读取EDID。但这里连事件都没有说明不是“读不到EDID”而是“根本没走到读取流程”。HDMI驱动的流程很清晰先检测HPDHPD有效后才去读EDID。HPD一直无效后续流程全部被跳过EDID失败只是表象不是根因。这类日志只给了半条线索真正有决定性证据的地方还是在物理层。2.3 modetest与状态节点驱动认为根本没有显示器为了确认软件侧结论我用了DRM框架下最直接的排查工具。查看状态节点# cat /sys/class/drm/card0-HDMI-A-1/status disconnected再用modetest看连接器# modetest -c Connectors: id 45 encoder 65 connector type HDMI-A encoder type: virtual connector_type: HDMI-A status: disconnected看到disconnected基本可以断定内核并没有感知到显示器插入。DRM框架下的状态节点是内核根据HPD信号和EDID读取结果综合出来的它说没连接就说明HPD或者DDC链路上一定有问题。软件能做的检查到这里全部结束再折腾驱动就是钻牛角尖。下一步只能回硬件拿示波器去量信号。3. 信号错位之后HPD、DDC、CEC如何“表演”各自的翻车方式3.1 用一根排线视角重新理解HDMI信号组HDMI Type-A接口虽然有19个引脚但和嵌入式点亮最相关的其实可以简化成几类HPD检测线、DDC通信线5V、SCL、SDA、TMDS数据线4对差分线以及CEC控制线。用一个生活化类比来理解HPD是门铃DDC是进门后填的问卷TMDS才是往家里搬货的快递。门铃不响屋里人根本不会开门问卷读不到系统不知道显示器支持哪些分辨率和HDR能力即使货送到了也不知道往哪里摆。CEC则是家里电器之间的对讲机不参与门禁但后面做遥控联动时也离不开它。HPD是显示器反馈给源端的信号。显示器检测到5V供电和接插正常后会把HPD拉高告诉源端“我准备好了”。源端收到高电平才去走DDC读EDID。如果HPD没有正确到达RK3576的检测引脚内核就会一直认为没有显示器插入。DDC本质上是一条I2C总线上面挂着显示器的EDID芯片。源端必须通过HDMI座的5V给显示器这一侧供电SCL和SDA才能正常通信。如果5V没有送到对应的HDMI座引脚EDID芯片根本没有供电读一百次也是超时。SCL和SDA再错位的话更是张冠李戴。TMDS差分线负责传递像素数据和像素时钟P/N极性对接错或者Lane顺序接错通常不会影响HPD和DDC画面却照样黑屏、花屏或闪屏。这是另一类症状和本次的“完全disconnected”有本质区别。3.2 错位之后的“症状对照表”我把常见错位方式和典型现象整理成一个对照表方便以后快速定位错位情形典型症状排查方向核心板HPD接到转接板GNDHPD恒低状态一直是disconnected没有hotplug事件用示波器量HPD电平核心板HPD接到转接板5VHPD恒高内核认为已连接但EDID读取失败检查DDC和5V通路5V没有送到HDMI座HPD不会正常拉高EDID芯片无供电量HDMI座5V脚SCL与SDA接错位DDC总线无应答地址0xA0拿不到ACK逻辑分析仪抓DDC波形TMDS Lane的P/N对调状态为connected、有mode画面却黑屏或雪花查差分线定义和极性本次我遇到的是典型的“三连错”核心板侧HPD被接到了转接板侧GNDSCL和SDA各漂移一位5V也没能正确送达HDMI座。所以HPD一直趴在低电平内核连hotplug事件都触发不了状态只能是disconnected。这里要特别提醒HPD被拉到GND和HPD被拉到5V是两种完全不同的现象。前者是“根本没检测到显示器”后者是“检测到了但读不到EDID”。很多人一看到disconnected就下意识怀疑驱动其实只要分清楚这两种HPD状态排查方向立刻就能清晰很多。3.3 为什么“1对1顺着接”也会错问题就出在“1对1顺着接”这句话上。两端排针都有“1”字丝印但关键问题是这个“1”是从顶视方向标的还是从底视方向标的PCB连接器上的脚位编号有两个坐标系。从顶面看1号脚在左上角从底面看同一个物理位置的脚就成了最末端。HDMI转接板这类小板子尤其喜欢把丝印放在背面装配时视角一转编号方向就全反了。我这次就是这样。核心板按自己的顶视方向定义1号脚转接板按自己的丝印方向定义1号脚。排线本身是1对1导通的但两端1号脚对应的信号不同结果整排信号被平移错位。HPD对到GND、SCL对到SDA、SDA对到SCL全乱了。我当时用万用表量完“左1到右1导通”就觉得没问题这是一个重大的认知误区。导通只能证明物理连接不能证明语义对应。排线的每一针本来就是导通的你需要确认的是把一个信号交给了正确的另一侧引脚而不是仅仅确认“通电了”。4. 示波器贴上去的那一刻排线搭错位终于从猜测变成证据4.1 示波器一探HPD脚趴着的0V状态把范围压到物理层到了硬件排查阶段我把示波器探头点在RK3576这一侧的HPD检测点上地线夹夹在旁边的GND上。显示器已经插好并通电这种情况下正常链路里HPD应该被显示器内部电路拉高到接近5V。实际测到的是一条笔直的0V线。我不死心又把探头移到转接板HDMI座上的HPD脚结果同样是0V。这说明HPD链路上根本不存在一个可以拉高的源头。显示器侧没有送来高电平源端引脚自然读不到任何变化。为了排除是驱动把HPD配置成了输出模式或者内部强下拉导致的我还在调试文件系统里确认了引脚复用状态结果完全正常。排除了软件影响之后就可以下结论HPD的物理连接一定是错的。不是驱动不干活是硬件压根没把它该看到的电平送过来。这里有个细节值得说HPD维持在恒定低电平时内核不会反复产生中断因为电平没有发生跳变。所以我在dmesg里看不到hotplug事件是正常的。很多人看不到事件就回去调驱动其实是被日志欺骗了。示波器拍下的电压证据比任何日志都更有说服力。4.2 逻辑分析仪抓DDC0xA0始终没有ACKHPD一直是低电平已经足够解释黑屏。但我想把DDC链路的账也彻底弄清楚毕竟后面修好之后还要保证HDMI座上的5V和SCL/SDA都正确。我拿出逻辑分析仪三个通道分别接在HDMI座上的SCL、SDA和5V引脚采样率设为1MHz左右触发条件设在SCL下降沿然后拔插一次显示器。抓到的波形非常清楚地显示内核在周期性发起I2C读操作发送起始位后地址线上出现0xA0但SDA上始终没有返回ACK。这里的0xA0需要解释一下。显示器的EDID地址是7位的0x50在I2C总线传输时写操作地址是0xA00x50 1读操作地址是0xA1。源端读EDID时总线上的第一个事务通常是写地址0xA0指向EDID内部的寄存器偏移。现在的问题是这个地址发出去之后SDA线上完全没有任何从设备回应。再看5V通道波形几乎是平的根本没有稳定的5V电平。HDMI座上的5V供电缺失显示器侧的EDID芯片连电都没有当然不可能产生ACK。这一下HPD为0V和DDC无ACK两个证据闭环了排线错位已经是板上钉钉的事。4.3 把原理图翻出来和测量结果对质拿着示波器和逻辑分析仪的结论我把两块板子的原理图排针部分并排打印出来逐行对网络名。排线两端实际对应的网络名是这样的核心板排针对应信号转接板排针对应信号1HDMI_5V1HPD2HPD2GND3HDMI_SCL3HDMI_SDA4HDMI_SDA4HDMI_SCL看到这张表已经不需要继续分析了。HPD对接GND、SCL/SDA交叉、5V被送到HPD检测位三处全错。根本原因就是两端排针的编号方向不一致而我傻乎乎地按编号1对1连接。另外我在转接板丝印上也发现了诱因它的排针旁只标注了“J1”和“1”没有在针脚旁写网络名。核心板丝印同样只有管脚编号。只要有一块板子的丝印把HPD、5V、SCL、SDA这几个信号名印出来这次错位在一开始扫一眼就能发现。5. 飞线借位修复后我用三个步骤确认HDMI真的“回来”了5.1 不换排线用飞线按“功能”重新分配引脚确认问题后我没有重新做板而是用飞线按“功能”重新跳接。原则很简单以信号名为准而不是以编号为准。核心板的HPD必须接到转接板的HPD核心板的5V必须接到转接板的5VSCL接SCLSDA接SDA其余地线单独补齐。飞线时我用不同颜色区分信号组红色5V、黄色HPD、绿色DDC SCL、白色DDC SDA、黑色GND。以前总觉得杜邦线颜色随便用这次踩坑之后才意识到颜色统一有多重要。修完一排线再回头检查时颜色本身就是一张网报表。重新上电前我还用万用表通断档按这张“功能映射表”逐条确认。这次不是量“左1到右1是否导通”而是量“核心板HPD点到转接板HPD点是否导通”。每确认一条就在表上打一个勾。全部通过之后才接通显示器上电。5.2 EDID读出、分辨率轮换、热插拔接力验证上电后的第一个检查点还是状态节点# cat /sys/class/drm/card0-HDMI-A-1/status connected从disconnected变成connected说明HPD链路已经活了。接着看内核日志EDID读取成功的信息出现了里面通常包含显示器厂商字符串、屏幕尺寸和支持的分辨率范围。再用modetest查看这次能看到1080p60、720p60等一系列mode。我没有就此收工因为“能显示”和“真的修好”是两回事。我做了三轮验证第一轮换三台不同品牌和不同分辨率的显示器第二轮做热插拔十次每拔一次状态节点都要回到disconnected插上后又立刻变成connected第三轮长时间跑彩色测试画面肉眼观察有没有雪花、闪屏、偏色。三个轮次全部通过我才认为链路彻底恢复。为什么这么折腾第一轮验证EDID读取第二轮验证HPD中断链路第三轮验证TMDS数据通路。黑屏解决不代表三块都恢复。如果TMDS某一对Lane的P/N接反可能前两轮都能过到第三轮才暴露表现为画面上有花点或颜色错乱。到那时候再回头查差分定义又得从头量一遍。5.3 CEC和其他“没参与点亮”的引脚也要复查HDMI座上还有CEC和Utility/ARC这类引脚它们不参与点亮所以很多人接线时根本不管。这次排线错位涉及的虽然不是CEC但我修好主链路之后顺手把CEC也量了一遍。原因很简单我的后续设计里要用ARC回传声音CEC和ARC往往在同一组信号附近。如果CEC位也漂移了画面正常、声音回传失败那又是一轮新的排错。显示通路只是HDMI的显性价值CEC、ARC这些扩展功能往往到了后面验收时才被真正测试到时候再飞线就非常难受。我的建议是修复主链路后把定义表里其余信号全部按“功能到功能”扫一遍包括CEC、Utility、屏蔽地。不要因为画面亮了就宣布结束。一个接口协议是否真正可靠要看它所有信号在真实场景下都正常工作而不仅仅是“能出图”。6. 这次搭错线送我的硬件自查清单6.1 原理图评审阶段就该消灭的隐患把这次教训往前推最早应该死在原理图评审阶段。我给自己列了几条硬性红线供大家参考。第一连接器在原理图上必须显示网络名不能只标脚号。排针、FPC座、HDMI座旁边要直接写上HDMI_HPD、HDMI_DDC_SCL这些名字。脚号是给装配用的网络名是给调试用的。只标“1、2、3”等于把关键信息藏起来。第二多板互联必须有一张“板间连线表”以表格形式列出左右两侧的引脚号和网络名评审时逐行核对。不要用原理图里跨页的小标签代替那太容易被忽略。第三差分信号必须在原理图和PCB阶段标注P/N极性并同步到转接板丝印。TMDS Lane里任何一对极性不对画面都出不来这类问题往往比HPD错位更隐蔽。第四HPD这类关键电平必须有明确的上拉/下拉策略。是源端弱上拉还是显示器侧驱动评审时一句话说清楚后面就不容易在排线阶段踩坑。嵌入式项目里显示点不亮的根因硬件接线和接口定义错误的比例其实比SoC配置错误高得多。工程师天然关注设备树和驱动反而忽略最基础的物理层。接口定义表如果在评审阶段被当成合同一样审核能省下后面大量现场时间。6.2 通电前的通路预检按分钟算不按小时算这次之后凡是做转接板、底板、排线连接我上电前都会做一次通路预检。步骤不复杂但要形成习惯先打印一张“功能映射表”左右两侧都写网络名而不是脚号用万用表二极管档或通断档从一侧信号点量到另一侧对应信号点逐个核对对电源和地先做短路排查防止5V和GND互换导致烧板有条件就上示波器看关键信号默认电平HPD应该是低5V应该是稳定的5VDDC的SCL/SDA空闲状态应该被上拉到高。这套检查通电前跑一遍也就十几分钟但能挡掉大部分低级错误。这次如果提前做了预检根本不会进入到软件怀疑阶段更不用把示波器和逻辑分析仪都搬出来。很多时候事后烧脑的真相事前用万用表就可以揭穿。6.3 定义表与丝印的一致性管理最后想说的是文档管理的问题。我之前的习惯是原理图归原理图PCB丝印归丝印排线定义又单独放一版。结果两块板子来自不同人维护版本对不上接线时只能靠猜。这次踩坑的根因表面上是接线方向实际上是文档没有单一事实来源。现在的做法是一个项目里只用一张板间连线表里面同时写核心板排针和转接板排针的网络名。任何人要改只能改这一张表。PCB丝印从这张表手动同步至少保证丝印上有网络名缩写。板子回来后直接拿表去现场核对不和口头沟通博弈。丝印上不要只印“J1”“1”。刚才已经说过脚号是给装配用的网络名是给调试用的两者缺一不可。如果板子空间有限至少把HPD、5V、GND这几个关键信号用加粗或特殊颜色标注出来。这一条看起来最简单但无数HDMI黑屏问题都源于此。修好之后我又盯着显示器看了一会儿。一块小小的转接板几根杜邦线差点把一个下午都搭进去。回头想想这次“搭错线”真正值钱的地方不是学会用示波器量HPD而是让我把接口定义当作一等公民对待。以后再遇到点不亮我不会急着改软件会先拿着万用表把每一根线的功能路径走一遍。如果你也正在被HDMI黑屏折磨建议从HPD和DDC测起这两个信号不会骗人。
阅读完成 · 觉得有帮助?
咨询建站