显示硬件原理: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背光。控制方式很简单:

  1. GPIO控制背光使能(EN脚)
  2. PWM控制亮度(PWM脚)
  3. 升压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 RGB特性 • 并行TTL传输 • 20~28根信号线 • 时序:HBP/HFP/HSPW LVDS特性 • 差分串行传输 • 4~5对差分线 • JEIDA/VESA映射 MIPI-DSI特性 • 1~4 Lane差分 • Video/Command模式 • D-PHY物理层 HDMI特性 • TMDS差分传输 • 3对数据+1对时钟 • 支持EDID/HDCP 像素时钟计算:PCLK = H_total × V_total × 帧率 背光控制:PWM + 升压IC + GPIO使能 四种接口的时序参数最终都归结为像素时钟和背光控制 ⚠ 常见坑:接口类型配错 / LVDS映射模式反了 / PWM频率太低导致闪烁 设备树配置前,务必先确认屏的规格书接口定义

八、小结

这一章我们把四种显示接口的硬件原理过了一遍。核心就三件事:

  • 接口类型:RGB、LVDS、MIPI-DSI、HDMI,物理层不同,驱动配置不同
  • 时序参数:HBP/HFP/HSPW/VBP/VFP/VSPW,像素时钟由这些参数算出
  • 背光控制:PWM频率、亮度等级、使能GPIO,调不好屏幕就闪

这些知识是后面设备树配置的基础。你想想看,如果连接口时序都算不对,设备树里那些clock-frequency、hactive、vactive参数怎么可能配得准?