MIPI LP CD机制与调试实战:从时序参数到花屏排查
做嵌入式显示和摄像头调试的朋友对MIPI这词肯定不陌生。DSI、CSI、D-PHY、C-PHY平时聊方案张口就来但真到调板子的时候花屏、白屏、总线卡死、插上屏没反应这些坑往往不在高速传输那段而是出在MIPI的LPLow Power低功耗模式上。LP模式下的那套控制/数据机制业内喜欢简称LP CDControl/Data它负责的是链路怎么从空闲状态走到高速状态、怎么安全退回去、怎么做总线仲裁和低功耗数据传输。可以这么说高速模式决定带宽上限LP模式决定链路能不能活着工作。这篇内容我打算把MIPI LP CD从物理电平、状态机、时序参数到实际调试完整捋一遍包括示波器实测方法、RK3588和FPGA平台上的适配步骤、以及花屏白屏这类故障的排查套路。适合刚接触MIPI协议、正在调MIPI屏或摄像头、或者准备在FPGA上做MIPI接口的工程师参考老手也可以跳到自己关心的章节看看有没有漏掉的坑。1. MIPI里的LP到底在做什么1.1 从D-PHY物理层说起MIPI D-PHY是当前最常用的物理层标准DSI显示接口和CSI摄像头接口都是跑在它上面的。D-PHY的每条lane由一对差分线组成Dp和Dn一条时钟lane加一到四条数据lane。很多人一听到差分信号就以为全是高速小摆幅其实MIPI D-PHY是双模的高速HS模式用小摆幅差分信号传数据低功耗LP模式用大摆幅单端信号传控制信息和低速数据。LP模式的核心是四种状态对应Dp和Dn两个引脚的高低电平组合LP-11表示空闲LP-01、LP-10、LP-00各有各的用途。HS信号的进入和退出必须经过特定的LP状态序列比如HS Entry序列就是LP-11到LP-01到LP-00然后进入HS-0的SoTStart of Transmission前导。这套流程不能乱乱一步PHY就识别不了接收端直接罢工。这里要特别注意LP信号不是差分信号是两个单端信号一起表示的逻辑状态。所以测量LP状态时你光夹一个探头在Dp上看波形是看不出名堂的必须同时看Dp和Dn两个通道组合起来判断当前状态。很多新人在调试时只抓单端波形看到一堆方波就以为数据在跑其实可能总线压根没进高速模式只是LP状态机在空转。1.2 LP CD这套机制管了哪些事所谓CD我理解的是Control和Data两层含义。首先LP模式承担了所有链路控制功能HS Request、Escape Mode进入、BTA总线切换、ULPS超低功耗状态这些都是通过LP状态组合来编码的。比如Escape Mode的进入序列是LP-11、LP-10、LP-00、LP-10、LP-00后面跟8位命令和8位数据可以用来发LPDTLow Power Data Transmission、触发BTA等。其次LP模式也真的可以传数据这就是LPDT。在DSI接口里LPDT常用于命令模式Command Mode下面板寄存器的读写DDIC的初始化序列很多时候就是靠LPDT传过去的。走LPDT时数据率很低但胜在稳定、简单不需要提前训练时钟恢复所以屏的初始化代码基本都是在这种低速状态下完成的。这套机制设计得巧妙的地方在于它让总线在不需要高速传输时几乎不耗电需要传输时又能通过LP状态机快速切换到高速模式。代价就是协议状态机相对复杂任何一个状态转换不满足时序要求链路就会卡死在某个状态。我调过的板子里至少有三次“屏点不亮”最终查出来是LP状态机的问题而不是初始化代码写错。2. LP CD的关键时序与测量方法2.1 时序参数的核心逻辑MIPI规范里定义了一堆以T开头的LP时序参数比如T_LPX、T_TA_GET、T_TA_GO、T_TA_SURE。T_LPX是最小低功耗脉冲宽度一般要求不小于50ns这是所有LP状态切换的基础节拍。T_TA_GET和T_TA_GO是总线切换BTA时的准备时间和保持时间BTA期间发送方释放总线接收方接管这个交接必须有足够的裕量否则两边同时驱动总线就会发生电流竞争轻则信号畸变重则损伤PHY。有个常见误解是这些时序参数只要满足最小值就行。实际上对于SOC内部的MIPI控制器固件或者驱动里已经把时序参数配好了你改不了也不需要改。真正需要关注的是那些由PCB布局和外部电路引入的偏差比如走线长短造成的skew、电平转换芯片带来的传播延迟、上下拉电阻对边沿速率的影响。这些外部因素会压缩接收端实际看到的时序裕量导致间歇性出问题。以我自己的经验LP时序问题最容易出现在两种场景一是用了非标准的电平转换芯片芯片本身的传播延迟和边沿速率达不到MIPI PHY要求二是PCB走线过长且阻抗失控导致LP信号反射严重波形上出现振铃接收端在状态判断时产生毛刺。2.2 示波器实测的坑看LP状态示波器带宽其实不需要很高200MHz到500MHz就够用了关键是探头和测量方法。我踩过的坑是用普通无源探头接地线又长又细测出来的波形上全是噪声LP状态判断根本不可信。后来换成弹簧地针或者直接用差分探头波形干净了一大截。其次是触发方式。观察HS Entry序列时建议用LP-01到LP-00这个跳变沿作为触发条件把示波器设置为正常触发抓SoT附近的完整波形。这样才能同时看到LP状态切换和随后HS信号的前导部分判断时序是否符合预期。如果只抓单通道你完全没法确认Dp和Dn的相对关系也就不知道状态对不对。还有一个细节HS模式下Dp和Dn是差分小摆幅信号约200mV量级而LP模式下是约1.2V量级的大摆幅信号。示波器探头衰减设置不合适时HS信号可能直接被淹没在量化噪声里。测HS段建议AC耦合、加大垂直灵敏度测LP段用DC耦合、看绝对电平。不同段分开测不要指望一个画面全看清。2.3 Deskew校准到底校的是什么热词里有个“mipi dphy deskew calibration”顺带说一下。Deskew校准简单说就是校准每条lane之间的时间偏差。高速模式下数据lane和时钟lane并行传输接收端用时钟lane的边沿来采样数据lane。由于PCB走线长度不同、PHY内部路径不同各lane之间会存在skew这个skew一旦超过接收端容忍范围采到的数据就是错的。很多SOC自带deskew校准逻辑启动时会自动测量并调整per-lane的延迟。但在某些FPGA方案或者特殊PHY配置下需要手动做校准这就要靠发送特定的训练序列接收端反馈误码情况来调整。实际调试时如果发现高速传输偶发误码、花屏出现又消失可以先跑一下或者观察一下接收端的SKEW补偿状态寄存器看补偿值是不是超出预期范围。如果补偿值到了上限多半是PCB等长没做好硬件上的问题软件再怎么调也白搭。3. 实际平台适配与核心环节实现3.1 RK3588 Linux下适配MIPI屏幕的操作流程RK3588这颗芯片的MIPI DSI控制器比较典型配置起来也绕不开设备树。拿到一块新的MIPI屏第一步是跟屏厂要三样东西面板规格书、初始化序列、电压和复位时序要求。然后把面板抽象成设备树里的一个panel节点配置compatible、使能GPIO、复位GPIO、背光引用、以及display-timing三个参数。设备树里最容易被忽略的是lane-mapping。MIPI DSI物理上虽然标准规定lane顺序但PCB上为了走线方便可能会交换lane序号这时必须在设备树或驱动里把物理lane和逻辑lane对应关系配好。我没记错的话RK平台通过phy的data-lanes属性来配置数值是一个顺序映射一旦配反了屏不是不亮就是花屏而且表现为特定方向的异常排查起来很费劲。初始化序列的发送是在panel驱动里完成的常见做法是拿到屏厂给的寄存器列表组织成一个数组逐个写入。注意两个地方一是寄存器地址和数据宽度要跟屏的DDIC一致有的是8位地址8位数据有的是8位地址16位数据长度搞错整段序列就废了二是序列中间的延时不能省略尤其power on之后到发初始化命令之前还有初始化完成后到开背光之间这些延时是屏内部电路稳定所必需的。配置完成后从串口或内核日志里看dsi的probe情况重点确认进入的是video mode还是command mode。RK3588支持两种video mode适合普通TFT屏command mode适合带GRAM的屏或者OLED。如果驱动默认配错了模式可能表现为屏幕能亮但画面撕裂、刷新率不对或者低功耗下显示内容丢失。3.2 FPGA实现MIPI接口的三种思路FPGA做MIPI接口是另一个常见需求。先说结论普通IO引脚是实现不了HS高速模式的。D-PHY高速模式下摆幅只有200mV左右共模电压也比较特殊FPGA的LVDS或LVCMOS电平标准并不能直接兼容直接连上去除了信号劣化还可能把FPGA的IO bank搞坏。所以实际做的时候通常有三条路可走。第一条是外挂MIPI D-PHY收发器芯片FPGA内部只做协议状态机和数据通路。这种方案最稳PHY的性能有保障但多一颗物料和成本。第二条是使用带有MIPI PHY硬核的FPGA或SoC FPGA目前主流厂商高端型号里也有相关IP可参考授权和实现都有成熟路径。第三条是用LVDS电平近似替代拼凑SoT序列这种做法只能用于极短距离、低速的实验验证产品项目我不建议碰。FPGA内部做MIPI协议逻辑时核心难点在于LP状态机和高速数据通路的衔接。LP状态机负责管理Dp/Dn的电平状态和时序触发HS后要把控制权交给高速发射逻辑同时做好时钟域切换。我见过不少例子是状态机的复位逻辑写得太粗暴下一包数据还没准备好就把HS链路打断了导致接收端频繁重同步。所以状态机设计时一定要把“进入HS”和“退出HS”做成独立的、可重入的状态分支别偷懒用一个大状态机从头撑到尾。3.3 从ST7701S看一种典型的驱动IC适配热词里有ST7701S这是国产屏上非常常见的一颗DDIC常用于720P和1080P的LCD屏走4-lane DSI。适配这类屏的时候除了初始化序列还要特别注意分辨率、时钟频率和DSI传输速率之间的关系。举个例子一块720x1280的屏刷新率60Hz算下来像素时钟大约70MHz上下。如果RGB格式是24位那么DSI数据lane上的总传输速率就要接近像素时钟乘以位宽再除以lane数。实际配置MIPI发送端时经常需要把传输速率设成比理论值高一些留出blanking开销。速率设置偏低画面刷新跟不上会闪烁设置偏高又可能超过D-PHY的速率等级信号质量变差。ST7701S这类芯片对初始化序列的依赖程度很高断点续传、色彩增强、局部调光这些功能都要靠特定寄存器打开。我在调一颗国产平板屏时就因为漏了某个扩展命令整体颜色偏蓝绿色找了半天才发现是某个0xF0开头的厂商专用命令没写全。所以拿到初始化序列时不要自作聪明去删减先原样执行有问题再逐条分析。4. 常见显示故障排查与PCB设计避坑4.1 花屏、白屏、横向条纹的根因分析花屏的根因绝大多数是数据采样出错而不是图像数据本身不对。MIPI链路上数据采样出错的来源又主要集中在三块时钟和数据lane之间的skew过大、LP与HS切换时的信号毛刺进入接收端采样窗口、以及电源地噪声导致接收端判决阈值漂移。横向条纹和花屏的区别在于横向条纹往往是整条lane持续出问题比如某条数据lane极性接反、PLL失锁、或者时钟频率偏差过大导致一整行都采错。如果只是屏幕某一个区域花屏多半是deskew补偿不充分局部数据线延迟差异太大。这时排查方向是先看PCB等长再看PHY层补偿值。白屏则要分情况。如果背光亮但屏幕全白通常是panel没有正常收到初始化命令或者DDIC没有被正确唤醒停留在默认状态默认状态下DDIC内部GRAM内容不定表现出来的就是白屏花屏都有。这时先确认LP模式能不能正常进入再检查复位时序和初始化序列发送时机。如果背光都不亮那问题在电源或背光驱动上跟MIPI链路还没关系。4.2 用排查顺序锁定问题我自己的排查习惯是固定的先看PHY再谈协议先看LP再谈HS先看时钟再谈数据。具体操作时第一步用示波器确认复位释放后LP-11状态是否稳定建立。第二步触发一次HS Entry看SoT前导是否存在且稳定。第三步抓高速段的眼图确认信号质量。最后才去翻初始化序列和寄存器配置。这个顺序的意义在于它是从物理层往协议层逐层检查的。很多时候你觉得是初始化代码不对结果反复修改屏的寄存器毫无起色其实问题出在物理层根本没建立起高速链路。反过来如果物理层信号很干净那大部分花屏问题都能在协议配置层面找到答案比如时序参数、lane配置、时钟极性。实际调板时我还会顺手把内核里MIPI相关的error统计寄存器读一遍。很多SoC的DSI控制器会记录CRC错误、ECC错误、同步错误计数这些数字非常有价值。比如CRC错误只出现在某个场景下说明是特定数据模式触发了信号质量边缘可能是码间干扰如果错误均匀分布则多半是整体信号裕量不足。4.3 同层挖空和等长设计的具体操作热词里的“mipi同层挖空”指的是MIPI差分走线下方尽量不要有完整的参考平面开口或挖空区域。实际工程里常见的情况是MIPI走线在表层下面的内层有电源平面但某个区域因为过孔和走线密集参考平面被切断了。参考平面不连续差分信号的回流路径被迫绕路阻抗就会突变反射增加眼图变差。如果因为布线空间必须挖空那要注意挖空区域两侧必须用密集地孔缝合让回流信号能够就近跳到相邻完整地平面。同时挖空的边缘尽量垂直于走线方向避免与走线平行形成谐振腔。这个细节直接影响高速段信号质量但很多板子送到手才被发现返工成本很高。等长设计方面MIPI D-PHY对内等长要求比对外宽松一些但HS速率高了以后对内skew还是要控制在mil级别。具体做法是时钟lane尽量走中间数据lane分组对称长度差越小越好。注意等长不是越长越好补偿方式要自然蛇形线不要绕得太密否则寄生感应对信号质量的影响可能比skew本身还大。4.4 MIPI与LVDS、DVP如何选型最后聊聊选型。DVP是并行总线摄像头数据线加同步信号线简单直接老平台支持好但EMI大、速率上不去长距离根本没法用。LVDS是低压差分信号抗干扰能力强适合做显示信号的长距离传输工控设备里用得多优势是成熟稳定劣势是引脚数相对多而且缺乏MIPI那些灵活的低功耗状态。MIPI的优势在于高频下的低功耗和少引脚适合手机、平板、嵌入式模块这类对体积和功耗敏感的产品。缺点也明显协议复杂、调试门槛高需要PHY层和协议层的配合。如果项目对成本不敏感、板子空间够大、传输距离比较长LVDS可能是更省心的选择如果追求高分辨率、窄边框、低功耗那就安心啃MIPI。选择的关键还是看SoC接口支持情况。现在很多应用处理器同时带MIPI和LVDS桥接芯片也越来越成熟实际上还可以用MIPI转LVDS或者LVDS转MIPI的方案来兼容不同屏。但每多一次转换就多一分信号损伤能直连就直连别为了省事硬加桥。5. 调试过程中的几个实用技巧先把LP状态机打印做成一个调试接口这招在协议层面很管用。驱动里把PHY的当前状态寄存器读出来对应到LP-11、HS-0这些状态串口输出一条log排查总线卡死时能快速定位是停在了哪个状态。调试阶段可以加打印量产固件里去掉就行。再就是示波器波形保存的命名习惯。每次抓波形直接在文件名里写明测试点、信号、触发条件、测量值比如“CLK_LP_entry_rising_340mV”。看起来是小事但项目周期长了以后回看历史波形时能省下大量回忆时间。我吃过亏之前波形文件命名混乱出了问题想找早期的基线波形对照翻了几百个文件没找到后来才养成了这个习惯。面板初始化序列的管理也是个容易踩坑的地方。建议把初始化序列做成独立的头文件或者数据表和驱动逻辑分开每条命令旁边注释好作用。屏厂更新版本后对比差异也方便。最怕的是屏厂悄悄换了DDIC型号初始化序列还沿用旧版本点不亮或者显示异常排查很久才发现是版本不匹配。C-PHY方面简单提一句它是另一套物理层标准用三线一组替代差分对信号密度更高但调试逻辑跟D-PHY完全不同很多D-PHY的经验不能直接迁移。如果项目用到C-PHY老老实实按C-PHY的规范来S参数仿真和协议分析仪都得上齐全别用D-PHY的思路硬套。6. 最后聊聊实际调板体会做MIPI调试这几年我最深的一个体会是出了问题先不要急着怀疑软件配置先把示波器架上去看物理层信号。MIPI链路就像一个复杂的接力赛每一棒都在规定时间内交接任何一棒慢了快了一点点到了接收端就已经错得离谱了。而LP CD这套低功耗控制机制是整个接力赛的起跑口令口令没喊对后面跑得再快也白搭。还有一个建议是调试MIPI屏的时候手边准备一个逻辑分析仪或者带MIPI协议解析的示波器会轻松很多。协议解析功能可以自动标出SoT、EoT、包类型、CRC错误比肉眼盯波形高效太多。如果条件实在有限那也至少保证示波器是四通道的能够同时观察时钟lane和一对数据lane测skew和时序不至于抓瞎。最后再分享一个小技巧初始化序列发送完毕、开背光之前强制拉一次复位引脚再重新发送初始化序列用来验证屏和驱动之间的握手是否真的稳定。如果第二次初始化后显示正常而第一次不正常说明电源或复位时序上还有问题需要往硬件方向查而不是继续改初始化数据。这个技巧帮我排查过好几块时序敏感的屏省了不少返工时间。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →