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 的扫描节奏。

时序参数错误是显示异常的常见根因:画面偏移、抖动、黑边、无信号,往往不是接口问题,而是 porch 或 sync 宽度不匹配。

三、色彩空间与像素格式:颜色如何被编码和存储

色彩空间定义颜色的组织方式。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。

显示链路基础:从像素数据到面板成像 帧缓冲 Framebuffer 像素格式 / 色彩空间 时序控制 CRTC / Mode H/V sync + porch 编码器 Encoder DSI / LVDS / HDMI 连接器 Connector EDID / 热插拔 面板 Panel 关键参数关系 分辨率 Hactive × Vactive 刷新率 Pixel Clock ÷ 总像素 像素格式 FourCC / bpp / Alpha 接口带宽 Lane 数 × 速率 一行像素的时序构成 Hback Hsync Hactive Hfront → 下一行重复 总水平像素 = Hback + Hsync + Hactive + Hfront;垂直方向同理,共同决定像素时钟与刷新率。

五、案例场景:一块 1920×1080 MIPI 面板的点亮检查

假设我们拿到一块 1920×1080@60Hz 的 MIPI DSI 面板,驱动调试时可按以下顺序核对基础参数:

  1. 确认面板规格书中的时序:Hactive=1920、Vactive=1080、Hsync=20、Hback=80、Hfront=80、Vsync=4、Vback=20、Vfront=20。
  2. 计算像素时钟:总水平 = 1920+80+20+80 = 2100,总垂直 = 1080+20+4+20 = 1124,像素时钟 ≈ 2100×1124×60 ≈ 141.6 MHz。
  3. 确认像素格式:面板通常接受 RGB888,对应 DRM_FORMAT_XRGB8888 或 RGB888 packed。
  4. 确认 DSI lane 数与速率是否满足带宽:1920×1080×24bpp×60 ≈ 2.99 Gbps,需按 lane 数分摊。
  5. 读取 EDID 或面板初始化序列,确认色彩空间为 sRGB、Gamma 2.2。
调试时优先用 modetest 或 kmstest 查看当前 mode 与 plane 格式,再对照面板规格书逐项核对,能快速定位是时序、格式还是接口带宽问题。

六、常见误区与复盘

  • 把分辨率等同于物理分辨率:缩放输出时显示分辨率可小于物理分辨率,但会引入插值或黑边。
  • 忽略消隐区:只算有效像素会导致像素时钟偏低,画面抖动或无信号。
  • 像素格式与面板不匹配:RGB 与 BGR 顺序颠倒会造成红蓝互换,YUV 与 RGB 混用会造成颜色失真。
  • 带宽估算只看有效像素:接口带宽必须按含消隐的总像素与开销计算,否则高刷新率下会丢帧。
  • 色彩空间未声明:sRGB 与 BT.709 混用会导致灰阶与饱和度偏差,尤其在视频叠加场景。