2. LCD硬件原理与接口协议:TFT-LCD工作原理、RGB接口与LVDS接口详解、MIPI DSI协议基础、时序参数解析
做显示驱动移植,第一件事不是翻芯片手册,而是搞懂屏幕那头到底在干什么。说白了,你得知道像素是怎么从主控芯片跑到液晶面板上的。这一章,我就带你把这些基础啃透。
2.1 TFT-LCD工作原理:每个像素是怎么亮起来的?
TFT-LCD,全称是薄膜晶体管液晶显示器。每个像素背后都藏着一个薄膜晶体管,相当于一个微型开关。我刚开始接触时,总觉得液晶面板很神秘,后来拆开一块报废屏才明白——它就是个巨大的矩阵开关网络。
工作原理可以拆成三步:
- 背光点亮:屏幕背面有一排LED灯珠,提供白色光源。
- 液晶偏转:每个像素的TFT开关控制电压,液晶分子在电场作用下扭转角度。
- 滤色成色:白光穿过液晶层后,经过红绿蓝滤色片,混合出最终颜色。
关键点:TFT-LCD是常亮型显示,背光一直开着,液晶只负责“挡光”或“透光”。这和OLED完全不同,OLED是自发光,每个像素自己发光。
我在项目中遇到过一块屏显示偏蓝,查了半天发现是背光色温不对。嗯,背光LED的色温参数也会影响最终显示效果,这点容易被忽略。
2.2 RGB接口详解:最经典的并行接口
RGB接口,也叫并行RGB接口,是嵌入式Linux显示驱动里最常见的接口之一。它把红绿蓝三路数据分开传输,配合时钟和同步信号,直接驱动屏幕。
典型的RGB接口信号线包括:
| 信号名 | 方向 | 说明 |
|---|---|---|
| R[0:n] | 输出 | 红色数据线,n+1位宽 |
| G[0:n] | 输出 | 绿色数据线,n+1位宽 |
| B[0:n] | 输出 | 蓝色数据线,n+1位宽 |
| PCLK | 输出 | 像素时钟,每个时钟传输一个像素 |
| HSYNC | 输出 | 行同步信号,标志一行开始 |
| VSYNC | 输出 | 帧同步信号,标志一帧开始 |
| DE | 输出 | 数据使能,有效时才传输有效像素 |
RGB接口的位宽常见有16位、18位、24位。24位就是真彩色,每个颜色8位。我建议你在选型时优先考虑24位,除非硬件引脚受限。为什么?因为16位会丢色,显示渐变图像时能看到明显的色阶断层。
实战经验:调试RGB接口时,先量PCLK频率对不对。我曾经遇到一块屏花屏,折腾了两天,最后发现是PCLK极性反了。RGB接口的时钟极性和数据采样沿是可以配置的,务必和屏厂规格书对齐。
2.3 LVDS接口详解:高速传输的差分方案
当分辨率上去后,RGB接口的并行线太多,信号干扰严重。这时候LVDS(低压差分信号)就派上用场了。它把并行数据串行化,用差分对传输,抗干扰能力强,线数也少。
LVDS接口的核心特点:
- 差分传输:每路信号用两根线(正负),共模噪声被抵消。
- 低压摆幅:典型摆幅350mV,功耗低。
- 数据映射:常见的映射格式有JEIDA和VESA两种,数据位顺序不同。
LVDS接口通常分为单通道和双通道。单通道4对差分数据线+1对时钟,支持到WXGA(1366x768)左右。双通道8对数据线+1对时钟,可以支持1080p甚至更高。
避坑指南:我曾经在移植驱动时,LVDS屏死活不亮,量波形都对。后来发现是数据映射格式搞错了——屏厂用的是JEIDA,我配成了VESA。两种格式的RGB数据位排列不同,配错就会花屏或黑屏。一定要和屏厂确认映射格式。
2.4 MIPI DSI协议基础:移动设备的主流选择
MIPI DSI(显示串行接口)是目前手机和平板上最主流的显示接口。它也是差分串行传输,但比LVDS更灵活,支持双向通信和控制命令。
DSI的物理层叫D-PHY,使用差分时钟+差分数据通道。数据通道可以是1、2、3或4条lane。lane数越多,带宽越大。
DSI有两种工作模式:
- 命令模式:通过发送命令和数据更新显示缓冲区,适合带帧缓存的屏幕。
- 视频模式:实时传输像素流,类似RGB接口的串行版,适合不带缓存的屏幕。
视频模式又分三种子模式:Non-Burst Sync Pulses、Non-Burst Sync Events、Burst Mode。其中Burst Mode效率最高,能把更多时间留给数据传输。
个人习惯:我调试DSI接口时,会先用示波器抓D-PHY的LP(低功耗)和HS(高速)状态切换。如果LP->HS切换时序不对,屏幕根本不会响应。很多DSI驱动问题都出在初始化序列的时序上。
2.5 时序参数解析:HBP/HFP/VBP/VFP
不管用RGB、LVDS还是DSI,最终都要面对一组时序参数。这些参数定义了像素数据在时间轴上的排布方式。你想想看,屏幕刷新不是瞬间完成的,它需要一行一行、一帧一帧地扫描。
关键时序参数如下:
| 参数 | 全称 | 说明 |
|---|---|---|
| HBP | Horizontal Back Porch | 行同步后肩,HSYNC结束到有效数据开始 |
| HFP | Horizontal Front Porch | 行同步前肩,有效数据结束到下一个HSYNC开始 |
| VBP | Vertical Back Porch | 帧同步后肩,VSYNC结束到有效数据开始 |
| VFP | Vertical Front Porch | 帧同步前肩,有效数据结束到下一个VSYNC开始 |
| HSW | Horizontal Sync Width | 行同步脉冲宽度 |
| VSW | Vertical Sync Width | 帧同步脉冲宽度 |
这些参数合起来决定了实际的像素时钟频率。计算公式是:
PCLK = (H_Active + HBP + HFP + HSW) × (V_Active + VBP + VFP + VSW) × 刷新率
举个例子,一块1024x600的屏,刷新率60Hz,如果HBP=160、HFP=160、HSW=10、VBP=23、VFP=12、VSW=10,那么:
PCLK = (1024 + 160 + 160 + 10) × (600 + 23 + 12 + 10) × 60
= 1354 × 645 × 60
≈ 52.4 MHz
调试技巧:如果屏幕显示偏移或闪烁,先检查HBP和HFP。我曾经调一块屏,图像整体右移了20个像素,把HBP减小20就正常了。这些参数在屏厂规格书里都有推荐值,但实际调试时可以微调。
下面这张图展示了时序参数在行扫描和帧扫描中的位置关系:
搞懂这些时序参数后,你在设备树或驱动里配置显示参数时就不会一头雾水了。每个参数都有它的物理意义,不是随便填的。
重要提醒:时序参数配错最常见的后果是黑屏、花屏或显示偏移。我建议你在调试时,先用屏厂规格书的推荐值,然后逐步微调。不要一次性改太多参数,否则出了问题都不知道是哪个改坏的。