
1. 问题现象开机十次有两三次不亮屏最近在调 RK3568 平台的 eDP 屏碰到一个很典型又很折腾的问题开机十次里总有那么两三次直接黑屏背光不亮和彻底挂了一样但再次复位或者重新上电它又有时候能正常显示。这种概率性的问题比那种百分百必现的 bug 难受多了因为你没法确定它到底什么时候犯病复测的时候还经常“啊这会儿又好了”让人怀疑是不是自己的操作有问题。先说清楚这个“不显示”具体是哪种不显示有的板子是背光灯都不亮整个屏幕黑着有的是背光亮了但无图像像一张白底黑字的“空屏”还有的是正常显示了一会儿然后在运行过程中突然黑掉。这三种现象背后的原因其实不完全一样排查方向也会不同。这篇文章主要针对 RK3568 平台上 eDP 屏概率性不显示的问题分享一下我自己调试这类问题的完整思路。内容适合正在做 ARM 嵌入式 Linux 产品开发的驱动工程师、硬件工程师也适合被这类问题折磨的应届生。先说结论概率性不显示本质上是 eDP 的时序裕量不够、信号质量处于临界状态或者电源时序没有严格满足面板规格。它不是一个单纯的驱动 bug而是软硬件联动的结果。所以在动手之前我的第一个建议是不要急着改代码更不要反复重启碰运气。先把波形抓出来把链路训练的日志看一遍再决定怎么修。很多时候问题已经写在日志里了只是没人看。2. eDP 链路是怎么工作的不懂链路很难定位2.1 eDP 不是一根简单的信号线eDPEmbedded DisplayPort是嵌入式设备里常用的数字显示接口它是把 DisplayPort 协议用在内部屏幕连接上的一种形式。相比古老的 LVDSeDP 的优势是线少、速率高、支持更高的分辨率和刷新率所以现在很多平板、工控板、商显设备都在用它。但线少不代表简单。一条 eDP 链路由几部分组成Main Link一组差分信号对负责传输图像数据。常见有 1 lane、2 lane、4 lane 的配置。AUX Channel辅助通道用于传输配置命令、读取面板信息、执行链路训练。这条通道是双向的逻辑上类似 I2C但物理层是差分信号。HPD热插拔检测信号。面板通过 HPD 向 SoC 表明自己已经准备好通信。这三部分缺一不可。eDP 在上电后并不是直接就能出图的SoC 要和面板做一次“握手”——也就是链路训练过程包括检测 HPD 信号 → AUX 通信 → 读取面板的 DPCD 寄存器 → 建立 Main Link 的时钟恢复和通道对齐 → 确认链路速率和 lane 数 → 然后才开始传图像数据。这个握手过程有点像两个人打电话你得先听到对方“喂”了一声HPD然后双方约定语速和声道链路训练再开始内容沟通。如果“喂”这一声没被听清或者双方约定的语速对不上那就只能重拨。2.2 链路训练为什么会失败链路训练失败是 eDP 屏不显示的常见原因而概率性链路失败在嵌入式板子上尤其多。问题往往出在链路速率过高。比如屏支持 HBR25.4GbpsPCB 走线却没能满足对应的信号质量要求导致某些速率跑不稳。AUX 信号质量差。AUX 是低速但协议时序敏感的信号如果被干扰、电平裕量不足训练过程中的“读 DPCD”可能超时。面板 HPD 时序不对。SoC 检测 HPD 有效的窗口很窄而面板 HPD 拉高晚于预期SoC 已经进入超时逻辑。电源纹波大。面板核心电压或者 SoC 的 eDP PHY 供电不稳定导致某些批次的芯片阈值偏移。这些因素在 25 次开机里可能影响一两次表现出来就是概率性黑屏。2.3 概率性的本质是“裕量”不够我调试这类问题久了以后最大的体会是概率性故障几乎都是“设计裕量”不够导致的。什么叫裕量就是实际工作状态离临界失效点有多远。如果符合规范的最低要求是 100us 上电延迟你的板子实际只有 110us那么在常温、内电、屏幕某种批次的组合下99 次能过但有 1 次会因为某个毛刺导致时序差了几 us 而失败。所以排查概率性问题重点不是复现而是把裕量找出来。怎么找用示波器量用日志看用实验排除。3. RK3568 的 eDP 驱动与设备树检查3.1 设备树里的 eDP 节点容易埋雷RK3568 的 SDK 里eDP 的使用一般通过设备树配置。下面是一个典型节点的简化示意实际文件里会根据板卡和屏幕型号填参数edp { status okay; clocks cru CLK_EDP, cru PCLK_EDP; clock-names dp, pclk; phys usb2phy0_edp_phy; phy-names edp; hpd-gpios gpio4 RK_PC2 GPIO_ACTIVE_HIGH; enable-gpios gpio3 RK_PB6 GPIO_ACTIVE_HIGH; pinctrl-names default; pinctrl-0 edp_hpd; panel: panel { compatible boe,tv101wum-nl6; lanes 4; link-rate 0x06; ... }; };这里面最容易埋雷的几个参数lanes屏实际的 lane 数是多少必须查屏规格书。如果把 2 lane 的屏配成 4 lane训练基本不会成功反过来4 lane 的屏配成 2 lane可能能出图但分辨率高时带宽不足。link-rateLink rate 的配置值表示法各家不同常见的是0x06表示 HBR1.62Gbps0x0A表示 HBR22.7Gbps0x14表示 HBR35.4Gbps。这里必须匹配屏的实际能力且要考虑板级信号质量。hpd-gpios有些板子没有把 HPD 接到 SoC而是用固定电平模拟热插拔。如果 HPD GPIO 复用或 Pinctrl 配置不对内核可能一直等不到 HPD直接导致初始化超时。enable-gpios这个 GPIO 一般是控制面板的供电使能。时序上如果 enable 拉得太晚面板可能没有准备好拉得太早面板还没上电完也会导致 HPD 状态不稳定。3.2 内核日志可以看到训练过程的“心路历程”在 RK3568 的 Linux 内核里eDP 驱动的 probe 和运行时日志通常会在dmesg里打印比如edp-fecrockchip-edp: link training successful edp-rockchip-edp: failed to read DPCD edp-rockchip-edp: link training failed, trying again建议一开机就立即打印完整启动日志搜索edp、dpcd、link_training、training这些关键词。特别是link training successful这一行如果它在开机时成功但仍然黑屏那问题可能出在背光、显示控制器或 framebuffer 配置上而不是 eDP 链路本身。如果日志里多次出现link training failed但后面又成功重试了说明链路在临界状态。概率性黑屏就很可能是因为第一次训练失败后没有正确重试或者重试逻辑被某个超时提前终止。注意概率性问题的日志要反复抓。先连续开机 20 次每次把完整dmesg存下来再对比成功和失败时日志的差异。这个习惯非常重要。3.3 驱动里常见的重试机制很多基于 RK 平台的 eDP 驱动链路训练失败后会自动重试。但重试能不能成功取决于驱动有没有正确复位 PHY、重新初始化 AUX、清空训练状态。如果驱动在重试时没有做足够长的延时后面成功的概率会大打折扣。我曾经遇到过一个情况内核日志显示第一次训练失败紧接着第二次训练成功屏幕也亮了。但重启十次中有两三次第二次训练也失败直接放弃出图。后来排查发现是驱动重试时没有重新触发 HPD 检测流程导致 AUX 链路上的逻辑状态还是残留的旧值。这类问题通常可以通过升级 SDK 或者修改驱动的 retrain 流程来解决但前提是你得真的去翻代码。4. 概率性问题的排查手段示波器、日志与实验4.1 示波器测量永远别跳过的一步对于概率性不显示示波器是绝对的主力工具。下面是我常用的测量方案用 4 通道示波器同时量面板 VDD 供电、HPD、背光使能、AUX 差分对的其中一个 P 端。触发模式设置为“上升沿”触发电平设在 VDD 的 50%每次按复位键抓上电过程。连续抓 10 次观察 VDD 到 HPD 的时间、HPD 上升沿是否有回沟或者毛刺。一个典型问题VDD 由某个 DCDC 提供启动时电流很大VDD 上升沿不是单调的中间会出现一个几十 mV 的台阶。这个台阶如果正好卡在 SoC 检测 HPD 的窗口内就会导致 HPD 检测失败。这种现象在 4 通道示波器上非常直观你会看到 VDD 曲线在 3V 附近停顿了一下而 HPD 恰好在这个时刻被 SoC 采样。硬件上可以在 VDD 输出端加一点 CLC 滤波或者增大软启动电容解决就立竿见影。也有通过软件挪时序解决的但改硬件裕量更彻底。4.2 抓 AUX 通信看到“到底卡在哪一步”AUX 是差分信号示波器带宽不够的话比较难解调。不过很多开发环境里都有逻辑分析仪支持 AUX 解码或者直接抓裸波形看有没有翻转。如果你手头有支持 DisplayPort 协议解码的示波器那最好。它能直接告诉你训练流程停在哪一步是等不到 HPD是 DPCD 读不到还是 channel equalization 失败没有协议分析仪的时候也可以在驱动里加打印把训练状态机的跳转打印出来。比如在analogix_dp_link_train相关函数里把每次读取 DPCD 寄存器后的返回值打出来。看到返回0x2表示有错误就要去翻时序图。4.3 降低速率和 lane 数判断是不是信号裕量问题排查链路问题时最实用的一个实验是把设备树里的link-rate或者lanes降一档比如从 4 lane HBR2 改成 2 lane HBR然后连续开机 50 次看是否还会黑屏。如果降频之后问题消失基本可以确定是 Main Link 或 PHY 的信号裕量不够。再进一步可以恢复速率但优化设备树里的驱动强度选项或者干脆把速率固定为稳定档位牺牲一点点带宽换取量产可靠性。对于 1080P eDP 屏HBR2 的 4 lane 本来就有相当大的带宽富余降到 HBR 在大多数情况下也不影响分辨率。这个实验成本极低收益极高。调试时一定要做而且最好做记录配置组合开机 20 次失败次数4 lane, HBR232 lane, HBR204 lane, HBR0如果表格结果是这样那不用犹豫赶紧往信号完整性方向查。4.4 软件修改时序在 delta 中找稳定点另一个常用的实验手段是给面板的电源使能、背光使能、HPD 等待加延时。具体来说在驱动里增加面板上电到 HPD 等待之间的延时每次增加 10ms50ms连续测开机成功率。把背光使能时序往后延避免在链路训练还没完成时就把背光点亮。背光早亮会让屏幕发灰或闪一下黑很容易被误认为是“不显示”。给 eDP 初始化增加一个复位流程在每次开机时强制先拉低面板电源 5ms 再重新上电。这些修改最容易见效但也最容易掩盖真正的问题。所以改完以后要持续验证最好跑 100 次耗电循环确认成功率达到 100% 才算数。5. 常见原因与解决方案速查表结合我调过的板子把常见的问题原因、验证方法、解决方案总结成一个速查表方便收藏现象可能原因验证方法解决措施背光不亮全黑电源时序不满足VDD 还没稳定就初始化示波器抓 VDD 与 HPD增加 VDD 延时修电源软启动调整 enable-gpios 时序背光亮无画面链路训练失败无视频流dmesg 查 link training failed降 link-rate/lane查 AUX 信号检查屏的 DPCD 能力启动时偶发黑复位后恢复HPD 毛刺导致检测失败抓 HPD 波形看上升沿毛刺HPD 加 10kΩ 下拉或小电容滤毛刺软件多次检测 HPD首次开机不亮断电重上电亮主电源过大导致二次软启动时序不稳定看 VDD 是否有跌落加大输入电容换负载调整率更好的 DCDC高速率下亮低速率下好PCB 走线质量差、阻抗不匹配对比不同速率下失败率优化 PCB调整 PHY 驱动电流/预强调某批次屏故障率高屏的参数差异换不同批次屏对比对屏厂提规格要求在驱动中放宽训练超时用电池供电时概率性变高电源瞬态跌落电池供电波形增加储容调整屏上电瞬间的电流限制这个表不是我凭空写的每个都对应真实案例。比如 HPD 加下拉电阻这个就解决过一次板子 HPD 走线旁边有一根高速信号串扰把 HPD 上拉过程打成锯齿状SoC 有时候能采到高电平有时候采不到。加上 10kΩ 下拉和 1nF 电容后波形干净了问题消失。6. 从设计阶段避坑Layout 与电源的建议6.1 eDP 布线差分、等长、阻抗是关键很多概率性问题在原理图阶段就已经注定。eDP 的 Main Link 必须是差分走线阻抗控制在 100Ω±10%AUX 也要做差分但它的速率不高对等长的要求相对宽松不过依然要注意远离干扰源。我见过一个板子调试时管脚溢流问题严重最后排查发现 PCB 上 eDP 差分对穿越了一个电源层分割回流路径被切断信号完整性大幅劣化。后来把走线挪走、保证参考平面连续问题就消失了。连接器到 SoC 之间的走线长度能短就短。尤其是对于 HBR2 以上速率1 inch 的走线差异都可能影响训练结果。如果无法缩短至少保证同一组 lane 内部等长控制总长差控制在 ±2mil 级别。6.2 电源设计eDP 的瞬态电流不能忽视eDP 面板上电瞬间电源要供给面板内部各路 LDO、DC-DC 以及背光驱动瞬时电流可能达到几百 mA 到 1A 级别。如果主电源的负载瞬态响应差电压跌落超过屏规格的 10%面板就可能出现上电初始化异常。选择 DCDC 时重点关注其负载瞬态调整率和输出电容的 ESR。输出电容不要只放 22uF最好再加几个小容值的陶瓷电容去高频纹波。经验值是3.3V 供电脚附近放 22uF 4.7uF 100nF。另外要留意 eDP 面板的 VDD 与 SoC 的 eDP PHY 供电是否能独立断电。如果两者共用一路电源屏在断电复位时可能反串电流到 PHY导致 SoC 死机或者偶发启动故障。6.3 量产测试把概率性问题扼杀在产线上概率性问题的可怕之处在于研发阶段可能测不出来一到量产就暴露。所以产测阶段一定要设计高强度的压力测试连续上下电 200 次每次间隔 5 秒统计成功率或者高温箱里跑老化把热漂移导致的时序问题提早暴露。产测软件里可以增加一个 “eDP 链路状态检测”读取 DRM 的 crtc 状态如果没有 eDP 设备直接报 FAIL。这样就不用靠人工眼睛判断黑不黑屏了。我建议的产测脚本逻辑类似# 检查 eDP 是否在线 if [ ! -d /sys/class/drm/card0-* ]; then echo eDP device not present exit 1 fi # 检查当前连接的 encoder 状态 status$(cat /sys/class/drm/card0-*/status) if [ $status ! connected ]; then echo eDP link failed exit 1 fi这虽然不是万能的但至少能把大部分链路不显示的问题拦下来。7. 一次真实问题的完整排查记录为了更直观地说明整个流程我分享一个近期的案例某板卡使用 RK3568 一块 1080P 的 4 lane eDP 屏客户反馈开机有 5%~8% 的概率黑屏。拿到板子后我先把内核dmesg日志开了连续开机 30 次发现失败时日志里都有这条edp-rockchip-edp: failed to read DPCD 0x00000这个寄存器是 DPCD 能力起始地址读取失败说明 AUX 通信没有建立成功。也就是说链路训练根本没走到第二步。然后用示波器抓 VDD 和 HPD。发现每次上电HPD 的上升沿都很正常但是 HPD 翻转时间比屏规格书里要求的最小时间晚了一些。屏规格书要求 VDD 达到稳定之后 100ms 内 HPD 必须拉高实际上 HPD 拉高发生在 VDD 稳定后 120ms 左右。为什么失败是概率性的因为 VDD 稳定时间本身有波动当 VDD 稳定慢一点HPD 就会更晚SoC 那边有固定超时导致约 5% 的次数超时失败。最后的解决办法是软件在驱动中把HPD检测的超时时间从默认 100ms 增加到 200ms并且增加了一次 HPD 重检测逻辑。改完后连续开机 200 次一次失败都没有。这个案例说明硬件问题不一定要改硬件软件适配也是一个高效手段。但前提是你要知道时序差在哪而不是瞎猜。8. 量产品控与后续扩展调试完成后还需要把这些改动固化到物料和设计规范里。比如要求屏厂确保 HPD 时序余量足够在承认图里注明最小值、典型值和最大值。硬件工程师在摆件的时候也要避免把 HPD 信号走到边缘区域。后续如果产品要升级更高分辨率记得重新验证 eDP 链路训练。分辨率提升通常意味着更高链路速率原来的裕量可能不够到时候大概率还会遇到概率性黑屏。所以这项工作没终点每次改硬件都要重新摸底。最后再分享一个小技巧调试概率性问题时一定要记录环境温度和电源电压。同一块板子在 25℃ 和 45℃ 下故障率可能完全不同。我做实验一般会备一个可调电源分别用 5.0V、5.2V、4.8V 供电测试很多概率性问题会在电压偏高或偏低时更快暴露出来。掌握了这些手段下次再遇到 eDP 屏概率性不显示你就不会慌了。