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 硬件框图如下所示,它展示了从内存读取到物理接口输出的完整数据流路径。
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 寄存器来触发一次原子更新。
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: 支持水平和垂直翻转。
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 结构体传递这些参数。
4.5 驱动初始化流程概览
在 Linux DRM 框架下,DPU 驱动的初始化遵循以下步骤,这些步骤将在后续章节中详细展开:
- 设备树解析: 读取 DPU 寄存器基址、中断号、时钟、接口配置。
- 硬件模块枚举: 扫描可用的 SSPP、Mixer、INTF 实例数量。
- DRM 对象创建: 为每个 SSPP 创建
drm_plane,为每个 Mixer 创建drm_crtc,为每个 INTF 创建drm_encoder+drm_connector。 - 中断注册: 注册 VBlank 中断、错误中断处理函数。
- 时钟与电源管理: 使能 DPU 核心时钟、总线时钟、接口时钟。
- 模式设置: 根据面板 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 实现)。建议读者在阅读本章后,对照源码进行验证。