RK3568嵌入式Linux双屏同显配置指南:从硬件架构到Wayland实践
2026/6/16 5:08:55 网站建设 项目流程

1. 项目概述:为什么要在RK3568上折腾双屏同显?

最近在搞一个基于RK3568的工控项目,客户要求在同一个操作界面上,一块屏幕放在操作台给操作员用,另一块大屏挂在墙上给参观或监控的人看,两块屏幕必须显示一模一样的内容。这不就是典型的“双屏同显”需求嘛。RK3568这颗芯片在嵌入式圈子里挺火的,性能不错,接口也丰富,官方资料说支持多路显示输出,但真到自己动手配置的时候,才发现从芯片能力到最终点亮两块屏,中间隔着好几道坎。

双屏同显,听起来简单,不就是把一份图像数据复制到两个显示通道嘛。但在嵌入式Linux系统里,这涉及到内核显示驱动框架(DRM/KMS)、设备树(DTS)配置、以及显示服务(比如Wayland或X11)的协同工作。RK3568的显示子系统(VOP)设计得很灵活,支持最多三路独立的Video Port(VP),这为多屏输出提供了硬件基础。但硬件支持只是第一步,软件配置才是大头。你需要搞清楚哪路VP连接了哪个物理接口(HDMI、LVDS、MIPI-DSI等),如何在设备树里正确描述这种连接关系,以及如何让合成器(Compositor)知道你要克隆输出。

这个需求在数字标牌、工业控制台、教育一体机、医疗显示终端等领域非常常见。它不追求扩展桌面那种“异显”的灵活性,而是强调显示的可靠性和一致性。对于开发者来说,实现双屏同显,是深入理解Linux图形栈和Rockchip平台显示框架的一个绝佳实践。接下来,我就结合自己的踩坑经验,把RK3568配置双屏同显的完整思路、关键步骤和避坑指南详细拆解一遍。

2. RK3568显示子系统与双屏同显原理拆解

2.1 RK3568 VOP与Video Port硬件架构

要配置双屏,首先得摸清RK3568显示输出的“家底”。Rockchip把它的显示控制器叫做VOP(Video Output Processor)。你可以把它想象成一个功能强大的“图像分发中心”。它的核心工作是从内存(Frame Buffer)里读取已经渲染好的图像数据,然后进行一系列处理(比如缩放、色彩空间转换),最后通过物理接口发送给显示器。

RK3568的VOP(v2版本)内部包含多个独立的Video Port(VP)。根据Rockchip的文档,RK3568通常有三个VP:VP0, VP1, VP2。这才是实现多屏的关键。每个VP都是一个完全独立的显示流水线,它可以连接一个物理显示接口。这意味着,在硬件层面,RK3568有能力同时驱动三块屏幕,每块屏幕的内容可以相同(同显),也可以不同(异显)。

那么,VP具体连到了哪些接口上呢?这取决于核心板的设计。以市面上常见的开发板为例,其映射关系通常是这样的:

  • VP0: 通常分配给HDMI TX(高清多媒体接口)或eDP(嵌入式DisplayPort)。
  • VP1: 可能分配给LVDS(低压差分信号)或另一个HDMI(如果支持)。
  • VP2: 通常分配给MIPI DSI(移动产业处理器接口)或RGB接口。

这里有一个至关重要的概念:物理接口与VP的绑定关系是在设备树(Device Tree)里定义的。开发板厂商会根据自己板子的实际布线,在DTS文件中写明,例如hdmi节点使用vop属性指向&vop0(即VP0),dsi节点指向&vop2。我们的配置工作,很大程度上就是在理解和修改这些绑定关系。

2.2 双屏同显的软件实现路径

在Linux图形系统中,实现同显主要有两种思路:

路径一:内核驱动层克隆(CRTC Clone)这是更底层、更高效的方式。通过修改显示驱动(通常是Rockchip的DRM驱动),将一个CRTC(对应一个VP)的输出直接复制到另一个CRTC。这样,从帧缓冲区(Framebuffer)到两个VP的数据流在内核里就完成了复制,上层应用无感知。这种方式性能损耗极低,两块屏的同步性最好。但需要你熟悉内核驱动代码,并进行定制化修改,门槛较高,且不同内核版本可能适配方式不同。

路径二:显示服务层复制(Compositor Mirroring)这是更通用、更常用的方式。我们不在内核里做文章,而是让显示服务器的合成器来干这个活。无论是Wayland(如Weston)还是X11,它们的合成器都支持将同一个桌面表面(Surface)渲染到多个输出(Output)上。例如,在Weston的配置文件(weston.ini)里,你可以指定某个输出作为另一个输出的“镜像”(mirror)。这种方式不涉及内核修改,配置相对灵活,通过用户空间的配置文件即可管理,是大部分项目首选的方案。

对于我们这次的目标,考虑到易用性和可维护性,我会选择路径二,即通过配置显示服务(以Wayland/Weston为例)来实现双屏同显。这样,即使未来内核或驱动有升级,我们的配置也能最大程度地保持兼容。

2.3 关键约束与前提条件

在动手之前,必须确认以下几点,否则大概率会失败:

  1. 硬件支持:你的RK3568核心板及底板必须确实引出了两路可用的显示接口,并且接口类型符合你的屏幕需求(如HDMI+LVDS)。
  2. 内核支持:你使用的内核必须已经编译并包含了这两路显示接口的驱动(如DRM_ROCKCHIP_DSI,DRM_ROCKCHIP_HDMI,DRM_ROCKCHIP_LVDS等)。
  3. 设备树基础配置:开发板默认的设备树应该已经正确配置了各个显示接口的引脚复用(Pinctrl)、供电等基本节点,确保单屏显示是正常的。
  4. VP资源不冲突:你要使用的两个显示接口必须绑定到不同的VP上。比如,HDMI用了VP0,那么你的第二块屏(如LVDS)就必须使用VP1或VP2。如果两块屏配置到了同一个VP,那是无法同时点亮的。

3. 设备树(DTS)配置详解

设备树是告诉内核硬件连接关系的“地图”。实现双屏,第一步就是修改设备树,确保两个显示接口节点都被启用,且分配了正确的VP资源。

3.1 定位与修改显示接口节点

首先,找到你的内核源码中对应你开发板的设备树文件(.dts.dtsi),通常位于arch/arm64/boot/dts/rockchip/目录下。文件名通常包含开发板型号,如rk3568-evb.dts

我们需要修改两个地方:

  1. 启用第二个屏幕的节点:默认情况下,为了省电或避免冲突,可能只启用了一个显示节点(比如只有hdmi节点是status = “okay”;)。你需要找到第二个屏幕对应的节点(比如dsilvds),将其状态改为“okay”
  2. 分配正确的VP:检查并确认两个显示节点的rockchip,vop属性指向了不同的VOP(即VP)。例如:
    // HDMI 节点,通常使用 vop0 (VP0) &hdmi { status = “okay”; rockchip,vop = <&vop0>; // 明确指定使用VP0 }; // LVDS 节点,需要指定为 vop1 (VP1) 或 vop2 (VP2) &lvds { status = “okay”; rockchip,vop = <&vop1>; // 指定使用VP1 // 注意:还需要正确配置 lvds_panel 子节点,指定屏幕时序参数 };
    重要rockchip,vop这个属性非常关键,它建立了物理接口与VOP硬件模块的链接。务必确保两个屏幕使用的vop不同。

3.2 处理时钟与电源依赖

有些显示接口有依赖关系。例如,MIPI DSI可能依赖于同一个VP上的另一个接口的时钟。或者,某些屏幕需要特定的供电引脚(enable-gpios)和背光控制(backlight)节点。你需要根据屏幕规格书和开发板原理图,确保这些节点也被正确启用和配置。

一个常见的坑是背光不亮。即使屏幕驱动信号正常,如果背光PWM或使能GPIO没有配置,屏幕也是一片黑。检查设备树中对应屏幕的backlight属性是否指向了一个有效的背光节点(如&backlight),并且该背光节点的状态也是“okay”

3.3 编译与更新设备树

修改保存后,需要重新编译设备树并更新到开发板。

# 在内核源码根目录下 make ARCH=arm64 your_board_name.dtb # 例如:make ARCH=arm64 rk3568-evb.dtb

编译生成的.dtb文件在arch/arm64/boot/dts/rockchip/目录下。将其替换掉开发板/boot目录下的原设备树文件(具体路径因系统而异,可能是/boot/dtbs/rockchip/),然后重启。

重启后,可以通过以下命令验证两个显示接口是否都被内核识别:

# 查看DRM设备信息,应该能看到两个connector(连接器) cat /sys/kernel/debug/dri/0/state # 或者使用 modetest 工具(需要安装) modetest -M rockchip

如果能看到两个状态为connectedconnector,并且它们的crtc(对应VP)ID不同,那么设备树配置就基本成功了。

4. 配置Wayland/Weston实现屏幕镜像

设备树搞定后,硬件层面已经准备就绪,两块屏幕应该都能被内核的DRM驱动识别为独立的显示输出。接下来,我们需要让图形合成器Weston将图像输出到这两块屏上,并设置为同显模式。

4.1 Weston核心配置解析

Weston的配置文件通常是/etc/xdg/weston/weston.ini(或/etc/weston.ini)。我们需要在其中定义输出(Output)行为。

一个实现双屏同显的基础配置示例如下:

[core] # 取消注释以允许后端使用多个GPU/设备(如果需要) # gbm-format=argb8888 [output] name=HDMI-A-1 mode=1920x1080@60 transform=normal [output] name=LVDS-1 mode=1280x800@60 transform=normal # 关键:指定此输出为HDMI-A-1的镜像 same-as=HDMI-A-1

配置项解读:

  • [output]: 每个段落定义了一个显示输出。
  • name: 这是输出的名称,这是最容易出错的地方。这个名称不是随意写的,必须与DRM驱动报告的名称一致。获取准确名称的方法是:
    # 方法1:查看 /sys/class/drm/ 目录 ls /sys/class/drm/ | grep card0- # 你会看到类似 card0-HDMI-A-1, card0-LVDS-1 的目录 # 名称就是 `-` 后面的部分,如 `HDMI-A-1`, `LVDS-1` # 方法2:使用 weston-info 命令(在Weston运行后,另一个终端执行) weston-info # 在输出信息中寻找 `output:` 段落,里面有 `name:` 字段
  • mode: 设置该输出的分辨率和刷新率。格式为宽度x高度@刷新率必须确保这个分辨率在你的屏幕和驱动支持的EDID模式列表中。设置一个不支持的模式会导致该输出无法初始化。
  • transform: 设置旋转,normal为不旋转,90180270为旋转角度,flippedflipped-180等用于镜像翻转。如果副屏显示方向不对,可以调整这个参数。
  • same-as:这是实现同显的关键指令。它告诉Weston,当前这个输出(如LVDS-1)应该显示与same-as指定的输出(如HDMI-A-1)完全相同的内容。你可以将多个输出same-as到同一个主输出上。

4.2 分辨率与时序适配

如果两块屏幕的分辨率不同(比如主屏是1080p,副屏是1280x800),Weston会怎么处理?在same-as模式下,Weston会将主输出的帧缓冲区内容,缩放(Scale)到每个副输出的分辨率上。缩放算法会影响清晰度和性能。

为了获得最佳效果,建议:

  1. 尽量使用相同分辨率:如果硬件允许,为两块屏幕选择相同的原生分辨率,可以避免缩放带来的性能损失和图像质量下降。
  2. 调整缩放器:Weston的DRM后端支持配置缩放过滤器。你可以在[core][output]段落添加scaling-filter选项,如scaling-filter=smart(双线性插值)或scaling-filter=nearest(最近邻,可能产生锯齿)。根据画面内容(文字/图像)进行选择。
  3. 验证EDID:对于HDMI屏幕,系统通常会通过EDID自动读取最佳分辨率。如果自动识别失败,你可以强制指定mode。对于LVDS等屏幕,需要在设备树的panel-timing节点中手动定义分辨率时序参数,确保与屏幕规格书一致。

4.3 启动Weston并验证

配置完成后,重启Weston服务,或者如果Weston是作为显示管理器(如Weston-launch)启动的,则重启系统。

# 如果Weston是systemd服务 sudo systemctl restart weston # 或者直接在前台启动调试(在已登录的终端下,Ctrl+C可退出) weston --backend=drm-backend.so --tty=1 --log=/tmp/weston.log

启动后,观察两块屏幕是否都亮起并显示相同的桌面内容。如果只有一块亮,或者Weston启动失败,需要查看日志排查。

# 查看Weston日志 journalctl -u weston --since “5 minutes ago” # 如果用了systemd cat /tmp/weston.log # 如果前台启动指定了log文件

常见启动失败原因

  • name字段错误,找不到对应的DRM connector。
  • 指定的mode不被支持。
  • 两个输出配置到了同一个CRTC(VP)上(这通常意味着设备树rockchip,vop配置有误)。
  • 权限问题,Weston进程没有访问DRM设备(/dev/dri/card0)的权限。确保用户属于videoinput组。

5. 高级调试与性能优化

5.1 使用DRM调试工具

当屏幕不亮或显示异常时,内核的DRM调试接口是强大的武器。

  1. 启用DRM调试日志:在启动内核时添加参数drm.debug=0x0e(或0xff获取最详细日志),可以在dmesg中看到DRM驱动初始化和模式设置的详细过程,有助于定位硬件初始化失败的原因。
  2. 使用modetest:这个工具是调试DRM的“瑞士军刀”。
    # 列出所有资源 modetest -M rockchip # 它会显示所有connector, encoder, crtc, plane的信息。重点关注: # - connector: 是否`connected`?支持的`modes`有哪些? # - crtc: 每个crtc的ID,对应一个VP。 # 手动测试显示模式(谨慎使用,会覆盖当前显示): # modetest -M rockchip -s <connector_id>[@<crtc_id>]:<mode> ... # 例如:同时设置两个输出 # modetest -M rockchip -s 43@41:1920x1080 -s 44@42:1280x800
  3. 检查/sys/kernel/debug/dri/:这个目录下的文件实时反映了DRM的状态。
    # 查看当前状态 cat /sys/kernel/debug/dri/0/state # 检查每个connector的EDID信息(HDMI屏) cat /sys/kernel/debug/dri/0/connector/<id>/edid | edid-decode

5.2 同显模式下的性能考量

双屏同显意味着GPU或合成器需要处理两倍于单屏的像素输出(如果分辨率不同,则按实际计算)。虽然数据是复制的,但扫描输出(Scanout)和信号生成的工作量是实打实增加的。

  1. 帧率稳定性:在高分辨率(如双4K)下,可能会对RK3568的显示子系统造成压力。使用glmark2-es2-waylandweston-simple-egl测试帧率,观察是否出现卡顿。如果卡顿,可以考虑:
    • 降低分辨率或刷新率。
    • 确保内核中CONFIG_DRM_DMA_SYNC等同步机制已开启,减少延迟。
    • 检查CPU/GPU频率缩放策略,确保在显示期间运行在足够高的性能档位。
  2. 内存带宽:双屏显示会占用更多的内存带宽(用于帧缓冲区)。确保系统内存(RAM)带宽充足,且没有其他外设(如GPU、VPU、NPU)在疯狂争抢带宽。
  3. 功耗与发热:同时驱动两块屏幕,尤其是高亮度屏幕,功耗会显著增加。需要评估开发板或产品的电源设计是否满足要求,并注意散热。

5.3 从同显切换到异显

有时你可能需要动态切换显示模式。Weston本身不支持运行时动态修改same-as配置。但你可以通过以下方式实现:

  1. 多配置文件切换:准备两个weston.ini文件,一个是同显配置,一个是异显(扩展桌面)配置。通过脚本停止Weston,替换配置文件,再启动Weston。这会有短暂的黑屏。
  2. 使用扩展桌面:直接移除same-as配置,并为每个[output]设置不同的位置(position),Weston就会将它们组织成一个扩展桌面。
    [output] name=HDMI-A-1 mode=1920x1080@60 position=0,0 # 主屏在(0,0)坐标 [output] name=LVDS-1 mode=1280x800@60 position=1920,0 # 副屏在主屏右侧,X坐标偏移主屏宽度
  3. 编写自定义合成器插件:这是最灵活但最复杂的方式。你可以编写一个Weston插件,监听DBus信号或读取配置文件,动态调用DRM的MODE_SET接口来改变输出模式。这需要对Weston和DRM API有深入理解。

6. 常见问题排查与解决方案实录

在实际操作中,你几乎一定会遇到各种奇怪的问题。下面是我总结的“排坑指南”。

6.1 屏幕不亮或只亮一块

这是最常见的问题。请按照以下流程图进行排查:

问题:屏幕不亮 | v 1. 检查硬件连接与供电 - 线缆是否插紧?屏幕电源是否打开? - 测量屏幕背光电压和信号线电压(需万用表)。 | v 2. 检查内核驱动加载 - `lsmod | grep rockchip` 查看相关DRM驱动是否加载。 - `dmesg | grep -i “drm\|vop\|hdmi\|dsi\|lvds”` 查看启动日志有无错误。 | v 3. 检查设备树配置 - 确认第二个屏幕的节点 `status = “okay”;`。 - **关键**:确认两个屏幕的 `rockchip,vop` 属性指向不同的VOP(如`&vop0`, `&vop1`)。 - 检查背光(`backlight`)、使能引脚(`enable-gpios`)配置。 | v 4. 检查DRM识别状态 - `cat /sys/class/drm/card0-*/status` 查看连接状态。 - 使用 `modetest -M rockchip` 确认两个connector是否为 `connected`。 | v 5. 检查Weston配置 - `name` 字段是否与 `/sys/class/drm/` 下的名称**完全一致**(大小写敏感)? - 指定的 `mode` 是否在 `modetest` 列出的支持模式中? - 查看Weston日志 (`journalctl -u weston` 或 `/tmp/weston.log`) 中的错误信息。

特别注意一个隐蔽的坑:有些LVDS屏幕需要特定的像素时钟(Pixel Clock)双通道/单通道配置。这些参数在设备树的panel-timing节点和lvds节点的dual-channel等属性中设置。一个错误的像素时钟值会导致屏幕完全无信号。务必对照屏幕数据手册(Datasheet)逐项核对。

6.2 显示画面异常(花屏、偏移、撕裂)

  1. 花屏/雪花

    • 信号干扰:检查排线是否过长、是否靠近高速信号线。LVDS信号对干扰敏感,确保使用屏蔽良好的线缆。
    • 时序参数错误:设备树中panel-timinghback-porch,hfront-porch,vback-porch,vfront-porch,hsync-len,vsync-len等参数必须精确。花屏往往是同步信号前沿/后沿设置不对。
    • 内存问题:帧缓冲区内存访问错误。尝试降低分辨率或刷新率,看是否改善。用memtester工具测试内存稳定性。
  2. 画面偏移或显示不全

    • 屏幕参数:检查Weston配置或设备树中的分辨率,是否与屏幕物理分辨率一致。
    • 过扫描(Overscan):某些电视或显示器默认开启过扫描,会导致图像边缘被裁剪。尝试在Weston配置中为该输出添加overscan=0选项,或在显示器菜单中关闭“过扫描”功能。
  3. 画面撕裂

    • 垂直同步(VSync)未开启:确保Weston合成器开启了VSync。在weston.ini[core]部分,可以尝试添加presentation-timestamps=true
    • 性能不足:同显加重了系统负担,导致合成帧率跟不上刷新率。按照5.2节的性能优化建议处理。

6.3 Weston启动失败或崩溃

  1. 权限错误:最常见的错误是failed to open /dev/dri/card0: Permission denied。确保运行Weston的用户(如weston或你的登录用户)属于videoinput组。可以执行sudo usermod -aG video,input $USER并重新登录。
  2. 资源冲突:如果之前用modetest手动设置了显示模式没有清理,可能会占用CRTC资源,导致Weston无法初始化。重启系统是最简单的解决方法。
  3. 配置语法错误weston.ini文件对格式有要求,节([section])和键值对(key=value)必须正确。一个多余的空格或错误的缩进都可能导致解析失败。可以使用weston --validate命令(如果支持)来检查配置文件语法。
  4. 依赖缺失:Weston需要GBM(Generic Buffer Management)和EGL库。确保已安装libgbm1,libegl1-mesa等包。可以通过ldd /usr/bin/weston检查动态链接库是否齐全。

6.4 系统启动后Weston不自动启动

这通常与你的系统初始化系统(如systemd)和显示管理器配置有关。

  1. 检查服务状态sudo systemctl status westonsudo systemctl status display-manager
  2. 检查服务依赖:Weston服务可能依赖于图形环境(如graphical.target)和多用户登录(multi-user.target)。确保系统进入了正确的运行级别(runlevel)。
  3. 查看日志:使用journalctl -b查看本次启动的所有日志,过滤weston相关的错误信息。
  4. 手动测试:尝试在TTY终端(如Ctrl+Alt+F2)手动启动Weston(weston --backend=drm-backend.so --tty=7),看是否能成功。如果手动可以但自动不行,问题很可能出在systemd服务文件的环境变量或依赖配置上。

折腾RK3568的双屏同显,就像在搭一个精密的积木。硬件连线(设备树)是地基,显示服务(Weston)是图纸,任何一个环节出点小差错,大楼就盖不起来。整个过程最磨人的不是步骤多,而是出错时的那一片漆黑和不知所云的日志。我的经验是,一定要分步验证,从硬件到内核再到用户空间,一层一层地确认。先保证单屏能亮,再折腾第二块屏的设备树,最后才去修改Weston配置。多用dmesgmodetest/sys/class/drm/这些调试工具,它们给出的信息比瞎猜靠谱得多。一旦调通,看着两块屏幕同步亮起,那种成就感还是挺足的。这套方法不仅适用于同显,稍加改动就能玩转异显、旋转、混合输出,把RK3568的显示潜力充分榨出来。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询