显示控制器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合成多个 planez-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 / panel
  • memory 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 或内存仲裁不足。

相关术语