Blog:
i.MXでQtWaylandの実現の案内

Wednesday, April 10, 2024
Qt
Qt

このブログ投稿では、Qt アプリケーションで EGL / KMS を使用して次のことを行う方法を示します:

  • Wayland で正しく動作しない Qt ライブラリを使用すること (例: QtVirtualKeyboard)
  • 2つ以上の画面を使用すること(マルチスクリーン)

まず最初にBSP6でQTの開発を行う方法は弊社のBSP5用のマニュアルをご参照ください。
大雑把には方法は同じです。
BSP5用のマニュアルではUbuntu20.04LTSを使用していますが弊社はBSP6ではUbuntu22.04LTSを使用しています。

local.confの編集内容:

これはNXPのライセンス規約に同意することを意味します。
(マニュアルの手順でも出てきます。)
ACCEPT_FSL_EULA = "1"

qtにeglfsとkmsのオプションをつけます。
PACKAGECONFIG_append_pn-qtbase = " sql-sqlite eglfs kms"
(sql-sqliteはおそらく関係ありません。)

これもgstreamerを使うためですのでおそらく不要です。
PACKAGECONFIG_append_pn-qtmultimedia = " gstreamer"

上記のサイトにはないですが下記も追加します。
QTCreatorを使うときにrsyncコマンドが必要です。
IMAGE_INSTALL:append = " rsync"

QTVirtualkeyboardをつか場合下記のファイルに依存関係を追加します。
layers/meta-qt5/recipes-qt/packagegroups/packagegroup-qt5-toolchain-target.bb

RDEPENDS:${PN} += "qtvirtualkeyboard qtvirtualkeyboard-dev qtvirtualkeyboard-mkspecs"

上記の修正でOSイメージをbitbakeして書き込みます。(マニュアル参照)
SDKを出力してインストールします。(マニュアル参照)

モジュール起動後デモアプリとwestonを無効化します。

systemctl disable wayland-app-launch
systemctl disable weston
systemctl disable weston.socket
/etc/kms.confを作ります。

LVDSとHDMIの2画面であれば下記のような内容です。

kms.conf
{
"device": "/dev/dri/card1",
"hwcursor": false,
"pbuffers": false,
"outputs": [
{ "name": "HDMI-A-1",
"mode": "800x640",
"virtualIndex": 0, "primary": true
},
{ "name": "LVDS1",
"mode": "1280x800",
"virtualIndex": 1
}
]
}

/boot/overlays.txtを修正してLVDS用にします。

#fdt_overlays=verdin-imx8mp_hdmi_overlay.dtbo verdin-imx8mp_dsi-to-hdmi_overlay.dtbo verdin-imx8mp_spidev_overlay.dtbo
fdt_overlays=verdin-imx8mp_hdmi_overlay.dtbo verdin-imx8mp_spidev_overlay.dtbo verdin-imx8mp_dsi-to-lvds_panel-cap-touch-10inch-lvds_overlay.dtbo

qtwayland_compositor側とqtwayland_client側で別の環境変数を使う必要があるため
それぞれシェルを作ります。(下記の内容は不要なものもあると思いますが弊社が動作確認した設定です。)

qtwayland_compositor.sh
#!/bin/bash

#export WAYLAND_DEBUG=1

#export QT_WAYLAND_CLIENT_BUFFER_INTEGRATION=wayland-egl

export QT_QPA_EGLFS_KMS_CONFIG=/etc/kms.conf
export QT_QPA_EGLFS_INTEGRATION=eglfs_kms
export QT_QPA_PLATFORM=eglfs
export QT_QPA_EGLFS_KMS_ATOMIC=1
export QT_QPA_EGLFS_NO_LIBINPUT=1

export QT_IM_MODULE=qtvirtualkeyboard
export XDG_RUNTIME_DIR=/run/user/0
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/dbus_session_socket
export WAYLAND_DISPLAY=/run/wayland-0
export QT_QPA_PLATFORM=eglfs
export FB_MULTI_BUFFER=2
export QT_QPA_EGLFS_FORCEVSYNC=1
export QT_QPA_EGLFS_FORCE888=1
export QT_QPA_EGLFS_KMS_ATOMIC=1
./dual-screen <Qt アプリケーション>
qtwayland_client.sh
#!/bin/bash

#export WAYLAND_DEBUG=1
export XDG_RUNTIME_DIR=/run/user/0
export WAYLAND_DISPLAY=/run/user/0/wayland-0
export QT_QPA_PLATFORM=wayland-egl

#export QT_WAYLAND_SHELL_INTEGRATION=xdg-shell-v5
qtwayland_compositor.shを実行してからqtwayland_client.shを実行します。
Authors:
桐川篤史
・岡本無線電機
ガルシアアルバロ・Toradex(トラデックス)
Share this on:

Leave a comment

Please login to leave a comment!
Have a Question?