1. 问题现象:开机十次有两三次不亮屏
最近在调 RK3568 平台的 eDP 屏,碰到一个很典型又很折腾的问题:开机十次里总有那么两三次直接黑屏,背光不亮,和彻底挂了一样;但再次复位或者重新上电,它又有时候能正常显示。这种概率性的问题,比那种百分百必现的 bug 难受多了,因为你没法确定它到底什么时候犯病,复测的时候还经常“啊这会儿又好了”,让人怀疑是不是自己的操作有问题。
先说清楚这个“不显示”具体是哪种不显示:有的板子是背光灯都不亮,整个屏幕黑着;有的是背光亮了但无图像,像一张白底黑字的“空屏”;还有的是正常显示了一会儿,然后在运行过程中突然黑掉。这三种现象背后的原因其实不完全一样,排查方向也会不同。
这篇文章主要针对 RK3568 平台上 eDP 屏概率性不显示的问题,分享一下我自己调试这类问题的完整思路。内容适合正在做 ARM 嵌入式 Linux 产品开发的驱动工程师、硬件工程师,也适合被这类问题折磨的应届生。先说结论:概率性不显示,本质上是 eDP 的时序裕量不够、信号质量处于临界状态,或者电源时序没有严格满足面板规格。它不是一个单纯的驱动 bug,而是软硬件联动的结果。
所以在动手之前,我的第一个建议是:不要急着改代码,更不要反复重启碰运气。先把波形抓出来,把链路训练的日志看一遍,再决定怎么修。很多时候,问题已经写在日志里了,只是没人看。
2. eDP 链路是怎么工作的:不懂链路很难定位
2.1 eDP 不是一根简单的信号线
eDP(Embedded DisplayPort)是嵌入式设备里常用的数字显示接口,它是把 DisplayPort 协议用在内部屏幕连接上的一种形式。相比古老的 LVDS,eDP 的优势是线少、速率高、支持更高的分辨率和刷新率,所以现在很多平板、工控板、商显设备都在用它。
但线少不代表简单。一条 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 屏不显示的常见原因,而概率性链路失败在嵌入式板子上尤其多。问题往往出在:
- 链路速率过高。比如屏支持 HBR2(5.4Gbps),PCB 走线却没能满足对应的信号质量要求,导致某些速率跑不稳。
- 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-rate:Link rate 的配置值表示法各家不同,常见的是0x06表示 HBR(1.62Gbps),0x0A表示 HBR2(2.7Gbps),0x14表示 HBR3(5.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, HBR2 | 3 |
| 2 lane, HBR2 | 0 |
| 4 lane, HBR | 0 |
如果表格结果是这样,那不用犹豫,赶紧往信号完整性方向查。
4.4 软件修改时序:在 delta 中找稳定点
另一个常用的实验手段是给面板的电源使能、背光使能、HPD 等待加延时。具体来说:
- 在驱动里增加面板上电到 HPD 等待之间的延时,每次增加 10ms~50ms,连续测开机成功率。
- 把背光使能时序往后延,避免在链路训练还没完成时就把背光点亮。背光早亮会让屏幕发灰或闪一下黑,很容易被误认为是“不显示”。
- 给 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 屏概率性不显示,你就不会慌了。