Buildroot 嵌入式 Linux Qt 程序竖屏改横屏显示问题记录:QT_QPA_FB_DRM=1 + linuxfb:rotation=90
一、问题背景
手上有一块 OK3506 开发板,系统为 Buildroot 嵌入式 Linux。系统启动后,Qt 应用 New_Jydl 可以正常显示,但是默认是 竖屏显示。现在需要将屏幕改成 横屏显示。
开发板系统信息如下:
root@ok3506-buildroot:~# uname -a
Linux ok3506-buildroot 6.1.99 #8 SMP PREEMPT Thu May 7 11:23:40 CST 2026 armv7l GNU/Linux
可以看出:
系统类型:嵌入式 Linux
构建系统:Buildroot
内核版本:Linux 6.1.99
CPU架构:32 位 ARM,armv7l
二、最开始尝试 eglfs 旋转失败
一开始按照 Qt 嵌入式常见方式尝试:
export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_ROTATION=90
./New_Jydl
或者:
export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_INTEGRATION=eglfs_kms
export QT_QPA_EGLFS_ROTATION=90
./New_Jydl
结果报错:
qt.qpa.plugin: Could not find the Qt platform plugin "eglfs" in "/usr/lib/qt/plugins"
This application failed to start because no Qt platform plugin could be initialized.
Available platform plugins are: linuxfb, minimal, offscreen, vnc.
说明当前系统 Qt 里面没有编译 eglfs 插件。
三、查看 Qt 平台插件
执行:
find /usr/lib/qt/plugins -maxdepth 3 -type f
输出中可以看到 Qt 目前只有:
/usr/lib/qt/plugins/platforms/libqminimal.so
/usr/lib/qt/plugins/platforms/libqvnc.so
/usr/lib/qt/plugins/platforms/libqoffscreen.so
/usr/lib/qt/plugins/platforms/libqlinuxfb.so
也就是说,当前 Qt 平台插件只有:
linuxfb
minimal
offscreen
vnc
没有:
eglfs
wayland
xcb
所以不能使用:
QT_QPA_PLATFORM=eglfs
QT_QPA_EGLFS_ROTATION=90
四、查看显示设备
继续查看系统显示设备:
ls /dev/fb*
结果:
ls: cannot access '/dev/fb*': No such file or directory
说明系统没有传统 framebuffer 设备 /dev/fb0。
再查看 DRM 设备:
ls /dev/dri/
输出:
by-path card0 renderD128
查看 DRM 输出接口:
ls /sys/class/drm/
输出:
card0 card0-DSI-1 renderD128 version
查看屏幕连接状态:
cat /sys/class/drm/card0-*/status 2>/dev/null
输出:
connected
说明当前屏幕接口是:
DRM/KMS
DSI-1
不是传统 framebuffer。
五、关键环境变量:QT_QPA_FB_DRM=1
查看 Qt 相关环境变量:
env | grep QT
输出:
QT_QPA_FB_DRM=1
QT_QPA_FONTDIR=/usr/share/fonts
QT_IM_MODULE=qtvirtualkeyboard
QT_DEBUG_PLUGINS=1
QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt/plugins
这里最关键的是:
QT_QPA_FB_DRM=1
这说明虽然 Qt 加载的是 linuxfb 插件,但是它不是通过 /dev/fb0 显示,而是通过 DRM dumb buffer 方式使用 /dev/dri/card0 输出。
也就是说,当前实际显示链路是:
New_Jydl
↓
Qt linuxfb 插件
↓
QT_QPA_FB_DRM=1
↓
DRM/KMS
↓
/dev/dri/card0
↓
DSI-1 屏幕
通过 Qt debug 日志也可以确认,程序实际加载的是:
loaded library "/usr/lib/qt/plugins/platforms/libqlinuxfb.so"
并且系统确实扫描到了 libqlinuxfb.so 平台插件。
六、最终可用的横屏启动命令
最终测试可用的命令如下:
unset QT_DEBUG_PLUGINS
unset QT_QPA_EGLFS_ROTATION
unset QT_QPA_EGLFS_INTEGRATION
export QT_QPA_FB_DRM=1
export QT_QPA_PLATFORM=linuxfb:rotation=90
./New_Jydl
执行后,Qt 程序从竖屏切换为横屏显示。
其中关键配置是:
export QT_QPA_FB_DRM=1
export QT_QPA_PLATFORM=linuxfb:rotation=90
含义如下:
| 配置 | 作用 |
|---|---|
QT_QPA_FB_DRM=1 | 让 Qt linuxfb 插件走 DRM/KMS 显示路径 |
QT_QPA_PLATFORM=linuxfb:rotation=90 | 使用 linuxfb 平台插件,并旋转 90 度 |
./New_Jydl | 启动 Qt 应用程序 |
如果方向相反,可以尝试:
export QT_QPA_PLATFORM=linuxfb:rotation=270
或者:
export QT_QPA_PLATFORM=linuxfb:rotation=180
七、整理后的手动启动脚本
可以写一个手动启动脚本,例如:
vi /root/start_new_jydl.sh
内容如下:
#!/bin/sh
unset QT_DEBUG_PLUGINS
unset QT_QPA_EGLFS_ROTATION
unset QT_QPA_EGLFS_INTEGRATION
export QT_QPA_FB_DRM=1
export QT_QPA_FONTDIR=/usr/share/fonts
export QT_IM_MODULE=qtvirtualkeyboard
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt/plugins
export QT_QPA_PLATFORM=linuxfb:rotation=90
cd /root
./New_Jydl
添加执行权限:
chmod +x /root/start_new_jydl.sh
以后启动:
/root/start_new_jydl.sh
八、设置开机自动横屏启动
如果希望开机自动启动 Qt 程序,可以新建 Buildroot init 脚本:
vi /etc/init.d/S99New_Jydl
写入:
#!/bin/sh
case "$1" in
start)
echo "Starting New_Jydl..."
unset QT_DEBUG_PLUGINS
unset QT_QPA_EGLFS_ROTATION
unset QT_QPA_EGLFS_INTEGRATION
export QT_QPA_FB_DRM=1
export QT_QPA_FONTDIR=/usr/share/fonts
export QT_IM_MODULE=qtvirtualkeyboard
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt/plugins
export QT_QPA_PLATFORM=linuxfb:rotation=90
cd /root
./New_Jydl &
;;
stop)
echo "Stopping New_Jydl..."
killall New_Jydl
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
添加执行权限:
chmod +x /etc/init.d/S99New_Jydl
sync
reboot
重启后,程序会自动以横屏方式启动。
九、触摸屏方向处理
当前触摸屏信息如下:
cat /proc/bus/input/devices
可以看到:
N: Name="Goodix Capacitive TouchScreen"
H: Handlers=event0
所以触摸节点是:
/dev/input/event0
如果屏幕横屏后触摸方向不对,可以尝试添加 Qt evdev 触摸参数:
export QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event0
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:rotate=90
完整启动示例:
unset QT_DEBUG_PLUGINS
unset QT_QPA_EGLFS_ROTATION
unset QT_QPA_EGLFS_INTEGRATION
export QT_QPA_FB_DRM=1
export QT_QPA_FONTDIR=/usr/share/fonts
export QT_IM_MODULE=qtvirtualkeyboard
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/qt/plugins
export QT_QPA_PLATFORM=linuxfb:rotation=90
export QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event0
export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:rotate=90
cd /root
./New_Jydl
如果触摸方向反了,可以把:
rotate=90
改成:
rotate=270
或者继续根据实际触摸方向调整。
十、问题总结
本次问题的核心不是简单地设置 QT_QPA_EGLFS_ROTATION,因为当前系统根本没有 eglfs 插件。
最终确认系统环境如下:
系统:Buildroot 嵌入式 Linux
内核:Linux 6.1.99
架构:armv7l,32 位 ARM
显示接口:DRM/KMS,DSI-1
Qt 平台插件:linuxfb、minimal、offscreen、vnc
实际 Qt 显示后端:linuxfb + QT_QPA_FB_DRM=1
最终可用方案:
export QT_QPA_FB_DRM=1
export QT_QPA_PLATFORM=linuxfb:rotation=90
./New_Jydl
一句话总结:
该 Buildroot 系统没有 eglfs,也没有 /dev/fb0,但 Qt 通过 QT_QPA_FB_DRM=1 使用 linuxfb 插件走 DRM/KMS 显示,因此可以通过 linuxfb:rotation=90 实现横屏显示。
十一、排查思路记录
以后遇到类似问题,可以按下面顺序排查:
uname -a
env | grep QT
find /usr/lib/qt/plugins -maxdepth 3 -type f
ls /dev/fb*
ls /dev/dri/
ls /sys/class/drm/
cat /sys/class/drm/card0-*/status 2>/dev/null
cat /proc/bus/input/devices
如果 Qt 报:
Available platform plugins are: linuxfb, minimal, offscreen, vnc.
说明不能使用 eglfs。
如果没有:
/dev/fb0
但有:
/dev/dri/card0
并且存在:
QT_QPA_FB_DRM=1
那么可以优先尝试:
export QT_QPA_FB_DRM=1
export QT_QPA_PLATFORM=linuxfb:rotation=90
./你的Qt程序
本次问题到这里解决。
更多推荐



所有评论(0)