2. 显示基础
在进入 Linux DRM/KMS 驱动开发之前,必须先建立对“显示”这件事本身的工程化理解。显示系统本质上是一条从内存中的像素数据,经过扫描时序控制、色彩编码、接口传输,最终在物理面板上呈现为可见图像的完整链路。DRM/KMS 的职责,正是把这条链路抽象成可配置、可管理的内核对象。本章围绕像素、分辨率、刷新率、时序、色彩空间、像素格式与显示接口七个基础概念展开,它们是后续理解 CRTC、Encoder、Connector、Plane 的前置知识。
一、像素与分辨率:显示的最小单位与空间规模
像素(Pixel)是显示画面的最小可控单元,每个像素包含若干子像素(通常为 R、G、B 三色),通过不同亮度组合形成颜色。分辨率描述一帧画面在水平与垂直方向上的像素数量,例如 1920×1080 表示每行 1920 个像素、共 1080 行。需要区分几个容易混淆的概念:
- 物理分辨率:面板实际拥有的像素行列数,是硬件上限。
- 显示分辨率:当前输出模式设定的像素规模,可低于物理分辨率。
- 有效分辨率:扣除消隐区后真正用于成像的像素区域。
分辨率决定了帧缓冲(Framebuffer)的大小。以 1920×1080、32bpp 为例,单帧缓冲占用 1920×1080×4 ≈ 8.29 MB,双缓冲则约 16.6 MB。这个数字直接影响内存带宽预算,也是驱动中 fbdev 模拟层与 GEM 对象分配的重要依据。
二、刷新率与时序:让画面稳定呈现的节拍
刷新率(Refresh Rate)表示每秒重绘画面的次数,单位 Hz。常见的 60 Hz 意味着每帧约 16.67 ms。刷新率并非孤立参数,它由像素时钟(Pixel Clock)和整帧时序共同决定。一帧的时序由以下关键参数构成:
| 参数 | 含义 | 典型作用 |
|---|---|---|
| Hactive / Vactive | 水平/垂直有效像素 | 真正成像区域 |
| Hfront porch | 水平前肩 | 行结束后的等待 |
| Hsync width | 水平同步脉冲宽度 | 通知接收端换行 |
| Hback porch | 水平后肩 | 行开始前的稳定期 |
| Vfront/Vsync/Vback | 垂直方向对应参数 | 帧同步与消隐 |
整帧总像素数 = (Hactive + Hfront + Hsync + Hback) × (Vactive + Vfront + Vsync + Vback)。像素时钟 = 总像素数 × 刷新率。例如 1920×1080@60Hz 的经典 CEA-861 时序,像素时钟约为 148.5 MHz。驱动中这些参数以 struct drm_display_mode 表示,KMS 通过它计算 CRTC 的扫描节奏。
三、色彩空间与像素格式:颜色如何被编码和存储
色彩空间定义颜色的组织方式。RGB 是显示领域最常用的加色模型,每个像素由红绿蓝分量构成。常见的色彩空间标准包括 sRGB、Adobe RGB、BT.601、BT.709、BT.2020,它们规定了色域范围与传递函数(Gamma)。视频领域还常用 YCbCr,通过亮度 Y 与色度 Cb/Cr 分离,便于压缩。
像素格式(Pixel Format)则描述像素在内存中的排布方式,包括通道顺序、位宽、是否含 Alpha。DRM 中使用 FourCC 编码标识,例如:
DRM_FORMAT_XRGB8888 // 32bpp,忽略 Alpha,内存序 B,G,R,X
DRM_FORMAT_ARGB8888 // 32bpp,含 Alpha
DRM_FORMAT_RGB565 // 16bpp,5-6-5 分配
DRM_FORMAT_NV12 // YUV 4:2:0,Y 平面 + 交错 UV 平面
DRM_FORMAT_YUYV // YUV 4:2:2 打包格式
像素格式必须与显示管线、接口带宽、面板能力匹配。例如 YUV 格式通常用于视频叠加层(Overlay Plane),而 UI 层多用 XRGB8888。格式不匹配会导致颜色错乱、花屏或带宽浪费。
四、显示接口基础:从并行到高速串行
显示接口负责把编码后的像素流从 SoC 送到面板或桥接芯片。常见接口包括:
- 并行 RGB:早期接口,信号线多,适合小分辨率。
- MIPI DSI:移动设备主流,差分串行,支持命令模式和视频模式。
- LVDS:工业与车载常见,抗干扰强。
- eDP / DP:PC 与高端嵌入式,支持高分辨率与多通道。
- HDMI:消费电子通用,内嵌 TMDS 编码与音频。
接口带宽决定了可支持的最大分辨率与刷新率组合。以 MIPI DSI 为例,单 lane 速率、lane 数量、像素格式共同约束输出能力。驱动中 Encoder 负责把 CRTC 输出的像素流转换为接口所需的电气与协议格式,Connector 则负责探测连接状态与读取 EDID。
五、案例场景:一块 1920×1080 MIPI 面板的点亮检查
假设我们拿到一块 1920×1080@60Hz 的 MIPI DSI 面板,驱动调试时可按以下顺序核对基础参数:
- 确认面板规格书中的时序:Hactive=1920、Vactive=1080、Hsync=20、Hback=80、Hfront=80、Vsync=4、Vback=20、Vfront=20。
- 计算像素时钟:总水平 = 1920+80+20+80 = 2100,总垂直 = 1080+20+4+20 = 1124,像素时钟 ≈ 2100×1124×60 ≈ 141.6 MHz。
- 确认像素格式:面板通常接受 RGB888,对应 DRM_FORMAT_XRGB8888 或 RGB888 packed。
- 确认 DSI lane 数与速率是否满足带宽:1920×1080×24bpp×60 ≈ 2.99 Gbps,需按 lane 数分摊。
- 读取 EDID 或面板初始化序列,确认色彩空间为 sRGB、Gamma 2.2。
modetest 或 kmstest 查看当前 mode 与 plane 格式,再对照面板规格书逐项核对,能快速定位是时序、格式还是接口带宽问题。
六、常见误区与复盘
- 把分辨率等同于物理分辨率:缩放输出时显示分辨率可小于物理分辨率,但会引入插值或黑边。
- 忽略消隐区:只算有效像素会导致像素时钟偏低,画面抖动或无信号。
- 像素格式与面板不匹配:RGB 与 BGR 顺序颠倒会造成红蓝互换,YUV 与 RGB 混用会造成颜色失真。
- 带宽估算只看有效像素:接口带宽必须按含消隐的总像素与开销计算,否则高刷新率下会丢帧。
- 色彩空间未声明:sRGB 与 BT.709 混用会导致灰阶与饱和度偏差,尤其在视频叠加场景。