RK3528 RGA硬件加速:多分辨率输入源切换与尺寸自适应完全解析
标签:RK3528 DRM 硬件缩放 尺寸适配 RGA HDMI输出 MEDAI V2
目录
- 一、为什么需要 DRM:从 FBDEV 到现代显示框架
- 二、DRM 框架核心技术
- 2.1 DRM 是什么:内核显示子系统
- 2.2 KMS 五大对象:显示流水线
- 2.3 GEM 与显存管理:dumb buffer / PRIME
- 2.4 libdrm 与一次标准送显流程
- 三、RK3528 显示硬件:VOP2 + HDMI 2.0
- 四、RGA + DRM 协同:从多图层合成到 HDMI 送显
- 4.1 为什么是 RGA 先合成、DRM 后送显
- 4.2 完整流水线拆解
- 五、设备实战:结合 MEDAI V2 使用说明书
- 5.1 视频输出源选择(决定送显主画面)
- 5.2 镜像 / 旋转(编码参数同步到显示帧)
- 5.3 视频叠加 Mode 1~5(RGA 多图层合成)
- 5.4 绿幕抠图与 LOGO 叠加(RGBA / 色键合成)
- 5.5 系统状态验证 HDMI 输出接入
- 六、图层与模式速查表
- 七、排障速查表
- 八、要点回顾
一、为什么需要 DRM:从 FBDEV 到现代显示框架
早期嵌入式 Linux 用 FBDEV(Framebuffer Device) 显示:应用直接写一段显存,驱动只负责把这段内存刷到屏幕。它简单,但只能应付"单层、固定分辨率、无硬件加速"的场景——一旦要叠 LOGO、画中画、绿幕合成、多输入源预览,FBDEV 就无能为力了。
DRM(Direct Rendering Manager,直接渲染管理器) 是 Linux 内核中接管图形显示与 GPU 加速的子系统,自 Kernel 4.4 起成为 Rockchip 平台的标准显示框架(MEDAI V2 的 RK3528 即采用此框架)。它把"显示模式设置、显存分配、图层合成、时序扫描"统一抽象成一套对象模型,让应用层(通过 libdrm)可以精确控制每一帧如何被合成、何时被翻页、送到哪个物理接口。
💡 一句话理解:FBDEV 像"直接往屏幕上糊一张图";DRM 像"导演调度多个图层、在垂直消隐期精准换帧、再送到指定接口"。MEDAI V2 的 HDMI 本地画面输出,正是建立在 DRM 这套调度之上。
二、DRM 框架核心技术
2.1 DRM 是什么:内核显示子系统
DRM 分为用户空间与内核空间两部分,通过 libdrm 库封装 ioctl 交互:
- 用户空间:libdrm 把 DRM 的 IOCTL 封装成友好 API,供 Wayland 合成器、Qt EGLFS、SDL 以及本设备的预览/送显程序调用。
- 内核空间:DRM 核心(通用逻辑)+ DRM 驱动(Rockchip 硬件适配层,drivers/gpu/drm/rockchip/)。
- 设备节点:/dev/dri/cardX(X 为 0~15,默认 card0)。打开该节点即可枚举显示资源、分配缓冲区、提交显示状态。
DRM 的两大支柱是 KMS(Kernel Mode Setting,内核显示模式设置) 与 GEM(Graphics Execution Manager,图形执行管理器),外加 PRIME(跨设备缓冲共享)。
2.2 KMS 五大对象:显示流水线
KMS 把一条"图像 → 屏幕"的显示流水线抽象为五个对象,顺序如下:
Framebuffer → Plane → CRTC → Encoder → (Bridge) → Connector → Panel(屏幕)
| Framebuffer (FB) | 描述显存中一幅图像的布局(宽高、FourCC 像素格式、pitch、offset),与硬件无关 | 一幅合成好的 NV12 / RGB 帧 |
| Plane(图层) | 硬件图层,支持多层叠加。类型:Primary(主图层)、Overlay(视频/OSD/摄像预览层)、Cursor(光标层) | VOP2 的 Cluster / Esmart / Overlay 窗口 |
| CRTC | 扫描输出流水线,保存显示时序(drm_display_mode),合并各 Plane,产生 VBLANK,连接像素流到 Encoder | RK3528 的 Video Port(VP0 / VP1) |
| Encoder | 把 CRTC 像素流转换成显示接口格式(HDMI / DP / DSI / LVDS 等) | HDMI TX 控制器前的格式转换 |
| Connector | 物理显示接口,读取 EDID、检测热插拔、上报连接状态 | HDMI 2.0 接口(含 HPD 热插拔检测) |
Plane 的关键属性(决定能否做特效):
- FB_ID / CRTC_ID:绑定哪个帧缓冲、送给哪个 CRTC;
- SRC_X/Y/W/H:源区域,使用 16.16 定点坐标;CRTC_X/Y/W/H:目标显示区域(整数像素);
- 当源尺寸 ≠ 目标尺寸时,VOP 自动做缩放;
- alpha(透明度)、zpos(图层 Z 序)、rotation(0/90/180/270)、pixel blend mode(混合模式)、COLOR_ENCODING / COLOR_RANGE、IN_FENCE_FD(同步栅栏)。
⚠️ 注意:一个可见 Plane 必须满足——有效的 Framebuffer、兼容的 CRTC、受支持的像素格式、合法的缩放比、可见的目标矩形、合适的 alpha 与 Z 序、足够的带宽,否则该图层不会显示(黑屏/花屏的常见根因)。
2.3 GEM 与显存管理:dumb buffer / PRIME
GEM 负责显存的分配、映射与生命周期,并解决 GPU/CPU/视频解码器之间的同步:
- Dumb Buffer:基于 CMA(连续物理内存)实现,仅支持连续物理内存,适合低分辨率简单场景。通过 drmModeCreateDumb() 创建,再用 drmModeAddFB2() 关联成 Framebuffer。
- PRIME Buffer:基于 DMA-BUF 的跨设备缓冲共享机制,支持连续/非连续物理内存,用于 GPU、VPU(MPP 解码)、RGA 之间零拷贝传递帧数据。
- Fence(dma_fence):保证 GPU 写入与 DRM 扫描之间的先后顺序,避免数据竞争与撕裂。
2.4 libdrm 与一次标准送显流程
一次"把一幅图送到 HDMI"的标准流程:
💡 原子提交(Atomic Commit):通过 drm_atomic_commit() 一次性批量提交 CRTC / Plane / Connector 的所有参数,保证"要么全部生效、要么全部不变",是避免中间态花屏的关键机制。现代 Rockchip 显示驱动默认走原子模式设置。
三、RK3528 显示硬件:VOP2 + HDMI 2.0
RK3528 采用 VOP2 架构(与 RK3562/3566/3568/3588 同代):整颗 SoC 只有一个 VOP,但 VOP 内部有多个独立的 Video Port(VP) 输出通道。
根据 RK3528 数据手册:
| Video Port0 (VP0) | 最大输出 4096×2304@60Hz(HDMI 主通道) |
| Video Port1 (VP1) | 最大输出 720×576@60Hz |
| Cluster 窗口 | 最大 4096×2304,支持 AFBC、RGB/YUV/YUYV、缩放、旋转 |
| Esmart 0/1/2/3 | 最大输入 2048×2160,输出 4096×2304,支持 4 区域 |
| Overlay | Port0 最多 4 层叠加,Port1 最多 2 层 |
| 图层能力 | 逐像素 alpha(颜色/alpha 分离)、Porter-Duff 混合、色键(Chroma Key)、抖动(Dither)、0/90/180/270° 旋转、X/Y 镜像 |
| HDMI | 符合 HDMI 2.0b,支持 4K×2K@60、带宽 18Gbps、HDCP 1.4/2.2、HPD 热插拔检测 |
RK3528 的 HDMI 与 VOP 绑定关系:HDMI 的图像数据来自 VOP,在 RK3528 上 HDMI 固定绑定到 VP0,并固定使用 HDMI PHY PLL 作为 dclk 时钟源,无需在 DTS 中额外配置 PLL 即可输出标准分辨率(如 1080P60)。MEDAI V2 的 HDMI 2.0 本地输出规格为 1920×1080@60(见技术参数表),完全落在 VP0 能力范围内。
💡 理解层级:DRM 的 CRTC 对象在 RK3528 上就映射为 VOP2 的某一个 Video Port(VP0);Plane 映射为 VOP2 的 Cluster/Esmart/Overlay 窗口;Encoder/Connector 映射为 HDMI TX 控制器与 HDMI 物理接口。软件看到的"五大对象",硬件上就是这一套。
四、RGA + DRM 协同:从多图层合成到 HDMI 送显
4.1 为什么是 RGA 先合成、DRM 后送显
MEDAI V2 的画面不是"一幅现成的图",而是多路来源 + 多层特效实时拼出来的:
- 主输入源:UVC 摄像头(经 V4L2 采集、MPP 硬解得到 NV12 帧);
- 副输入源:NDI / NET1 / NET2(经网络拉流、MPP 硬解);
- 特效层:视频叠加(Mode 1~5 双路拼接)、绿幕抠图(前景+背景合成)、LOGO(RGBA 叠加)、镜像/旋转(编码参数里配置);
- 输出:本地 HDMI 电视 + 编码推流(两路共用同一合成结果)。
RGA(Rockchip 2D 硬件加速器) 在这里承担"合成车间":它把主源、副源、背景图、LOGO 按模式做缩放、色彩转换、Alpha 混合、色键抠图、旋转/镜像,产出一个统一格式的完整帧。然后这个帧被交给 DRM,由 VOP2 扫描输出到 HDMI。
为什么不全部交给 VOP2 的硬件 Plane 去做多层合成?——因为 MEDAI V2 的叠加模式(如画中画、左右拼接、绿幕前景合成)逻辑复杂、图层数量与位置关系随配置动态变化,用 RGA 在内存里"先合成成一整张",再让 DRM 用单个 Primary Plane 扫描输出,是最稳、最省带宽、也最容易同时喂给编码链路的做法。RGA 输出帧既送 HDMI 预览,也送 MPP 编码,实现"预览/推流同源"。
4.2 完整流水线拆解

[UVC 摄像头]──V4L2采集──┐
[NDI/NET1/NET2]─MPP硬解─┤
├─→ [RGA 2D 合成车间]
[背景图/前景图]──────────┤ • 缩放/色彩转换(imcvtcolor)
[LOGO 图片 RGBA]────────┤ • Alpha混合(imblend)
│ • 色键抠图(chroma key) → 绿幕
│ • 旋转/镜像(imrotate/imflip)
│ • 按 Mode1~5 拼接双路
▼
[合成后统一帧 NV12/RGB]
│ (DMA-BUF 零拷贝 / dumb buffer)
▼
[DRM / GEM] 分配 Framebuffer
│ drmModeAddFB2() 注册
▼
[KMS] Plane(Primary) → CRTC(=VOP2 VP0)
│ drm_atomic_commit() 原子提交
▼
[Encoder] HDMI TX 格式转换
▼
[Connector] HDMI 2.0 接口 + EDID/HPD 热插拔
▼
[本地电视 / 监视器] 1920×1080@60
└─ 同时:合成帧送 MPP 编码 → RTMP/RTSP/SRT… 推流
要点:
- RGA 与 DRM 通过 DMA-BUF 衔接:RGA 输出的帧 buffer 以 dma-buf 形式导入 DRM,避免 CPU 侧 memcpy,降低延迟与内存带宽占用;
- 原子提交保证不花屏:所有图层参数一次性 drm_atomic_commit(),切换叠加模式/绿幕时不会出现半帧错乱;
- VBLANK 页翻转保证不撕裂:HDMI 显示用页面翻转在垂直消隐期换帧;
- EDID/HPD 热插拔:Connector 上报 HDMI 是否接入、支持的分辨率,对应说明书"系统状态 → HDMI 输出接入状态"。
五、设备实战:结合 MEDAI V2 使用说明书
下面把上面的框架落到 MEDAI V2 的实际配置上,所有截图均来自设备真实 WEB 界面。
5.1 视频输出源选择(决定送显主画面)
进入 编码配置 > 信号配置,在"视频输出(HDMI 显示与编码源选择)"中选择送显主源:
- UVC:USB 摄像头源(默认主输入源);
- NDI:NDI 输入源;
- NET1 / NET2:网络源 1 / 网络源 2 输入源。
页面底部的预监状态区会实时显示所有输入源的视频画面——这正是由 DRM/VOP2 把多路采集帧合成后在本地 HDMI 上呈现的预览。

注意:UVC 为主输入源;副输入源 NDI / NET1 / NET2 三者只能选其一(NDI 与网络流互斥)。
5.2 镜像 / 旋转(编码参数同步到显示帧)
进入 编码配置 > 高级编码配置,可设置影响显示/编码帧的变换:
- 镜像配置:视频编码画面镜像显示(对应 RGA 的 imflip X/Y 镜像);
- 旋转配置:0° / 90° / 180° / 270°(对应 RGA 的 imrotate,也对应 VOP2 Plane 的 rotation 属性)。
这些变换在 RGA 合成阶段即作用于帧,因此 HDMI 本地预览与推流画面保持一致。

5.3 视频叠加 Mode 1~5(RGA 多图层合成)
进入 特效配置 > 视频叠加,这是 RGA 合成最直接的体现:
- 背景图片:本地上传;
- 主输入源:固定为 UVC;
- 副输入源:下拉选择 NDI / NET1 / NET2;
- 模式选择:Mode 1~5 共五种叠加模式。
五种模式效果(来自说明书):
- 模式 1:左右中间视频叠加;
- 模式 2:左上右下视频叠加;
- 模式 3:左下右上视频叠加;
- 模式 4:画中画,主 UVC + 右上第二路视频;
- 模式 5:画中画,主 UVC + 右下第二路视频。

⚠️ 五种模式切换时,需先点击"应用"参数,再重新开关启用开关方可生效(说明书明确提示)。在底层即对应一次 RGA 合成参数的重配 + 一次 DRM 原子提交。
5.4 绿幕抠图与 LOGO 叠加(RGBA / 色键合成)
- 绿幕抠图(特效配置 > 绿幕配置):用背景图片与前景(人形)合成,可调色差容忍度、边缘平滑度、绿色溢出色抑制、亮度/对比度、边缘侵蚀/模糊。底层用 RGA 的 色键(Chroma Key)+ Alpha 混合 实现"去绿留人、换背景"。
- LOGO 水印(特效配置 > LOGO 参数):上传 LOGO 图片,支持以视频左上角为基准的 X/Y 偏移(最大 100 像素),以 RGBA 叠加 方式合成到画面(技术参数注明"支持 RGBA 叠加")。
两者合成结果同样进入 RGA 的统一帧,再经 DRM 送 HDMI 预览与编码推流。

5.5 系统状态验证 HDMI 输出接入
进入 系统状态 页,在"输出状态"中可看到 HDMI 输出接入状态、RTMP 推流时长、USB 本地录制时长;"输入状态"显示 UVC/NDI/NET1/NET2 的连接与接入分辨率。这正对应 DRM Connector 上报的 HDMI 连接状态(HPD/EDID)。
六、图层与模式速查表
| 本地输出接口 | HDMI 2.0,1920×1080@60 | DRM Connector + VOP2 VP0 |
| 显示框架 | DRM/KMS(替代 FBDEV) | /dev/dri/card0 + libdrm |
| 合成方式 | RGA 2D 先合成 → DRM 送显 | RGA 输出帧 → DMA-BUF → drmModeAddFB2 |
| 主输入源 | UVC(固定) | V4L2 采集 + MPP 硬解 |
| 副输入源 | NDI / NET1 / NET2(三选一) | 网络拉流 + MPP 硬解 |
| 视频叠加 | Mode 1~5(5 种拼接) | RGA Alpha 混合 + 缩放拼接 |
| 绿幕 | 色键抠图 + 背景合成 | RGA Chroma Key + imblend |
| LOGO | RGBA 叠加,X/Y 偏移 ≤100px | RGA 逐像素 alpha |
| 镜像 / 旋转 | 支持 X/Y 镜像,0/90/180/270° | RGA imflip/imrotate(或 VOP2 Plane 属性) |
| 防撕裂 | VBLANK 页翻转 | drmModePageFlip |
| 防花屏 | 原子提交 | drm_atomic_commit |
| 热插拔 | HDMI 接入状态上报 | DRM Connector HPD/EDID |
七、排障速查表
| HDMI 电视无画面 | 线缆 / 接口未接好,或电视输入源选错 | 确认 HDMI 线接设备 HDMI 2.0 口;电视切到对应 HDMI 通道;看系统状态"HDMI 输出接入状态"是否变"已接入" |
| 切换叠加模式后画面不变 | 未重新开关启用 | 先点"应用",再关掉再打开启用开关(说明书提示) |
| HDMI 与推流画面镜像不一致 | 镜像仅对编码画面生效理解偏差 | 镜像/旋转在 RGA 合成阶段统一作用,预览与推流同源;若不一致多为配置未点"应用" |
| 绿幕边缘有绿边/锯齿 | 溢出色未抑制、边缘平滑不足 | 调大"绿色溢出色抑制"与"边缘平滑度",必要时加"边缘模糊" |
| LOGO 位置偏移异常 | X/Y 偏移超过 100px 被截断 | LOGO 偏移以视频左上角为基准,最大 100 像素,控制在范围内 |
| 预览卡顿/掉帧 | RGA 合成带宽或 VOP 带宽不足 | 降低副源分辨率;避免 Port0 4 层叠加同时开绿幕+LOGO+画中画;确认输入分辨率与帧率匹配 |
| 切换 UVC 分辨率后无变化 | 需重启生效 | UVC 分辨率(2160P/1080P)切换后需重启设备方可生效 |
| 花屏/半帧错乱 | 非原子提交的中间态 | 确认驱动走原子模式设置(drm_atomic_commit);避免直接写 fb 绕过 KMS |
网硕互联帮助中心



评论前必须登录!
注册