このガイドでは、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.conf
と local.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 でのパーティクルとエフェクトは非常にスムーズです: