Seeed reTerminal 用の Yocto boot2qt (Qt 6)

このガイドでは、Yocto プロジェクトと boot2qt を使用して、Seeed reTerminal 用の Linux ディストリビューションを構築します。 Qt が提供するスタック。この boot2qt イメージは内部 eMMC に書き込むことができ、起動時に Seeed reTerminal は Qt Creator (Qt IDE) とうまく統合されたソフトウェア スタックを実行します。たとえば、デバイスへのワンクリック デプロイメントです。独自の Qt アプリケーションを reTerminal のフル スクリーンで実行すると、すぐに起動します。このガイドでは Qt 6.2 について説明します。このガイドでは、デフォルトのスタートアップ アプリを独自のアプリに変更する方法、Qt Creator の統合、および Qt アプリのローテーション (ウィジェットと QML の両方) (後者は Wayland と Weston 経由) についても説明します。

Seeed が提供するガイドとこのガイドの主な違いは、このガイドが Qt 独自の boot2qt Yocto スタックを使用し、Qt 6 を実行することです。 Seeedguide は独自のイメージと Qt 5 をカバーしています。ローテーションを助けます。

Seeed が提供するデフォルトの Debian イメージ上で独自の Yocto ディストリビューションを実行すると、再現可能であり、完全に制御できるという利点があります。 boot2qt の使用 Yocto スタックにより、Yocto のセットアップ プロセスがより簡単かつ迅速になります。独自のイメージを使用すると、デバイスで他のアプリケーションが実行されないため、すべてのリソースをアプリで使用できます。 (イメージでビルドしない限り、デスクトップ環境やその他のソフトウェアはありません。) これにより、将来、例として 5 年後でもイメージとソフトウェアをビルドできることが保証されます。すべてのソースがローカルにあります。

完全な開示:Seeed から連絡があり、いくつかの記事と引き換えにこの reTerminal が送られてきました。これが最初の記事です。金銭の支払いは関係なく、Seeed は公開前にこの記事をレビューしていません。公式サポートについては、Seeed wiki にアクセスしてください。

Seeed は実際に 2 台の reTerminal ユニットを送ってくれました。最初のものには、ブートモードスイッチが動かなくなっていました。それは動かず、後で壊れました。イメージをフラッシュするには、ブート モード スイッチが必要です。これは、この Yocto ガイドにとって非常に重要です。連絡したところ、交換品がすぐに送られてきました。したがって、ブート モード スイッチには注意してください。ピンセットを使って切り替えますが、特に注意が必要です。

記事の変更ログ:

  • 2022 年 4 月 4 日:シェル コマンドのパスを修正
  • 2022 年 4 月 4 日:スラッシュの欠落など、一部のレシピ ファイルの構文を修正しました
  • 2022 年 4 月 4 日:seeed-linux-dtoverlays に関する注記を追加 コミット時 7c846e23de9346d318fbdc8ac92dcc72b90fb6ce
  • 上記の問題と修正について Ryan Bryngelson に感謝します!

reTerminal とは

reTerminal は、将来に備えたヒューマン マシン インターフェース (HMI) として販売されています。 reTerminal は、1.5 GHz で動作するクアッドコア ARM Cortex-A72 CPU である Raspberry Pi Compute Module 4 (cm4) と、解像度 1280x720 の 5 インチ IPS 容量性マルチタッチ スクリーンを搭載しています。 4 GB の RAM と 32 GB の eMMC ストレージが組み込まれています (拡張不可)。デュアルバンド 2.4GHz/5GHz Wi-Fi と Bluetooth 5.0 BLE によるワイヤレス接続を備えています。

reTerminal には高速拡張インターフェイスがあり、多くの I/O ポートとコネクタが公開されています。このデバイスには、安全なハードウェア ベースのキー ストレージを備えた暗号化コプロセッサなどのセキュリティ機能があります。また、加速度計、光センサー、リアルタイム クロックなどのモジュールも内蔵しています。reTerminal には、ネットワーク接続を高速化するためのギガビット イーサネット ポートと、デュアル USB 2.0 Type-A ポートがあります。 40 ピンの Raspberry Pi 互換 GPIO ヘッダーにより、帽子のプロジェクトや既存のプロジェクトのほとんどまたはすべてを reTerminal で動作させることができます。

reTerminal はこちらで購入できます。現在の価格は 195 米ドルです。 これには Compute Module 4 が含まれます。

reTerminal は、マルチタッチ スクリーンと便利なケースを備えたコンピュート モジュール 4 用のキャリア ボードであると率直に言えます。私の意見では、それだけではありません。

この記事を書いている時点では、内蔵バッテリーがありません。 USB ケーブルを介して、または正しい GPIO ピンに 5V とアースを供給することにより、電源を供給します。

小さなカバー パッドの後ろには高速インターフェイスがあり、上の図では Industrial High Speed Interface とラベル付けされています。 . FAQ には次のように書かれています:

したがって、ハードウェアに関して言えば、reTerminal は堅実で将来性があります。購入すると、Compute Module と Raspbian がプリロードされており、ドライバとデモ アプリケーションが含まれているので、すぐに使い始めることができます。面倒なサプライ チェーンの問題はありません。中国からの荷物の発送を少し待つだけです。

Yocto とは

Yoctoproject に慣れていない場合は、ここで簡単に簡略化して説明します。 、すべての用語の概要。

reTerminal に関する Yocto に関する独自の FAQ を参照してください .その FAQ は基本をカバーし、Yocto を使用するためのヒントとコツを含んでいます。さまざまな部分について説明しているため、そのガイドも読むことをお勧めします。私のガイドは、reTerminal 上の (ブート 2) Qt に合わせて調整されています。

Yocto は、ターゲット ボードのカスタム イメージの作成に役立つビルド フレームワークとメタデータを提供するオープン ソース プロジェクトです。 Yocto は、いわゆる (メタ) レイヤーとレシピを使用します。レシピは.bb (bitbake の場合) ビルド命令とレイヤーを含むファイルは、特定のレシピ、クラス、および構成ファイルのコレクションです。 meta-raspberry という名前のレイヤーを持つことができます (慣例により、すべてのレイヤーは meta- で始まります ) には、Raspberry Pi にのみ適用可能なレシピがあります。

Yocto は、Linux ディストリビューションの構築を支援します。参照ディストリビューションの名前は poky です。 .主要なビルド ツールは、bitbake という名前の Python コマンド ライン ツールです。 .すべてのレシピを解析し、ソース コードを 1 つずつ収集してすべてのソフトウェアをコンパイルし、ボードのイメージにパッケージ化します。

Yocto は組み込みの Linux デバイスを対象としており、職場ではそれを使用して独自の Linux ディストリビューションを作成しています (boot2qt ではありません)。 ) をコーヒーマシンで実行します。多くの異なるボードがサポートされており、ほとんどのベンダーはいわゆるボードサポート パッケージ (bsp) を提供しています。多くの場合、これにはボード用のカーネルとドライバーが含まれています。 Raspberry Pi 用のボード サポート パッケージがあり、これを使用します。

boot2qt は、デスクトップなしで起動するシンプルな Linux システムを Qt アプリケーションに組み込む Yocto のレイヤー セットです。また、デスクトップ用のクロスコンパイル SDK をビルドします。これを Qt Creator で使用して、ターゲット デバイス用にアプリケーションをクロスコンパイルできます。多くの場合、開発対象のデバイスは、デスクトップ ワークステーションと同じ CPU アーキテクチャを備えていません。さらに、Qt Creator にも統合されているため、デバイス上でネットワーク経由でワンクリックでアプリケーションをデプロイして実行できます。

boot2qt yocto を作成するための一連のスクリプトも提供します。 セットアップは非常に簡単なので、このガイドに記載されているプロセスはデフォルトの yocto とは異なります 設定。 boot2qt専用です

要約すると、boot2qt 組み込み Linux デバイスと Qt スイートのツールとの統合を追加する yocto の上にレイヤーを提供し、手動の忙しい作業を行う時間を大幅に節約します。

開発ホスト Yocto のセットアップ

boot2qt をビルドするマシン 画像 (bitbake を実行するホスト ) ビルドを開始する前に、いくつかのパッケージが必要です。少なくとも 50 GB の空き容量が必要ですが、私のホストには 300 GB あります。すべてのパッケージをクロスコンパイルするには膨大な時間がかかるため、コアと RAM が多ければ多いほどよいでしょう。私のテスト ビルド マシンには 4 つのコアと 8 GB の RAM があり、イメージ全体のビルドには 2 日以上かかりました。職場には強力なサーバーがいくつかあり、ビルドには約 2 時間かかります。 Yocto はインクリメンタル ビルドをサポートしているため、1 つのレシピを変更した場合、その部分のみを再ビルドする必要があり、他のすべての部分を再ビルドする必要はありません。

私のビルド マシンは Debian 11 を実行していますが、Ubuntu 20.04 も動作することが知られています。最初に必要なパッケージをインストールします:

apt-get install gawk wget git diffstat unzip texinfo gcc build-essential
chrpath socat cpio python3 python3-pip python3-pexpect xz-utils
debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa
libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev python
git-lfs g++-multilib gcc-multilib libxkbcommon-dev
libxkbcommon-x11-dev libwayland-cursor++0 libwayland-cursor0

これらは Qt サイトが推奨するよりも少し多くのパッケージです。qbsp をビルドするときにビルドの問題がありました。 余分なパッケージのほとんどがここから来る層です。

Google レポ

次に repo が必要です 、Google による git 管理ツール。すべての追加情報をマニフェスト ファイルに入れることで、サブモジュールとさまざまなリポジトリの複雑さのほとんどを隠します。 apt を使用してインストールできます:

apt install repo

リポジトリにない場合は、手順を確認してください。インストール プロセスは、1 つの実行可能ファイルの単なるコピーです。

最初の boot2qt セットアップ

すべての yocto が存在するフォルダーを作成します。

mkdir b2qt
cd b2qt

repo を使用 Yocto プロジェクトと boot2qt のすべての git リポジトリを複製するツール すぐに。最初に正しい Qt バージョンの初期化:

# for Qt 6.2:
repo init -u git://code.qt.io/yocto/boot2qt-manifest -m v6.2.3.xml

次に、リポジトリを同期します:

repo sync

ビルドするボードを指定してから、ascript をソースする必要があります:

export MACHINE=raspberrypi4-64 && source ./setup-environment.sh 

この手順はログインごとに繰り返す必要があります .

raspberrypi-64 を指定していることに注意してください .これは、reTerminal が Raspberry Pi Compute Module 4 を使用しているためです。meta-raspberry layer は、通常の Pi 4 と Compute モジュールの両方にその名前を使用します。 Seeed の Yocto レイヤーには、3 日後 (執筆時点) から reTerminal 用の特定のボードがありますが、boot2qt はそれをサポートしていないため、このガイドでは、特定の要件をビルド イメージに移植します。

出力:

### Shell environment set up for builds. ###

You can now run 'bitbake <target>'

Common targets are:
b2qt-embedded-qt6-image
meta-toolchain-b2qt-embedded-qt6-sdk

QBSP target is:
meta-b2qt-embedded-qbsp

For creating toolchain or QBSP for Windows, set environment variable before running bitbake:
SDKMACHINE=x86_64-mingw32

For more information about Boot to Qt, see https://doc.qt.io/QtForDeviceCreation/

build-raspberrypi4-64 という名前のフォルダーに移動する必要があります。 . repo の使用 ツールとこのスクリプトのソースにより、yocto の気の利いたフォルダー構造が作成されました:

  • build-raspberrypi4-64 :ボードのビルド ディレクトリ。setup-environment.sh をソースした後、このフォルダにいます。 ファイル。
  • sources :すべての bitbake を持っています レイヤーとレシピ
  • download :すべてのソース コードがダウンロードされるフォルダー (git リポジトリの tar.gz アーカイブ)

build-*conf があるディレクトリ フォルダーには、2 つの重要なファイルがあります。 bblayers.conflocal.conf . 1 つ目はビルドが使用するレイヤーを定義し、2 つ目はこの特定のビルドに固有の構成オプションを持っています。 reTerminal レイヤーを追加することから始めます。config ファイルについては後で説明します。

Seeed reTerminal レイヤーの追加

デバイス ツリー用の reTerminal レイヤーといくつかのドライバーが必要です。

cd ../sources
git clone -b main https://github.com/Seeed-Studio/meta-seeed-reterminal.git

このガイドを commit 7c846e23de9346d318fbdc8ac92dcc72b90fb6ce でテストしました そしてコミット 57d1b68d73e625fe6a4cb14372a0cb7c42bae9c5 付き . seeed-linux-dtoverlays の場合 パッケージは以下のようなリンカ エラーを返します:

| aarch64-poky-linux-ld: internal error in set_address, at ../../gold/output.h:322

次に、 ld-is-gold を削除します boot2qt のオプション distro.conf 後でローカル構成で行うように、ファイルを有効にします:

DISTRO_FEATURES_remove = "ld-is-gold"

上流のバグレポートを作成しました。 commit 7c846e23de9346d318fbdc8ac92dcc72b90fb6ce を使用する場合 、エラーは表示されません。

boot2qt の Yocto バージョンを追加する必要があります レイヤー構成に使用します。次のファイルを編集します:

vi meta-seeed-reterminal/conf/layer.conf

hardknott を追加 LAYERSERIES_COMPAT に 行:

LAYERSERIES_COMPAT_meta-reterminal = "honister hardknott"

保存して閉じます。ビルド フォルダーに移動します。

cd ../build-raspberrypi4-64

レイヤーを構成に追加します:

bitbake-layers add-layer ../sources/meta-seeed-reterminal

b2qt イメージ オーバーライド用に独自のレイヤーを作成する

デフォルトの b2qt-embedded-qt6-image のいくつかの部分をオーバーライドするには 、独自のレイヤーを作成する必要があります。このレイヤーには、後でさらにカスタマイズが含まれますが、最初のビルドでは、イメージの一部のみをオーバーライドします。元のファイルの内容を上書きしないのはなぜですか? .bbappend を使用する ファイルを使用すると、変更を分けて保持できるため、特定の変更が何であるかを後で知ることができます。また、アップストリームの変更を簡単に適用できます。

b2qt にレイヤー用のフォルダーをいくつか作成することから始めます。 フォルダ:

mkdir -p sources/meta-raymii/conf/
mkdir -p sources/meta-raymii/recipes-qt/images/

次のファイルを編集します:

sources/meta-raymii/conf/layer.conf

以下のコンテンツを配置します:

BBPATH .= ":${LAYERDIR}"

BBFILES += "${LAYERDIR}/recipes*/*/*.bb \
            ${LAYERDIR}/recipes*/*/*.bbappend \
            "
BBFILE_COLLECTIONS += "raymii"
BBFILE_PATTERN_raymii := "^${LAYERDIR}/"
BBFILE_PRIORITY_raymii = "1"

LAYERSERIES_COMPAT_raymii = "thud zeus dunfell gatesgarth hardknott"

reTerminal の Yocto ビルドにレイヤーを追加します。

cd build-raspberrypi4-64
bitbake-layers add-layer ../sources/meta-raymii

次に、デフォルトの boot2qt への変更に進みます 画像。次のファイルは .bbappend です ファイルの名前、パス、バージョンが同じ場合、ご想像のとおり、元のファイルに追加されます。この場合、デフォルトの b2qt-embedded-qt6-image を拡張します myapp を含む画像 インストールのレシピ。このファイルを編集:

vi sources/meta-raymii/recipes-qt/images/b2qt-embedded-qt6-image.bbappend

以下を追加してください:

SUMMARY = "reTerminal changes for Qt image"

SPLASH = "psplash-raspberrypi"

IMAGE_FEATURES_append = " \
        splash \
        "

IMAGE_INSTALL_append = " \
        kernel-modules \
        evtest \
        iperf3 \
        i2c-tools \
        util-linux \
        "

ご覧のとおり、変更は reTerminal イメージに関連しています。後でアプリケーションをここに追加しますが、今のところ、これは起動可能なイメージを作成するための必須要素にすぎません。

local.conf の微調整 リターミナル用

ローカル構成ファイルにいくつかの変数を追加する必要があります (conf/local.conf )。これらはすべて、webengine の削除を除いて、reTerminal ハードウェアに関係しています。 . Qt アプリが webengine を使用している場合はそのままにし、そうでない場合は削除します。それを含めないことで、コンパイルにかかる時間を大幅に節約でき、イメージが小さくなります。

reTerminal 関連の機能は公式レイヤーから取得され、boot2qt 用に調整されています .ここでバックポートを確認できます。これは、この記事を書いている 3 日前に reTerminal Yocto レイヤーに最近追加されたものです。

local.conf の違い そして b2qt-embedded-qt6-image.bbappend それは local.conf です このデバイス専用です。私の場合、 raspberrypi4 も持っています 計算モジュール用の machinebuild フォルダー 4. 独自の distro.conf を作成することもできます または、マシン固有のオーバーライドを使用して新しいデバイスを定義しますが、この記事では local.conf

次のファイルを編集します:

# in the folder: build-raspberrypi4-64   
vi conf/local.conf

以下を追加してください:

RPI_KERNEL_DEVICETREE_OVERLAYS_append = " overlays/reTerminal.dtbo overlays/i2c3.dtbo overlays/vc4-kms-v3d-pi4.dtbo"
ENABLE_UART = "1"
ENABLE_I2C = "1"

KERNEL_MODULE_AUTOLOAD_rpi += "i2c-dev"

MACHINE_EXTRA_RRECOMMENDS += "\
    seeed-linux-dtoverlays \
"

VC4DTBO ?= "vc4-kms-v3d"

PACKAGECONFIG_append_pn-qtbase = " eglfs "

DISTRO_FEATURES_remove = "webengine ld-is-gold"

PREFERRED_VERSION_linux-raspberrypi ?= "5.10.%" 

boot2qt の初期ビルドの準備が整いました . screen を開始することをお勧めします または tmux ビルドには時間がかかるため、セッションを終了します。前述のハードウェアでの最初のビルドには 2 日以上かかりました。

commit 7c846e23de9346d318fbdc8ac92dcc72b90fb6ce を使用する場合 MACHINE_EXTRA_RRECOMMENDS += "seeed-linux-dtoverlays" を追加する必要はありません .デバイス ツリー オーバーレイはそのコミットのパッチであり、後で git サブモジュールになりました。

画像のビットベイク

boot2qt で reTerminal ハードウェア レイヤーのセットアップが完了したら、初期ビルドを実行できます。

source であることを確認してください スクリプトを -ed し、正しいフォルダーにあります:

cd ~/b2qt
export MACHINE=raspberrypi4-64 && source ./setup-environment.sh 

イメージのビルドを開始します:

bitbake b2qt-embedded-qt6-image

出力が異なります。最初にすべてのレイヤーと構成が一覧表示され、下部に現在のタスクが表示されます。出力例:

WARNING: Host distribution "debian-11" has not been validated with this version of the build system; you may possibly experience unexpected failures. It is recommended that you use a tested distribution.
Loading cache: 100% |################################################################################################| Time: 0:00:00
Loaded 4374 entries from dependency cache.
Parsing recipes: 100% |##############################################################################################| Time: 0:00:00
Parsing of 2813 .bb files complete (2809 cached, 4 parsed). 4377 targets, 611 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "1.50.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "aarch64-poky-linux"
MACHINE              = "raspberrypi4-64"
DISTRO               = "b2qt"
DISTRO_VERSION       = "3.3.4"
TUNE_FEATURES        = "aarch64 armv8a crc crypto cortexa72"
TARGET_FPU           = ""
SDKMACHINE           = "x86_64"
meta
meta-poky            = "HEAD:c40ac16d79026169639f47be76a3f7b9d8b5178e"
meta-raspberrypi     = "HEAD:b4ec97e4eb8e36efd1f7e2f8ae020a9e55cfc239"
meta-oe
meta-python
meta-networking
meta-initramfs
meta-multimedia      = "HEAD:f72a73b42fa740130b388ba8555cdbefdee8d37d"
meta-python2         = "HEAD:810d6d842f103eb59f18b06426106462b15de7e2"
meta-boot2qt
meta-boot2qt-distro  = "HEAD:e59a2e20697e0afc2a0b068835cd90e102dec589"
meta-mingw           = "HEAD:422b96cb2b6116442be1f40dfb5bd77447d1219e"
meta-qt6             = "HEAD:eb3719266fc03b96d5056980b135b371f31811f4"
meta-seeed-reterminal = "main:57d1b68d73e625fe6a4cb14372a0cb7c42bae9c5"
meta-raymii          = "master:84123f093be34a9a4d73de545132cffc3e210c19"

Initialising tasks: 100% |###########################################################################################| Time: 0:00:10
Sstate summary: Wanted 1706 Local 49 Network 0 Missed 1657 Current 1441 (2% match, 47% complete)
Removing 375 stale sstate objects for arch raspberrypi4_64: 100% |#################################################| Time: 0:00:02
Removing 6 stale sstate objects for arch allarch: 100% |###########################################################| Time: 0:00:00
Removing 956 stale sstate objects for arch cortexa72: 100% |#######################################################| Time: 0:00:02
NOTE: Executing Tasks
Currently  8 running tasks (2488 of 9043)  27% |######################                                                           |
0: libunistring-0.9.10-r0 do_configure - 27s (pid 1946515)
1: libpciaccess-0.16-r0 do_configure - 22s (pid 1949317)
2: icu-68.2-r0 do_compile - 15s (pid 1959678)
3: libpam-1.5.1-r0 do_compile - 15s (pid 1959794)
4: tslib-1.22-r0 do_configure - 13s (pid 1961800)
5: nettle-3.7.3-r0 do_configure - 10s (pid 1963210)
6: libpcre2-10.36-r0 do_configure - 8s (pid 1963889)
7: libogg-1.3.4-r0 do_configure - 5s (pid 1964770)

今は何か別のことをして、数日後に戻ってくる絶好の機会です。強力なマシンを使用している場合、ビルドは高速になりますが、それでもしばらく時間がかかります.

ビルドが完了すると、イメージは次のフォルダにあります:

build-raspberrypi4-64/tmp/deploy/images/raspberrypi4-64/

画像は bmap です ファイル。 bmap は、フラッシュが高速で、フラッシュ中にデータを検証する特別な形式であり、最初は Intel が Tizenproject のために作成しました。 Ubuntu を実行している場合は、bmap-tools をインストールする必要があります。 パッケージ。

画像のフラッシュ

reTerminal には eMMC を備えた Compute Module 4 があるため、SD カード スロットは機能しません。 Raspberry Pi が提供するツールを使用して、イメージを eMMC にフラッシュする必要があります。このツールの名前は rpiboot です 、自分で構築する必要があります。依存関係をインストールすることから始めます:

sudo apt install git libusb-1.0-0-dev

次に、リポジトリをクローンします

git clone --depth=1 https://github.com/raspberrypi/usbboot
cd usbboot

ビルド プロセスを開始します。

make

上記の手順は 1 回だけです。これで rpiboot が手に入りました このフォルダ内のツール。画像をフラッシュするたびに、以下のプロセスを繰り返す必要があります。

ブート モード スイッチを切り替えます。私の最初のユニットには起動モードスイッチが詰まっていたので、十分に注意してください。ピンセットを使って小さなスイッチを慎重に切り替えます。

reTerminal をいじっていて、画像が絶えず点滅している間は、冷却装置やプラスチック カバーを元に戻さずに、デバイスを開いたままにしておくことをお勧めします。このようにして、ブート スイッチに簡単にアクセスできます。デバイスが少し熱くなりましたが、極端ではありませんでした。

USB C ケーブルを差し込み、rpiboot を実行します。 ルートとしてのユーティリティ:

$ sudo ./rpiboot 
RPIBOOT: build-date Feb 22 2022 version 20220208~181027 042cd145
Waiting for BCM2835/6/7/2711...
Loading embedded: bootcode4.bin
Sending bootcode.bin
Successful read 4 bytes 
Waiting for BCM2835/6/7/2711...
Loading embedded: bootcode4.bin
Second stage boot server
Loading embedded: start4.elf
File read: start4.elf
Second stage boot server done

フォルダをアンマウントしないと、イメージのフラッシュが失敗します:

sudo umount /dev/sda1; sudo umount /dev/sda2

bmaptool を使用して画像をフラッシュします :

cd TO_THE_YOCTO_IMAGE_FOLDER
# cd b2qt/build-raspberrypi4-64/tmp/deploy/images/raspberrypi4-64/


sudo bmaptool copy b2qt-embedded-qt6-image-raspberrypi4-64-20220316191856.rootfs.wic.bz2 --bmap b2qt-embedded-qt6-image-raspberrypi4-64-20220316191856.rootfs.wic.bmap /dev/sda

出力:

bmaptool: info: block map format version 2.0
bmaptool: info: 698368 blocks of size 4096 (2.7 GiB), mapped 367758 blocks (1.4 GiB or 52.7%)
bmaptool: info: copying image 'rootfs.wic.bz2' to block device '/dev/sda' using bmap file 'rootfs.wic.bmap'
bmaptool: info: 100% copied
bmaptool: info: synchronizing '/dev/sda'
bmaptool: info: copying time: 5m 6.5s, copying speed 4.7 MiB/sec

フラッシュにはしばらく時間がかかります。私の場合、デフォルトのイメージでは約 5 分かかります。イメージのファイル名はさまざまで、日付と時刻がそこにあります。起動モード スイッチを元に戻し (注意してください)、USB C 電源ケーブルを取り外して、もう一度差し込みます。

初回起動と簡単なまとめ

座ってリラックスし、独自の自家製イメージ ブートをお楽しみください。よくやった!

サンプル アプリを試してみてください。[詳細] をクリックして、少しスクロールできます。

アプリケーションがローテーションされていることに気付くかもしれません。実際には画面のデフォルトの向きは縦ですが、端末は横です。 FAQ では、Ubuntu と Debian についてこれに対処しています。これは、後で独自の Qt アプリを展開するときに修正します。この修正は、実行する Qt アプリの種類と、そのアプリのソース コードにアクセスできるかどうかによって異なります。

ネットワークケーブルと ssh を接続することもできます マシンに入力すると、IP アドレスが画面に表示されます。

すでに達成したことを要約するには:

  • Yocto をインストール
  • boot2qt をインストールしました スタック
  • 独自のレイヤーを作成して Yocto をカスタマイズ
  • reTerminal ハードウェア レイヤーを追加
  • 独自のイメージを構築
  • reTerminal にフラッシュしました。

Yocto に変更を加えると、変更された部分をやり直すだけで済むため、その後のビルドは高速になります。 Yoctoside で常に行う必要がある手順は次のとおりです。

  • cd b2qt/
  • export MACHINE=raspberrypi4-64 && source ./setup-environment.sh
  • (変更を加えてください)
  • bitbake b2qt-embedded-qt6-image

フラッシュ用の reTerminal 側:

  • boot mode switch を裏返す USB C ケーブルを差し込む
  • ./rpiboot 画像をフラッシュできるようにする
  • bmaptool copy b2qt-embedded-qt6-image-raspberrypi4-64-2022*.rootfs.wic.bz2 --bmap b2qt-embedded-qt6-image-raspberrypi4-64-2022*.rootfs.wic.bmap /dev/sda
  • ブート モード スイッチを元に戻す
  • 電源ケーブルを取り外し、再び差し込む

デバイスのセットアップが完了したので、すべての便利な機能を利用する時が来ましたboot2qt 最も重要なのは、Qt IDE、Qt Creator との統合です。迅速な開発とテストを可能にし、IDE 内からデバイスにデプロイして変更をテストできます。そのワークフローは、デバッグ、ブレークポイントなどを含め、非常に素晴らしく迅速です。

Qt SDK と Qt Creator の統合

通常の Pi Compute Module 4 の Yocto に関する他の記事では、Qt SDK をビルドして Qt Creator と統合するために必要なすべての手順を書き出しました。このプロセスは非常に長いため、ここでは複製せず、スクリーンショットでプロセス全体を説明している別のガイドを参照することにしました.

完全なガイドについては、その記事をご覧ください。変更されるのは、最初のコマンドが source になることだけです セットアップ ファイル、MACHINE をエクスポートしています 64 ビット バージョンの変数、次のように:

export MACHINE=raspberrypi4-64 && source ./setup-environment.sh 

次に、しばらく時間がかかる SDK をビルドします。

bitbake meta-toolchain-b2qt-embedded-qt6-sdk

私の他のガイドのすべての手順を完了すると、Qt Creator で構成された新しい Qt キットと、デプロイ先の新しいデバイスが必要になります。

独自のアプリをデフォルトにする

イメージが機能し、Qt 統合がセットアップされたので、Qt Creator を介してアプリを実行し、reTerminal にデプロイできるはずです。

その場合に限り、ガイドを続けてください。デフォルトの b2qt を置き換えます startupscreen 独自にコンパイルされたプログラムをアプリに追加します。

私の場合は、ドラッグ アンド ドロップのデモ アプリです。現在の IP アドレスも表示するように少し変更されています。これは、デバイスでデバッグするときに役立ちます。

このデモ アプリは、タッチ スクリーンも確認できるので便利です。ガイドの後半では、Qt ウィジェット アプリの場合、画面の回転とタッチ スクリーンの回転が一致している必要があります。そうでない場合、アプリは回転しますが、タッチは回転しません。その時、非常に奇妙なことが起こります。

アプリの新しいレシピを作成することから始めます。名前を myapp とします この例では:

    mkdir -p sources/meta-raymii/recipes-myapp/myapp/files/

files/ フォルダ内 作成したばかりのアプリのコンパイル済みバイナリを配置し、myapp という名前を付けます このガイドの例では。アーキテクチャが Pi 64 ビット ビルドと一致していることを確認してください:

$ file myapp
myapp: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.14.0, BuildID[sha1]=f2d876e1fe62e2eec1d5c0ead27a99c74a1f77ca, with debug_info, not stripped

次に、ファイル名が myapp_1.0.bb の実際のレシピ ファイルを作成します。 (files にはありません) フォルダー、ただし 1 つ上のフォルダー)。アンダースコアとバージョン番号は重要です。その番号を上げると、Yocto.Paste によって次の内容の新しいパッケージがビルドされます:

DESCRIPTION = "My Custom Qt App"
AUTHOR = "[email protected]"
LICENSE = "CLOSED"
PR = "r0"

SRC_URI =+ "file://myapp \
           "

DEPENDS += "qtbase qtdeclarative qtdeclarative-native"

do_install() {
    install -d ${D}/${bindir}
    install -m 0755 ${WORKDIR}/myapp ${D}/${bindir}/myapp

    lnr ${D}/${bindir}/myapp ${D}/${bindir}/b2qt

}

FILES_${PN} = "${bindir}/myapp \
               ${bindir}/b2qt \
              "

lnr で始まる行 b2qt のビルドを置き換えます startupscreen アプリ (シンボリック リンク) を独自のアプリケーションに追加します。 boot2qt 起動時に/usr/bin/b2qtの現在のシンボリックリンクを起動するsimplelauncherが同梱されています さらにいくつかのユーティリティがあります (開始/停止、シンボリック リンクの置換など)

新しい myapp を追加します カスタム イメージ .bbappend のレシピ ファイル:

vi sources/meta-raymii/recipes-qt/images/b2qt-embedded-qt6-image.bbappend

IMAGE_INSTALL_append を編集します セクションに myapp を追加します kernel-modules のすぐ上 行:

        myapp \

セクション全体は次のようになります:

IMAGE_INSTALL_append = " \
        myapp \
        kernel-modules \
        evtest \
        iperf3 \
        i2c-tools \
        util-linux \
        "

変更後、新しいイメージを作成します:

bitbake b2qt-embedded-qt6-image

bmaptool を使用するフラッシュ

デフォルトの b2qt に追加しているため 画像、および b2qt ランチャーがそれを期待している場合、イメージをビルドしてフラッシュした後に次回起動すると、独自のアプリが起動するはずです。

これは、起動後のカスタム アプリの写真ですが、まだ正しく回転されていません:

アプリの新しいバージョンをアップロードする場合は、myapp を置き換えます files のバイナリ フォルダを開き、PR = "r0" をインクリメントします r1 までの行 .次に、新しいイメージを bitbakea してフラッシュします。リリースごとにすすぎ、繰り返します。

新しいバージョンを試してみたいだけなら、bitbake myapp もできます の場合、新しいイメージなしでアプリをビルドするだけです。新しい IPK があります tmp/deploy/ipk のパッケージ フォルダ:

$ file tmp/deploy/ipk/cortexa72/myapp_1.0-r2_cortexa72.ipk
tmp/deploy/ipk/cortexa72/myapp_1.0-r2_cortexa72.ipk: Debian binary package (format 2.0), with control.tar.gz, data compression xz

scp このファイルをデバイスに転送し、パッケージ マネージャー opkg を使用してインストールします。 :

opkg install myapp_1.0-r2_cortexa72.ipk

次に、startupscreen を再起動または再起動します 新しいアプリをロードするサービス。

ただし、アプリの新しいビルドをテストするだけの場合は、以前にセットアップした組み込みの Qt クリエーター統合を使用してください。リモート デバッグを含め、Qt Creator から直接、より高速に動作します。

b2qt でのアプリのローテーション

次のセクションでは、回転の側面について説明します。 Qt Widgets と Qt QML アプリでは異なり、私の意見では、大きな混乱です。 FAQ はローテーションを扱っており、ローテーションを扱っている JapaneseSeeed ブログを見つけましたが、X11 についてはここまでです。 ディスプレイサーバー。

boot2qt eglfs を使用 アプリを直接実行します。 EGLFS は、X11 のような実際のウィンドウ システムなしで、EGL および OpenGL ES 2.0 上で Qt アプリケーションを実行するためのプラットフォーム プラグインです。 または Wayland .

eglfs の使用 、環境変数を設定してアプリケーションを回転させることができますが、それは Qt Widgets アプリがある場合にのみ機能します。 QML アプリの場合、transform: Rotation {} を追加する必要があります プログラムに追加するか、weston のようなディスプレイ サーバーを実行します。 wayland で 回転を処理します。 Qt ウィジェットから始めて、次のセクションですべてのオプションについて説明します。

Qt ウィジェットのローテーション

最も簡単なオプションは Qt ウィジェット アプリケーション用です。回転用とタッチスクリーン回転用の 2 つの環境変数を定義できます。これですべてです。

QT_QPA_EGLFS_ROTATION=-90
QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event0:rotate=270

-90 を使用する理由 1つは 270 を使用します ? 270 を使おうとしたとき -90 の代わりに 、起動時にアプリでエラーが発生しました:Invalid rotation 270 specified in QT_QPA_EGLFS_ROTATION . QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS を試してみました 、しかし、それはタッチスクリーンの回転には機能しませんでした.

では、これを Yocto にどのように適用しますか? /etc/default/qt にデフォルトの qt 環境ファイルがあります Yocto ビルドでオーバーライドする必要があります。まず、オーバーライド .bbappend を格納するフォルダーを作成します。 常駐します:

mkdir -p sources/meta-raymii/recipes-qt/boot2qt-addons/default-qt-envs/

boot2qt からデフォルトの環境ファイルをコピーします。 そのフォルダーへのレイヤー:

cp sources/meta-boot2qt/meta-boot2qt/recipes-qt/boot2qt-addons/default-qt-envs/defaults sources/meta-raymii/recipes-qt/boot2qt-addons/default-qt-envs/

defaults を編集します ファイル:

vim sources/meta-raymii/recipes-qt/boot2qt-addons/default-qt-envs/defaults

既存の行の下に 2 行を追加します:

QT_QPA_EGLFS_ROTATION=-90
QT_QPA_GENERIC_PLUGINS=evdevtouch:/dev/input/event0:rotate=270    

私の場合、ユーザーがプログラム可能なキーが表示されないため、タッチスクリーンは /dev/input/event0 です . event1かもしれません ですが、evtest を使用して確認できます コマンド:

root@b2qt-raspberrypi4-64:~# evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:      seeed-tp
/dev/input/event1:      vc4
/dev/input/event2:      vc4
Select the device event number [0-2]: 

seeed-tp はタッチスクリーンです (tp はタッチパネルの略です)。

.bbappend を作成します デフォルトのレシピを上書きするファイル:

vim sources/meta-raymii/recipes-qt/boot2qt-addons/default-qt-envs.bbappend

以下を追加してください:

FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

この行は、独自のレイヤー内のフォルダーをパッケージに追加するため、元のフォルダーだけでなくそのフォルダー内のファイルも検索します。新しいフォルダが最初にチェックされます。 Yocto のマニュアルでは、この変数と := を使用する理由について説明しています。 は重要。

.bbappend を確認できます 次のコマンドを使用して使用されます:

bitbake-layers show-appends default-qt-envs

出力:

=== Matched appended recipes ===
default-qt-envs.bb:
  /home/remy/b2qt/sources/meta-raymii/recipes-qt/boot2qt-addons/default-qt-envs.bbappend
  /home/remy/b2qt/sources/meta-boot2qt/meta-boot2qt-distro/dynamic-layers/raspberrypi/recipes-qt/boot2qt-addons/default-qt-envs.bbappend

bitbake 画像をフラッシュして、Qt ウィジェット アプリを正しく回転させる必要があります。これは、正しく回転されていない例の Qt ウィジェット コントロールのデモ アプリの図です:

そして、環境変数が設定され、期待どおりにローテーションされたアプリは次のとおりです。

Qt QML ローテーション

QML アプリケーションの場合、回転は少し難しくなります。ソース コードを変更するか、wayland を使用する必要があります。 と weston 、回転を処理するディスプレイマネージャーとサーバー。後者の解決策は、アプリケーションのソース コードを変更できない場合のみです。

QML を変更できる場合 ソースコードに Rotation を追加 変換:

transform: Rotation {
    angle: 270 
    origin.x: parent.width / 2
    origin.y: parent.width / 2
}

この場合、回転はルート要素にあると想定しています。 Window ではありません 、しかし Loader または StackLayout 、または Rectangle ウィンドウで、ルート要素が何であれ。

環境を変更する必要はありません。上記のようにアプリケーションの新しいバージョンをアップロードするだけです。

ウェストンとウェイランド

ソース コードを変更できない場合は、ディスプレイ マネージャーをインストールする必要があります。 X11 ではなく、Wayland と Weston を使用しています . Qt のドキュメントには、X11 ではない理由を説明する記事があります。重要な部分を要約した引用を以下に示します:

Qt には Wayland Compositor もありますが、これは使用しません。 myapp を実行します Weston のクライアント アプリケーションとしてのプログラム . Weston はリファレンス コンポジターであり、X11 のウィンドウ マネージャーのようなものです。なぜウェストン? boot2qt に同梱されています Yocto スタックで、1 つのプログラムを装飾やパネルなしでフルスクリーンで実行できます (kiosk を使用) プラグイン)

現在、Weston バージョン 9 です。バージョン 10 では、プログラムの自動起動がサポートされる予定ですが、今のところ、systemd を使用して自分で行う必要があります。 サービス。

このガイドで何度か行ったように、.bbappend を作成します。 ファイルを変更して、デフォルトのレシピを上書きします。フォルダ構造を作成することから始めます:

mkdir -p sources/meta-raymii/recipes-graphics/wayland/weston-init/

そのフォルダーに、weston.ini という名前のファイルを作成します。 そして以下を入れてください:

# configuration file for Weston

[core]
shell=kiosk-shell.so
require-input=false

[output]
name=DSI-1
mode=720x1280@60
transform=rotate-270

[screen-share]
command=/usr/bin/weston --backend=rdp-backend.so --shell=fullscreen-shell.so --no-clients-resize

[shell]
panel-position=none

デフォルトの出荷構成ではデスクトップが起動しますが、これを変更しています。 kiosk-shell.so プラグインは、ウィンドウ装飾なしで 1 つのアプリをフルスクリーンで実行します。 output transform=rotate-270 を含むセクション これは、QML アプリケーションをローテーションするために必要な魔法のセクションです。

.bbappend を作成します レシピ:

FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"

SRC_URI += " file://weston.ini "

do_install_append() {
    # Remove upstream weston.ini to avoid conflict with weston-ini-conf package
    rm -f ${D}${sysconfdir}/xdg/weston/weston.ini

    install -D -p -m0644 ${WORKDIR}/weston.ini ${D}${sysconfdir}/xdg/weston/weston.ini
}

SYSTEMD_AUTO_ENABLE_${PN} = "enable"

これは、デフォルトの Qt 環境をオーバーライドするために以前に行ったことと似ています。 FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" 構成ファイルを配置した独自のレイヤーに現在のフォルダーを追加します。デフォルトの weston.ini が ファイルは置き換えられませんでした。そのため、明示的な do_install_append が存在します。 セクション。通常は必要ありませんが、私の場合、このようにしない限りファイルは置き換えられません。

SYSTEMD_AUTO_ENABLE_${PN} = "enable" weston を有効にします systemd サービス。

ここで、weston を確認します。 b2qt ではなく開始します または startupscreen 、もう少し .bbappend を作成する必要があります それらのsystemdサービスを無効にするレシピ。 b2qt の場合、表示サービスは 1 つしか実行できません。 実行後、weston 起動に失敗します。

前と同じように、次のファイルを作成します:

sources/meta-raymii/recipes-qt/boot2qt-addons/boot2qt-startupscreen_%.bbappend 

以下の行を入力してください:

SYSTEMD_AUTO_ENABLE_${PN} = "disable"

これにより、startupscreen が無効になります サービス。

b2qt について上記を繰り返します このサービスは、紛らわしいことに、default-qt-envs にあります。 レシピファイル:

sources/meta-raymii/recipes-qt/boot2qt-addons/default-qt-envs.bbappend

同じ行で systemd サービスを無効にします:

SYSTEMD_AUTO_ENABLE_${PN} = "disable"

次の部分は、カスタム イメージ .bbappend に関するものです。 weston を追加する必要があるファイル systemd を確認するために、ディストリビューション機能に graphicalまで起動 multiuser ではなくターゲット ターゲット:

sources/meta-raymii/recipes-qt/images/b2qt-embedded-qt6-image.bbappend

weston \ を追加 IMAGE_FEATURES_appendに セクション:

IMAGE_FEATURES_append = " \
        splash \
        weston \
        "

weston-init を含める IMAGE_INSTALL_append のパッケージ セクション:

IMAGE_INSTALL_append = " \
        myapp \
        kernel-modules \
        evtest \
        iperf3 \
        i2c-tools \
        util-linux \
        weston-init \
        "

最後の部分では、myapp を更新します。 systemd を含めるレシピ このサービスは、weston 以降にアプリケーションを起動します 開始されます。新しいファイルを作成します:

vim sources/meta-raymii/recipes-myapp/myapp/files/myapp.service 

次のコンテンツを配置します:

[Unit]
Description=MyApp on Weston
After=weston.service

[Service]
User=weston
Restart=always
Type=simple
Environment=QT_QPA_PLATFORM=wayland
ExecStartPre=/bin/sh -c 'echo XDG_RUNTIME_DIR="$(loginctl show-user --property=RuntimePath --value \"$USER\")" > /tmp/qtenv'
EnvironmentFile=-/tmp/qtenv
ExecStopPost=/bin/rm /tmp/qtenv
ExecStart=/usr/bin/myapp
WorkingDirectory=/home/weston

[Install]
WantedBy=multi-user.target

Wayland で Qt アプリを実行する場合、XDG_RUNTIME_DIR が必要です。 環境変数。これを /run/user/1000 にハードコードできます 、この特定のセットアップで機能しますが、 loginctl も使用できます コマンドを使用して実際のパスを照会します。これは、将来のすべてのデバイスとセットアップで機能します。

systemd シェル コマンドを Environment として評価するオプションはありません オプションなので、ハックを使用してそれを行います。まず、ExecStartPre を実行します。 サブシェルを開始してコマンドを実行し、出力をファイルに書き込みます /tmp .次に、行 EnvironmentFile を指定します 、しかし、重要 、ダッシュで始めます (- )。これにより、最初にコマンド、次にファイルの正しい順序が保証されます。十分に文書化されていないため、それを説明するstackoverflowの投稿を見つけましたが、ソースとして引用することができなくなりました。アプリが停止すると、環境ファイルは削除されます。

myapp_1.0.bb を変更 この systemd レシピを含めるレシピ:

DESCRIPTION = "My Custom Qt App"
AUTHOR = "[email protected]"
LICENSE = "CLOSED"
PR = "r1"

SRC_URI =+ "file://myapp \
            file://myapp.service \
           "

inherit systemd

DEPENDS += "qtbase qtdeclarative qtdeclarative-native"

do_install() {
    install -d ${D}/${bindir}
    install -m 0755 ${WORKDIR}/myapp ${D}/${bindir}/myapp

    lnr ${D}/${bindir}/myapp ${D}/${bindir}/b2qt

    install -m 0755 -d ${D}${systemd_unitdir}/system
    install -m 0644 ${WORKDIR}/myapp.service ${D}${systemd_unitdir}/system/
}

FILES_${PN} = "${bindir}/myapp \
               ${bindir}/b2qt \
              "
SYSTEMD_SERVICE:${PN} = "myapp.service"

SYSTEMD_SERVICE を指定して 、起動時にデフォルトで有効になります。

新しいイメージを構築すると、そのすべての努力の後に、正しくローテーションされた QML アプリケーションが結果として得られるはずです:

私の個人的な意見では、この QML のローテーションは、Qt Company が改善できる領域であり、Qt ウィジェットと同じくらい簡単にすることができます。

この方法で任意の Qt アプリを手動で実行し、Qt Creator を介してコンパイルしてコピーするか、コンパイルできない場合はコピーするだけです。正しい環境変数を設定して実行します。たとえば、Qt に組み込まれた Bear Whack の例 (楽しいゲーム、quick/touchinteraction の下) ):

XDG_RUNTIME_DIR=/run/user/1000 QT_QPA_PLATFORM=wayland /usr/share/examples/quick/touchinteraction/touchinteraction 

これがベア ワックの写真です:

そして、SameGame デモの実行中の写真を次に示します。 reTerminal でのパーティクルとエフェクトは非常にスムーズです: