4. DPU 驱动详解(上):Display Processing Unit 硬件架构与核心模块

本章深入解析高通 SA8155 平台显示链路中的核心硬件——Display Processing Unit (DPU)。DPU 位于 GPU 与物理显示接口之间,负责将 GPU 渲染完成的帧数据进行合成、色彩处理、缩放、旋转等操作,最终输出到 MIPI DSI、HDMI 或 DP 接口。理解 DPU 的硬件架构是编写高效显示驱动的基石。

学习提示: DPU 并非简单的“显示控制器”,而是一个包含多个可编程流水线、硬件合成器(Layer Mixer)和后处理模块的复杂 ISP(Image Signal Processor)类单元。其驱动(dpu_kms)在 Linux DRM 框架中扮演 CRTC 和 Plane 的角色。

4.1 DPU 整体硬件架构

SA8155 的 DPU 硬件框图如下所示,它展示了从内存读取到物理接口输出的完整数据流路径。

高通 SA8155 DPU 硬件架构总览 SA8155 DPU 硬件架构总览 GPU 渲染帧 (Framebuffer) 多媒体/解码器 (Video/Camera) VBIF (Video Bus Interconnect) 数据分发与仲裁 SSPP 组 (Source Surface Processor) SSPP0: 主UI层 SSPP1: 视频层 SSPP2: 光标层 SSPP3: 安全层 Layer Mixer (硬件合成) Alpha 混合 Z-order 排序 DSPP (后处理: 色彩/伽马) INTF (DSI/DP/HDMI) 显示面板 数据流方向: GPU/多媒体 → VBIF(总线仲裁) → SSPP(源处理/缩放) → Layer Mixer(合成) → DSPP(后处理) → INTF(接口输出) → 面板

DPU 内部主要包含以下关键硬件模块:

模块缩写 全称 核心功能 对应 DRM 角色
VBIF Video Bus Interconnect 系统总线接口,负责从 DDR 读取帧数据并分发到各个 SSPP —
SSPP Source Surface Processor 独立的源图层处理单元,支持缩放、格式转换、旋转、Alpha DRM Plane
Layer Mixer Layer Mixer 硬件合成器,将多个 SSPP 输出按 Z-order 进行 Alpha 混合 DRM CRTC (部分)
DSPP Display Post Processing 显示后处理,包括色彩校正、伽马、色域映射、HDR 处理 CRTC 属性
INTF Interface 物理显示接口控制器,如 DSI 0/1、DP、HDMI DRM Encoder + Connector

4.2 Mixer(合成器)模块详解

Layer Mixer 是 DPU 的核心合成引擎。SA8155 通常包含多个 Mixer(如 Mixer0 和 Mixer1),每个 Mixer 可以独立输出一路合成后的图像。Mixer 的主要职责包括:

  • Z-order 排序: 根据用户空间设定的图层优先级决定覆盖关系。
  • Alpha 混合: 支持逐像素 Alpha 和全局 Alpha 混合,实现透明/半透明效果。
  • 背景色填充: 当没有图层覆盖时,显示设定的背景颜色。
  • 裁剪与边界处理: 对超出显示区域的图层进行硬件裁剪。
关键概念: 在 SA8155 上,一个 Mixer 通常绑定一个显示接口(如 Mixer0 → DSI0)。驱动通过配置 Mixer 的 flush 寄存器来触发一次原子更新。
Layer Mixer 合成流程 Layer Mixer 合成流程 SSPP0 (UI) SSPP1 (Video) SSPP2 (Cursor) Layer Mixer 1. Z-order 排序 2. Alpha 混合 3. 裁剪 4. 背景填充 5. 像素格式转换 合成帧 (送往 DSPP) 注意: 每个 Mixer 的输入图层数量有限(通常为 4~8 层),超出部分需要 GPU 合成或使用多个 Mixer 拼接。

4.3 Layer(图层/SSPP)模块详解

SSPP(Source Surface Processor)是 DPU 中负责处理单个图层的硬件单元。每个 SSPP 对应一个 DRM Plane,支持多种输入格式和硬件加速操作。SA8155 的 SSPP 通常分为两类:

SSPP 类型 典型用途 支持的最大分辨率 硬件特性
VIG (Vigorous) 主 UI 层、视频层 4096x4096 支持缩放、色彩空间转换、去隔行
DMA (Direct Memory Access) 光标层、小尺寸覆盖层 2048x2048 低延迟、低功耗,不支持缩放
CURSOR 硬件光标 128x128 专用光标通道,支持快速移动

每个 SSPP 内部包含以下关键子模块:

  • Fetch Unit: 通过 VBIF 从 DDR 中读取像素数据,支持 stride、tile 模式。
  • Scaler: 硬件缩放引擎,支持 Bilinear、Bicubic、Sharpening 等滤波算法。
  • Color Processor: 支持色彩空间转换(如 YUV ↔ RGB)、色键(Chromakey)。
  • Alpha Processor: 处理全局 Alpha 和逐像素 Alpha 通道。
  • Flip/Flip: 支持水平和垂直翻转。
SSPP 内部流水线结构 SSPP 内部流水线结构 VBIF 数据 Fetch Unit (数据读取) Scaler (缩放引擎) Color Proc (色彩转换) Alpha Proc (Alpha 处理) 输出 SSPP 配置关键寄存器(驱动视角): • SSPP_SRC_SIZE: 源图像宽高 • SSPP_OUT_SIZE: 输出目标宽高(缩放后) • SSPP_SRC_FORMAT: 像素格式(RGB888/YUV420 等) • SSPP_ALPHA: 全局 Alpha 值 • SSPP_FLIP_MODE: 翻转模式 • SSPP_CRTC_ID: 绑定的 Mixer ID

4.4 Interface(显示接口)模块详解

INTF 模块是 DPU 与外部显示面板之间的桥梁。SA8155 支持多种显示接口,每个 INTF 实例对应一个物理接口控制器。驱动中通过 dpu_encoder 来管理 INTF 的配置。

接口类型 SA8155 实例数量 最大分辨率 典型应用
DSI (Display Serial Interface) 2 (DSI0, DSI1) 2560x1600 @60fps 车载中控屏、仪表盘
DP (DisplayPort) 1 4K @60fps 外接显示器、投屏
HDMI 1 (通过外部桥接) 4K @30fps 娱乐系统输出

INTF 模块的主要功能包括:

  • 时序生成: 根据 VESA/CEA 标准生成 H-sync、V-sync、DE 等时序信号。
  • 数据打包: 将并行像素数据转换为 DSI 包或 DP 微包。
  • 时钟管理: 控制像素时钟、链路时钟,支持动态频率调整。
  • 错误检测: 监测链路完整性,处理 ECC/CRC 校验。
驱动开发注意: INTF 的时序参数(如 front porch、sync width、back porch)必须与面板规格严格匹配。错误的时序会导致显示闪烁、黑屏甚至硬件损坏。驱动中通过 drm_display_mode 结构体传递这些参数。
INTF 接口与显示面板连接 INTF 接口与显示面板连接 DPU Core Layer Mixer DSPP Ping-Pong INTF 控制器 时序生成 数据打包 时钟管理 PHY DSI/DP SerDes 显示面板 LCD/OLED 驱动配置流程:dpu_encoder → INTF 时序参数 → PHY 初始化 → 链路训练 → 发送视频流

4.5 驱动初始化流程概览

在 Linux DRM 框架下,DPU 驱动的初始化遵循以下步骤,这些步骤将在后续章节中详细展开:

  1. 设备树解析: 读取 DPU 寄存器基址、中断号、时钟、接口配置。
  2. 硬件模块枚举: 扫描可用的 SSPP、Mixer、INTF 实例数量。
  3. DRM 对象创建: 为每个 SSPP 创建 drm_plane,为每个 Mixer 创建 drm_crtc,为每个 INTF 创建 drm_encoder + drm_connector。
  4. 中断注册: 注册 VBlank 中断、错误中断处理函数。
  5. 时钟与电源管理: 使能 DPU 核心时钟、总线时钟、接口时钟。
  6. 模式设置: 根据面板 EDID 或固定时序配置显示模式。
实战提示: 在 SA8155 上,DPU 驱动代码位于 drivers/gpu/drm/msm/disp/dpu1/ 目录。核心文件包括 dpu_kms.c(KMS 初始化)、dpu_crtc.c(CRTC 实现)、dpu_plane.c(Plane 实现)和 dpu_encoder.c(Encoder 实现)。建议读者在阅读本章后,对照源码进行验证。