B y Toradex 秦海 1). 简介 目前主流的 ARM 平台嵌入式 Linux BSP 的显示后端基本都已经从 X11 升级到了 Wayland , 而常用的 Wayland Compositor - Weston 对于 Linux 下常用的 Qt 图形界面开发框架的一些 Plugin ( 比如 Qt VirtualKeyboard) 的配合并不完善,因此 本文就 基于 TI AM62 处理器平台测试 Qt 提供的 Wayland Compositor - QtWayland 的部署测试。 本文所演示的平台来自于 Toradex Verdin AM62 嵌入式平台 。 2. 准备 a). Verdin AM62 ARM 核心版配合 Dahlia 载板, 并连接调试串口和 HDMI 显示器以及 USB 触摸 / 鼠标用于测试 。 3). Verdin AM62 Yocto Linux 编译部署以及配置 a). 由于需要增加对 Qt Eglfs/KMS, QtWayland 和 Qt VirtualKeyboard 的支持,需要 通过 Yocto /Openembedded 框架 重新编译 Yocto Linux BSP ,具体的配置方法请参考 这里 , 部署 如下修改后编译 Reference-Multimedia image 镜像 ------------------------------- # ## local .conf ,增加 Qt eglf s/ kms , Qtwayland 和 Qt VirtualKeyboard 支持 ### + TOOLCHAIN_TARGET_TASK:append = " libgles3-mesa-dev" + IMAGE_INSTALL:append = " qtvirtualkeyboard qtwayland ttf-droid-sans ttf-droid-sans-fallback ttf-droid-sans-mono ttf-droid-serif freetype" + PACKAGECONFIG:append:pn-qtvirtualkeyboard = " lang-zh_CN" + PACKAGECONFIG:append:pn-qtbase = " gles2extra eglfs kms" + PACKAGECONFIG_DISTRO:pn-qtbase = "icu examples accessibility gif gbm kms libinput" + PACKAGECONFIG_FONTS:pn-qtbase = "fontconfig" + PACKAGECONFIG:remove:pn-qtwayland = "xcomposite-egl xcomposite-glx" # ## layers/meta-toradex-ti/qt5-layer/recipes-qt/qt5/qtbase_%.bbappend , 注释掉以下内容 ### ############################### TDX added # from meta-arago/conf/layer.conf -PACKAGECONFIG_GL:am62xx = "gles2extra linuxfb" -PACKAGECONFIG_DISTRO:am62xx = "icu examples accessibility gif gbm kms libinput" -PACKAGECONFIG_FONTS:am62xx = "fontconfig" +#PACKAGECONFIG_GL:am62xx = "gles2extra linuxfb" +#PACKAGECONFIG_DISTRO:am62xx = "icu examples accessibility gif gbm kms libinput" +#PACKAGECONFIG_FONTS:am62xx = "fontconfig" -PACKAGECONFIG:remove:am62xx = "kms" -PACKAGECONFIG:remove:am62xx = "vulkan" -PACKAGECONFIG:remove:am62xx = "glib xcb" +#PACKAGECONFIG:remove:am62xx = "kms" +#PACKAGECONFIG:remove:am62xx = "vulkan" +#PACKAGECONFIG:remove:am62xx = "glib xcb" # they don't apply without changes, drop them for now -SRC_URI:remove = " \ - file://0002-deform-disable-opengl-button.patch \ - \ - file://0001-deform-Fix-how-controls-are-shown.patch \ - file://0001-qtbase-plugins-platforms-eglfs_kms-fix-compiler-erro.patch \ - file://0001-eglfs-Force-888-format-only-on-env-flag.patch \ -" +#SRC_URI:remove = " \ +# file://0002-deform-disable-opengl-button.patch \ +# \ +# file://0001-deform-Fix-how-controls-are-shown.patch \ +# file://0001-qtbase-plugins-platforms-eglfs_kms-fix-compiler-erro.patch \ +# file://0001-eglfs-Force-888-format-only-on-env-flag.patch \ +#" # ## compile Reference-Multimedia image ### $ MACHINE="verdin-am62" bitbake bitbake tdx-reference-multimedia-image # ## compile SDK ### $ MACHINE="verdin-am62" bitbake tdx-reference-multimedia-image -c populate_sdk ------------------------------- b ). Yocto Linux image 部署 参考 这里 通过 Toradex Easy installer 将上面编译好的 image 更新部署到模块 c ). 显示配置 . / HDMI 默认即可正常显示,如果 实际测试是连接其他接口如 LVDS 等显示设备,可以参考这里调整 Device-Tree Overlay 设置来使能相关的显示设备。 . / 输入设备如 USB HID 电容式触摸或者 USB 鼠标通常无需额外设置,插上即可使用。 4 ). Q twayland compositor 编译部署 a ). Qt Qtwayland 组件可以非常方便的使用 C++/ QML 语言开发定制化的 W ayland compositor ,详细说明请见 这里 ,也提供了很多 sample project 供参考 b ). 本文测试所使用的 Q twayland compositor 来自于 Qt 官方的 Pure-qml sample 示例 ,源代码请参考 这里 ,这是一个 基于 QML 开发的并且支持 Qt VirtualKeyboard plugin 的简单 Q twayland compositor c ). 参考 这里 说明使用上面章节 3 .a 编译出的 SDK 文件配置 Q tcreator IDE 工具 交叉编译环境, 然后 下载 Pure-qml 工程源代码后通过 Qtcreator IDE 进行 交叉 编译,生成 pure-qml 可执行二进制文件上传到 Verdin AM62 Linux 系统中 d ). 使用编译好的 pure-qml Q twayland compositor 替换系统默认的 W eston compositor . / 创建 pure-qml .sh 执行脚本文件 ------------------------------- # copy pure-qml binary to /usr/bin $ cp pure-qml /usr/bin/ # create pure-qml .sh script , detailed content in below $ vi /usr/bin/ pure-qml .sh # add executable permission $ chmod +x pure-qml .sh ------------------------------- ./ pure-qml .sh – 由于系统 DRM 挂载显示设备 在启动过程中,其对应的 card 号码可能会变化, 因此脚本前面先对 “ kms .conf” 文件里面的设置和系统启动后的设备 card0 或者 card1 进行 匹配修改 , 然 后再启动 c ompositor 。 ------------------------------- #!/bin/sh set -e # modify kms.conf if seetings is not consistent with system drm card device name if ;then sed -i '2 s/card1/card0/' /etc/qt5/eglfs_kms_cfg.json fi if ;then sed -i '2 s/card0/card1/' /etc/qt5/eglfs_kms_cfg.json fi # execute qtwayland compositor /usr/bin/pure-qml & ------------------------------- . / 创建 Qtwayland systemd service 文件 , 参考 这里 说明, Qt VirtualKeyboard 基于 Wayland Compositor 使用时候,需要在 Compositor 侧配置 “QT_IM_MODULE” 环境变量,而不是应用侧。 ------------------------------- $ vi /lib/systemd/system/qtwayland.service ------ # This is a system unit for launching QtWayland Description=Qt Wayland, a Wayland compositor, as a system service RequiresMountsFor=/run # Make sure we are started after logins are permitted. Requires=systemd-user-sessions.service After=systemd-user-sessions.service After=plymouth-quit-wait.service Before=graphical.target Environment="QT_QPA_EGLFS_KMS_CONFIG=/etc/qt5/eglfs_kms_cfg.json" Environment="QT_QPA_EGLFS_INTEGRATION=eglfs_kms" Environment="QT_QPA_PLATFORM=eglfs" Environment="QT_QPA_EGLFS_KMS_ATOMIC=1" Environment="QT_IM_MODULE=qtvirtualkeyboard" ExecStart=/usr/bin/pure-qml.sh User=root Group=root PAMName=login StandardOutput=journal StandardError=journal WantedBy=graphical.target ------ ------------------------------- e ). 测试 Q twayland compositor ------------------------------- # ## disable default Weston compositor and Q t demo app ### $ systemctl disable weston.service $ systemctl disable weston.socket $ systemctl disable wayland-app-launch ### enable Qt wayland compositor ### $ systemctl enable qtwayland $ reboot ------------------------------- 重启后,可以看到 如下 Qt Compositor pure-qml 显示结果 5 ). Qt VirtualKeyboard Example 应用测试 a ). 分别使用一个 Qt Widget 应用和一个 Qt Quick 应用进行测试 . / Qt Widget 应用 – Line Edits Example ,详细说明请参考 这里 ,源码从 这里 下载, 将编译好的可执行 binary “ lineedits ” 上传到 Verdin AM62 Linux /home/root 目录 . / Qt Quick 应用 – Qt VirtualKeyboard Basic Example ,详细说明请参考 这里 , 源码从这里下载,如上面 4.d 章节所提到的,需要如下修改 main.cpp 将环境变量取消导出,然后 将编译好的可执行 binary “ basic ” 上传到 Verdin AM62 Linux /home/root 目录 ------------------------------- ... int main(int argc, char *argv ; do sleep 0.1; done sleep 1 # run basic or lineedits app /home/root/basic -platform wayland & # /home/root/lineedits -platform wayland & ------------------------------- c). 创建开机自启动 systemd service 文件 ------------------------------- $ vi /lib/systemd/system/qtwayland-app-launch.service Description=Start a Qt wayland application After=qtwayland.service Requires=qtwayland.service Restart=on-failure Type=forking ExecStart=/home/root/qtwayland-app-launch.sh RestartSec=1 WantedBy=graphical.target ------------------------------- d ). enable service 并测试 ------------------------------- $ systemctl enable qtwayland-app-launch $ reboot ------------------------------- e). 重启后 分别启动 basic 和 lineedits 应用 效果如下 , USB HID 电容触摸和鼠标都可以正常操作虚拟键盘输入 6 ). 总结 本文 基于 Ti AM62 处理器演示了 QtWayland compositor 的部署以及 Qt VirtualKeyboard 应用的测试。