RK3566 显示配置
DRM/KMS , 这两项是什么,起什么作用, rk3566是否支持?
RK3566 完全支持 DRM/KMS,并且这是在该平台上构建现代图形系统(如 Wayland + Weston)的基础。
一、DRM 和 KMS 是什么?
1. DRM(Direct Rendering Manager)
- 作用:Linux 内核中的子系统,用于管理 GPU 和显示控制器的直接访问。
- 最初为 3D 加速(如 Mesa 驱动)设计,后来扩展为统一的显示管理框架。
- 提供用户空间程序(如 Weston、X Server)与 GPU/显示硬件通信的接口(通过
/dev/dri/card0等设备节点)。
2. KMS(Kernel Mode Setting)
- 作用:由内核(而非用户空间)负责设置显示模式(分辨率、刷新率、多屏配置等)。
- 是 DRM 的一部分,解决了传统 fbdev(framebuffer)无法动态切换分辨率、多屏支持差等问题。
- 启用 KMS 后,系统启动时就能直接进入高分辨率图形模式,无需依赖用户空间工具(如
fbset)。
简单理解:
- DRM = 内核提供的 GPU/显示硬件控制接口
- KMS = 内核负责设置屏幕分辨率和显示输出
- 二者结合 = 现代 Linux 图形栈(Wayland/X11)的基石
二、RK3566 是否支持 DRM/KMS?
是的,完全支持。
- RK3566 使用 Rockchip 自研的 VOP(Video Output Processor) 显示控制器。
- Linux 内核从 4.4+ 版本开始就逐步合入了对 Rockchip DRM/KMS 驱动的支持。
- 在 5.10+ 内核(尤其是 5.10 LTS 及更新版本)中,RK3566 的 DRM/KMS 支持已非常成熟,包括:
- 多图层合成(Plane)
- HDMI、MIPI-DSI、eDP 输出
- 多屏异显/同显
- 旋转、缩放等基本功能
内核中关键配置项(需启用):
CONFIG_DRM=y
CONFIG_DRM_ROCKCHIP=y
CONFIG_DRM_FBDEV_EMULATION=y # 可选,提供 fb0 兼容
CONFIG_DRM_PANEL_SIMPLE=y # 支持简单 LCD 面板
CONFIG_DRM_DW_HDMI=y # RK3566 使用 DesignWare HDMI
CONFIG_DRM_DW_HDMI_I2S_AUDIO=y💡 Buildroot 中你已配置:
kconfigBR2_LINUX_KERNEL_CUSTOM_LOCAL=y BR2_LINUX_KERNEL_CUSTOM_LOCAL_LOCATION="$(TOPDIR)/../kernel"请确保你的内核源码(
../kernel)已启用上述 DRM/KMS 选项。
Weston 合成器是什么,为什么需要一个合成器.在运行中起什么作用?
Weston 是 Wayland 协议的参考合成器(reference compositor),由 Wayland 项目官方维护。要理解 Weston 的作用,需要先理解 Wayland 架构 和 “合成器” 的概念。
一、什么是“合成器”(Compositor)?
在传统 X11 架构中,窗口管理器(Window Manager)和显示服务器(X Server)是分开的。
而在 Wayland 架构中,这两者合二为一,这个统一的角色就叫 合成器(Compositor)。
合成器的核心职责:
- 接收客户端(应用程序)的图形缓冲区(如一个窗口的内容)
- 将多个窗口的图形内容“合成”成一帧完整的屏幕图像
- 直接将最终画面提交给显示硬件(通过 DRM/KMS、framebuffer 或嵌入式显示控制器)
- 处理输入事件(键盘、鼠标、触摸)并分发给对应的应用程序窗口
🖼️ 类比:就像视频编辑软件把多个图层(视频、字幕、特效)合成一个最终视频,合成器把多个应用窗口合成一帧桌面画面。
二、Weston 是什么?
Weston 是 Wayland 协议的官方参考实现,既是合成器,也用于:
- 验证 Wayland 协议的正确性
- 作为开发和测试平台
- 在嵌入式或轻量级系统中直接作为桌面环境使用
它支持多种后端(backend):
drm:直接通过内核 DRM/KMS 输出(最常用,无依赖)fbdev:使用传统 framebuffer(性能较差)wayland:嵌套在另一个 Wayland 会话中(用于调试)x11:运行在 X11 上(仅用于开发测试)
三、为什么需要合成器?(对比 X11)
| 功能 | X11 架构 | Wayland + 合成器 |
|---|---|---|
| 显示服务器 | X Server | 合成器(如 Weston) |
| 窗口管理 | 独立的 WM(如 i3, GNOME Shell) | 合成器内置 |
| 图形合成 | 应用直接绘图到共享帧缓冲区(易冲突) | 每个应用提交独立缓冲区,由合成器安全合成 |
| 安全性 | 应用可窥探其他窗口 | 应用彼此隔离 |
| 性能 | 多次拷贝、协议开销大 | 零拷贝(通过 DMA-BUF)、更高效 |
| 延迟 | 高(输入→X→WM→应用) | 低(输入→合成器→应用) |
✅ 合成器是 Wayland 架构的核心:没有它,Wayland 客户端无法显示任何内容。
四、Weston 在运行中起什么作用?
假设你运行一个基于 Wayland 的系统(如 Buildroot + Weston):
- 系统启动后,
weston进程启动(通常作为 init 脚本的一部分) - Weston:
- 打开
/dev/dri/card0,初始化 DRM/KMS,设置屏幕分辨率 - 创建一个“桌面”背景和面板(如果启用 shell)
- 监听输入设备(通过 libinput)
- 启动一个 Wayland socket(如
/run/user/0/wayland-0)
- 打开
- 应用程序启动时(如
glmark2-wayland):- 连接到 Weston 的 Wayland socket
- 请求创建一个“surface”(窗口)
- 渲染内容到自己的缓冲区,并提交给 Weston
- Weston:
- 接收所有应用的缓冲区
- 按 Z 顺序、透明度等合成一帧完整画面
- 通过 DRM/KMS 直接翻转(page flip)到显示器
- 用户点击鼠标 → Weston 接收事件 → 转发给对应应用 → 应用响应
🔄 整个过程高效、安全、低延迟,特别适合嵌入式和移动设备。
五、其他合成器举例
Weston 不是唯一选择,其他常见合成器包括:
- Mutter(GNOME 桌面使用)
- KWin(KDE Plasma 使用)
- Sway(兼容 i3 的 Wayland 合成器)
- HMI 专用合成器(如 Automotive Grade Linux 的 Luna)
但在嵌入式 Buildroot 系统中,Weston 因其轻量、稳定、无依赖,是最常用的选择。
总结
- Weston 是 Wayland 的合成器,相当于“显示服务器 + 窗口管理器”。
- 必须有合成器,Wayland 应用才能显示内容。
- 在 RK3566 + Buildroot 系统中,Weston 通过 DRM/KMS 直接驱动屏幕,提供轻量级图形桌面。
- 它负责:合成窗口、处理输入、管理显示输出,是图形系统的中枢。
💡 简单说:没有 Weston(或其他合成器),你的 Wayland 应用就“无处可画”。
如何让开发板启动后不再显示桌面?
如果你希望开发板启动后不显示桌面环境,但保留显示驱动功能,可以通过停用 Weston 服务来实现。
操作步骤
停用 Weston 服务:
- 在
make menuconfig配置中,找到 Weston 选项 - 将
BR2_PACKAGE_WESTON选项设置为n - 路径:
Target packages > Graphic libraries and applications > Weston > 'n'
- 在
重新编译系统:
bashmake编译完成后,在
output/images/目录下会生成新的rootfs.ext2镜像文件。烧录镜像到开发板:
bashsudo upgrade_tool di -rootfs rootfs.ext2📝 详细烧录步骤请参考:如何烧录分区镜像
重启开发板验证:
- 重启开发板
- 如果开发板启动后没有显示桌面,只会停留在开机 logo 界面,说明配置成功
验证 Weston 服务状态:
- 通过串口连接到开发板
- 进入终端界面,执行以下命令:bash
ps -ef | grep weston - 如果没有显示
weston进程,说明 Weston 服务已成功停用
注意事项
- 停用 Weston 后,Wayland 应用程序将无法运行
- 显示驱动仍然正常工作,可以用于 Qt5 等直接使用 framebuffer 的应用程序
- 如果需要重新启用桌面,只需将
BR2_PACKAGE_WESTON选项重新设置为y并重新编译
如何启用 Qt5 并编译示例程序?
Qt5 是 Qt5 开发包,包含 Qt5 的库文件、头文件以及示例程序。Qt5 程序可以在没有桌面环境的情况下直接显示 Qt 程序界面,非常适合嵌入式开发。
配置步骤
启用 Qt5 主包:
- 在
make menuconfig配置中,找到Qt5选项 - 启用
BR2_PACKAGE_QT5=y选项 - 如果无法启用,检查并启用缺少的依赖项
- 在
配置必要的 Qt5 组件:
kconfig# 基础组件 BR2_PACKAGE_QT5 [=y] `# Qt5 开发包` BR2_PACKAGE_QT5BASE_EXAMPLES [=y] `# Qt5 示例程序` BR2_PACKAGE_QT5BASE_GUI [=y] `# Qt5 GUI 库` BR2_PACKAGE_QT5BASE_WIDGETS [=y] `# Qt5 界面库` # 显示后端配置 BR2_PACKAGE_QT5BASE_DEFAULT_QPA [=linuxfb] `# Qt5 默认的 QPA(Linux Framebuffer)` BR2_PACKAGE_QT5BASE_LINUXFB_DIRECT_PAINTING [=y] `# Qt5 Linux FB 直绘` # 多媒体支持 BR2_PACKAGE_QT5BASE_GIF [=y] `# Qt5 GIF 库` BR2_PACKAGE_QT5BASE_JPEG [=y] `# Qt5 JPEG 库` BR2_PACKAGE_QT5BASE_PNG [=y] `# Qt5 PNG 库` # 字体和输入支持 BR2_PACKAGE_QT5BASE_FONTCONFIG [=y] `# Qt5 FontConfig 库` BR2_PACKAGE_QT5BASE_TSLIB [=y] `# Qt5 TSLIB 库,用于触摸屏` # Wayland 支持(可选) BR2_PACKAGE_QT5WAYLAND [=y] `# Qt5 Wayland 支持` BR2_PACKAGE_QT5WAYLAND_COMPOSITOR [=y] `# Qt5 Wayland 合成器支持`
编译和验证
执行编译:
bashmake编译完成后,在
output/images/目录下会生成rootfs.ext2镜像文件。烧录镜像:
bashsudo upgrade_tool di -rootfs rootfs.ext2📝 详细烧录步骤请参考:如何烧录分区镜像
验证 Qt5 示例程序:
- 通过串口连接开发板
- 进入示例程序目录:bash
cd /usr/lib/qt5/examples/widgets/analogclock - 运行示例程序:bash
./analogclock - 预期结果:如果能看到模拟时钟界面,说明 Qt5 配置成功
