ARTICLE DETAIL

资讯详情

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

LCD时钟计算核心:从Pixel Clock到MIPI Clk的推导与排障

LCD时钟计算核心:从Pixel Clock到MIPI Clk的推导与排障 上周帮一个做智能硬件的朋友查屏现象很典型一块 720×1280 的 RGB 接口屏程序烧进去以后画面偶尔横向断裂左上角还有一条若隐若现的竖带。他们软件写了三天一直怀疑是 GPIO 初始化顺序不对最后我用示波器一量 DCLK发现频率只有 55.3MHz。问他们怎么配的回答是720×1280×60 算出来的。问题就在这55.3MHz 只是有效像素时钟实际 DCLK 必须把 blanking 区域一起算进去而这恰恰是很多 LCD 工程师最容易忽略的第一步。这个坑在 MIPI DSI 项目里同样高频出现只是换了个马甲——MIPI Clk 算错。PCLK 和 MIPI Clk 是整个显示链路的地基地基没打对后面所有调试都是浪费时间。这篇文章把这两者的计算逻辑、背后原理、实测排查套路一次性讲透公式全部可直接抄适合刚接手 LCD 项目的新人也适合那些一直在抄 datasheet、但没真正搞懂时钟来源的工程师。1. 先算账Pixel Clock 不是分辨率乘刷新率1.1 blanking 看起来没用但每一行每一帧都逃不掉很多初次接触显示时序的人会有一个本能疑问既然有效显示区域就是 720×1280那我把 1280×720×60 算出来的频率不正好匹配每个像素吗问题在于LCD 屏幕扫描不是画完一个像素紧接着画下一个像素这么简单它和 CRT 时代的扫描逻辑一脉相承。每一行除了有效像素还包含行前肩 HFP、行后肩 HBP、行同步脉冲 HSPW。每一帧除了有效行数还包含帧前肩 VFP、帧后肩 VBP、帧同步脉冲 VSPW。这些参数在屏幕上不显示任何内容但它们为面板内部的扫描逻辑、电荷共享、信号稳定留出了时间窗口。没有这些时间面板根本不知道这一行从哪开始、哪一行结束了。用个不恰当的比方有效像素就像乘客blanking 时间就是列车在站台停靠和重新启动的时间。你不可能让列车刚停稳就立刻满速冲出去也不可能让两列火车完全无缝对接。LCD 驱动 IC 也需要这些空档期来完成内部信号翻转和像素充电的准备工作。所以完整的 Pixel Clock 计算公式是这样的H_Total H_Active HFP HBP HSPWV_Total V_Active VFP VBP VSPWPCLK H_Total × V_Total × FrameRate其中 H_Total 是一行总共需要的像素时钟个数V_Total 是一帧总共需要的行数。两者相乘就是一帧的总像素数再乘以每秒帧数就是时钟频率。1.2 屏厂 datasheet 里怎么找这些参数拿到一块屏的数据手册不要盯着那些花花绿绿的效果图看直接翻到 Timing Characteristics 那一页。以最常见的并列 RGB 接口屏为例一般会给出这样一张时序参数表参数缩写说明Horizontal Front PorchHFP行有效数据结束到行同步信号开始之间Horizontal Back PorchHBP行同步信号结束到行有效数据开始之间Horizontal Sync Pulse WidthHSPW/HSA行同步脉冲宽度Vertical Front PorchVFP帧有效数据结束到帧同步信号开始之间Vertical Back PorchVBP帧同步信号结束到帧有效数据开始之间Vertical Sync Pulse WidthVSPW/VSA帧同步脉冲宽度不同屏厂叫法略有差异有的把 HSPW 写成 HSA有的写成 HSW有的干脆用 Hsync width 这种直白命名。我见过最省事的 datasheet 会直接给出 Recommended Timing Parameter你照着填就行但也有很多手册只会给一个范围比如 HBP 允许 10~100 pixel这时候就要靠经验和平台能力去选。有一个非常常见的误解需要纠正这些 porch 参数的单位不一定是像素数。在 MIPI DSI 接口中HSA/HBP/HFP 的配置单位可能是 byte也可能是 pixel取决于驱动 IC 和 DSC 是否开启。RGB 接口通常是 pixel但也要看手册怎么说不要想当然。我在调试中遇到过参数单位搞错导致整个画面偏移一个色块的情况排查了整整半天。1.3 两个完整计算示例直接照着算下面以两块不同分辨率的屏为例走一遍完整计算流程。例一720×1280 60HzRGB 接口假设 datasheet 给了一组常用时序参数H_Active 720HFP 20HBP 80HSPW 8V_Active 1280VFP 16VBP 24VSPW 8那么H_Total 720 20 80 8 828V_Total 1280 16 24 8 1328PCLK 828 × 1328 × 60 ≈ 65,975,040 Hz ≈ 65.98 MHz如果按分辨率 × 刷新率的估算方式得到的是 55.3MHz和真实需求差了约 19%。你按 55.3MHz 去配屏幕能亮才有鬼。例二1080×1920 60HzMIPI DSI 接口一组常见的 1080P 屏参数H_Active 1080HFP 12HBP 32HSPW 24V_Active 1920VFP 8VBP 24VSPW 4H_Total 1080 12 32 24 1148V_Total 1920 8 24 4 1956PCLK 1148 × 1956 × 60 ≈ 134.72 MHz估算方式是 124.4MHz差约 8%。1080P 屏的 porch 占比通常比 720P 小所以差距没那么夸张但 10MHz 的差距在 MIPI Clock 上会被 bpp 和 lane 数放大后面你会看到。这块计算必须在项目启动第一天就完成。我习惯在 Excel 里拉一张表把每种分辨率、每个刷新率下的 PCLK 都算出来后面做多分辨率切换时直接查比自己每次拿计算器按快得多也少了很多低级错误。2. 从 Pixel Clock 推导 MIPI Clk关键在 DDR 与 Lane 数2.1 DSI 的传输模型一个时钟周期传两个 bitMIPI DSI 接口和 RGB 并行接口最大的不同是像素数据不再由一根根单独的 D0~D23 数据线并行传输而是通过高速差分信号串行传输。但像素点的产生速率仍然由 PCLK 决定。DSI 物理层分两条链路Clock Lane 和 Data Lane。Clock Lane 专门传输高速同步时钟Data Lane 传输数据。这里有个关键机制叫 DDRDouble Data Rate也就是时钟的每个上升沿和下降沿都会采样一次数据。换句话说Clock Lane 每翻转一个完整周期实际上能传 2 bit 数据。这就是 MIPI Clk 计算中最大的分水岭。很多人第一次看 MIPI 时钟配置时会把 datasheet 上的数据速率和时钟频率搞混。如果一个 lane 的数据速率是 800Mbps那么对应的 HS 时钟频率是 400MHz而不是 800MHz。这是 DDR 的先天属性不是芯片厂商标错了。2.2 推导过程从 PCLK 到 MIPI Clk 的完整链路整个推导只需要四步每秒需要传输的总数据量 PCLK × bpp。bpp 是每个像素的 bit 数RGB888 是 24RGB666 是 18RGB565 是 16。把这些数据分配到所有 Data Lane 上每 Lane 数据速率 PCLK × bpp / Lane_Num。由于 DDR 双沿采样MIPI Clock 每 Lane 数据速率 / 2。合起来就是MIPI Clk PCLK × bpp / (2 × Lane_Num)用上面 1080P 的例子假设 4 Lane、RGB888总数据率 134.72 × 24 3233.28 Mbps每 Lane 3233.28 / 4 808.32 MbpsMIPI Clk 808.32 / 2 404.16 MHz这就是为什么那些 1080P 60Hz 的手机屏MIPI 时钟普遍跑在 400MHz 上下的原因。如果你用的是 720P 屏PCLK 约 65.98MHz同样 4 Lane 24bpp每 Lane 65.98 × 24 / 4 395.88 MbpsMIPI Clk 197.94 MHz如果项目为了省成本只用了 2 Lane那每 Lane 数据速率直接翻倍到 791.76 MbpsMIPI Clk 也到 395.88 MHz。这已经比较接近 D-PHY v1.1 时代 1Gbps/lane 的速率上限了虽然还没超但留给 PCB 走线和信号完整性的余量已经不多。这就是为什么 1080P 的屏几乎没人用 2 Lane 跑 24bpp太悬了。2.3 带宽余量那 10%~20% 从哪来理论上算出的 MIPI Clk 是数据必须传完的最低要求。实际配置时我建议在这个理论值基础上留 10%~20% 的余量。原因有三第一DSI 传输本身有协议开销。视频数据不是裸数据裸传而是被拆成一个个 packet每个 packet 有 header、ECC、CRC这些都要占带宽。虽然 DSI 的 packet overhead 占比不大但在高速场景下不能忽略。第二blanking 期间虽然不传有效像素数据但 MIPI 链路仍然要维持 HS 模式或者至少要在每个 blanking 区间做 LP→HS 或 HS→LP 的状态切换。这个切换过程有固定的建立时间如果时钟太紧切换窗口不够就会出现偶发花屏。第三SoC 的 DSI host 控制器和 PHY 有实际的频率粒度限制。不是你想要 404.16MHz 就能精确输出 404.16MHz通常只能配置到某个分频粒度比如 20MHz 一步。这种情况下要向上取整而不是向下取整。所以实际配置时比如你算出 404.16MHz可能会配到 420MHz 甚至 430MHz。这多出来的部分就是安全垫。3. Video Mode 和 Command Mode 的时钟逻辑不一样3.1 Video Modeporch 必须原封不动进时序账MIPI DSI 有两种工作模式Video Mode 和 Command Mode很多工程师只会在代码里改一个 mode 字段却没想过这两种模式下时钟的计算逻辑完全不同。Video Mode也叫同步模式可以理解成把 RGB 并行接口的时序原封不动搬到 MIPI 总线上。PCLK、porch、同步信号全部要在 DSI 链路上体现而且链路必须持续不断地传输数据空白区域传 blanking packet以保证面板端的时序连续。这种模式下前面算过的 PCLK 和 MIPI Clk 公式完全适用porch 参数一个都不能省。SoC 端配置时HFP、HBP、HSPW、VFP、VBP、VSPW 全部要填进 panel timing 结构体而且最终输出的 PCLK 必须等于 H_Total × V_Total × FrameRate和 RGB 接口没有本质区别。3.2 Command ModePCLK 弱化TE 周期才是硬约束Command Mode 就完全不一样了。这种模式下面板内部有一块 GRAMGraphic RAMSoC 不需要一帧接一帧持续刷新屏幕只需要把数据写进 GRAM面板内部的振荡器会自己负责从 GRAM 刷新到 LCD 面板上。这就带来了两个变化第一DSI 链路上不再需要连续传输视频流可以在一个 burst 里把整帧数据灌进去然后链路可以空闲省电。所以porch 必须留够这个要求在 Command Mode 下不成立像素时钟的计算也不再直接等于 H_Total × V_Total × FrameRate。第二面板会通过 TETearing Effect信号通知 SoC 什么时候可以安全写入新一帧避免出现画面撕裂。这时候硬约束变成了MIPI Clk × 2 × Lane_Num × FrameTime ≥ 一帧总 bit 数。也就是说一帧数据必须在 TE 信号给出的周期内写完写不完就会出现撕裂。为了简化实际项目里 Command Mode 也经常用 Video Mode 的方式估算 MIPI Clk把结果当作保守下限再加上余量刷进配置。这样算出来的时钟只会更稳不会因为时钟偏低导致 GRAM 写入超时。但如果你追求极致功耗可以在掌握 TE 实际周期的前提下把时钟压低一些。3.3 撕裂是怎么从时钟问题演变成画面问题的撕裂的本质是GRAM 刷新到面板的过程和 SoC 写入 GRAM 的过程两者在时间上打架了。面板的栅极扫描正在从上往下逐行刷新SoC 却在某个任意时间点开始写新的帧新帧的头部就追上了正在显示的旧帧尾部画面上就会出现一条明显的横切缝。缓解手段有两个方向。一是硬件上用 TE 信号做帧同步SoC 在 TE 到来之后再开始传输保证写入窗口和面板刷新节奏对齐。二是从时钟角度给足带宽让整帧数据在 TE 周期内的安全窗口里写完。前者决定何时写后者决定写多快能写完。很多人只盯 TE 配置却忘了如果 MIPI Clk 太低就算 TE 给了窗口也写不完撕裂照样出现。4. 实测排查从示波器波形倒推 Clock 配置问题4.1 先测 PCLK别急着改代码屏点不亮或者花屏的时候第一反应该是拿示波器量而不是打开代码逐行看。我排查 LCD 问题的固定顺序是先确认供电和复位再测 PCLK再测 MIPI 差分信号最后才看寄存器配置。量 PCLK 很简单如果板上走的是 RGB 并行接口直接在 DCLK 引脚上量频率。如果走的是 MIPI 接口但 SoC 内部有时钟测试引脚也可以直接量。量到的频率和你按 H_Total × V_Total × FrameRate 算出来的理论值对比。如果量出来只有 55.3MHz而理论值是 65.98MHz大概率是软件里用了 720×1280×60 的估算方式porch 没加进去。如果量出来频率正常但屏花那就是时序参数内部配置不对比如 HFP 和 HBP 填反了。4.2 HS Clock 测量差分探头和÷2的陷阱MIPI 的 Clock Lane 是一对差分线测量时要用差分探头AC 耦合探头带宽至少要 1GHz 以上否则量出来的波形上升沿都是歪的容易误判信号质量问题。这里有个特别容易栽的坑示波器频率计显示的是 Clock Lane 的翻转频率也就是 MIPI HS Clock大约等于你配置的 MIPI Clk。而实际上每个 Lane 传数据的速度是它的两倍。比如你在配置里写了 400MHz示波器量 Clock Lane 也应该看到 400MHz但对应的数据速率是 800Mbps/lane。有工程师看到 datasheet 上写支持 1Gbps/lane就去示波器上找 1GHz 频率的信号找了半天找不到最后发现 datasheet 写的是数据速率不是时钟频率时钟只有 500MHz。4.3 花屏、闪屏、水波纹的 Clock 侧排查链路不同画面异常对应的 Clock 排查方向不太一样但基本遵循下面这条链路整体花屏、画面错位优先查 H_Total 和 V_Total。把示波器波形调出来看 DCLK 频率是否正确再检查 porch 参数是否填对、单位是否搞错。HFP/HBP 填反的典型现象是画面整体左移或右移一个色块。屏幕右侧出现竖带多半是 HFP 设置过小或总行像素没有四字节对齐。MIPI DSI 对 H_Total 有对齐要求不对齐时 controller 会自动补齐但补出来的结果和你预期不符视觉效果就是竖带。画面闪烁、有水平滚动条纹重点查实际帧率。帧率 PCLK / (H_Total × V_Total)。如果 PCLK 低于理论值帧率就跌了闪烁随之而来。这种情况在低功耗调光场景下尤其常见因为调低背光后刷新率如果也跌到肉眼可见的频率体验就崩了。水波纹、轻微横纹干扰优先怀疑 MIPI HS Clock 余量不够或信号完整性出问题。用示波器看 Clock Lane 的眼图如果眼皮厚、眼高不够优先在 PCB 上找原因比如 clock lane 走线过长、过孔太多、阻抗不匹配。我印象很深的一次排查一块 1080P 屏在常温下完全正常放到高低温箱里 60 度就出现横纹。量了半天发现 MIPI Clk 配置在理论值边缘没有余量高温下信号质量变差后直接踩线。把时钟从 490MHz 降到 460MHz 后问题消失带宽还有富余画面也没任何损失。这就是留余量的价值。5. 公式速查、常见组合速查与平台代码对应5.1 一页纸公式表收藏备用下面这几条公式是整个 PCLK 和 MIPI Clk 计算的骨架我用了这么多年基本够用计算目标公式说明行总像素H_Total H_Active HFP HBP HSPW注意单位可能是 pixel 或 byte帧总行数V_Total V_Active VFP VBP VSPW行单位Pixel ClockPCLK H_Total × V_Total × FrameRate单位 Hz总数据速率DataRate_Total PCLK × bppbppRGB88824RGB66618RGB56516单 Lane 数据速率DataRate_Lane DataRate_Total / Lane_Num单位 MbpsMIPI HS ClockMIPI_Clk DataRate_Lane / 2DDR 采样时钟是数据速率的一半帧率反推验证FrameRate PCLK / (H_Total × V_Total)排查闪烁问题时用5.2 常见分辨率组合速查表我按工程中常见组合算了一张速查表直接对照着用不用每次拿计算器按。PCLK 一列已经包含了一套典型的 porch 参数实际以你自己的屏厂手册为准分辨率帧率PCLK 典型值bppLane 数MIPI Clk 理论值备注480×85460约 29.0 MHz242约 174 MHz低端入门配置720×128060约 65.98 MHz244约 198 MHz性价比主流组合720×128060约 65.98 MHz242约 396 MHz省 lane 方案余量小1080×192060约 134.72 MHz244约 404 MHz手机/平板常用1080×192060约 134.72 MHz244约 404 MHz实际需留余量1920×120060约 153.6 MHz244约 461 MHz接近 D-PHY v1.1 上限注意一个细节MIPI Clk 的理论值往上留余量之后如果已经压到了 D-PHY 版本或 SoC 能力上限就要考虑换方案要么增加 Lane 数、要么降低色深、要么开启 DSC 压缩而不是硬顶着极限跑。5.3 平台 dts/driver 里这些字段长什么样不同 SoC 平台的配置数据结构不一样但核心字段是相通的。以常见的高通 MDSS DSI 为例pixel clock 不会直接让你填而是让你填每个 timing 参数驱动自己算qcom,mdss-dsi-panel-framerate 60; qcom,mdss-dsi-h-front-porch 12; qcom,mdss-dsi-h-back-porch 32; qcom,mdss-dsi-h-pulse-width 24; qcom,mdss-dsi-v-front-porch 8; qcom,mdss-dsi-v-back-porch 24; qcom,mdss-dsi-v-pulse-width 4; qcom,mdss-dsi-h-sync-skew 0;另外还有一个字段qcom,mdss-dsi-panel-clockrate这个直接对应的是 byte clock 或 MIPI Clk 的配置值很多移植代码的人在这里翻车。如果你手动指定 clockrate驱动会优先用你指定的值而不是用 porch 参数推算。你填 404MHz 和填 460MHz最终输出的 HS Clock 就不同直接决定了带宽余量。MTK 平台的 dts 里则是经典的 panel-timing 节点panel-timing { clock-frequency 134720000; hactive 1080; vactive 1920; hfront-porch 12; hback-porch 32; hsync-len 24; vfront-porch 8; vback-porch 24; vsync-len 4; };这里的clock-frequency填的就是 PCLK也就是 H_Total × V_Total × FrameRate 的结果。平台根据这个值和你的 lane 数、bpp 自动推 MIPI HS Clock。如果你填的 PCLK 是 124.4MHz没算 porch驱动算出来的 MIPI Clk 就是错的后面所有时序全部对不上。6. 写到最后几个踩过坑才知道的细节6.1 双 DSI 和 dual-port 千万别忘了除 2有些大尺寸屏幕会用双 DSI 方案即两个 DSI 控制器各负责屏幕一半左边一个、右边一个或者奇偶列交错。这种方案的带宽天然翻倍等效于 Lane 数翻倍。计算时如果忘掉这一点会按单口去算 MIPI Clk算出来翻一倍浪费时间排查一个不存在的频率异常。RGB 接口的屏也有对应的 dual-port 模式两个端口各采一半像素端口频率直接减半。遇到这种屏PCLK 要先按全分辨率算再除以 2 才是单个端口的时钟。6.2 DSC 压缩后 bpp 要替换如果项目里开了 DSCDisplay Stream Compression视频数据在传输前会被压缩bpp 已经不是原来的 24 了。比如压缩目标 bpp 设为 16那么 MIPI Clk 计算就按 16 代入而不是 24。这一点特别坑因为你可能把 PCLK 和 lane 数都算对了唯独忘了 DSC 对 bpp 的替换导致配出来的时钟比实际需要高出 50%白白增加功耗和 EMI。6.3 我个人的工作流和经验建议最后聊聊我现在做新项目时的固定流程。第一步永远是打开 datasheet 的 Timing Characteristics 页把 H_Total、V_Total、PCLK、MIPI Clk 全部手算一遍写进一个注释里贴到驱动代码头部方便后来的同事快速理解。第二步才去配置 dts 或 driver 结构体。第三步是上电之后用示波器实测把波形频率和理论值对照确认没有偏差再继续做画质调优。这个流程看起来多花了几分钟但能省掉后面几天的排查时间。LCD 调试里面时钟问题是最容易定位但也最容易反复犯的主要原因就是大家太依赖以前的项目这么配的这种经验而没有真正理解公式背后的含义。只要你把 PCLK 和 MIPI Clk 的推导逻辑吃透了遇到任何新屏、新分辨率、新接口都能在几分钟内给出正确的初始配置而不是拿着旧配置去试。
返回列表