ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RK3568 eDP屏概率性不显示:从链路训练到时序排查实战

RK3568 eDP屏概率性不显示:从链路训练到时序排查实战 做嵌入式Linux显示调试的朋友应该都遇到过这种场景板子批量贴回来大部分板子开机一次就能亮可总有那么几台上电后屏幕的背光亮了画面就是不出来。或者同一块板子今天开机正常明天冷启动就黑屏重新上电几次又好了。这种“薛定谔的屏幕”问题十有八九会落在eDP接口上。我最近在RK3568平台上就遇到了一起eDP屏概率性不显示的case断断续续折腾了几天最后定位的思路和修复方法很有代表性这篇把完整过程整理出来。这篇内容适合刚接触嵌入式显示调试的工程师也适合已经在做RK3568、RK3588这类Rockchip平台开发的朋友。读完你会明白eDP链路建立过程中哪些环节最容易出问题以及遇到概率性黑屏时应该从哪个方向入手排查、用什么设备和手段去把“偶发”变成“必然复现”。整个过程不涉及太复杂的理论主要是工程实践中的定位方法和避坑经验。1. 问题现场背光亮但没画面重启几次才能好1.1 现场现象描述先说下硬件背景。我用的主控是RK3568内核用的Rockchip官方发布的Linux 4.19分支显示方案是一块标准的eDP接口屏幕分辨率1920x1080通过主板上一个板对板连接器走线到屏端。系统启动后正常情况下从uboot阶段就能看到logo进入内核后图形界面也正常。故障现象是这样的批量到货的几十块板子里面有大概五分之一在冷启动时会遇到屏幕不亮的情况。具体表现为——主板正常运行串口有内核日志系统起来后网络和业务程序都正常但屏幕一直保持黑屏状态。注意这里有个细节屏幕的背光是亮的说明背光供电和控制没有问题只是没有任何画面内容也就是屏本身没有收到有效的视频数据或者eDP链路没能建立起来。这种黑屏和背光不亮是两回事。背光不亮多半是背光电路或者背光控制GPIO的问题而“背光亮但无画面”基本可以锁死在eDP数据链路上。遇到这类现象直接奔着eDP建链过程去查就对了不需要去怀疑LED驱动、背光升压电路这些无关模块。另一个关键特征是“概率性”。同一块板子反复断电上电几十次大概有两三次会黑屏刚出现黑屏后马上断电重启大概率又能正常亮起来。这说明不是连接器松动这种硬故障而是链路建立过程中的某一步存在竞争或者时序裕量不足时好时坏。1.2 概率性问题怎么入手先复现再收敛不要上来就改代码处理概率性问题我个人的经验是“先复现、再收敛、最后才动手”。一上来就怀疑某个参数然后乱改很容易把问题搞得更复杂。概率性问题最忌讳的就是在复现率还不稳定的情况下做对比实验那样得出的结论根本不可信。我先做了一轮简单的统计把出现黑屏的板子单独挑出来用自动断电/上电的脚本循环测试100次记录每次是否正常显示、日志里有没有报错。这样先把复现率稳定在可观测的水平。同时把串口日志全部抓下来哪怕是正常开机的日志也要留后面做对比用。这一步看着不起眼但后面所有判断的依据都靠这批数据。准备好之后我开始排查eDP链路的建立流程。这里尤其要注意的是概率性问题往往不是单一原因而是多个条件同时不满足才触发。所以接下来的工作就是把这个链路上所有可能不满足“屏规格书时序要求”的节点全部过一遍。2. 先把eDP建链过程搞清楚再来谈为什么概率性2.1 eDP接口和LVDS、MIPI DSI的本质差异很多从LVDS或者RGB接口转过来的工程师第一次接触eDP时容易用老思路去理解。LVDS接口的信号是并转串的差分对数据持续传输没有“链路协商”的概念MIPI DSI虽然也有lane和高速模式但它的物理层和协议层相对简单而且驱动大多是SoC厂商和你用的屏幕模组厂商提前配好的。eDP就不一样了。eDP规范沿用了DisplayPort的思路物理上分成主链路Main Link和辅助通道AUX Channel两部分。主链路负责传输视频数据按照link rate如1.62Gbps、2.7Gbps、5.4Gbps和lane数1/2/4 lane的组合工作AUX通道则用来做设备识别、EDID读取、链路训练Link Training等控制面的通信。在真正开始传视频之前主机和屏之间要完成一系列“握手动作”。这就好比两个人打电话先要拨号、接通、确认线路质量然后才开始讲话。如果握手过程有一方响应慢半拍电话就接不通——反映到嵌入式显示上就是概率性黑屏。嵌入式设备里很少有热插拔场景所以HPDHot Plug Detect信号通常要么直接拉高要么由SoC的GPIO检测。但就算不依赖热插拔主控侧eDP控制器也不会凭空开始发数据它必须等panel驱动准备好电源和时序之后再启动AUX通信和链路训练。2.2 一次完整的eDP建链过程拆解以RK3568平台为例一条eDP屏从系统上电到真正显示画面大致经历这么几个阶段SoC上电相关时钟、pinctrl初始化完毕先保证系统能起来。eDP控制器所在电源域上电PHY的供电如VCC_1V8、VCC_3V3稳定。panel驱动Linux里通常是panel-simple或厂商自带的edp-panel驱动控制VDD上电屏端电源稳定。屏的复位引脚释放。这里有个很关键的参数复位信号拉低保持时间、VDD稳定到复位释放的延时必须满足屏规格书。屏端控制器初始化完成后主控开始通过AUX通道读取EDID。主控根据EDID信息确定分辨率然后启动链路训练设置lane数和link rate并做均衡和预加重。链路训练成功后主控开始通过主链路发送视频数据这时候屏幕上才会出现画面。最后一步是背光点亮。背光不该早于视频数据出现否则人眼会先看到一片亮屏几秒后才出画面观感上就像“显示异常”。任何一个环节的时序不对都可能从根本上导致链路失败。而“概率性”的本质就是某个环节的时序裕量非常接近临界值有时恰好过了有时差那么零点几毫秒就挂了。RK3568的eDP控制器本身支持到eDP 1.3主链路支持最高2.7Gbps的HBRHigh Bit Rate最多4 lane1080P60这种常见分辨率完全够用。但控制器支持归支持实际能不能稳定建链还要看板级实现和系统侧配置。我看到很多RK3568板子的画板习惯是从RK3399时代延续下来的电源和复位走线比较随意这在eDP这种需要稳定握手协议的接口上就容易埋雷。3. RK3568平台上概率性不显示的四大高发原因3.1 电源、复位、背光的时序没有对齐这是概率性黑屏的最高频原因没有之一。屏厂在规格书里都会给出明确的上电时序图通常会包括VDD电源建立后到RST释放之间的延时、RST低电平保持宽度、RST释放后到AUX通信可开始的时间以及VDD关闭到下一个上电周期之间的最小间隔。实际在RK3568的设备树里这些时序控制分散在panel驱动和eDP驱动里。如果使用的是panel-simple这类通用驱动毫秒级的延时参数可以通过设备树来控制但如果是厂商给的半成品BSP往往这些延时写得很随意。比如某屏规格书要求VDD稳定后至少20ms再释放复位代码里却只给了5ms。在大多数板子上5ms也能亮但只要屏端电源滤波电容的容值有一点批次差异或者主板供电纹波稍有波动这个5ms就不够了复位释放时屏端逻辑还没起来后续AUX通信全部失败。这一类问题的排查核心是“量时序”后面第4节我会具体讲示波器的测法。这里想强调一点背光时序同样重要。部分方案里背光enable信号和VDD用同一个GPIO控制如果代码里背光比视频早开冷启动时屏幕先亮起来但没画面用户就会以为主板坏了。实际链路可能再等几十毫秒就能好但用户体验已经差了。3.2 PHY供电与校准问题RK3568的eDP PHY是片内的但PHY用的电源还是要外部供给。如果PHY的供电轨和屏的VDD、LED背光共用一路DCDC而背光升压又是脉冲电流很大的负载PHY电源上就容易出现周期性毛刺。在链路训练阶段PHY的电压裕量不足会直接导致眼图变差均衡器训练失败于是概率性黑屏。另外eDP PHY在上电后有一个校准流程。这个校准需要电源稳定、时钟稳定的前提条件。如果内核驱动在PHY供电尚未稳定时就启动了校准或者校准寄存器的配置和板级Layout不匹配也会导致链路训练时好时坏。这一类问题在日志上通常表现为link training失败或者downspread、pre-emphasis设置异常。遇到这种问题简单粗暴的解决手段是把PHY的供电改成独立的LDO或者在电源轨上加大电容把纹波压下去。软件侧则可以检查是否关闭了PHY的省电模式power saving因为在待机切换的瞬间重新做链路训练是概率性黑屏的一个重要来源。3.3 驱动加载竞态与初始化延时不足这是RK3568平台比较典型的Linux内核问题。eDP链路涉及VOPVideo Output Processor、eDP控制器、panel三个子系统在Linux下它们往往由不同的驱动probe。如果panel的probe在eDP controller还没ready时就先跑了或者eDP controller的probe被defer后重试而panel的电源控制又被另一个模块占用了时机建链时序就可能被打破。更常见的坑是设备树里pinctrl的默认状态设置。很多RK3568官方SDK默认会把复位引脚、使能引脚的初始电平配置为某个状态如果reset引脚在bootloader阶段是低电平而驱动probe时没有立即切换或者切换的时机晚了几百毫秒屏可能已经在错误的时序下完成了一次失败的初始化。之后驱动再尝试建链时屏端状态机已经不接受了链路就一直建立不起来。这类问题在日志里有一个特征dmesg中eDP驱动偶尔报出Timeout、Link Training failed、AUX CH failed之类的错误但并不是每次都报复现的时间和内核启动的log timing有相关性。3.4 EDID读取与链路训练重试机制缺失EDID读取失败和链路训练失败是两种不同情况但都可能导致概率性黑屏。前者是AUX通道上的通信错误后者是主链路上的训练错误。AUX通道是一对单向差分信号速率不高1Mbps级别但它对噪声非常敏感。如果主板上AUX的走线太长、没有包地、或者靠近了背光线缆在系统启动时背光升压电路产生的EMI就可能干扰AUX通信导致EDID读到一半失败。驱动如果对EDID读取失败不做重试建链直接中断屏幕自然黑掉。链路训练失败也是类似的道理。主链路的lane之间需要做skew补偿如果PCB上4对差分线的长度差异过大或者连接器接触阻抗不稳定训练过程就可能fallback失败。更气人的是有些屏厂提供的eDP屏固件在某些pre-emphasis档位下就是不稳定但屏规格书说支持实际到了批量环境里这批屏就需要降低一档速率才能保证每次训练成功。4. 实操排查从日志到波形一步步把“概率”逼出来4.1 先看日志一条命令定位失败发生在哪一步排查的第一步永远是日志。在RK3568的Linux 4.19内核里eDP相关驱动的日志一般会带edp、drm、panel这些关键字。建议开串口的时候把内核日志完整抓到文件里然后重点搜索dmesg | grep -iE edp|drm|panel|dp|link train|aux正常开机时你应该能看到eDP驱动初始化、PHY校准、EDID读取成功、link training成功、VOP使能这些关键日志。一旦黑屏日志会停在某个环节或者直接报错。有个容易被忽略的细节很多RK3568方案的串口默认只开uart2但内核日志的printk级别可能会把debug信息过滤掉。排查eDP时建议在内核cmdline里加上loglevel8或者动态调试全开。还有更简单的做法直接通过debugfs看当前的DP状态cat /sys/kernel/debug/dri/0/edp/status如果这个节点存在能看到link rate、lane count、training status等信息比猜要快得多。另外/sys/class/drm/card0-eDP-1/status也能反映链路是否connected。注意不同SDK版本的路径可能略有差异但思路是一致的。日志看多了会发现一件事真正“没有报错就黑屏”的情况很少大多数概率性黑屏在日志里都留下了蛛丝马迹只是被淹没在大量无关log里。所以我的习惯是开机后马上执行一次完整dump把dmesg /tmp/boot.log存下来出现黑屏后立刻和正常开机的log做diff往往几行之间的差异就指向了问题点。4.2 用示波器量时序把“概率”变成“确定”日志能定位到大概率是哪个环节但真正要确认还得上示波器。我排查这类问题时一般用四通道示波器同时抓VDD、RST、背光EN、AUX差分对中的一个通道一次就能把关键时序看得清清楚楚。测量时先找到屏规格书里的时序图把上升/下降时间、高低电平保持时间、相互之间的延时都标出来。然后对着测量VDD从0上升到稳定电平的斜率以及稳定后到RST释放的延时。RST低电平保持时间从拉低到拉高之间的宽度。RST释放后到AUX上出现第一个通信包的间隔。视频数据开始后到背光EN拉高的时间差。第一次量通常会发现明显的问题。比如你看到RST释放得太早VDD还在爬升过程中或者RST低电平只有1ms而规格书要求10ms又或者背光EN拉高时主链路都还没开始训练。这些问题一旦在波形上确认修复方向就非常明确。这里补充一个测量技巧示波器触发模式建议用RST的上升沿触发然后看整个时间窗口。如果你用VDD触发RST可能已经跑出窗口了。另外AUX差分信号幅度很小建议使用差分探头或者至少用两个单端探头做差分计算否则测量结果会误导你。我在这次排查里量到了一个非常典型的异常VDD稳定到RST释放隔了大概30ms初看没问题但细看发现VDD的上升斜率非常慢实际是DCDC输出能力不够导致屏端电源在很长一段时间里处于“将满未满”的状态。这种波形平时看不出来但碰上一批电容容值偏差稍大的屏就直接导致概率性不稳定。4.3 交叉实验主板、屏幕、线缆逐个排除时序测量做完如果波形全部符合规格书就要考虑主板或屏端本身的问题了。工程上最有效的办法是交叉对比实验。我通常这样安排把所有测试板分成几组把出现黑屏的板子和正常板子的eDP屏互相调换同时把连接器线缆也换一换然后每组循环做100次冷启动测试记录黑屏次数。哪个组合黑屏率高问题就在哪个环节。举个例子如果黑屏现象跟着某块屏走那就是屏的问题如果跟着主板走那就是主板问题如果只有“主板A屏B”的组合才出问题那大概率是某一对信号之间的协同时序裕量不足或者阻抗不匹配。再加上一个变量——把背光电源和逻辑电源分开供电或者给AUX信号加屏蔽基本就能把硬件层面的干扰问题也覆盖掉。交叉实验的关键是保证变量单一一次只动一个变量。我见过太多人同时换了屏、换了线、改了dts结果黑屏依旧却根本不知道是哪个动作起了作用。这种混乱的测试不如不做。5. 修复落地与压力测试5.1 设备树调整实例eDP panel配置的核心参数如果问题出在panel侧时序修改RK3568设备树是最直接的手段。下面给一个精简但完整的edp-panel设备树示例关键参数我都加了注释。不同SDK版本对binding字段名的叫法略有差异实际使用时以你手上那份内核文档为准但思路是通用的edp { status okay; lane-count 4; /* 主链路lane数要和屏规格一致 */ link-rate 0x0c; /* 1.62Gbps若屏支持HBR可配0x0f */ hpd-gpios gpio4 16 GPIO_ACTIVE_HIGH; pinctrl-names default; pinctrl-0 edp_hpd; }; edp_panel { status okay; compatible edp-panel; power-supply vcc_lcd; /* 屏VDD供电 */ enable-gpios gpio4 17 GPIO_ACTIVE_HIGH; /* 屏使能脚 */ reset-gpios gpio4 19 GPIO_ACTIVE_LOW; /* 屏复位脚 */ backlight backlight; /* 关键时序参数根据屏规格书填写单位是毫秒 */ delay-prepare 20; /* VDD稳定后延时20ms再释放复位 */ delay-reset 10; /* 复位低电平保持10ms */ delay-unprepare 100; /* 复位释放后延时100ms再做链路训练 */ port { panel_in_edp: endpoint { remote-endpoint edp_out_panel; }; }; };这里注意link-rate的取值和寄存器值对应关系0x0c代表RBR1.62Gbps0x0f代表HBR2.7Gbps。如果屏本身只支持RBR你却配置成HBR链路训练就会频繁失败。这个参数很多BSP默认配成HBR遇到只支持RBR的屏就容易概率性黑屏。改过来之后往往问题立刻消失。另外reset-gpios的active level要特别小心。你看规格书里复位脚是低电平复位还是高电平复位Active低就声明为GPIO_ACTIVE_LOWActive高就声明为GPIO_ACTIVE_HIGH。这个写反了之后驱动在准备/解备时段的电平操作就全反了释放复位变成了拉低屏永远起不来——这也是一个我见过不止一次的低级错误。5.2 驱动侧优化补重试降速率关省电设备树能解决的只是panel侧参数匹配。如果问题出在eDP控制器驱动自身就得看内核侧能不能打补丁。最常见的三种优化方向第一给链路训练加重试机制。很多RK3568的第三方BSP是从上游rockchip内核改出来的eDP驱动在link training失败后不会自动重试直接返回错误。我在调试时直接给驱动打了一个简单的patch单次训练失败后延时100ms重复训练最多3次直到成功为止。虽然治标不治本但作为快速止血非常有效。第二降低链路速率和lane数。把link-rate从HBR2.7Gbps降到RBR1.62Gbps或者把lane count从4降到2。速率越低信号裕量越大训练成功率越高。1080P60的带宽需求只有3.73Gbps出头RBR4lane能提供6.48Gbps降速到RBR仍然完全够用。如果降低后测试1000次没有黑屏说明根因大概率是信号完整性问题而不是逻辑时序问题。第三关闭eDP驱动里的省电模式电源切换。某些内核版本在屏进入suspend后会关闭eDP PHY的电源resume时重新建链。如果VOP的驱动和eDP驱动的resume顺序乱了屏端就醒不过来了。此时干脆在驱动里把PM runtime的autosuspend关掉或者直接把省电切换相关的代码跳过去稳定性立竿见影。5.3 压力测试别修完就收工用数据说话修复之后一定要做批量压力测试否则你根本不知道问题是否真的解决了。我自己的标准是同一机型、同一批板子至少选5台故障板每台连续做200次冷启动循环统计成功率。只有所有板子100%通过才算修复完成。测试脚本很简单一个shell脚本控制继电器或者I/O控制板反复断电上电同时判断屏幕是否点亮。判断方法可以在LCD屏幕上跑一个开机自启的测试程序程序在特定GPIO上拉一个电平信号外部MCU检测这个信号来判断画面是否正常或者用串口判断内核日志里eDP链路建立是否成功。除了冷启动还要覆盖热重启reboot和suspend/resume。因为热重启时电源不会完全掉电屏端的电容还保留着电荷这又是一种完全不同的时序环境。很多板子冷启动没问题reboot反而概率性黑屏多半就是屏端没有完全掉电、复位状态没有彻底清干净导致的。此时除了改软件延时还可以考虑在reboot流程里增加掉电延时让屏端彻底放电后再重新上电。6. 高频问题速查与独家心得6.1 排查问题速查表现象特征首要怀疑方向快速验证方法典型修复手段背光亮、无画面、冷启动多电源/复位时序裕量不足示波器对照规格书量VDD/RST修改设备树延时参数日志报link training失败主链路信号完整性问题降低link-rate重复测试降速至RBR、减少lane数日志报AUX或EDID读取失败AUX通道干扰交叉实验屏蔽AUX主板Layout优化、增加重试reboot或resume后黑屏电源未彻底掉电/状态未清测量断电时序增加掉电延时、关闭PM切换特定屏特定板组合才黑屏阻抗不匹配或固件版本差异更换屏/线缆对比换固件版本、调整pre-emphasis所有板子都偶发波形正常PHY供电或校准问题测PHY电源纹波独立供电、加大电容、关省电这张表是我这次排查过程中实际用到的判断路径。遇到新问题别慌先把自己手里的现象往表上靠通常能节省大量走弯路的时间。6.2 防患于未然的几条经验经历这次排坑我总结了几个写在设计阶段就能避免eDP概率性黑屏的要点提前做比事后补救省太多事第一选屏阶段一定向屏厂索要完整的上电时序图和接口定义特别是RST低电平宽度、VDD稳定到RST释放的delay、RST释放到AUX可用的delay这三个参数。如果屏厂提供不了这些数值趁早换供应商否则后续量产遇到问题根本没法定位。第二原理图阶段就确认复位和使能信号的连接方式。很多方案喜欢把屏的PWR_EN和LED背光EN放在一起控制这在逻辑上没问题但如果你想让背光晚于视频数据开启就必须保证这两个信号能被软件分时控制。不然黑屏排查时背光永远抢先亮起来问题面目全非。第三批量生产测试时做“冷启动老化”。产测程序不要只跑一次开机而是循环断电上电至少要跑50个循环。这能在老化阶段把时序裕量不足的板子筛出来远比等到用户手里再发现要好。我这次如果早一点在产测环节加重这个测试后面就没这么多事了。第四BSP内核版本要锁定。RK3568的BSP更新很频繁eDP驱动在不同版本之间的行为差别很大。同一个问题在4.19上修好了升级到5.10可能又复现因为驱动的probe顺序和PM逻辑变了。所以量产阶段内核版本冻结是稳定性的基本前提。最后再说两句这次RK3568 eDP屏概率性不显示的问题最终定位在主链路速率配置过高、加上系统侧复位时序裕量不足这两个因素共同作用。单独看每个问题都不严重但叠在一起就成了批量概率性故障。嵌入式调试就是这样很多“玄学”问题背后其实是多个变量在互相拉扯你只有把链路拆开、逐段验证才能把概率从“偶尔”变成“可控”。我在实际调试中最深的体会是不要在没有测量数据的时候去猜问题。示波器永远是嵌入式工程师最好的朋友尤其在eDP这种协议握手型的接口上波形比任何日志都诚实。另外也提醒一句设备树里那些看似不起眼的延时参数实际上是和生产稳定性直接挂钩的关键数据千万别拿到BSP默认值就放过去。希望这篇记录能给正在调RK3568或者其他Rockchip平台eDP屏的你提供一点参考少走几步弯路。
返回列表