拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

从LVDS到eDP:嵌入式显示高速串行接口的链路训练与调试实战

从LVDS到eDP:嵌入式显示高速串行接口的链路训练与调试实战 第一次在示波器上看到eDP的眼图时我就意识到这跟LVDS完全是两个时代的产物。eDPEmbedded DisplayPort作为VESA专门为嵌入式显示定义的高速串行接口今天早已不是笔记本的专属工控屏、车载中控、医疗监护仪、消费电子里到处都是它的影子。很多刚接触eDP的工程师面对一根排线里就十来个信号怎么点都不亮最后抓波形才发现链路训练压根没完成。eDP的秘密集中在三根信号上负责搬数据的Main Link、负责下命令和读状态的AUX CH、以及负责上报面板状态的HPD。这篇文章我会把这三条线从物理层到协议层的完整工作方式拆一遍结合我bring-up和debug时的真实经历把那些datasheet里不会写的坑一起讲清楚。1. 为什么嵌入式显示要从LVDS切换到eDP并行总线的天花板与协议化必然1.1 并行RGB/LVDS到了高分辨率时代就是硬伤早年的嵌入式显示大家用得最多的是LVDS和并行RGB。并行RGB的物理结构很直白像素时钟一根线RGB数据动不动就是18根、24根再加上行场同步排线一拉就是几十根信号。到了中高分辨率信号完整的控制成本立刻上来了。LVDS虽然把数据串到4对差分线上但本质上还是“像素时钟×7”的并行数据传输每对线的速率受限于时钟频率和线缆质量到了1080p以后就已经很吃力想上4K就得用两副LVDS链路VGA、DC、CLK、DE一堆信号挤在FFC排线上串扰和EMI处理起来非常痛苦。eDP把这一切换成了一条基于小包传输的高速串行总线。单对差分线的速率从1.62Gbps一路做到8.1Gbps4条lane一开原始带宽轻松超过30Gbps。更重要的是它不再把像素信号“硬扛”在线上而是把视频数据打包成一个个Transfer UnitTU发出去面板端的TCON按包头恢复出精确的时序。这样就带来一个革命性的好处链路质量和像素格式之间解耦了同样一根排线跑1080p和4K只是协商速率不同不再需要重新设计硬件。1.2 eDP各版本演进从PSR到DSC功能是一点点堆上来的eDP并不只是一个“高速LVDS替代品”它在VESA的体系里是独立演进的一条线从1.1一路走到1.5每个版本都往协议栈里加了一些对嵌入式场景非常重要的东西。版本发布时间核心变化eDP 1.12008基于DisplayPort定义嵌入式用例替代LVDSeDP 1.22009引入Panel Self RefreshPSR面板自刷新eDP 1.32011增强链路管理和低功耗优化eDP 1.4/1.4a2013增加HBR3速率、DSC显示流压缩、PSR2eDP 1.4b2017细分刷新率策略ALPM更长休眠eDP 1.52021新增Panel Replay、Adaptive-Sync等对做产品的工程师来说版本最重要的意义在于两端SoC和面板的能力协商协商是通过AUX CH读面板的DPCD寄存器实现的。你会看到很多面板明明写着支持eDP 1.4但最大速率只有HBR2说明它没有启用HBR3。这不是板子坏了是寄存器里写死的拿到屏先读一遍能力寄存器再谈速率和分辨率能不能扛得住。1.3 带宽账本算清楚再决定用几条lane带宽这块我建议每个做显示的都学会自己手算别什么都信驱动模板。算带宽很简单分辨率×刷新率×色深再乘盲区空占比。以1080p60Hz、24bit为例有效像素是124.4M/s约2.99Gbps算上行场消隐按2200×1125×60算实际要传3.56Gbps。单lane HBR有效带宽只有2.16Gbps肯定不够2 lane HBR的有效带宽4.32Gbps就够用了。4K60Hz、24bit按4400×2250×60算约14.26Gbps那么2 lane HBR28.64Gbps有效不够4 lane HBR217.28Gbps有效刚好过得去。4K120Hz加10bit HDR4 lane HBR3的25.92Gbps也顶不住这时候就必须靠DSC压缩或者接更高阶的链路。我见过不少项目硬件照抄参考设计结果面板从4 lane降到2 lane分辨率就上不去了最后查下来就是软件里DSC没使能白白浪费了硬件能力。2. Main Link通道把像素装进微包再走过整条信号链2.1 物理层差分对、AC耦合与编码开销Main Link是eDP的数据主干由1条、2条或4条差分对组成每条lane线速率可以是RBR1.62Gbps/lane、HBR2.7Gbps/lane、HBR25.4Gbps/lane或HBR38.1Gbps/lane。物理上每条差分对都是AC耦合的源端和面板端之间会串一颗电容绝大多数设计是100nF。差分阻抗控制在100Ωlayout上要特别注意等长和参考平面两条内部线的长度差要压到极小否则到了5.4Gbps以上skew直接吃掉眼图宽度。Main Link传输用的编码是8b/10b即每8bit数据实际在线上要发10bit符号。这么做有两个原因一是维持DC平衡避免长串的0或1把直流分量顶起来二是保证足够多的跳变沿方便接收端恢复时钟。8b/10b的代价就是20%的开销所以前面算带宽时我直接用“原始速率×0.8”得到有效带宽。协议上视频数据被打包成TUTransfer UnitTU里塞的是由MSAMain Stream Attribute包定义的像素时序参数包括分辨率、刷新率、像素格式、行场消隐等TCON拿到MSA后就能精确重建出视频时序而不是靠一根硬时钟线去对齐。2.2 链路训练开机时的一次“握手”谈判Main Link最关键的机制是链路训练Link Training这个机制解决的是“源端和面板都不知道对方能力上限也不知道线上损耗多大”的问题。整个过程本质是源端和面板通过AUX CH互相对话逐步把链路速度、lane数、驱动强度调到能稳定工作的状态。完整流程大致如下源端检测到HPD拉高确认面板已上电就绪。源端通过AUX CH读面板DPCD寄存器拿到MAX_LINK_RATE和MAX_LANE_COUNT也就是面板能力的上限。源端向LINK_BW_SET和LANE_COUNT_SET写入本次想跑的速率和lane数。源端写入训练模式先发TPS1时钟恢复训练序列再发TPS2或TPS3均衡训练序列HBR3下还会用到TPS4。源端轮询链路状态寄存器看每条lane的时钟恢复CR和符号锁定/通道均衡CE是否完成。如果某条lane没通过源端会增大电压摆幅V swing和预加重Pre-emphasis再试最多尝试几次后还是不行就降速率、降lane数重来。全部lane通过后源端把训练模式寄存器写成0进入正常传输状态开始送视频。很多人不理解为什么检查完时钟恢复还要做均衡训练。打个比方高速信号在PCB和FFC上跑就像人隔着很远的距离喊话距离远、干扰大时对方听不清音调细节喊话的人就得加大音量电压摆幅并且咬字更清楚预加重。眼睛图上看到的“张开程度”就是信号质量训练的过程就是在找一组参数让面板端的眼睛张得最大。2.3 展频时钟SSC与信号完整性的平衡点eDP源端通常会把参考时钟做展频SSC用向下展频Down Spread的方式把能量分散到更宽的频段换取EMI降低典型展频量是±0.5%或±0.3%。展频打开后源端和面板端必须都支持否则接收端锁相环会跟不上表现为偶发性闪屏。面板支不支持SSC也会写在自己的DPCD能力寄存器里训练前源端应该先读一下。Layout上对Main Link的教训我踩过不止一次。AC耦合电容一定要放在阻抗连续的位置不要因为空间紧张把电容打孔放到内层过孔的stub在高频下会形成反射点。4条lane内部尽量走同一层、同方向线长差尽量控制在10mil以内。FFC排线是另一个重灾区折弯处或者靠近金属屏蔽盖时损耗和串扰会突然恶化。遇到“同一块板子有的屏能过训练有的过不了”这种问题八成不是面板差异而是你的layout余量不够面板稍微偏差一点就顶不住。3. AUX CH辅助通道慢速信道里藏着协议的控制中枢3.1 物理层特征单对差分、曼彻斯特编码、1MbpsAUX CH是一条单对差分线半双工工作速率只有1Mbps和Main Link动辄Gbps的高速彻底反着来。但这条线承担了eDP所有控制面的功能读EDID、读写DPCD、链路训练、低功耗唤醒、面板状态上报全部靠它。AUX CH使用曼彻斯特编码传输。曼彻斯特编码的特点是“每个bit一定有一次跳变”用跳变沿来表达0或1。这样接收端不需要单独的时钟线也能恢复时钟代价是有效数据率只有信号速率的一半1Mbps的信号速率实际上只能传约0.5Mbps的有效数据但这对控制面完全够用了。AUX之所以故意做这么慢就是为了在高速数字环境里获得更高抗干扰能力毕竟它跑在离Main Link很近的地方而它承载的训练握手如果出错整个系统都点不亮。3.2 事务模型Native AUX与I2C-over-AUXAUX CH上跑的事务分两大类Native AUX事务和I2C-over-AUX事务。Native AUX事务直接访问面板的DPCD寄存器空间读写命令由4字节头部组成包含同步、命令类型和20位地址后面跟最多16字节的数据事务尾部还有奇偶校验。一条AUX写请求就是源端发地址和数据面板端回一个应答状态一条AUX读请求则是源端发地址面板端把寄存器内容作为数据返回。所有链路训练参数的交互都依赖这种事务。I2C-over-AUX则是把AUX当桥接通道去访问面板挂载的I2C设备最常见的就是读EDID。EDID通常挂在I2C地址0x50上但AUX事务一次最多搬16字节数据EDID有256字节后面还有扩展块所以源端要按地址段分多次去读。第二块及以上扩展块要用段指针寄存器Segment PointerI2C地址0x30切换。如果你在调试时发现EDID读到一半卡住优先怀疑AUX信号质量或者面板端I2C控制器的响应时序。3.3 DPCD寄存器链路状态的全景图DPCDDisplayPort Configuration Data是一块很大的寄存器空间从0x00000开始源端读写它来完成几乎所有协议操作。我在现场调试时手边常备一张核心寄存器清单寄存器地址名称作用0x00000DPCD_REV面板支持的DP/eDP协议版本0x00001MAX_LINK_RATE面板支持的最大链路速率0x00002MAX_LANE_COUNT面板支持的最大lane数量0x0000EEDP_CONFIGURATION_CAPeDP特有能力如支持面板控制功能0x00100LINK_BW_SET源端写入本次协商的速率0x00101LANE_COUNT_SET源端写入本次协商的lane数0x00102TRAINING_PATTERN_SET训练模式控制0x00103~0x00106TRAINING_LANE0~3_SET设置每条lane的电压摆幅和预加重0x00200~0x00202LANE_x_STATUS / LANE_ALIGN_STATUS训练结果状态0x00203~0x00204ADJUST_REQUEST_LANE_x面板请求调整的参数这个表格值得保存在手机里。真正的教训是当显示异常时不要急着乱试先把这几个寄存器的值抓出来看。我调试过一台老款工控一体机现象是开机偶尔黑屏看训练状态寄存器发现lane1的CR一直在失败调整了预加重之后稳定了。如果你没有这个抓寄存器的习惯很容易在“是不是电源问题”“是不是背光问题”之间来回耗。4. HPD热插拔检测面板与主控之间的“事件哨兵”4.1 HPD的电平行为正常高电平、短脉冲中断、长低电平断开HPD是一根单端信号线方向是从面板端指向源端典型的3.3V电平。协议里HPD的行为看上去简单但细节很容易被忽略。正常连接时HPD保持高电平。当面板需要源端介入时会拉一个持续0.25ms到2ms的低脉冲这叫IRQ_HPD相当于“我有事件要上报”。当面板拔出或者链路异常断开时HPD会拉低并保持超过2ms源端在去抖后判定为断开事件。这里要特别说明一点eDP是嵌入式接口面板基本是焊死的几乎不存在用户“热插拔”的场景。所以eDP里的HPD更多承担的是另外两个职责一是面板电源就绪信号二是面向源端的中断请求线。很多嵌入式工程师第一次用eDP时以为HPD只是“检测屏插没插”于是干脆不接或直接拉高结果面板上电后源端不进行链路训练屏幕就是黑的。HPD在eDP里的含义必须理解对。4.2 eDP场景下HPD的三个实际职责就绪通知、PSR唤醒与错误上报职责一就绪通知。eDP面板上电后内部的TCON需要初始化、PLL需要锁定这个过程通常需要几十到几百毫秒。TCON初始化完成后才会把HPD拉高。源端看到HPD高后才敢去发起AUX通信和链路训练。如果某块面板的电源时序特别慢而驱动又没等HPD就会发生AUX超时。职责二PSR唤醒。eDP 1.2开始支持Panel Self RefreshPSR进入PSR后源端可以停止发送视频信号由面板用自己的本地帧存持续刷新画面这是笔记本续航的关键技术。但面板一旦遇到自己搞不定的事情比如帧存出错、温升保护、刷新超时就会用IRQ_HPD把源端拉回来。源端收到短脉冲后需要退出PSR状态、重新接管画面。职责三错误上报。eDP 1.4之后的Panel Replay和Adaptive-Sync同样依赖HPD上报面板状态变化。面板在做可变刷新率时如果出现超时或需要重发帧会通过IRQ_HPD通知源端。整个系统的低功耗策略和多模式切换都建立在这根线的可靠解析之上。4.3 时序参数与去抖软件驱动里最容易被写错的地方HPD的信号处理看起来简单软件里却最容易翻车。源端对HPD的判定必须有去抖逻辑连续电平稳定一段时间后才算是有效事件。常见的做法是把GPIO配成双边沿中断进中断后启动一个定时器延时100ms再读一遍电平确认稳定了再处理。处理IRQ_HPD时还要区分短脉冲和长低电平这决定了后续是“处理中断”还是“整条链路断开”。我在某个项目里就吃过亏面板规格书上写HPD上电拉高的时间典型值是200ms驱动默认只等了100ms结果10片里有1片在低温下初始化变慢源端就误认为面板没准备好整个链路训练流程被跳过屏幕点亮成功率只有九成。后来把等待HPD的超时时间加大到500ms并且加上“等不到HPD就重试”的逻辑问题才消失。HPD这根线最不值钱但它是整个eDP链路的启动开关优先级比Main Link和AUX CH都要高。5. 遇到“点不亮”别慌三轮排查定位三大信号的病根5.1 第一轮先把HPD和电源时序确认清楚面对一台eDP点不亮的设备我从来不先动逻辑分析仪第一步永远是看HPD。用示波器DC档抓HPD和面板VDD的时序确认VDD起来后HPD有没有在一段合理时间内拉高。如果HPD没拉高后面的一切AUX和Main Link都无从谈起问题是电源、TCON初始化或面板硬件本身。HPD正常拉高后再去抓AUX CH。这时候看有没有1Mbps的曼彻斯特波形以及面板有没有正常应答。如果AUX上完全没波形检查源端是否已经使能了eDP控制器如果AUX上有请求但面板不回检查AC耦合电容、差分阻抗、面板端I2C/DPCD是否卡死。最有效的办法是直接读几个核心DPCD寄存器能读到DPCD_REV基本说明AUX通路是通的。5.2 第二轮链路训练失败时学会看训练状态寄存器如果AUX正常但屏幕还是黑的十有八九卡在链路训练。此时强制把速率降到RBR或HBR先确定能不能在低速下点亮再用二分法往上找临界速率。同时反复读LANE_x_STATUS看是哪条lane的CR没过、哪条lane的CE没过然后针对性调电压摆幅和预加重。这里有个经验训练失败不要只调一次就放弃面板和SoC对参数的敏感度不同把V swing和Pre-emphasis组合多试几轮同时观察眼图和误码。如果是某一条lane固定失败先量这条lane的AC耦合电容和线长再检查是否做了lane polarity反转或lane mapping配置。很多SoC允许软件层面翻转lane极性或映射顺序但默认配置下接反了就是黑屏硬件改线代价大软件翻转是最快的验证手段。5.3 第三轮那些“偶发”问题多半在低频信号和软件逻辑上闪屏、休眠唤醒失败、PSR退出异常这类问题不要一上来就去怀疑Main Link。我遇到过几次典型的例子开发板正常量产样机偶尔闪屏最后抓到的是HPD上叠加了纹波干扰源端把噪声误判成IRQ_HPD导致系统不停退出PSR又重进。这种问题靠加粗HPD走线、远离背光PWM走线、或者在GPIO上做滤波解决。另一种高频坑是FFC排线。有的屏用FFC连接排线在机构里折来折去高速lane对位偏移或者被螺丝压到训练会时好时坏。面板点亮后去掰一下排线如果画面开始闪或者花屏基本就是接触或阻抗问题。跟面板FAE沟通时把HPD波形、DPCD寄存器转储、训练尝试次数和当时的速率/lane数一起发过去对方一眼就能看出问题在哪比你只发一张“不亮”的照片高效太多。5.4 调试工具建议做eDP调试示波器带宽至少2.5GHz起步越高越好配差分探头抓Main Link眼图。AUX CH因为速率低普通探头就能看。有条件的话上协议分析仪可以直接解码AUX事务把源端和面板端的交互过程拉出来看。没有协议分析仪也不要紧很多SoC的驱动里带了DPCD dump功能训练失败时自动打印寄存器状态这比抓波形更快。另外保留一块“已知好的”基准板很重要我习惯在硬件调试初期就把同型号的面板、同版本的SoC模板固定下来排查问题时先在基准板上抓一套“正常波形”存档后面所有异常对比着看效率会高很多。eDP链路这个东西玄学的时候多但把三大信号按顺序拆开检查绝大多数问题都能定位到物理层或协议层里的某一个具体环节。
返回列表