云计算百科
云计算领域专业知识百科平台

RK3528 RGA+DRM框架 HDMI out视频输出:从多图层合成到显示送显

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(屏幕)

对象角色在 Rockchip / RK3528 上的对应
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"的标准流程:

  • 初始化:驱动 drm_dev_register() 注册设备,KMS 初始化 CRTC / Encoder / Connector;
  • 模式设置:用户空间用 drmModeSetCrtc()(或原子接口 drm_atomic_commit())配置分辨率、刷新率,KMS 更新硬件时序;
  • 显存分配:用 drmModeCreateDumb() + drmModeAddFB2() 创建 Framebuffer,GEM 分配显存并返回句柄;
  • 渲染与提交:合成器把画面写入显存,调用 drmModePageFlip() 触发页面翻转;
  • VBLANK 同步:翻转发生在垂直消隐期(Vertical Blank),确保无撕裂;
  • 资源释放:关闭 fd 时 DRM 自动回收显存与对象。
  • 💡 原子提交(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

    八、要点回顾

  • DRM 是 RK3528 的显示基石:取代 FBDEV,用 KMS 五大对象(Framebuffer→Plane→CRTC→Encoder→Connector)把"多图层合成 + 时序扫描 + 接口输出"统一调度,设备节点 /dev/dri/card0,用户层经 libdrm 控制。
  • RK3528 显示硬件是 VOP2:单 VOP 多 VP,HDMI 固定绑 VP0(最大 4K),支持逐像素 alpha、Porter-Duff、色键、旋转/镜像、4 层叠加;HDMI 2.0b 输出 1080P@60 毫无压力。
  • RGA + DRM 分工明确:RGA 当"合成车间",把 UVC/NDI/NET 多源 + 叠加/绿幕/LOGO/镜像旋转合成统一帧;DRM 当"送显调度",用原子提交 + VBLANK 页翻转把帧稳稳送到 HDMI,且无撕裂、无花屏。
  • 预览即推流同源:RGA 合成帧经 DMA-BUF 同时喂给 HDMI 预览与 MPP 编码,保证本地电视看到的就是推流出去的画面。
  • 说明书对应点:视频输出源选择(信号配置)、镜像/旋转(高级编码)、视频叠加 Mode1~5、绿幕、LOGO(特效配置)、HDMI 接入状态(系统状态)——每一项都能在 DRM/RGA 框架里找到对应的技术落点。

  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » RK3528 RGA+DRM框架 HDMI out视频输出:从多图层合成到显示送显
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!