显示控制器(Display Controller)是 SoC 或显卡中的显示输出硬件模块,负责从 帧缓冲 或 DRM Plane 读取像素,执行必要的缩放、混合和颜色处理,生成稳定显示时序,并把最终像素流送往具体显示接口。
它和 GPU 的职责不同:GPU 主要负责渲染或计算,显示控制器主要负责把已经存在的图像按屏幕时序输出。某些 SoC 的 dc8000 类模块就是显示控制器。
核心问题
屏幕不是“内存里有图就会显示”。系统还需要一个硬件模块持续完成以下工作:
- 从内存中按固定节奏读取图像数据。
- 处理多个显示层的定位、缩放、裁剪和混合。
- 生成分辨率、刷新率、同步信号和 blanking 时序。
- 对接 HDMI、DisplayPort、eDP、MIPI DSI、LVDS 等接口。
- 在页面翻转、热插拔、休眠恢复和模式切换时保持状态一致。
显示控制器就是这个实时输出链路的核心。
核心对象
| 对象 | 作用 | 工程关注点 |
|---|---|---|
| fetch unit | 从内存读取 framebuffer 或 plane 数据 | 带宽、burst、stride、modifier |
| plane / layer | 可独立显示的图像层 | 格式、位置、z-order、alpha |
| [[Scaler(硬件缩放器) | scaler]] | 把源图像实时缩放到目标区域 |
| color pipeline | 颜色空间转换和校正 | CSC、gamma、degamma、HDR、色深 |
| blender | 合成多个 plane | z-order、alpha、premultiplied alpha |
| timing generator | 产生扫描时序 | pixel clock、hblank、vblank、同步极性 |
| encoder / interface | 把像素流送往物理接口 | HDMI、DP、eDP、DSI、PHY 配置 |
| interrupt/status | 报告事件和错误 | vblank、page flip、underflow、hotplug |
核心机制
显示控制器的 scanout 路径可以抽象成:
memory buffers
-> fetch planes
-> crop / scale / color convert
-> blend planes
-> timing generator
-> display encoder / panelmemory buffers是应用、合成器或视频解码器准备好的图像缓冲。fetch planes根据每个 plane 的配置从内存取像素。crop / scale / color convert处理源区域、目标区域、缩放和颜色格式。blend planes把多个 plane 按顺序合成为最终像素。timing generator按显示模式产生像素时钟、行同步、场同步和 blanking。display encoder / panel把像素流变成接口信号或面板命令。
在 Linux 中,显示控制器通常由 DRM/KMS 驱动暴露为 connector、encoder、CRTC、plane、framebuffer 等对象。用户态合成器不直接写显示控制器寄存器,而是通过 KMS atomic commit 请求内核驱动配置这些硬件对象。
工程用途
- 嵌入式显示 bring-up:确认面板供电、时钟、接口、KMS mode、plane 和 framebuffer 是否都正确。
- 低功耗显示合成:用硬件 plane、scaler 和 blender 减少 GPU 合成工作。
- 视频播放和相机预览:直接用 overlay plane 输出 YUV 或缩放后图像。
- 多屏输出:管理不同 connector、CRTC 和显示接口的路由。
常见观察点包括 DRM/KMS 枚举结果、connector 状态、CRTC mode、plane 格式、underflow 日志、vblank 中断、背光状态和接口 PHY 配置。
边界与常见坑
- 显示控制器不是 GPU:它通常不能执行通用 shader,也不能替代 GPU 做复杂渲染。
- 显示控制器不是面板:面板是最终显示器件;显示控制器负责产生和发送像素流。
- 有 framebuffer 不等于有输出:时钟、接口、plane 配置、背光、同步信号和带宽都可能出问题。
- 硬件 plane 能力有限:格式、缩放、rotation、alpha、色彩空间和数量常有组合限制。
- underflow 不是软件没有画图:也可能是显示控制器带宽、QoS 或内存仲裁不足。