RK3576作为瑞芯微新一代高性能处理器平台,在工业控制、智能终端等领域有着广泛应用。最近在实际项目开发中遇到两个典型需求:一是需要在嵌入式Linux系统中集成Qt开发环境,二是要解决屏幕旋转显示问题。这两个需求看似独立,实则都涉及到嵌入式系统开发的底层适配工作。
我以Rockchip官方BSP为基础,通过打补丁方式实现了Qt5.15.2的完整移植,并解决了270度旋转显示时的DRM/KMS输出异常问题。整个过程涉及uboot参数修改、内核DRM驱动适配、Qt编译配置等多个技术环节,现将具体实现方案和踩坑经验整理如下。
开发环境采用Ubuntu 20.04 LTS,使用Rockchip官方提供的SDK(版本号1.3.0)作为基础。首先需要配置交叉编译工具链:
bash复制export PATH=/opt/toolchain/aarch64--glibc--stable-2022.03-1/bin:$PATH
export CROSS_COMPILE=aarch64-buildroot-linux-gnu-
Qt版本选择5.15.2长期支持版,这个版本在嵌入式领域有较好的兼容性。源码下载后需要打上两个关键补丁:
Qt的编译配置直接影响最终在嵌入式平台上的运行性能,以下是经过实测验证的优化配置:
bash复制./configure -release -opengl es2 -eglfs \
-no-gtk -no-cups -no-pch -no-xcb -no-wayland \
-skip qtwebengine -skip qtlocation \
-prefix /usr/local/qt5.15.2 \
-xplatform linux-aarch64-gnu-g++ \
-sysroot /opt/sysroot/rk3576 \
特别需要注意:
编译完成后通过scp将Qt库部署到目标板:
bash复制scp -r qt5.15.2 root@192.168.1.100:/usr/local/
在目标板上需要设置以下环境变量:
bash复制export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_INTEGRATION=eglfs_kms
export QT_QPA_EGLFS_ROTATION=270
测试时建议使用Qt自带的示例程序:
bash复制./widgets/widgets/analogclock -platform eglfs
RK3576使用DRM/KMS框架管理显示输出,旋转功能需要修改以下关键文件:
drivers/gpu/drm/rockchip/rockchip_drm_vop.c
添加旋转属性支持:
c复制static const struct drm_prop_enum_list rotation_enum_list[] = {
{ DRM_MODE_ROTATE_0, "normal" },
{ DRM_MODE_ROTATE_270, "rotate-270" },
};
drivers/gpu/drm/drm_plane.c
修改plane的rotation属性检查逻辑
在设备树中需要明确指定默认旋转参数:
dts复制&hdmi {
rotation = <270>;
force-output = <1>;
};
Qt的eglfs_kms插件需要同步修改以正确读取旋转参数:
qtbase/src/plugins/platforms/eglfs/deviceintegration/eglfs_kms/qeglfskmsgbmscreen.cpp现象:旋转后出现画面撕裂
解决:检查VOP的时钟配置,确保pixel clock满足旋转后的时序要求
bash复制# 查看当前显示模式
cat /sys/kernel/debug/dri/0/summary
现象:启动时段错误
排查步骤:
bash复制dmesg | grep Mali
bash复制eglinfo | grep -i config
旋转操作会带来额外的内存带宽消耗,建议:
dts复制&display_subsystem {
memory-region = <&afbc_reserved>;
};
经过优化后的性能数据对比:
| 测试项 | 原始模式 | 旋转270度 | 优化后旋转 |
|---|---|---|---|
| 帧率(fps) | 60 | 42 | 58 |
| 内存带宽(GB/s) | 3.2 | 5.1 | 3.8 |
| CPU占用(%) | 12 | 35 | 18 |
关键优化手段:
bash复制tar -czf /userdata/qt_backup.tar.gz /usr/local/qt5.15.2
bash复制echo 270 > /sys/class/drm/card0-HDMI-A-1/rotation
bash复制#!/bin/sh
dmesg > /var/log/display.log
cat /sys/kernel/debug/dri/0/state >> /var/log/display.log
实际项目中发现,在低温环境下(-20℃)旋转显示可能会出现初始化失败,解决方案是在uboot阶段提前初始化显示控制器:
c复制/* uboot board_init阶段添加 */
int rk3576_display_init(void)
{
/* 提前加载PMIC供电 */
pmic_reg_write(0x32, 0x1F);
udelay(5000);
return 0;
}