尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

RK平台MIPI DSI闪屏排查:用示波器定位物理层信号问题

RK平台MIPI DSI闪屏排查:用示波器定位物理层信号问题 RK平台上调MIPI DSI屏的兄弟应该都被闪屏折磨过正常显示五分钟突然黑一下或者屏幕上半部分横条纹一闪而过抓log啥也看不出来。如果你的驱动参数已经改了好几轮仍然找不到规律那问题往往不在软件而在物理层的MIPI DSI信号上。这篇内容就是我平时在RK平台上用示波器抓取DSI信号、分析闪屏根因的完整流程涉及示波器设置、探头选择、测试点定位、波形分析和驱动侧配合适合正在被显示问题困扰的嵌入式工程师也适合想入门高速信号测试的硬件工程师。MIPI DSI是现在手机、平板、工控板、开发板上最常用的屏幕接口RK平台的SoC几乎全系标配。闪屏的原因可以有很多供电纹波把信号抬歪了、串阻阻值不对导致幅度太低、PCB走线过长导致上升沿变缓、驱动IC的porch参数配错导致时序溢位……这些东西靠眼睛和log很难定位但示波器一测信号波形摆在那里很多问题会变得非常直观。下面我按自己调试RK平台MIPI DSI屏的习惯把这套流程拆开讲清楚。1. 为什么闪屏要动示波器MIPI DSI的调试思路1.1 从“软件查问题”到“物理层找真相”很多人遇到闪屏第一反应是改驱动调porch、调时钟、关PWM、换init序列一套组合拳下来运气好碰对了运气不好直接陷入“改了又改”的死循环。我自己的经验是如果屏幕能点亮、init序列没有报错那软件侧的配置大概率已经“能用”了闪屏往往是物理层信号质量不够接收端采样裕量不足造成的。示波器在这种场景下的价值就是帮你把“信号到底长什么样”这件事变得可见。比如你怀疑时钟抖那就去测时钟lane的周期抖动你怀疑数据线被干扰那就去测数据lane有没有毛刺你怀疑供电带来的纹波串进信号那就同时挂一个通道测电源。这些都不是拍脑袋能判断的必须有实测数据支撑。另外RK平台在开机和休眠唤醒的时候MIPI DSI链路会经历多次LP/HS状态切换很多偶发闪屏就发生在这些切换点上。软件log在这种场景下基本是无能为力的因为它记录不到纳秒级的状态变化。只有示波器配合合适的触发方式才能抓住那一次“瞬间发生的异常”。1.2 MIPI DSI信号本质先搞清楚你要抓什么动手接示波器之前得先知道MIPI DSI在物理层到底长什么样。MIPI DSI基于D-PHY规范链路里至少有一对时钟信号Clock Lane和一到四对数据信号Data Lane每一对都是差分线正端通常叫P负端叫N。RK平台的屏常见的是4-lane DSI就是4对数据加1对时钟一共5对差分信号。D-PHY有两种工作状态LP状态Low Power用于传输命令和状态切换单端电平接近0V和1.2V速度较慢。HS状态High Speed用于传输图像像素数据是高速差分信号差分摆幅典型在200mV上下速度从几百Mbps到数Gbps不等。你在示波器上看到的DSI信号不会是连续的波形而是一段一段的“脉冲串”。屏在显示图像时只有在一行有效数据、HSA/HBP/HFP这些区间里时钟lane才连续翻转数据lane才传输具体内容行与行之间、帧与帧之间会进入短暂的LP状态。所以抓DSI信号不能靠FreeRun模式在那里瞎等必须有触发而且要搞清楚触发目标是哪一段HS burst。很多新手第一次测MIPI DSI探头一接示波器上哗啦啦全是波形就以为抓到了。其实那些大概率是LP状态的低速翻转根本没进到高速模式自然看不出信号质量。后面我会详细说怎么设置触发让示波器只抓HS burst里的波形。2. 动手前的关键准备工具、探头与测试点选型2.1 示波器选型带宽和采样率不是玄学先说个实话拿一台100MHz的台式示波器去测MIPI DSI基本上测个寂寞。示波器带宽不够高速方波会被滤成圆头圆脑的“慢坡”上升沿全是假的测出来的幅值也偏低这种数据拿去分析问题只会误导你。MIPI DSI信号的速度取决于屏幕分辨率和lane数。比如一块1280x80060fps、RGB888、4-lane的屏单个lane的数据率大约在400Mbps级别DSI时钟频率则在200MHz附近。带宽经验法则是示波器带宽至少是信号基频的5倍才能比较真实地还原上升沿。这意味着200MHz的DSI时钟示波器带宽最好到1GHz最低也要500MHz起步。项目最低要求推荐配置原因示波器带宽500MHz1GHz及以上至少覆盖信号基频的3~5倍避免上升沿失真采样率5GSa/s10GSa/s及以上保证每个bit上有足够采样点能看清毛刺和抖动通道数2通道4通道需要同时看时钟、数据和电源时4通道更方便存储深度不低于10Mpts50Mpts以上偶发异常需要长时间采集存储太浅会错过关键点我这里说的“基频”不是屏幕的刷新率而是DSI时钟lane的实际翻转频率。分辨率越高、刷新率越高、lane数越少单lane速率越高对示波器的要求就越苛刻。如果你平时主要调1080P以内的屏一台500MHz带宽的无源探头示波器勉强能干活但如果你要调4K屏或者高刷屏还是想办法找一台1GHz以上的设备比较稳妥。2.2 探头选择x1和x10真的不是随便选探头这块是很多人容易踩坑的地方尤其是“示波器探头x1和x10到底用哪个”这个问题在论坛和群里几乎每个月都有人问。直接给结论测MIPI DSI这种高速信号必须用x10档或者专用差分探头不要用x1档。原因很简单。x1档相当于把探头变成一根直连线示波器输入端的电容直接挂到被测节点上一般会带来几十pF的负载电容对高速信号来说是致命的会直接把上升沿拖慢甚至让电路工作异常。而x10档在探头前端串了一个9MΩ电阻配合示波器输入端的1MΩ和电容补偿网络输入电容能降到10~15pF带宽也更高对被测电路的影响小得多。测MIPI DSI这种差分信号有条件的话优先用差分探头。差分探头两个输入端一直接P和N探头内部做减法直接输出差分信号测量结果最真实。如果用普通无源x10探头只能分别测P端和N端的单端波形然后靠示波器的数学通道CH1-CH2算出“伪差分”波形。这个办法在没有差分探头的时候可以用但要特别注意两条探头的延迟要一致探头的电容匹配也要好否则算出来的差分波形会带误差。另外一个容易被忽略的点是探头接地。用无源探头测高速信号时不要用那个长长的鳄鱼夹地线地线越长回路电感越大测出来的波形上会叠加一堆振铃。最好用探头自带的接地弹簧直接压在测试点旁边这样地回路最短波形最干净。2.3 在板子上找测试点连接器、串阻、柔板焊盘拿到一块待测的RK平台板子先别急着上示波器先在原理图和PCB上把测试点找好。最常见、最方便的测试点是MIPI DSI连接器的焊盘。如果屏是排线连接器焊盘通常会露出来示波器探头可以直接点上去但要小心别短路到旁边的引脚。其次是MIPI DSI差分线上的串联电阻两端。RK平台的参考设计里每一对差分线靠近SoC输出端通常会放0~22Ω的串阻串阻两端都是很好的测试点尤其是靠近SoC的一端信号质量最接近SoC实际输出。还有一种情况是板子上设计了专门的测试焊盘或者过孔这种位置非常好用直接把探头地弹簧压在露出地过孔上探头针尖点在信号过孔上测量就非常稳定。找测试点有个原则优先测靠近SoC输出端的位置不要一上来就跑到屏端去测。因为示波器探头本身有一定负载如果你把探头点在靠近屏的位置探头负载和屏的输入电容叠加可能掩盖真实的信号问题。先测SoC出来的信号确认输出端干净再一路查到屏端看信号在那条链路里被恶化到了什么程度。3. 示波器抓取MIPI DSI波形的完整实操步骤3.1 接线与通道分配第一件事不能错接线的第一原则先确认示波器是接地的并且被测板子和示波器最好共地。如果用差分探头地和地之间也要连接好否则共模电压带来的误差会非常大。通道分配我一般是这样做的CH1接CLK差分对的正端P或者差分探头的正端接CLK PCH2接CLK N端如果用差分探头就只占一个通道另一个通道拿去看数据CH3接其中一对数据lane的正端比如D0PCH4留着用来夹电源或者背光PWM排查干扰源。这里有个细节如果你用两个无源探头分别测CLK_P和CLK_N一定要在示波器上打开通道的“反相”关系检查确保P和N的相位是对的。然后可以用数学通道设置CH1-CH2得到差分信号波形。不过此时两条探头的公共地会形成地环路测出来的高频部分可能有额外噪声只能作为参考不能当成最终结论。如果你手头有差分探头那流程简单很多差分探头接CLK差分对通道1显示的就是时钟lane的差分波形再拿一条无源x10探头接D0P看数据lane的单端波形。如果屏是4-lane DSI可以按顺序把D0、D1、D2、D3逐个验证优先看和闪屏现象最相关的那一路。3.2 触发设置抓到那一次“异常闪屏”示波器屏幕上哗啦啦滚动的波形在调试偶发闪屏时基本没用。正确做法是用Single或Normal触发模式让示波器捕捉到满足条件的那一次事件然后冻结下来仔细看。MIPI DSI的HS burst是按帧、按行周期性出现的。时钟lane在HS传输期间是连续翻转的方波所以最简单的触发方式就是把触发源设为CLK通道触发模式选下降沿或上升沿触发电平设在波形幅度中间。以单端测量为例HS摆幅大概在0V附近触发电平可以设置在100mV左右视实测波形再微调。对于偶发性闪屏更好的做法是使用示波器的“毛刺触发”Glitch Trigger或者“欠幅触发”Runt Trigger。比如你怀疑数据lane上有偶发毛刺就把触发源设到那条数据lane上触发条件设为“正毛刺、宽度小于正常bit宽度”示波器就会在异常出现的那一瞬间捕捉波形。实测下来这种定向触发比单纯抓HS burst有效得多因为它是为你怀疑的“异常现象”量身定做的。注意触发模式要切换到Normal或Single不要放在Auto。Auto模式在没有满足触发条件时会强制刷新屏幕导致看起来像“一直在跑”反而抓不住那一次异常。3.3 软件侧开测试Pattern让信号乖乖等着你抓很多人在板子上跑着完整的Android或Linux系统去抓DSI信号画面上各种动态内容信号一直在变分析起来非常痛苦。我的建议是调试初期尽量让屏幕显示一个固定画面最好能让SoC输出标准的测试Pattern彩条、灰阶、棋盘格这样信号是稳定的、可重复的示波器抓起来轻松很多。RK平台的MIPI DSI驱动框架里不同SDK版本对test pattern的支持方式不太一样。有的SDK在DW MIPI DSI驱动里直接保留了debugfs接口往某个文件节点写数字就能让屏幕输出彩条有的SDK需要修改panel驱动的初始化参数把test pattern开关打开还有的屏的Driver IC本身支持内部自检模式往panel发一条DCS命令就能让屏显示IC自带的彩条。具体到自己手里的SDK我建议先在kernel源码里搜一下这几个关键词test_pattern、color_bar、pattern_mode、video_pattern。搜到了基本就能找到入口。如果搜不到还有一个偏方在panel驱动的初始化序列里查一下屏厂有没有提供“进入自检测试模式”的命令很多MIPI屏的Driver IC手册里都有这条命令一般是往某个寄存器写某个值。屏幕出彩条之后信号就是固定的HS burst节奏示波器抓到一次就能代表整条链路的状态后续再反复对比也会方便很多。3.4 从HS Burst到单bit波形逐级展开看细节信号抓稳之后不要只盯着一个时基刻度看。我建议按这个顺序逐级放大第一级把时基拉到每格几微秒到几十微秒看整帧或者整行的HS burst结构。这时候你能看到时钟lane和数据lane在HS传输期间是不是“一起出现一起消失”有没有某条lane缺席或者提前退出。如果某条lane的burst比其他lane明显短或者明显长那就是时序异常。第二级把时基拉到每格几纳秒看单个burst内部的具体波形。这时候你能看到时钟lane是不是等幅等频的方波数据lane是不是在正常翻转。看看上升沿有没有过冲、振铃幅值是否均匀有没有掉底。第三级打开示波器的测量项把光标放到单个bit上测出周期、频率、上升时间、下降时间、幅值。这几个数据记下来和屏规格书里的参数要求做对比。如果示波器支持眼图模式也可以直接看眼图眼图“眼睛”张开得越大信号质量越好反之说明抖动和干扰比较严重。4. 分析波形从时序与幅值一步步锁定闪屏根因4.1 幅值异常波形“矮了”屏幕就闪给你看DSI的HS信号是低压差分信号差分幅值通常设计在200mV上下具体要看SoC和屏的规格。如果你测到的差分幅值明显偏低比如只有100mV甚至更低那接收端的采样裕量就会非常小稍微来一点干扰信号就可能被判错表现出来就是偶发闪屏、花屏或者横纹。幅值偏低的常见原因有三个。第一差分线上的串联电阻阻值偏大。RK平台参考设计里串阻常见的是0Ω到22Ω如果你为了匹配阻抗把手上的电阻换成了33Ω甚至更大电压就被分掉了一大截幅值自然上不去。第二走线过长或者经过过多的过孔、连接器链路损耗大。第三接收端的等效电容太大把高速信号的幅度“压矮”了。排查方法也很直接用示波器分别测串阻前、串阻后的波形对比幅值差多少。如果串阻前后差得特别多说明串阻本身阻抗选大了或者链路后端有异常负载。如果两端差别不大但整体都低那问题大概率在SoC端驱动能力或者PCB走线损耗上。4.2 上升沿慢与过冲信号变形问题示波器上如果看到上升沿明显变缓方波变成了梯形波那接收端的采样窗口会被压缩导致误码率上升。尤其当闪屏出现在低温或高温环境下时信号上升沿的余量问题会更容易暴露。上升沿慢的原因一般是阻抗不连续、分布电容过大、或者走线太长。DSI走线在PCB上要求做差分阻抗控制通常控制在100Ω左右如果走线阻抗偏离这个值反射就会叠加在信号上让上升沿出现台阶或振铃。过冲则是另一个方向的问题信号冲得太高超过接收端的绝对最大额定值可能导致Driver IC内部闩扣表现就是屏幕闪一下甚至黑掉。过冲太大常见原因是串阻阻值过小或者PCB走线阻抗偏高导致信号反射。解决方向是增加串阻阻值、优化PCB阻抗或缩短走线长度而不是盲目去驱动里调参数。4.3 时序异常位置不对、burst长短不对MIPI DSI显示一帧画面的过程中HS burst的起始位置、持续时间必须和驱动IC里配置的porch参数严格对应。如果porch配错HS burst会跑到不该占用的时间段里屏幕顶部可能会出现横纹、闪烁或边角花屏。示波器分析时序时可以把时钟lane的HS burst起始沿和某条数据lane的HS burst起始沿放在同一个屏幕里对比。正常情况下时钟lane和数据lane在进入HS状态时是基本同步启动的退出HS状态时也是同步退出的。如果你发现数据lane比时钟lane早启动或者晚退出那可能是lane内部进入了异常状态或者时钟/数据之间的skew太大。还有一种常见时序异常是连续时钟模式和非连续时钟模式的问题。RK平台驱动里DSI时钟lane可以选择continuous clock或者non-continuous clock两种模式。non-continuous模式下时钟lane在LP期间会停止翻转重新进入HS时需要重新锁定如果这个锁定过程不稳就会导致屏在切换瞬间闪一下。示波器上看就是时钟lane的HS burst起点位置出现一段非理想的波形。4.4 噪声与纹波闪屏背后不一定是DSI信号本身有时候DSI信号本身看起来非常干净但屏就是间歇性地闪。这时候要警惕问题可能不在MIPI总线上而是供电或者地弹把整个系统搞得不稳定。我常用的做法是用示波器第四个通道夹在屏幕供电的AVDD或VCC引脚附近同时观察DSI时钟lane的波形看闪屏发生瞬间电源纹波有没有大的跳动。如果电源在闪屏瞬间出现百毫伏级的下陷或尖峰那问题多半要从电源、LDO或者DC-DC的布局去解决而不是死磕DSI信号。地弹问题也有类似表现。高速信号的回流路径如果经过大面积开槽或者细长过孔地平面不完整DSI信号的波形上就会出现周期性振铃或共模噪声。这种问题在示波器上看单端波形时特别明显DSI的P端和N端波形应该是对称的如果出现不对称的振铃优先怀疑回流路径出了问题。4.5 现象对照表把屏幕表现和波形特征对上调试过程中我习惯把屏幕现象和波形特征一一对应着记录这样能减少很多无效排查。屏幕表现波形可能特征优先排查方向开机瞬间闪一下时钟lane HS启动段异常、LP转HS切换处有毛刺连续时钟配置、porch参数运行中偶发整屏闪数据lane幅值偏低、偶有一截波形掉底串阻阻值、供电纹波、EMI干扰屏幕上部横纹数据lane与时钟lane的启动时序不同步lane间skew、驱动IC配置画面出现雪花点上升沿过缓、眼图闭合严重PCB走线阻抗、连接器质量、线束长度特定颜色画面下闪烁对应lane信号幅值异常或过冲走线阻抗、串阻、Driver IC端接这张表不是标准答案但它能提供一个排查起点。很多时候闪屏问题是叠加的比如供电纹波加大信号抖动信号抖动又叠加在本来余量不大的链路上这时候就要一层层剥开最终找到最大的那个影响因素。5. RK平台专项驱动配置与pattern测试配合5.1 RK平台DSI链路的基本配置项RK平台的MIPI DSI驱动代码路径一般在kernel/drivers/gpu/drm/下面的rockchip目录和synopsys目录其中DSI controller用的比较多的是Synopsys DW-MIPI-DSI IP。所以调试时既要看RK自己封装的那层driver也要看dw-mipi-dsi这层通用代码。DTS配置里和DSI信号关系最密切的有这么几个方向lane数配置dsi,lane-number或者通过panel节点的属性指定配置成4-lane还是2-lane必须和硬件实际接线一致否则信号链路会异常初始化轻则花屏重则点不亮。时序参数hactive、vactive、HFP、HBP、HSA、VFP、VBP这些。这些参数直接决定了HS burst的位置和长度配错之后表现出来的现象非常隐蔽有的屏只有少量闪屏。lane-rate或clock-frequency控制每个lane的传输速率。这个值如果和屏规格书对不上可能造成时钟余量不足尤其在低温下闪屏概率大增。continuous clock相关配置RK平台某些SDK支持配置时钟lane是连续还是非连续模式这个字段具体名字在不同版本里不一样但作用就是前面说的时钟lane在HS/LP切换时的行为。遇到闪屏问题时先把这些参数和屏厂提供的init sequence、规格书逐一核对一遍。很多所谓“疑难闪屏”最后查下来都是porch里的某个参数比屏厂推荐值小了几个像素导致HS burst卡到了切换边界上。5.2 打开彩条/自测pattern验证链路的“黄金手段”在RK平台上我强烈建议先让系统输出固定测试图案再上示波器。原因前面也说了动态画面下信号一直在变示波器虽然能抓到HS burst但分析的时候你会分不清某个波形异常是正常的数据变化还是真实的信号质量问题。固定画面下数据lane的翻转规律是确定的一旦出现意外波形那一定有问题。怎么开彩条不同SDK差别很大。我接触过的RK SDK里至少见过三种方式驱动debugfs接口有的SDK会在/sys/kernel/debug/下导出一个DSI test pattern节点通过echo写入对应参数开启。代码开关有的SDK在panel驱动或mipi dsi驱动里留了一个test_pattern或video_pattern变量改编译配置或者运行时设置对应的模块参数。屏端自检很多MIPI Driver IC支持厂商自定义命令进入内建pattern显示模式需要通过DCS命令下发。拿到一套新SDK第一件事就是在kernel源码里搜test_pattern、color_bar、pattern_mode这几个关键词通常能找到入口。如果实在找不到直接翻屏的Driver IC手册找到自检命令自己在panel驱动的init序列后面追加一条命令也能达到同样效果。开彩条模式的好处还在于你可以让屏长时间停留在固定画面示波器用余晖模式观察偶发的毛刺和异常会被累积起来比单次抓取更容易暴露问题。5.3 从日志到波形的闭环思路RK平台的MIPI DSI调试一定要建立“日志波形”的闭环思维。先看日志再决定要不要上示波器上完示波器拿到波形还要再回到代码里去验证。举个例子RK平台的dmesg里如果出现mipi_dsi_host_transfer超时或者D-PHY错误计数那基本可以确定是物理层出问题了。这时候用示波器抓HS burst重点看出错的时间点附近波形是不是有掉落、毛刺或者幅值跌落。如果示波器波形又确实干净那可能问题出在电源域、时钟源或者SoC内部PLL配置上需要回到驱动里查时钟树。反过来也一样如果示波器上测到CLK和数据lane的偏移比较大那就要回驱动里查lane的极性配置、端口配置看RKDTS里有没有把数据lane映射反了。波形数据是“果”驱动配置是“因”两者相互印证才能把问题真正钉死。6. 常见问题与排查技巧速查6.1 示波器显示不出波形怎么办这是新手最容易卡住的地方。示波器屏幕上啥都没有你先检查这几件事触发模式是不是在Auto如果是先切成Normal或者Single再把触发电平调到波形幅度中间重新触发一次。探头是x1还是x10确认档位在x10并且示波器通道已经做了对应的衰减设置。测试点找对没有如果你测的是SoC输出端附近的串阻前端信号一定存在如果测的是柔板排线上很细的焊盘可能探头压偏了没接触到。屏有没有真正进入工作状态如果屏没被驱动起来DSI可能一直处于LP状态没有任何HS burst那示波器当然抓不到高速波形。最好先用软件跑一下彩条模式确认链路确实在高速传输数据。还有个容易忽略的点示波器通道要确保是打开状态别接入信号后才发现通道被关了。6.2 测到的幅值怎么和规格书对不上幅值对不上先分清你测的是单端波形还是差分波形。普通无源探头测P端看到的是单端电平变化幅值大概是差分幅值的一半左右。很多屏厂规格书里标的是差分幅值你用单端探头的读数直接去对比肯定觉得“不对”。另外探头如果没有做补偿校准测出来的幅值也会偏。无源探头x10档在探头前端有个微调电容需要用示波器自带的1kHz方波校准信号把波形调到方方正正否则高频响应不平坦测出来的上升沿和幅值都有误差。如果确认仪表没问题再检查测试点位置。测在串阻输入端和输出端结果本来就该不一样越靠近负载端幅值被分压和损耗的影响越明显。6.3 为什么电脑上CSV看到的波形和示波器上不一样示波器屏幕显示的是经过内插算法处理的波形而导出的CSV是原始采样点。如果示波器的采样率不够屏幕上看起来“连续”的波形在CSV里可能就是一个个离散的点直接用软件画出来会显得很“糙”。所以导出CSV做后处理时要注意两点一是确认导出时选择的是“原始采样点”模式而不是“屏幕上显示的像素点”模式否则导出来的就是屏幕截图级别的数据精度会差很多二是在电脑上用Python或者Matlab处理时不要直接连点成线就下结论最好先看原始点密度够不够。如果是偶发毛刺建议直接在示波器上用余晖模式观察有时候比导出CSV更直观。6.4 闪屏问题救场的一个小技巧最后分享一个我实测有效的技巧遇到那种“明明波形看不出明显异常但屏幕就是会闪”的情况把示波器显示模式切成余晖/累积模式Persist然后把时基拉到能看到整行HS burst的宽度让屏跑上几分钟。如果这时候屏幕上有某些波形轨迹被反复点亮那就是偶发毛刺的频率已经很高了再多观察一会儿异常形态就会从背景噪声里浮出来。再配合示波器的FFT功能看DSI时钟频率周围有没有异常杂散峰。如果杂散峰的频率和某颗DC-DC的开关频率对得上那闪屏的真凶十有八九就是电源干扰通过某种耦合路径进了DSI链路。这种情况下改驱动参数没有意义去查电源布局、加滤波电容或者调整屏蔽才是根治方向。我自己的体会是MIPI DSI调试最忌讳“一把抓瞎”。先把示波器接好、把测试点选对、把触发条件设准再让屏显示固定pattern然后用波形数据反推驱动配置和硬件设计每一步都有据可查闪屏问题基本都能在一个小时之内收敛到具体原因上。这个过程本身也是个很好的示波器进阶练习做多了之后再遇到eMMC HS400时序、USB眼图这类高速信号测试思路也是相通的。
返回列表