2. CRTC 核心概念:时序生成、扫描输出模型与同步机制
CRTC(Cathode Ray Tube Controller,阴极射线管控制器)是 DRM/KMS 显示子系统的核心调度单元,负责将 内存中的帧缓冲区(Framebuffer) 转换为 显示面板所需的时序信号,并驱动像素从 CRTC 经编码器(Encoder)最终到达连接器(Connector)。理解 CRTC 的时序生成模型与同步机制,是开发多图层显示驱动的基础。
2.1 CRTC 的作用与职责
在 DRM/KMS 架构中,CRTC 处于 Plane(图层)与 Encoder(编码器)之间的枢纽位置。其主要职责包括:
- 时序生成:根据显示模式(如 1920x1080@60Hz)生成水平同步(HSync)、垂直同步(VSync)和数据使能(DE)信号。
- 扫描输出:控制从帧缓冲区到显示面板的像素扫描顺序(从左到右、从上到下),并处理消隐区(Blanking)的插入。
- 图层合成:接收来自多个 Plane 的像素数据,在内部进行 Alpha 混合或叠加,生成最终的合成帧。
- 模式设置:响应应用层通过 DRM IOCTL 提交的
drm_mode_set请求,切换分辨率、刷新率或色彩深度。 - Vblank 管理:在每帧扫描结束后的垂直消隐期(VBlank)触发中断,通知 GPU 或应用层更新帧缓冲区,避免撕裂(Tearing)。
2.2 时序生成模型:VESA 标准与消隐区
CRTC 的时序生成严格遵循 VESA(Video Electronics Standards Association)标准。一个完整的显示帧由 有效显示区(Active Area) 和 消隐区(Blanking Area) 组成。消隐区又细分为前肩(Front Porch)、同步脉冲(Sync Pulse)和后肩(Back Porch)。
| 时序参数 | 符号 | 说明 | 典型值 (1920x1080@60Hz) |
|---|---|---|---|
| 水平有效像素 | HActive | 一行中实际显示的像素数 | 1920 |
| 水平前肩 | HFP | 有效像素结束到 HSync 脉冲开始 | 88 |
| 水平同步宽度 | HSync | HSync 脉冲持续宽度 | 44 |
| 水平后肩 | HBP | HSync 脉冲结束到下一行有效像素开始 | 148 |
| 水平总像素 | HTotal | HActive + HFP + HSync + HBP | 2200 |
| 垂直有效行数 | VActive | 一帧中实际显示的行数 | 1080 |
| 垂直前肩 | VFP | 有效行结束到 VSync 脉冲开始 | 4 |
| 垂直同步宽度 | VSync | VSync 脉冲持续行数 | 5 |
| 垂直后肩 | VBP | VSync 脉冲结束到下一帧有效行开始 | 36 |
| 垂直总行数 | VTotal | VActive + VFP + VSync + VBP | 1125 |
mode_set 回调时,必须将上述时序参数正确写入显示控制器的硬件寄存器。常见的错误是 HTotal/VTotal 计算错误,导致显示偏移或刷新率不准确。建议使用 drm_mode_vrefresh() 辅助函数验证时序。
2.3 扫描输出模型:从内存到像素
CRTC 的扫描输出模型描述了像素数据如何从帧缓冲区(Framebuffer)经过扫描转换,最终形成显示面板所需的像素流。该模型包含三个关键阶段:
- 内存读取(Fetch):CRTC 根据当前扫描位置(行、列)计算帧缓冲区中的像素地址,通过 DMA 引擎读取像素数据。对于多 Plane 场景,CRTC 需要同时从多个缓冲区读取数据。
- 合成与混合(Blend):如果硬件支持,CRTC 内部会执行 Alpha 混合,将主图层、光标图层、视频图层等叠加为单一像素流。混合顺序通常由 Z-order 决定。
- 时序封装(Timing Insertion):在有效像素之间插入 HSync、VSync 和 DE 信号,形成符合面板规格的并行像素接口(如 RGB/DPI)或串行接口(如 LVDS/eDP)。
2.4 与显示面板的同步机制
CRTC 与显示面板之间的同步通过 硬件握手信号 实现,确保像素流与面板的扫描节奏一致。同步机制分为两种模式:
| 同步模式 | 信号线 | 工作原理 | 典型场景 |
|---|---|---|---|
| 内同步(PCLK + HSync + VSync) | Pixel Clock, HSync, VSync, DE | CRTC 主动生成所有时序信号,面板被动接收。CRTC 控制扫描节奏,面板只需在 DE 有效时锁存像素。 | LCD 显示屏、eDP、HDMI |
| 外同步(TE/VSync 输入) | TE (Tearing Effect) 或 VSync 输入 | 面板主动发送同步脉冲(如 TE 信号),CRTC 等待该信号后再开始下一帧的扫描输出。用于避免撕裂。 | MIPI DSI 面板、部分 OLED |
2.5 CRTC 与 VBlank 中断
VBlank(垂直消隐期)是 CRTC 驱动开发中最重要的同步事件。当 CRTC 完成一帧的有效像素扫描后,进入垂直消隐期(VTotal - VActive 行),此时硬件会触发 VBlank 中断。驱动利用该中断完成以下操作:
- 帧缓冲区切换:在 VBlank 期间更新 CRTC 的帧缓冲区地址寄存器,确保下一帧使用新缓冲区,避免撕裂。
- Plane 更新:应用层通过
drmModeAtomicCommit提交的 Plane 状态变更,在 VBlank 中断中一次性生效。 - 性能统计:记录帧率、VBlank 时间戳,用于调试和性能分析。
enable_vblank 回调中使能硬件 VBlank 中断,在 disable_vblank 中关闭。中断处理函数中调用 drm_crtc_handle_vblank() 通知 DRM 核心层。
// CRTC VBlank 中断处理函数示例
static irqreturn_t crtc_vblank_handler(int irq, void *dev_id)
{
struct drm_crtc *crtc = dev_id;
struct my_crtc_state *state = to_my_crtc_state(crtc->state);
// 清除硬件中断状态位
writel(1, state->mmio + VBLANK_STATUS_REG);
// 通知 DRM 核心层 VBlank 事件
drm_crtc_handle_vblank(crtc);
// 如果有等待的 atomic 提交,在此处应用
if (state->pending_update)
apply_pending_plane_updates(crtc);
return IRQ_HANDLED;
}
通过以上机制,CRTC 实现了从内存到面板的完整像素传输控制,成为 DRM/KMS 显示流水线的“心脏”。理解 CRTC 的时序生成、扫描模型和同步机制,是后续实现多 Plane 联动和复杂显示效果的基础。