普通网友 2025-10-04 21:55 采纳率: 98.4%
浏览 12
已采纳

rk3588 Qt运行报错:no device configuration set

在基于RK3588平台运行Qt应用程序时,常出现“no device configuration set”错误,导致界面无法正常显示。该问题多源于设备未正确配置显示参数或DRM/KMS驱动初始化失败。常见原因包括:设备树中显示节点配置不完整、未启用正确的显示输出接口(如HDMI或DP)、或Qt未指定合适的平台插件(如`-platform drm`)及设备文件路径。此外,权限不足或缺少相关依赖库也可能触发此错误。需检查`/dev/dri/card*`设备节点是否存在,并确保Qt构建时启用了DRM支持。
  • 写回答

1条回答 默认 最新

  • 扶余城里小老二 2025-10-04 21:55
    关注

    基于RK3588平台运行Qt应用时“no device configuration set”错误的深度解析与解决方案

    1. 问题现象与初步诊断

    在RK3588平台上部署Qt应用程序时,常遇到如下错误信息:

    QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
    Could not initialize EGL display: Error: unknown
    No device configuration set
    Failed to create wl_display (Wayland)

    尽管错误中提及Wayland,但在使用DRM/KMS后端时,该提示具有误导性。真正原因往往在于DRM设备未正确初始化或配置。

    此问题直接影响UI渲染流程,导致界面黑屏或程序崩溃。

    2. 根本原因分类分析

    根据长期调试经验,可将“no device configuration set”归因于以下五大类:

    1. 设备树(Device Tree)中显示控制器节点配置缺失或错误
    2. 未启用HDMI/DP等物理输出接口
    3. Qt未指定正确的平台插件(如-platform drm
    4. DRM设备节点(/dev/dri/card*)不存在或权限不足
    5. Qt构建时未启用DRM支持或缺少必要依赖库

    3. 深度排查路径:从硬件到应用层

    层级检查项验证命令/方法
    内核层DRM驱动是否加载dmesg | grep -i drm
    设备层/dev/dri/card0是否存在ls /dev/dri/
    权限层用户是否有访问/dev/dri权限ls -l /dev/dri/card0
    设备树vop、dual-panel、hdmi节点是否启用fdtget <.dtb file> / <node>
    Qt构建是否启用eglfs_drm和kmsqmake -query | grep QT_CONFIG
    运行时是否指定-platform drm./app -platform drm
    环境变量XDG_RUNTIME_DIR是否设置export XDG_RUNTIME_DIR=/tmp
    依赖库libdrm、libgbm、libEGL是否存在ldd ./app | grep libdrm
    日志KMS初始化失败细节dmesg | grep -i kms
    多显示器connector状态是否connectedmodetest -M rockchip -c

    4. 设备树关键配置示例

    RK3588的设备树需确保以下节点正确启用:

    / {
        chosen {
            framebuffer@0 {
                status = "okay";
            };
        };
    
        &vopl {
            status = "okay";
            ports {
                #address-cells = <1>;
                #size-cells = <0>;
    
                port@0 {
                    reg = <0>;
                    vopl_out_panel: endpoint {
                        remote-endpoint = <&panel_in_vopl>;
                    };
                };
            };
        };
    
        &hdmi {
            status = "okay";
        };
    
        &dw_hdmi {
            status = "okay";
        };
    };

    5. Qt运行时参数与环境配置

    即使底层配置正确,若Qt未指定合适平台插件,仍会失败。推荐启动方式:

    export QT_LOGGING_RULES=qt.qpa.drm=true
    export XDG_RUNTIME_DIR=/tmp
    chmod 777 /tmp
    ./myqtapp -platform drm device=/dev/dri/card0 drmMode=atomic

    其中drmMode=atomic可提升显示稳定性,尤其在多层合成场景下。

    6. DRM/KMS初始化流程图解

    graph TD A[启动Qt应用] --> B{是否指定-platform drm?} B -- 否 --> Z[回退至其他平台, 可能失败] B -- 是 --> C[打开/dev/dri/card0] C --> D{打开成功?} D -- 否 --> E[报错: no device configuration set] D -- 是 --> F[调用DRM_IOCTL_GET_CAP获取能力] F --> G[枚举Connector与Encoder] G --> H{找到有效显示设备?} H -- 否 --> I[报错: no modes available] H -- 是 --> J[设置CRTC与FrameBuffer] J --> K[进入图形渲染循环]

    7. 构建Qt时的关键配置项

    为确保DRM支持,编译Qt时必须包含以下选项:

    • -device-feature eglfs_egl_device
    • -device-feature eglfs_kms
    • -device-feature eglfs_brcm(如适用)
    • 链接libdrmlibgbmlibEGL等库

    可通过查看Qt构建日志确认是否启用了linux-eglfs-kms-atomics支持。

    8. 权限与udev规则配置

    非root用户运行时,需添加udev规则以赋予访问权限:

    # /etc/udev/rules.d/99-dri-permissions.rules
    KERNEL=="card*", SUBSYSTEM=="drm", GROUP="video", MODE="0666"
    KERNEL=="renderD*", SUBSYSTEM=="drm", GROUP="video", MODE="0666"

    同时确保当前用户已加入video组:usermod -aG video your_user

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 10月4日