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>。
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 的读取偏移和缩放系数。
2.3 独立显示场景:实际应用中的多屏配置
独立显示场景是指每个屏幕运行完全独立的应用程序或 UI 界面,彼此之间没有内容关联。这种场景在嵌入式产品中非常常见,对 DMA-BUF 的隔离性和独立性要求最高。
2.3.1 典型独立显示场景
| 场景 | 主屏内容 | 副屏内容 | DMA-BUF 要求 |
|---|---|---|---|
| 智能座舱 | 仪表盘(实时车速、转速) | 中控娱乐(导航、音乐) | 两个独立 DMA-BUF,高实时性 |
| 收银系统 | 收银操作界面(触摸交互) | 顾客价格展示屏(只读) | 主屏 DMA-BUF 可写,副屏只读 |
| 医疗监护 | 患者监护波形(高刷新率) | 信息汇总屏(静态数据) | 主屏 DMA-BUF 高频更新,副屏低频 |
| 数字标牌 | 管理员配置界面 | 广告播放(视频循环) | 副屏 DMA-BUF 支持视频解码输出 |
2.3.2 独立显示场景的 DMA-BUF 配置要点
- 物理地址隔离:每个屏幕的 DMA-BUF 必须分配在独立的物理内存区域,避免 VOP 跨区域读取导致画面撕裂或错误。
- 缓存一致性管理:当 CPU 或 GPU 更新某个屏幕的 DMA-BUF 时,必须通过
DMA_BUF_IOCTL_SYNC或dma_buf_begin_cpu_access()保证缓存同步,不影响另一个屏幕的显示。 - VOP 独立配置:每个 VOP 的显示时序(timing)、分辨率、色彩格式必须独立设置,DMA-BUF 的 stride(行跨度)需与对应 VOP 的配置匹配。
- 帧同步策略:在独立场景中,两个屏幕的刷新率可能不同(如主屏 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,
};