Skip to content

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 输出
    • 多屏异显/同显
    • 旋转、缩放等基本功能

内核中关键配置项(需启用):

kconfig
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 中你已配置:

kconfig
BR2_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)

合成器的核心职责:

  1. 接收客户端(应用程序)的图形缓冲区(如一个窗口的内容)
  2. 将多个窗口的图形内容“合成”成一帧完整的屏幕图像
  3. 直接将最终画面提交给显示硬件(通过 DRM/KMS、framebuffer 或嵌入式显示控制器)
  4. 处理输入事件(键盘、鼠标、触摸)并分发给对应的应用程序窗口

🖼️ 类比:就像视频编辑软件把多个图层(视频、字幕、特效)合成一个最终视频,合成器把多个应用窗口合成一帧桌面画面。


二、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):

  1. 系统启动后weston 进程启动(通常作为 init 脚本的一部分)
  2. Weston:
    • 打开 /dev/dri/card0,初始化 DRM/KMS,设置屏幕分辨率
    • 创建一个“桌面”背景和面板(如果启用 shell)
    • 监听输入设备(通过 libinput)
    • 启动一个 Wayland socket(如 /run/user/0/wayland-0
  3. 应用程序启动时(如 glmark2-wayland):
    • 连接到 Weston 的 Wayland socket
    • 请求创建一个“surface”(窗口)
    • 渲染内容到自己的缓冲区,并提交给 Weston
  4. Weston:
    • 接收所有应用的缓冲区
    • 按 Z 顺序、透明度等合成一帧完整画面
    • 通过 DRM/KMS 直接翻转(page flip)到显示器
  5. 用户点击鼠标 → 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 服务来实现。

操作步骤

  1. 停用 Weston 服务

    • make menuconfig 配置中,找到 Weston 选项
    • BR2_PACKAGE_WESTON 选项设置为 n
    • 路径:Target packages > Graphic libraries and applications > Weston > 'n'
  2. 重新编译系统

    bash
    make

    编译完成后,在 output/images/ 目录下会生成新的 rootfs.ext2 镜像文件。

  3. 烧录镜像到开发板

    bash
    sudo upgrade_tool di -rootfs rootfs.ext2

    📝 详细烧录步骤请参考:如何烧录分区镜像

  4. 重启开发板验证

    • 重启开发板
    • 如果开发板启动后没有显示桌面,只会停留在开机 logo 界面,说明配置成功
  5. 验证 Weston 服务状态

    • 通过串口连接到开发板
    • 进入终端界面,执行以下命令:
      bash
      ps -ef | grep weston
    • 如果没有显示 weston 进程,说明 Weston 服务已成功停用

注意事项

  • 停用 Weston 后,Wayland 应用程序将无法运行
  • 显示驱动仍然正常工作,可以用于 Qt5 等直接使用 framebuffer 的应用程序
  • 如果需要重新启用桌面,只需将 BR2_PACKAGE_WESTON 选项重新设置为 y 并重新编译

如何启用 Qt5 并编译示例程序?

Qt5 是 Qt5 开发包,包含 Qt5 的库文件、头文件以及示例程序。Qt5 程序可以在没有桌面环境的情况下直接显示 Qt 程序界面,非常适合嵌入式开发。

配置步骤

  1. 启用 Qt5 主包

    • make menuconfig 配置中,找到 Qt5 选项
    • 启用 BR2_PACKAGE_QT5=y 选项
    • 如果无法启用,检查并启用缺少的依赖项
  2. 配置必要的 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 合成器支持`

编译和验证

  1. 执行编译

    bash
    make

    编译完成后,在 output/images/ 目录下会生成 rootfs.ext2 镜像文件。

  2. 烧录镜像

    bash
    sudo upgrade_tool di -rootfs rootfs.ext2

    📝 详细烧录步骤请参考:如何烧录分区镜像

  3. 验证 Qt5 示例程序

    • 通过串口连接开发板
    • 进入示例程序目录:
      bash
      cd /usr/lib/qt5/examples/widgets/analogclock
    • 运行示例程序:
      bash
      ./analogclock
    • 预期结果:如果能看到模拟时钟界面,说明 Qt5 配置成功