显示硬件原理:RGB/LVDS/MIPI-DSI/HDMI接口时序、像素时钟计算、背光控制原理
做显示驱动移植,第一件事不是翻代码,而是看懂屏幕的硬件接口。我见过不少工程师,上来就改设备树,结果点不亮,最后发现是接口类型都搞错了。这一章,咱们把几种主流显示接口的硬件原理理清楚。
一、显示接口的物理层差异
嵌入式设备里常见的显示接口就四种:RGB、LVDS、MIPI-DSI、HDMI。它们传输方式完全不同,驱动配置也天差地别。
| 接口类型 | 传输方式 | 最大分辨率(典型) | 传输距离 | 线数 |
|---|---|---|---|---|
| RGB | 并行TTL | XGA (1024x768) | 短(<0.3m) | 20~28根 |
| LVDS | 差分串行 | WUXGA (1920x1200) | 中(<5m) | 4~5对差分对 |
| MIPI-DSI | 差分串行 | 4K (3840x2160) | 短(<0.5m) | 1~4 Lane |
| HDMI | 差分串行+TMDS | 4K@60Hz | 中(<10m) | 3对TMDS+1对时钟 |
我个人习惯,拿到一块新屏,先看接口类型。RGB接口最简单,但线多、干扰大;LVDS抗干扰好,适合工控;MIPI-DSI线少、速率高,手机平板标配;HDMI带音频,适合多媒体。
二、RGB接口时序
RGB接口是最基础的显示接口。说白了,就是直接把像素的R、G、B数据,加上行同步、场同步、像素时钟、数据使能,一股脑并行送出去。
时序参数就这几个:
- HBP (Horizontal Back Porch):行消隐后肩
- HFP (Horizontal Front Porch):行消隐前肩
- HSPW (Horizontal Sync Pulse Width):行同步脉宽
- VBP、VFP、VSPW:场方向对应参数
为什么要有这些消隐区?因为CRT时代的电子枪需要回扫时间。现在LCD虽然不需要了,但时序标准保留了下来。我刚开始做驱动时,把HBP设成0,结果屏幕左边有一条竖线——嗯,这就是消隐区不够的典型症状。
像素时钟计算公式:
PCLK = (H_Active + HFP + HSPW + HBP) × (V_Active + VFP + VSPW + VBP) × 刷新率
例如:1024x768@60Hz,典型时序参数:
H_total = 1024 + 24 + 136 + 160 = 1344
V_total = 768 + 3 + 6 + 29 = 806
PCLK = 1344 × 806 × 60 ≈ 65.0 MHz
三、LVDS接口
LVDS(Low-Voltage Differential Signaling)用差分对传输,抗干扰能力强。它把RGB并行数据串行化,通过4对或5对差分线传输。
LVDS的映射模式有两种:
- JEIDA模式:日本标准,数据映射方式不同
- VESA模式:美国标准,更常见
我在项目中遇到过一块屏,死活点不亮,示波器看波形都对。折腾了两天,最后发现是LVDS映射模式配反了。设备树里一个属性的事,教训深刻。
避坑指南:LVDS的时钟频率一般是像素时钟的1/7(4 Lane)或1/5.6(5 Lane)。例如PCLK=65MHz,4 Lane LVDS的时钟约9.3MHz。别搞混了。
四、MIPI-DSI接口
MIPI-DSI是目前移动设备的主流。它用差分Lane传输,支持高速模式和低功耗模式。DSI协议分两层:
- D-PHY物理层:负责电气特性、时钟恢复
- 协议层:负责命令、像素数据的打包解包
MIPI-DSI的传输模式:
- Video Mode:实时传输像素流,类似RGB接口
- Command Mode:通过命令写显存,屏幕自带FrameBuffer
我个人习惯,带显存的屏用Command Mode,刷新率低但省电;不带显存的只能用Video Mode。曾经有个项目,为了省成本选了不带显存的屏,结果Video Mode时序没调好,屏幕一直闪——后来加了颗外部SRAM才搞定。
MIPI-DSI的时钟计算:
DSI_Clk = (H_total × V_total × 帧率 × 每像素位数) / (Lane数 × 2)
例如:1080p@60Hz,24bpp,4 Lane
DSI_Clk = (2200 × 1125 × 60 × 24) / (4 × 2) ≈ 445.5 MHz
注意:MIPI-DSI的时钟是DDR(双沿采样),所以公式里除以2。实际配置时,很多SoC的DSI控制器会自己计算,但你要确保PLL能输出这个频率。
五、HDMI接口
HDMI在嵌入式里用得少一些,但做机顶盒、电视盒子的同学绕不开。它基于TMDS(Transition Minimized Differential Signaling)技术,3对数据线+1对时钟线。
HDMI的时序和RGB基本一致,但多了:
- 音频数据:嵌入在消隐区传输
- EDID:显示器能力信息,通过I2C读取
- HDCP:内容保护,加密传输
HDMI的像素时钟计算和RGB一样,但要注意:HDMI 1.4最高支持340MHz TMDS时钟,对应1080p@120Hz或4K@30Hz。HDMI 2.0支持600MHz,能跑4K@60Hz。
六、背光控制原理
屏幕亮了,不代表背光也亮了。LCD本身不发光,需要背光源。常见背光方案:
| 背光类型 | 控制方式 | 调光方式 | 优缺点 |
|---|---|---|---|
| LED背光 | PWM + 升压IC | PWM调光 / DC调光 | 成本低,效率高 |
| OLED | 自发光,无需背光 | 电流调光 | 对比度高,成本高 |
| CCFL(老式) | 高压逆变器 | 电压调光 | 已淘汰 |
嵌入式里99%是LED背光。控制方式很简单:
- GPIO控制背光使能(EN脚)
- PWM控制亮度(PWM脚)
- 升压IC把电池电压升到LED需要的电压(通常20~40V)
PWM调光的频率要注意。我曾经把PWM频率设成200Hz,结果屏幕在低亮度下肉眼可见闪烁。后来改成1kHz以上,问题解决。人眼对200Hz左右的闪烁比较敏感,建议PWM频率至少1kHz,最好20kHz以上。
经验之谈:设备树里背光节点通常这样配:
backlight: backlight {
compatible = "pwm-backlight";
pwms = &pwm1 0 50000; // 周期50us,频率20kHz
brightness-levels = <0 4 8 16 32 64 128 255>;
default-brightness-level = <7>;
power-supply = <®_3v3>;
enable-gpios = &gpio1 15 GPIO_ACTIVE_HIGH;
};
brightness-levels数组可以做成非线性,让低亮度变化更细腻。
七、知识体系总览
下面这张图把本章的核心关系串起来了:
八、小结
这一章我们把四种显示接口的硬件原理过了一遍。核心就三件事:
- 接口类型:RGB、LVDS、MIPI-DSI、HDMI,物理层不同,驱动配置不同
- 时序参数:HBP/HFP/HSPW/VBP/VFP/VSPW,像素时钟由这些参数算出
- 背光控制:PWM频率、亮度等级、使能GPIO,调不好屏幕就闪
这些知识是后面设备树配置的基础。你想想看,如果连接口时序都算不对,设备树里那些clock-frequency、hactive、vactive参数怎么可能配得准?