2. 多屏异显概念解析:主屏、副屏、扩展模式、镜像模式、独立显示场景

在嵌入式多屏显示系统中,“多屏异显”(Multi-Display with Different Content)是指多个显示输出接口(如 HDMI、DP、eDP、MIPI DSI)同时呈现不同或相同的画面内容。RK3399 平台凭借其双 VOP(Video Output Processor)架构,天然支持两个独立显示通道,是实现多屏异显的硬件基础。

本章将系统解析多屏异显的核心概念:主屏与副屏的角色划分、扩展模式与镜像模式的差异,以及独立显示场景的典型应用。理解这些概念是后续配置 DMA-BUF 缓存管理的前提。

2.1 主屏与副屏:显示角色的划分

在多屏系统中,主屏(Primary Display) 和 副屏(Secondary Display) 是逻辑上的角色定义,通常由操作系统或显示驱动根据硬件连接和用户配置决定。

角色 定义 RK3399 典型接口 特点
主屏 系统启动时默认输出控制台、桌面环境或 UI 主界面的显示设备 eDP(内置面板)、HDMI(外接显示器) 拥有 framebuffer 0,通常绑定 VOP0,负责显示系统核心内容
副屏 辅助显示设备,用于扩展桌面、显示附加信息或独立应用界面 MIPI DSI、DP、第二个 HDMI 拥有 framebuffer 1,通常绑定 VOP1,内容与主屏独立或关联
实践提示:在 RK3399 的 Device Tree 中,主屏和副屏的绑定关系通过 display-timings 和 ports 节点配置。主屏的 primary 属性通常设置为 <1>,副屏则省略或设为 <0>。
主屏与副屏角色关系 RK3399 SoC VOP0(主通道) VOP1(副通道) 主屏(Primary) eDP / HDMI 副屏(Secondary) MIPI DSI / DP

2.2 扩展模式与镜像模式:显示逻辑的差异

多屏显示的核心逻辑分为 扩展模式(Extended Mode) 和 镜像模式(Mirror Mode)。两者在帧缓冲管理、DMA-BUF 分配和显示控制器配置上存在本质区别。

2.2.1 扩展模式

扩展模式下,主屏和副屏显示不同的内容,共同构成一个更大的逻辑桌面。每个屏幕拥有独立的帧缓冲(Framebuffer),显示控制器(VOP)从各自的 DMA-BUF 中读取像素数据。

  • 帧缓冲数量:2 个(每个屏幕独立分配)
  • DMA-BUF 分配:每个屏幕独立申请,物理地址不连续
  • VOP 配置:VOP0 和 VOP1 分别绑定不同的 DMA-BUF
  • 典型场景:仪表盘 + 中控娱乐屏、收银系统 + 顾客展示屏

2.2.2 镜像模式

镜像模式下,主屏和副屏显示完全相同的内容。两个屏幕共享同一个帧缓冲,VOP0 和 VOP1 从同一块 DMA-BUF 中读取数据。

  • 帧缓冲数量:1 个(两个屏幕共享)
  • DMA-BUF 分配:仅分配一次,两个 VOP 通过硬件地址映射共享
  • VOP 配置:VOP0 和 VOP1 指向相同的 DMA-BUF 物理地址
  • 典型场景:演示投影、教学大屏同步显示
对比维度 扩展模式 镜像模式
帧缓冲数量 2 个(独立) 1 个(共享)
DMA-BUF 数量 2 块 1 块
VOP 绑定 VOP0 → DMA-BUF0,VOP1 → DMA-BUF1 VOP0 和 VOP1 → 同一 DMA-BUF
内存占用 高(双倍帧缓冲) 低(单帧缓冲)
显示内容 不同 相同
关键注意:在镜像模式下,虽然两个 VOP 共享同一块 DMA-BUF,但它们的显示时序参数(如分辨率、刷新率)可以不同。RK3399 的 VOP 支持独立的缩放引擎,因此副屏可以以不同分辨率显示主屏内容的缩放版本。这需要在 DMA-BUF 配置时考虑 VOP 的读取偏移和缩放系数。
扩展模式 vs 镜像模式 扩展模式 DMA-BUF 0 DMA-BUF 1 VOP0 VOP1 主屏 内容 A 副屏 内容 B 镜像模式 共享 DMA-BUF VOP0 VOP1 主屏 内容 A 副屏 内容 A

2.3 独立显示场景:实际应用中的多屏配置

独立显示场景是指每个屏幕运行完全独立的应用程序或 UI 界面,彼此之间没有内容关联。这种场景在嵌入式产品中非常常见,对 DMA-BUF 的隔离性和独立性要求最高。

2.3.1 典型独立显示场景

场景 主屏内容 副屏内容 DMA-BUF 要求
智能座舱 仪表盘(实时车速、转速) 中控娱乐(导航、音乐) 两个独立 DMA-BUF,高实时性
收银系统 收银操作界面(触摸交互) 顾客价格展示屏(只读) 主屏 DMA-BUF 可写,副屏只读
医疗监护 患者监护波形(高刷新率) 信息汇总屏(静态数据) 主屏 DMA-BUF 高频更新,副屏低频
数字标牌 管理员配置界面 广告播放(视频循环) 副屏 DMA-BUF 支持视频解码输出

2.3.2 独立显示场景的 DMA-BUF 配置要点

  1. 物理地址隔离:每个屏幕的 DMA-BUF 必须分配在独立的物理内存区域,避免 VOP 跨区域读取导致画面撕裂或错误。
  2. 缓存一致性管理:当 CPU 或 GPU 更新某个屏幕的 DMA-BUF 时,必须通过 DMA_BUF_IOCTL_SYNC 或 dma_buf_begin_cpu_access() 保证缓存同步,不影响另一个屏幕的显示。
  3. VOP 独立配置:每个 VOP 的显示时序(timing)、分辨率、色彩格式必须独立设置,DMA-BUF 的 stride(行跨度)需与对应 VOP 的配置匹配。
  4. 帧同步策略:在独立场景中,两个屏幕的刷新率可能不同(如主屏 60Hz、副屏 30Hz),DMA-BUF 的更新时机需要与各自的 V-Sync 对齐。
实践案例:在 RK3399 智能座舱项目中,主屏(eDP,1920x1080@60Hz)显示仪表盘,副屏(MIPI DSI,1280x720@30Hz)显示导航。DMA-BUF 配置如下:
// 主屏 DMA-BUF 配置
struct dma_buf_config primary_cfg = {
    .width = 1920,
    .height = 1080,
    .format = DRM_FORMAT_XRGB8888,
    .stride = 1920 * 4,  // 7680 bytes
    .vop_id = 0,
    .sync_mode = SYNC_TO_VSYNC,
};

// 副屏 DMA-BUF 配置
struct dma_buf_config secondary_cfg = {
    .width = 1280,
    .height = 720,
    .format = DRM_FORMAT_XRGB8888,
    .stride = 1280 * 4,  // 5120 bytes
    .vop_id = 1,
    .sync_mode = SYNC_TO_VSYNC,
};
独立显示场景架构 应用层(独立进程) 应用 A(仪表盘) 应用 B(导航) DMA-BUF 层(独立缓存) DMA-BUF A(主屏) DMA-BUF B(副屏) VOP 层(独立显示控制器)

2.4 本章小结