4. 瑞芯微VOP与显示控制器
在瑞芯微(Rockchip)平台上,VOP(Video Output Processor)是显示子系统的核心硬件模块,负责从内存读取图层数据、完成缩放/旋转/格式转换,并按时序输出到 MIPI-DSI、HDMI、eDP、RGB 等接口。KMS 驱动中的 CRTC 本质上就是对 VOP 的抽象,因此理解 VOP 的版本差异与能力边界,是显示模式配置与调试的基础。
一、VOP 版本差异:从 VOP-Big 到 VOP2/VOP3
瑞芯微各代 SoC 使用的 VOP 差异明显,常见的有 VOP-Big、VOP-Lite、VOP2、VOP3 等。VOP-Big 多见于 RK3288/RK3399,支持多图层叠加与硬件光标;VOP-Lite 是精简版,图层数和带宽能力较弱,常见于 RK3328 等;VOP2 在 RK3568/RK3566 上广泛使用,采用“Video Port + Cluster”结构,支持多显示通路;VOP3 则用于 RK3588 等新一代平台,支持 8K 输出、更多图层和更强的 AFBC 能力。
版本差异直接决定了 KMS 中可用的 plane 数量、支持的像素格式、最大分辨率以及是否支持 AFBC。调试时若发现某个图层无法分配或格式不被接受,首先要确认当前 SoC 的 VOP 版本及其能力表。
二、图层能力:Plane 类型与叠加限制
VOP 内部由多个图层(layer/window)组成,KMS 将其抽象为 plane。通常分为 Primary、Overlay 和 Cursor 三类。Primary 用于主显示,Overlay 用于视频、UI 等叠加,Cursor 用于鼠标。每个图层有独立的格式、缩放和位置能力,但共享 VOP 的带宽与时钟资源。
- 图层数量有限:VOP2 单路通常支持 4~6 个图层,超出后需要合成或复用。
- 格式支持不同:部分图层不支持 YUV,或仅支持特定 RGB 格式。
- 缩放能力受限:并非所有图层都支持任意比例缩放,部分仅支持 1/2~2 倍。
- 叠加顺序固定:zpos 决定叠加次序,配置错误会导致图层被遮挡。
modetest -p 查看各 plane 的 formats、size 和 rotation 属性,再决定图层分配策略。三、缩放与旋转:硬件能力与约束
VOP 支持硬件缩放和旋转,但不同版本能力不同。缩放通常通过 YUV/RGB 缩放器完成,支持整数或分数比例;旋转则依赖 VOP 内部的旋转模块或 AFBC 配合。旋转 90°/270° 时,输出宽高会互换,带宽和时钟需求也会变化。
在 KMS 中,缩放和旋转通过 plane 的 SRC_W/SRC_H 与 CRTC_W/CRTC_H 属性表达。若缩放比例超出硬件范围,驱动会返回 -EINVAL,此时需要改用 GPU 合成或调整图层尺寸。
# 查看 plane 支持的旋转与缩放
modetest -M rockchip -p
# 典型 plane 属性
rotation: 0x1 (rotate-0) 0x2 (rotate-90) 0x4 (rotate-180) 0x8 (rotate-270)
SRC_W: 1920 SRC_H: 1080
CRTC_W: 1280 CRTC_H: 720
四、AFBC 压缩:带宽优化的关键
AFBC(Arm Frame Buffer Compression)是瑞芯微 VOP 支持的重要特性,通过对帧缓冲进行压缩,显著降低内存带宽和功耗。VOP2/VOP3 对 AFBC 支持较好,但要求 framebuffer 以 AFBC 格式分配,且宽高需满足对齐要求(如 16 像素对齐)。
启用 AFBC 后,图层数据在内存中以压缩块存储,VOP 解码后送显示。若格式或对齐不满足,会出现花屏、绿屏或直接无法显示。调试时可通过 dmesg 查看 AFBC 相关报错,并确认 DRM_FORMAT_MOD_ARM_AFBC 是否被正确设置。
五、带宽与时钟约束:显示稳定性的底层保障
VOP 的稳定输出依赖足够的 DDR 带宽和像素时钟。带宽需求与分辨率、刷新率、图层数、格式和是否压缩相关。例如 4K@60 RGB888 单图层约需 1.5GB/s 带宽,多图层叠加会成倍增加。若带宽不足,会出现撕裂、闪烁或掉帧。
时钟方面,VOP 需要像素时钟(pixel clock)与 DDR 时钟协同。KMS 在 modeset 时会计算 clock 需求,若超出 VOP 或 PLL 能力,会拒绝该模式。调试时可查看 /sys/kernel/debug/dri/0/summary 中的带宽与时钟信息。
| 约束类型 | 影响因素 | 典型现象 | 排查手段 |
|---|---|---|---|
| 带宽 | 分辨率、图层数、格式、AFBC | 撕裂、掉帧、闪烁 | dri summary、带宽计算 |
| 时钟 | 像素时钟、PLL、VOP 上限 | modeset 失败、黑屏 | dmesg、clk_summary |
| 图层 | plane 数量、格式、缩放 | 图层无法分配 | modetest -p |
| AFBC | 对齐、modifier、格式 | 花屏、绿屏 | dmesg、modifier 检查 |
六、案例与复盘:多图层 4K 显示的调试
某 RK3568 项目需要 4K@60 输出,同时叠加视频层和 UI 层。初始配置下出现周期性闪烁。排查发现:视频层使用 NV12 线性格式,UI 层使用 ARGB8888,两图层叠加后带宽接近 VOP2 上限。将视频层改为 AFBC 压缩后,带宽下降约 40%,闪烁消失。
复盘要点:一是优先确认 VOP 版本与图层能力;二是合理使用 AFBC 降低带宽;三是避免不必要的缩放和旋转;四是通过 dri summary 和 dmesg 量化带宽与时钟余量。只有把 VOP 的硬件约束与 KMS 的软件配置对齐,才能实现稳定可靠的显示输出。