Raspberry Pi 4 用の Yocto boot2qt (Qt 5.15 と 6.2 の両方)

このガイドでは、Yocto プロジェクトと boot2qt を使用して、Raspberry Pi 4 用の Linux ディストリビューションを構築します。 Qt が提供するスタック。この boot2qt イメージは SD カードに書き込むことができ、起動すると、Raspberry Pi は Qt Creator (Qt IDE) とうまく統合されたソフトウェア スタックを実行します。たとえば、デバイスへのワンクリック デプロイです。独自の Qt アプリケーションを Pi でフル スクリーンで実行できます。起動するとすぐに起動します。このガイドは、Qt 5.15 と Qt 6.2 の両方を対象としています。 5.15 のビルド プロセスは、アップストリームにいくつかの問題があるため、少し複雑です。このガイドでは、デフォルトのスタートアップ アプリを独自のアプリに変更することと、Qt Creator の統合についても説明します。

最終的に boot2qt になります Raspberry Pi 4 のイメージ。私はここに 8 GB モデルを持っていますが、RAM が少なくても問題なく動作します。このガイドでは、その後の QtCreator キットとデバイスのセットアップについても説明します。

カスタム Qt アプリを起動する boot2qt のビデオは次のとおりです。

ステップが特定の Qt バージョン用である場合は、それが言及されています。それ以外の場合、この手順は両方のバージョンに適用されます。

このガイドは Raspberry Pi 4 を対象としていますが、Qt でサポートされている他の Raspberry Pi モデルでも機能するはずです。 MACHINE を置き換えます 後で別のモデルで変数を使用します。

yocto とは、boot2qt とは

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

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 にも統合されているため、デバイス上でネットワーク経由でワンクリックでアプリケーションをデプロイして実行できます。

3 つの部分すべてにより、膨大な量の作業が節約されます。私たちは独自の yoctobuild を持っているので、ボードがサポートされている限り、boot2qt スタックは非常に多くの時間を節約します。ボードのリストは、Qt 5.15 ではこちら、Qt 6.2 ではこちらでご覧いただけます。

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

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

開発ホスト

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

私のビルド マシンは、Qt 5.15 ビルド用に Ubuntu 20.04 を実行し、Qt 6 ビルド用に Debian 11 を実行します。最初に必要なパッケージをインストールします:

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 をビルドするときにビルドの問題がありました。 余分なパッケージのほとんどがここから来る層です。

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

apt install repo

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

すべての 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

# for Qt 5.15
repo init -u git://code.qt.io/yocto/boot2qt-manifest -m v5.15.2.xml

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

repo sync

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

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

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

出力:

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

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

build-*conf があるディレクトリ フォルダーには、2 つの重要なファイルがあります。 bblayers.conflocal.conf . oom-killer に問題がありました イメージのビルド中、do_compile qtwebengine の クラッシュし続けました(殺されました)。次の変数を 1 に設定する必要がありました 、ビルドパスを作成します:

# Default to setting automatically based on cpu count
BB_NUMBER_THREADS ?= "1"
# 
# Default to setting automatically based on cpu count
PARALLEL_MAKE ?= "-j1"

これはおそらくビルド マシンのハードウェアが限られているためですが、ビルド中にメモリ不足の問題が発生した場合は、どこを見ればよいかがわかります。

これですべての設定が完了しました。 screen を開始することをお勧めします または tmux ビルドには時間がかかります。

boot2qt のビルド

Qt 6 の場合、次の手順は問題なく実行されます。Qt 5 の場合は、手動でパッチを適用する必要があります。私がしなければならなかったパッチは、この記事の一番下にあります。Qt 5.15 LTS の料金を支払えば、問題はありません。現時点での最後のオープン ソース Qt 5 バージョンは 5.15.2 で、商用バージョンは 5.15.8 です。商用リリースではこれらの問題が修正されています。オープン ソース リリースでは、いくつかのレシピを自分で編集し、新しいファームウェアをダウンロードする必要があります。

次のコマンドは、完全な boot2qt をビルドします SD カードにフラッシュできるイメージ (およびすべてのパッケージ):

# for Qt 6
bitbake b2qt-embedded-qt6-image

# for Qt 5
bitbake b2qt-embedded-qt5-image

すべてのソース コードをコンパイルするため、ビルド プロセスには時間がかかります。 Qt 5 の出力は以下のようになります:

    remy@host:~/b2qt/build-raspberrypi4$ bitbake b2qt-embedded-qt5-image                                                           
    WARNING: Host distribution "ubuntu-20.04" 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 4132 entries from dependency cache.
    Parsing recipes: 100% |###############################################################################################| Time: 0:00:00
    Parsing of 2779 .bb files complete (2778 cached, 1 parsed). 4132 targets, 299 skipped, 1 masked, 0 errors.
    NOTE: Resolving any missing task queue dependencies

    Build Configuration:
    BB_VERSION           = "1.44.0"
    BUILD_SYS            = "x86_64-linux"
    NATIVELSBSTRING      = "universal"
    TARGET_SYS           = "arm-poky-linux-gnueabi"
    MACHINE              = "raspberrypi4"
    DISTRO               = "b2qt"
    DISTRO_VERSION       = "3.0.4"
    TUNE_FEATURES        = "arm vfp cortexa7 neon vfpv4 thumb callconvention-hard"
    TARGET_FPU           = "hard"
    SDKMACHINE           = "x86_64"
    meta                 
    meta-poky            = "HEAD:f2eb22a8783f1eecf99bd4042695bab920eed00e"
    meta-raspberrypi     = "HEAD:0e05098853eea77032bff9cf81955679edd2f35d"
    meta-oe              
    meta-python          
    meta-networking      
    meta-initramfs       
    meta-multimedia      = "HEAD:2b5dd1eb81cd08bc065bc76125f2856e9383e98b"
    meta-python2         = "HEAD:4400f9155ec193d028208cf0c66aeed2ba2b00ab"
    meta-boot2qt         
    meta-boot2qt-distro  = "HEAD:5f23cb2d6836bbad3a1fa982089ccf20bf0c6245"
    meta-mingw           = "HEAD:756963cc28ebc163df7d7f4b4ee004c18d3d3260"
    meta-qt5             = "HEAD:72459ce0639eb3ce408558a7abede945e1f8ddc9"

    Initialising tasks: 100% |############################################################################################| Time: 0:00:05
    Sstate summary: Wanted 513 Found 295 Missed 218 Current 1721 (57% match, 90% complete)
    NOTE: Executing Tasks
    NOTE: Setscene tasks completed
    Currently  5 running tasks (4391 of 6968)  63% |####################################################                                |
    0: qtquickcontrols2-5.15.2+gitAUTOINC+16f27dfa35-r0 do_compile - 9m41s (pid 4102272)
    1: qtmultimedia-5.15.2+gitAUTOINC+fd30913d46-r0 do_compile - 9m33s (pid 4104096)
    2: qtlocation-5.15.2+gitAUTOINC+02a21217a9_d3101bbc22-r0 do_compile - 8m16s (pid 4107720)
    3: qtconnectivity-5.15.2+gitAUTOINC+ca6cc606d9-r0 do_compile - 6m51s (pid 4110585)
    4: qtwayland-5.15.2+gitAUTOINC+3cc17177b1-r0 do_compile - 6m20s (pid 4111432)

出力の下部に、実行中のさまざまなタスクが表示されます。do_fetch の可能性があります。 (ソースをダウンロード)、do_compile (コードをクロスコンパイル) または do_package (パッケージを作る)、または他のいくつかの do_* ステップ。

ほとんど 7000 があることがわかります 変更はビルドに失敗するため、定期的に確認してください。 Yocto エラー メッセージは、ログ ファイルを含めて明確です。

Qt 6.2 の場合、出力は次のようになります:

remy@host:~/b2qt/build-raspberrypi4$ 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 unex
pected failures. It is recommended that you use a tested distribution.
Loading cache: 100% |#################################################################################################| Time: 0:00:00
Loaded 4368 entries from dependency cache.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "1.50.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "arm-poky-linux-gnueabi"
MACHINE              = "raspberrypi4"
DISTRO               = "b2qt"
DISTRO_VERSION       = "3.3.4"
TUNE_FEATURES        = "arm vfp cortexa7 neon vfpv4 thumb callconvention-hard"
TARGET_FPU           = "hard"
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-raymii          = "master:0789f30e221712462748cf56b9afddeec3613be1"

Initialising tasks: 100% |############################################################################################| Time: 0:00:09
Sstate summary: Wanted 482 Local 356 Network 0 Missed 126 Current 2730 (73% match, 96% complete)
NOTE: Executing Tasks
Currently  4 running tasks (4425 of 9263)  47% |########################################                                            |
0: qtwebengine-6.2.3-r0 do_compile (pid 527778)   0% |                                                                              |
1: qtwayland-6.2.3-r0 do_install_ptest_base - 1m2s (pid 527854)
2: qtdeclarative-6.2.3-r0 do_package_write_ipk - 1m0s (pid 527980)
3: qtmultimedia-6.2.3-r0 do_package_write_ipk - 30s (pid 529522)

さらに多くのタスク、それは 9000 を超えています!.

冒頭で述べたように、Qt WebEngine をコンパイルする際に問題がありましたが、これは並列コアを少なくすることで解決されました。 Qt 5.15.2 にはさらに問題がありましたが、これらの修正はこのページの下にあります。すべてが構築されたら、画像のフラッシュに入る次の段落に進みます。

Yocto イメージのフラッシュ

Yocto ビルドが完了すると、Raspberry Pi を起動するために SD カードにフラッシュできるイメージ ファイルが作成されます。 Yocto はさらに多くのファイル、個々のソフトウェアのパッケージ、デバイス ツリーなどのサポート ファイル、その他いくつかのファイルを生成しますが、現時点ではイメージ ファイルのみに関心があります。

2 つの異なる boot2qt バージョン (Qt 5 および Qt 6) は異なるイメージファイルをビルドします。 Qt 5 には dd だけのイメージがあります SD カードに接続して起動すると、Qt 6 には bmap があります ファイル。 bmap は、フラッシュが高速で、フラッシュ中にデータを検証する特別な形式であり、最初は Intel が Tizenproject のために作成しました。

Qt 5 の場合、b2qt/build-raspberrypi4/tmp/deploy/images/raspberrypi4 で次のようになります。 フォルダ:

ls -larSh tmp/deploy/images/raspberrypi4/ # ls sorted by size

出力:

-rw-r--r-- 2 remy remy  40K Feb 15 15:22 bcm2711-rpi-4-b-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-20220215123308.dtb
drwxr-xr-x 3 remy remy  52K Feb 17 06:14 .
-rw-r--r-- 1 remy remy 193K Feb 17 06:09 b2qt-embedded-qt5-image-raspberrypi4-20220217055709.rootfs.manifest
-rw-r--r-- 1 remy remy 335K Feb 17 06:09 b2qt-embedded-qt5-image-raspberrypi4-20220217055709.testdata.json
-rw-r--r-- 2 remy remy 5.7M Feb 15 15:21 zImage-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-20220215123308.bin
-rw-rw-r-- 2 remy remy  19M Feb 15 15:22 modules-1-4.19.93+git0+3fdcc814c5-r0-raspberrypi4-20220215123308.tgz
-rw-r--r-- 1 remy remy 322M Feb 17 06:13 b2qt-embedded-qt5-image-raspberrypi4-20220217055709.7z
-rw-r--r-- 1 remy remy 488M Feb 17 06:10 b2qt-embedded-qt5-image-raspberrypi4-20220217055709.rootfs.tar.bz2
-rw-r--r-- 1 remy remy 1.7G Feb 17 06:10 b2qt-embedded-qt5-image-raspberrypi4-20220217055709.rootfs.ext3
-rw-r--r-- 1 remy remy 1.8G Feb 17 06:10 b2qt-embedded-qt5-image-raspberrypi4-20220217055709.rootfs.rpi-sdimg

最後のファイル、*-sdimg ファイル、dd を使用して SD カードにフラッシュできます :

dd if=b2qt-embedded-qt5-image-raspberrypi4-20220217055709.rootfs.rpi-sdimg of=/dev/sdX bs=4M conv=fsync 

外付けの SD カード リーダーを使用しています。内蔵リーダーがある場合は、おそらく of=/dev/mmcblk0 を使用する必要があります /dev/sdX ではなく、出力デバイスとして .画像ファイルには日付が含まれていることに注意してください。この例のファイル名は、ビルド出力ファイル名に置き換える必要があります。

Qt 6 の場合は bmap です 画像ファイル ファイル:

-rw-r--r-- 2 remy remy  29K Feb 15 18:03 bcm2710-rpi-3-b-plus-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.dtb
-rw-r--r-- 2 remy remy  35K Feb 15 18:03 sx150x-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.dtbo
-rw-r--r-- 2 remy remy  49K Feb 15 18:03 bcm2711-rpi-400-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.dtb
-rw-r--r-- 2 remy remy  49K Feb 15 18:03 bcm2711-rpi-4-b-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.dtb
-rw-r--r-- 2 remy remy  49K Feb 15 18:03 bcm2711-rpi-cm4-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.dtb
drwxr-xr-x 3 remy remy  60K Feb 16 22:57 .
-rw-r--r-- 1 remy remy 216K Feb 16 22:53 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.rootfs.manifest
-rw-r--r-- 1 remy remy 346K Feb 16 22:53 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.testdata.json
-rw-r--r-- 2 remy remy 7.1M Feb 15 18:03 zImage-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.bin
-rw-r--r-- 2 remy remy  19M Feb 15 18:03 modules-1-5.10.31+git0+a19886b00e_89399e6e7e-r0-raspberrypi4-20220215145419.tgz
-rw-r--r-- 1 remy remy 374M Feb 16 22:57 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.7z
-rw-r--r-- 1 remy remy 374M Feb 16 22:57 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.rootfs.wic.xz
-rw-r--r-- 1 remy remy 579M Feb 16 22:53 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.rootfs.tar.bz2
-rw-r--r-- 1 remy remy 596M Feb 16 22:54 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.rootfs.wic.bz2
-rw-r--r-- 1 remy remy 2.0G Feb 16 22:54 b2qt-embedded-qt6-image-raspberrypi4-20220216200033.rootfs.ext3

Ubuntu を実行している場合は、bmap-tools をインストールする必要があります。 パッケージを作成し、次のコマンドを使用してイメージを SD カードにフラッシュします:

$ sudo bmaptool copy b2qt-embedded-qt6-image-raspberrypi4.wic.bz2 --bmap b2qt-embedded-qt6-image-raspberrypi4.wic.bmap /dev/sda
bmaptool: info: block map format version 2.0
bmaptool: info: 687923 blocks of size 4096 (2.6 GiB), mapped 374929 blocks (1.4 GiB or 54.5%)
bmaptool: info: copying image 'b2qt-embedded-qt6-image-raspberrypi4.wic.bz2' to block device '/dev/sda' using bmap file 'b2qt-embedded-qt6-image-raspberrypi4.wic.bmap'

bmap がない場合 *.rootfs.wic.bz2 を抽出するだけです ファイルを作成して dd を使用 SD カードに書き込みます。少し時間がかかり、書き込まれたデータの検証が欠けていますが、同様に機能します。

SD カードに書き込んだら、Raspberry Pi に挿入して起動します。短いブートアップ シーケンスの後、素敵な Boot 2 Qt 画面が表示されます。

Qt 6 の場合、IP アドレスは画面に出力されます。ユーザー名 root を使用してその IP に SSH で接続できます そしてパスワードなし。すべてがうまくいけば、シェル プロンプトが表示されます。その場合は、Qt Creator の統合に進みます。 Qt 5 の場合、いくつかのデモ アプリケーションをすぐに実行できます。

Qt Creator の統合

boot2qt の大きな利点の 1 つ IDE Qt Creator など、他の Qt ツールとの統合です。

Qt Creator には、基本的にコンパイラ構成であるキットの概念があります。 Qt または GCC (または CLANG) の複数のバージョンをインストールすることができ、キット内で Qt Creator に使用する特定のバージョンを指示します。 Qt 5.15、Android とデスクトップ Linux の両方、および Qt 6.2 用の特定のキットがあります。また、x86 デスクトップから Raspberry Pi 用にコンパイルできるクロス コンパイラ キットもインストールしています。

Yocto は、特定の環境に必要なすべてのコンパイル ツールを備えたネイティブ SDK を構築できます。 boot2qt これを拡張し、クロス コンパイル SDK の Qtstack 全体といくつかのヘルパー スクリプトも含まれています。

デバイスを Qt Creator に統合する手順は次のとおりです。

  • クロスコンパイル SDK をビルドする
  • クロスコンパイル SDK をインストールする
  • SDK をキットとして Qt Creator に追加
  • そのキットのクローンを作成し、正しくセットアップします
  • リモート デバイス (Pi) を追加する
  • デバイスに展開するキットを更新します
  • キットをプロジェクトに追加

可動部品がたくさんありますが、すべてセットアップして実行すると、簡単です。 Qt クリエーターがアプリをクロスコンパイルしてデバイスに直接コピーします。手動のタスクは必要ありません。

クロスコンパイル SDK のビルド

SDK は、使用する前にビルドする必要があります。SDK は、ブート イメージをビルドするときに自動的にビルドされるわけではありません。 b2qt にいることを確認してください フォルダを作成し、環境をセットアップしました:

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

bitbake コマンドを実行して SDK をビルドします:

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

ホスト マシンの仕様によっては、ビルドに数時間かかる場合があります。イメージ全体を構築するほどではありませんが、それでもかなりの時間がかかります。出力は、イメージをビルドしたときに見た以前の出力とよく似ています:

remy@host:~/b2qt/build-raspberrypi4$ bitbake meta-toolchain-b2qt-embedded-qt6-sdk
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 4368 entries from dependency cache.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "1.50.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "arm-poky-linux-gnueabi"
MACHINE              = "raspberrypi4"
DISTRO               = "b2qt"
DISTRO_VERSION       = "3.3.4"
TUNE_FEATURES        = "arm vfp cortexa7 neon vfpv4 thumb callconvention-hard"
TARGET_FPU           = "hard"
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-raymii          = "master:0789f30e221712462748cf56b9afddeec3613be1"


Initialising tasks: 100% |############################################################################################| Time: 0:00:10
Sstate summary: Wanted 1340 Local 292 Network 0 Missed 1048 Current 2252 (21% match, 70% complete)
NOTE: Executing Tasks
NOTE: Tasks Summary: Attempted 10059 tasks of which 7511 didn't need to be rerun and all succeeded.
NOTE: Build completion summary:
NOTE:   do_populate_sysroot: 0.0% sstate reuse(0 setscene, 146 scratch)
NOTE:   do_deploy_source_date_epoch: 0.0% sstate reuse(0 setscene, 146 scratch)
NOTE:   do_package_qa: 0.0% sstate reuse(0 setscene, 150 scratch)
NOTE:   do_package: 0.0% sstate reuse(0 setscene, 150 scratch)
NOTE:   do_packagedata: 0.0% sstate reuse(0 setscene, 150 scratch)
NOTE:   do_package_write_ipk: 2.0% sstate reuse(3 setscene, 150 scratch)
NOTE:   do_populate_lic: 0.0% sstate reuse(0 setscene, 154 scratch)

ビルドが完了すると、インストール可能なシェル スクリプトが tmp/deploy/sdk に作成されます。 フォルダ:

remy@host:~/b2qt/build-raspberrypi4$ ls tmp/deploy/sdk/ -larSh
total 1.6G
-rw-r--r-- 1 remy remy    0 Feb 18 15:43 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt6-sdk-raspberrypi4.host.manifest
-rw-r--r-- 1 remy remy  90K Feb 18 15:42 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt6-sdk-raspberrypi4.target.manifest
-rw-r--r-- 1 remy remy 324K Feb 18 15:42 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt6-sdk-raspberrypi4.testdata.json
-rwxr-xr-x 1 remy remy 1.6G Feb 18 15:58 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt6-sdk-raspberrypi4.sh

b2qt-x86_64-meta-toolchain-b2qt-embedded-qt6-sdk-raspberrypi4.sh を実行できます ローカル マシンに SDK をインストールするためのファイル:

$ ./b2qt-x86_64-meta-toolchain-b2qt-embedded-qt6-sdk-raspberrypi4.sh 
Boot to Qt for Embedded Linux SDK installer version 3.3.4
=========================================================
Enter target directory for SDK (default: /opt/b2qt/3.3.4): 
You are about to install the SDK to "/opt/b2qt/3.3.4". Proceed [Y/n]? y
[sudo] password for remy: 
Extracting SDK...
done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
 $ . /opt/b2qt/3.3.4/environment-setup-cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi

Qt 5 のビルド コマンドは次のとおりです。

bitbake meta-toolchain-b2qt-embedded-qt5-sdk

出力はほぼ同じで、ビルドが完了すると、同じフォルダー tmp/deploy/sdk にインストーラーが作成されます。 :

remy@host:~/b2qt/build-raspberrypi4$ ls -larSh tmp/deploy/sdk/
total 1.7G
-rw-r--r-- 1 remy remy  59K Feb 19 22:25 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt5-sdk-raspberrypi4.host.manifest
-rw-r--r-- 1 remy remy 199K Feb 19 22:24 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt5-sdk-raspberrypi4.target.manifest
-rw-r--r-- 1 remy remy 303K Feb 19 22:24 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt5-sdk-raspberrypi4.testdata.json
-rwxr-xr-x 1 remy remy 1.7G Feb 19 22:47 b2qt-x86_64-meta-toolchain-b2qt-embedded-qt5-sdk-raspberrypi4.sh

このスクリプトは Qt 6 と同じようにインストールでき、回避策や問題はありません:

$ ./b2qt-x86_64-meta-toolchain-b2qt-embedded-qt5-sdk-raspberrypi4.sh 
Boot to Qt for Embedded Linux SDK installer version 3.0.4
=========================================================
Enter target directory for SDK (default: /opt/b2qt/3.0.4): 
You are about to install the SDK to "/opt/b2qt/3.0.4". Proceed [Y/n]? Y
[sudo] password for remy: 
Extracting SDK...done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
 $ . /opt/b2qt/3.0.4/environment-setup-cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi

Qt Creator にキットを追加する

Qt Creator でキットを構成するのは面倒なプロセスですが、 boot2qt この部分を少し簡単にするスクリプトも提供します。 nativeSDK をインストールしたら、configure-qtcreator.sh を使用できます。 キットを追加するスクリプト。最初に Qt Creator を閉じてから、スクリプトを実行します:

/opt/b2qt/3.3.4/configure-qtcreator.sh --config /opt/b2qt/3.3.4/environment-setup-cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi --qtcreator /mnt/DATADISK/qt2021/Tools/QtCreator/ --name qt6-pi4-template
  • --config :SDK インストーラーがソースを指示するファイルを指します。
  • --qtcreator :QtCreator がインストールされているフォルダーを指します。追加のディスクにあるため、パスが異なります
  • --name :キットの名前

このキットは後で編集できないため、-template を追加しました 名前に。変更は可能ですが、最初にキットを複製する必要があります。

出力:

Configured Qt Creator with new kit: qt6-pi4-template

Qt Creator を起動し、Preferences に移動します 、次に Kits . Clone をクリックすると、新しいキットが表示されます。 ボタン:

変更する最も重要な設定は Qt Version です .検出されなかった理由は定かではありませんが、私にとっては None と表示されていました .ドロップダウンで正しい Qt バージョンを選択します。どちらを使用するかわからない場合は、Qt Versions に切り替えてください タブをクリックして、必要なものを確認してください。これが私が持っている設定の写真です:

このキットを独自のプロジェクト用に構成できるようになりましたが、その前に、Pi を追加します (boot2qt を実行します)。 image) を展開するリモートデバイスとして。

リモート デバイスの追加

また、設定の Devices の下 . Add をクリックします ボタン。 Generic Linux Device を追加 ただし、IP をボードの IP に置き換えます:

boot2qt 画像のユーザー名は root です そしてパスワードはありません。公開鍵をデプロイできますが、必須ではありません。デバイスが追加されたら、[テスト] ボタンを使用して、すべてが機能することを確認します。

キット設定に戻り、Device でこのデバイスを選択します ドロップダウンしてください。

デバイスをキットに追加した後、プロジェクト用にキットを構成できます。プロジェクトを開いて、Project をクリックします。 ボタンをクリックして新しいキットを追加し、プロジェクトをビルドします。 compileoutput には、通常のコンパイラではなく、Yocto SDK へのパスが表示されます:

15:09:01: Starting: "/opt/b2qt/3.3.4/sysroots/x86_64-pokysdk-linux/usr/bin/make" -j12
/opt/b2qt/3.3.4/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-g++ -mthumb -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi -c -pipe -g -std=gnu++1z -Wall -Wextra -D_REENTRANT -fPIC -DQT_QML_DEBUG -DQT_QUICK_LIB -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_QMLMODELS_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I../dragdropexample -I. -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtQuick -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtOpenGL -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtGui -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtQmlModels -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtQml -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtNetwork -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/include/QtCore -I. -I/opt/b2qt/3.3.4/sysroots/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/usr/lib/mkspecs/linux-oe-g++ -o main.o ../dragdropexample/main.cpp

ワンクリックでデプロイ

Qt のドキュメントでは、Run の下にオプションの 1 つがリストされています。 Change Default App としてのキットのステップ 、しかし、おそらく qbsp をインストールしていないため、そのオプションはありません パッケージ。ただし、Qt Creator に正しいコマンドを手で伝えるだけなので、大きな問題にはなりません。

Run の下 設定、Alternate executable on device を確認してください パスを /usr/bin/appcontroller に変更します .アプリのフル パスを Command Line Arguments に追加します。 下の画像のように、テキストフィールド。アプリへのフル パスは、同じ設定ダイアログに表示されます。

次回デプロイすると、実行中の appcontroller インスタンスが強制終了されます アプリケーションをコマンドライン引数として起動し、アプリを効果的にデバイスにデプロイします。

Yocto でデフォルトの boot2qt スタートアップ アプリケーションを変更する

次のコマンドを使用して、システムの実行中に起動するデフォルトのアプリを変更できます:

appcontroller --make-default /path/to/your/app

/usr/bin/b2qt へのシンボリック リンクを作成するだけです。 .

ただし、アプリをイメージに焼き付けたい場合があります。これは、独自のレイヤーとレシピを作成し、Qt イメージを拡張してそのレシピをイメージに含めるための簡単な短いセクションです。バイナリをファイル システムとシンボリック リンクに配置するレシピを作成し、デフォルト イメージを拡張することで、これを行います。

このガイドを使用して実稼働イメージを出荷する予定がある場合は、これが開発イメージであること、SSH が広く開かれていること、および正しくセットアップする必要のあるイメージがたくさん残っていることを覚えておいてください。詳細については、Yocto をもう少し詳しく調べてください。

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

mkdir -p sources/meta-raymii/recipes-myapp/myapp/files/
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"

次に、アプリのレシピである次のファイルを編集します。

sources/meta-raymii/recipes-myapp/myapp/myapp_1.0.bb

ファイル名の形式 (myapp underscore versionMajor.versionMinor ) が重要です。underscore を混同しないでください dash の場合 .アプリの新しいバージョンの名前は myapp_1.1.bb になる可能性があります 、または PR="r0" を上げることができます マイナー リリース用。

内容:

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) を作成します。 ) から /usr/bin/b2qt . DEPENDS 行は、関連する Qt ピースがインストールされていることを確認します。 boot2qt で ただし、その行を省略すると、Yocto はプログラムの実行可能ファイルをスキャンするほどインテリジェントであるため、ビルド エラーが発生します。

files でプログラムのクロスコンパイルされたバージョンを確認してください フォルダ:

remy@host:~/b2qt$ file sources/meta-raymii/recipes-myapp/myapp/files/myapp
sources/meta-raymii/recipes-myapp/myapp/files/myapp: ELF 32-bit LSB
pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked,
interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID
[sha1]=f313bc93bfc28c7a8af0eb046c0270ab55378502, with debug_info, not
stripped

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

build-raspberrypi4/conf/bblayers.conf

末尾のスラッシュを忘れないでください (\ ):

BBLAYERS ?= " \
  ${BSPDIR}/sources/poky/meta \
    [...]
  ${BSPDIR}/sources/meta-qt6 \
  ${BSPDIR}/sources/meta-raymii \
  "

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

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

内容:

SUMMARY = "Add myapp to Qt image"
IMAGE_INSTALL_prepend := "myapp"

上記のすべてを実行したら、イメージを再構築します (bitbake b2qt-embedded-qt6-image )、SDカードにフラッシュします。起動すると、デフォルトではなく、独自のプログラムが起動します。

画像が正しいことを確認したい場合は、ファイル /etc/build を確認してください。 SSH 経由でログインして、イメージのビルドに使用されたレイヤーと git コミットを確認します。

root@b2qt-raspberrypi4:~# cat /etc/build 
-----------------------
Build Configuration:  |
-----------------------
DISTRO = b2qt
DISTRO_VERSION = 3.3.4
QT_VERSION = 6.2.3
-----------------------
Layer Revisions:      |
-----------------------
meta              = HEAD:c40ac16d79026169639f47be76a3f7b9d8b5178e -- modified
meta-poky         = HEAD:c40ac16d79026169639f47be76a3f7b9d8b5178e -- modified
meta-raspberrypi  = HEAD:b4ec97e4eb8e36efd1f7e2f8ae020a9e55cfc239 
meta-oe           = HEAD:f72a73b42fa740130b388ba8555cdbefdee8d37d 
meta-python       = HEAD:f72a73b42fa740130b388ba8555cdbefdee8d37d 
meta-networking   = HEAD:f72a73b42fa740130b388ba8555cdbefdee8d37d 
meta-initramfs    = HEAD:f72a73b42fa740130b388ba8555cdbefdee8d37d 
meta-multimedia   = HEAD:f72a73b42fa740130b388ba8555cdbefdee8d37d 
meta-python2      = HEAD:810d6d842f103eb59f18b06426106462b15de7e2 
meta-boot2qt      = HEAD:e59a2e20697e0afc2a0b068835cd90e102dec589 
meta-boot2qt-distro = HEAD:e59a2e20697e0afc2a0b068835cd90e102dec589 
meta-mingw        = HEAD:422b96cb2b6116442be1f40dfb5bd77447d1219e 
meta-qt6          = HEAD:eb3719266fc03b96d5056980b135b371f31811f4 
meta-raymii       = master:0789f30e221712462748cf56b9afddeec3613be1 -- modified

image-buildinfo クラスはターゲット ファイル システムに情報を書き込み、Qt イメージではこのクラスがデフォルトで有効になっています。画像は meta-boot2qt/classes/deploy-buildinfo.bbclass を継承しています image-buildinfo を継承する いくつかの Qt バージョン情報でそれを拡張します。

Qt 5.15.2 の問題

5.15.2 用の boot2qt をビルドするときに、いくつかの問題が発生しました。アップストリームの git リポジトリはブランチ名を変更するため、フォントについては、フォントに関連するいくつかのレシピを更新する必要がありました:

  • b2qt/sources/meta-boot2qt/meta-boot2qt/recipes-graphics/fonts/otf-noto_git.bb
  • b2qt/sources/meta-boot2qt/meta-boot2qt/recipes-graphics/fonts/ttf-opensans_git.bb

以下を変更してください:

SRC_URI = "git://github.com/googlei18n/noto-cjk.git"

;branch=main を追加 最後まで:

SRC_URI = "git://github.com/googlei18n/noto-cjk.git;branch=main"

問題のある他のフォント レシピについては、すすぎ、繰り返します。

私の Raspberry Pi 4b 8 GB はこのイメージで起動できませんでした。ブートローダーは次のエラーで不平を言っています:

start4x.elf is not compatible
This board requires newer software

これが 8 GB バージョンに固有のものかどうかはわかりません。私は Raspberry Pi 4 を 1 つしか持っていないため、4 GB モデルでテストすることはできません。最初にイメージをフラッシュしてみて、同じ問題が発生した場合にのみ次のレシピを更新してください。

新しいファームウェア ファイルを取得するには、2 つのレシピを更新する必要があります。前の yocto レイヤーの例では、デフォルトのアプリを変更するためにオーバーライドを使用しましたが、この場合は、他のレシピをオーバーライドして修正する方法を力ずくで行っています。最も美しい方法ではありませんが、機能します。

次のファイルを更新してください:

b2qt/sources/meta-raspberrypi/recipes-bsp/common/raspberrypi-firmware.inc

既存のコンテンツをすべて削除し、以下を貼り付けます:

RPIFW_DATE ?= "20210421"
SRCREV ?= "2ac4de4eaac5c1d1b25acec4a5e0a9fdb16f0c91"
RPIFW_SRC_URI ?= "https://github.com/raspberrypi/firmware/archive/${SRCREV}.tar.gz;downloadfilename=raspberrypi-firmware-${SRCREV}.tar.gz"
RPIFW_S ?= "${WORKDIR}/firmware-${SRCREV}"

SRC_URI = "${RPIFW_SRC_URI}"
SRC_URI[sha256sum] = "c687aa1b5127a8dc0773e8aefb1f009f24bf71ccb4c9e8b40a1d46cbbb7bee0c"

PV = "${RPIFW_DATE}"

次のファイルを更新してください:

b2qt/sources/meta-raspberrypi/recipes-kernel/linux-firmware-rpidistro/linux-firmware-rpidistro_git.bb

既存のコンテンツをすべて削除し、以下を貼り付けます:

SUMMARY = "Linux kernel firmware files from Raspbian distribution"
DESCRIPTION = "Updated firmware files for RaspberryPi hardware. \
RPi-Distro obtains these directly from Cypress; they are not submitted \
to linux-firmware for general use."
HOMEPAGE = "https://github.com/RPi-Distro/firmware-nonfree"
SECTION = "kernel"

# In maintained upstream linux-firmware:
# * brcmfmac43430-sdio falls under LICENSE.cypress
# * brcmfmac43455-sdio falls under LICENSE.broadcom_bcm43xx
# * brcmfmac43456-sdio falls under LICENSE.broadcom_bcm43xx
#
# It is likely[^1] that both of these should be under LICENSE.cypress.
# Further, at this time the text of LICENSE.broadcom_bcm43xx is the same
# in linux-firmware and RPi-Distro/firmware-nonfree, but this may
# change.
#
# Rather than make assumptions about what's supposed to be what, we'll
# use the license implied by the source of these files, named to avoid
# conflicts with linux-firmware.
#
# [^1]: https://github.com/RPi-Distro/bluez-firmware/issues/1
LICENSE = "\
    Firmware-broadcom_bcm43xx-rpidistro \
"
LIC_FILES_CHKSUM = "\
    file://debian/config/brcm80211/LICENSE;md5=8cba1397cda6386db37210439a0da3eb \
"

# These are not common licenses, set NO_GENERIC_LICENSE for them
# so that the license files will be copied from fetched source
NO_GENERIC_LICENSE[Firmware-broadcom_bcm43xx-rpidistro] = "debian/config/brcm80211/LICENSE"

SRC_URI = "git://github.com/RPi-Distro/firmware-nonfree;branch=bullseye;protocol=https"

SRCREV = "b3eec612566ca08913f0830d299f4df70297428f"
PV = "20210315-3+rpt4"

S = "${WORKDIR}/git"

inherit allarch

CLEANBROKEN = "1"

do_compile() {
    :
}

do_install() {
    install -d ${D}${nonarch_base_libdir}/firmware/brcm ${D}${nonarch_base_libdir}/firmware/cypress

    cp debian/config/brcm80211/LICENSE ${D}${nonarch_base_libdir}/firmware/LICENSE.broadcom_bcm43xx-rpidistro

    # Replace outdated linux-firmware files with updated ones from
    # raspbian firmware-nonfree. Raspbian adds blobs and nvram
    # definitions that are also necessary so copy those too.
    for fw in brcmfmac43430-sdio brcmfmac43436-sdio brcmfmac43436s-sdio brcmfmac43455-sdio brcmfmac43456-sdio ; do
        cp -R --no-dereference --preserve=mode,links -v debian/config/brcm80211/brcm/${fw}.* ${D}${nonarch_base_libdir}/firmware/brcm/
    done
    cp -R --no-dereference --preserve=mode,links -v debian/config/brcm80211/cypress/* ${D}${nonarch_base_libdir}/firmware/cypress/
    # add compat links. Fixes errors like
    # brcmfmac mmc1:0001:1: Direct firmware load for brcm/brcmfmac43455-sdio.raspberrypi,4-model-compute-module.txt failed with error -2
    ln -s brcmfmac43455-sdio.txt ${D}${nonarch_base_libdir}/firmware/brcm/brcmfmac43455-sdio.raspberrypi,4-compute-module.txt
}

PACKAGES = "\
    ${PN}-broadcom-license \
    ${PN}-bcm43430 \
    ${PN}-bcm43455 \
    ${PN}-bcm43456 \
    ${PN}-bcm43436 \
    ${PN}-bcm43436s \
"

LICENSE_${PN}-bcm43430 = "Firmware-broadcom_bcm43xx-rpidistro"
LICENSE_${PN}-bcm43436 = "Firmware-broadcom_bcm43xx-rpidistro"
LICENSE_${PN}-bcm43436s = "Firmware-broadcom_bcm43xx-rpidistro"
LICENSE_${PN}-bcm43455 = "Firmware-broadcom_bcm43xx-rpidistro"
LICENSE_${PN}-bcm43456 = "Firmware-broadcom_bcm43xx-rpidistro"
LICENSE_${PN}-broadcom-license = "Firmware-broadcom_bcm43xx-rpidistro"
FILES_${PN}-broadcom-license = "${nonarch_base_libdir}/firmware/LICENSE.broadcom_bcm43xx-rpidistro"
FILES_${PN}-bcm43430 = "${nonarch_base_libdir}/firmware/brcm/brcmfmac43430* ${nonarch_base_libdir}/firmware/cypress/cyfmac43430-sdio.bin"
FILES_${PN}-bcm43436 = "${nonarch_base_libdir}/firmware/brcm/brcmfmac43436-*"
FILES_${PN}-bcm43436s = "${nonarch_base_libdir}/firmware/brcm/brcmfmac43436s*"
FILES_${PN}-bcm43455 = "${nonarch_base_libdir}/firmware/brcm/brcmfmac43455* ${nonarch_base_libdir}/firmware/cypress/cyfmac43455-sdio.*"
FILES_${PN}-bcm43456 = "${nonarch_base_libdir}/firmware/brcm/brcmfmac43456*"
RDEPENDS_${PN}-bcm43430 += "${PN}-broadcom-license"
RDEPENDS_${PN}-bcm43436 += "${PN}-broadcom-license"
RDEPENDS_${PN}-bcm43436s += "${PN}-broadcom-license"
RDEPENDS_${PN}-bcm43455 += "${PN}-broadcom-license"
RDEPENDS_${PN}-bcm43456 += "${PN}-broadcom-license"
RCONFLICTS_${PN}-bcm43430 = "\
    linux-firmware-bcm43430 \
    linux-firmware-raspbian-bcm43430 \
"

RREPLACES_${PN}-bcm43430 = "\
    linux-firmware-bcm43430 \
    linux-firmware-raspbian-bcm43430 \
"

RCONFLICTS_${PN}-bcm43436 = "\
    linux-firmware-bcm43436 \
    linux-firmware-raspbian-bcm43436 \
"

RREPLACES_${PN}-bcm43436 = "\
    linux-firmware-bcm43436 \
    linux-firmware-raspbian-bcm43436 \
"

RCONFLICTS_${PN}-bcm43436s = "\
    linux-firmware-bcm43436s \
    linux-firmware-raspbian-bcm43436s \
"

RREPLACES_${PN}-bcm43436s = "\
    linux-firmware-bcm43436s \
    linux-firmware-raspbian-bcm43436s \
"

RCONFLICTS_${PN}-bcm43455 = "\
    linux-firmware-bcm43455 \
    linux-firmware-raspbian-bcm43455 \
"
RREPLACES_${PN}-bcm43455 = "\
    linux-firmware-bcm43455 \
    linux-firmware-raspbian-bcm43455 \
"
RCONFLICTS_${PN}-bcm43456 = "\
    linux-firmware-bcm43456 \
    linux-firmware-raspbian-bcm43456 \
"
RREPLACES_${PN}-bcm43456 = "\
    linux-firmware-bcm43456 \
    linux-firmware-raspbian-bcm43456 \
"

# Firmware files are generally not run on the CPU, so they can be
# allarch despite being architecture specific
INSANE_SKIP = "arch"

両方のレシピは、meta-raspberry の最新のマスター ブランチからのものです。 レイヤーですが、最後のファイルにはコロンがあります (: ) アンダースコアに置き換えます (_ )、以前の yocto バージョンはコロンをサポートしていないため (:) ).

冒頭で述べたように、Qt5.15 の商用 LTS バージョンの料金を支払うと、これらの問題は解決されます。職場ではそのライセンスを持っていますが、明らかに商用の boot2qt 5.15 ソース コードを見ていません。 、これらのエラーを修正するために、私の一般的なトラブルシューティングの知識を適用しました。フォントの修正は、qt サイトと start4x.elf で公開されています。 問題は meta-raspberry からのものです boot2qt レイヤーではありません。この問題は、ネットワーク ブートもサポートするブートローダーを試していたことが原因である可能性もあります。