Yocto boot2qt für den Raspberry Pi 4, sowohl Qt 5.15 als auch 6.2

 C Programming >> C-Programmierung >  >> Tags >> Qt
Yocto boot2qt für den Raspberry Pi 4, sowohl Qt 5.15 als auch 6.2

In dieser Anleitung erstellen wir eine Linux-Distribution für Raspberry Pi 4 mit dem Yocto-Projekt und dem boot2qt Stack bereitgestellt von Qt. Diese boot2qt Image kann auf eine SD-Karte geschrieben werden, und beim Hochfahren führt der Raspberry Pi einen Software-Stack aus, der sich gut in Qt Creator (die Qt-IDE) integriert, z. B. Bereitstellung mit einem Klick auf dem Gerät. Sie können Ihre eigene Qt-Anwendung auf dem Pi im Vollbildmodus ausführen, sie bootet direkt hinein. Dieses Handbuch behandelt sowohl Qt 5.15 als auch Qt 6.2. Der 5.15-Build-Prozess ist aufgrund einiger Upstream-Probleme etwas kompliziert. Die Anleitung behandelt auch das Ändern der Standardstart-App in Ihre eigene App und die Qt Creator-Integration.

Wir landen bei boot2qt image für den Raspberry Pi 4. Ich habe hier ein 8-GB-Modell, aber es funktioniert genauso gut mit weniger RAM. Dieses Handbuch behandelt auch das QtCreator-Kit und die spätere Geräteeinrichtung.

Hier ist ein Video, in dem boot2qt direkt in meine benutzerdefinierte Qt-App bootet:

Wenn ein Schritt für eine bestimmte Qt-Version gilt, wird dies erwähnt. Ansonsten gilt der Schritt für beide Versionen.

Diese Anleitung gilt für den Raspberry Pi 4, sollte aber für alle anderen von Qt unterstützten Raspberry Pi-Modelle funktionieren. Ersetzen Sie die MACHINE später mit einem anderen Modell variabel.

Was ist yocto, was ist boot2qt

Es gibt viel zu tun, wenn Sie mit dem Yoctoproject nicht vertraut sind, hier ist eine schnelle, vereinfachte , Übersicht aller Begriffe.

Yocto ist ein Open-Source-Projekt, das ein Build-Framework und Metadaten bereitstellt, mit denen Sie ein benutzerdefiniertes Image für Ihr Zielboard erstellen können. Yocto verwendet sogenannte(Meta)Layer und Rezepte. Rezepte sind .bb (für Bitbake) Dateien, die Bauanweisungen und Ebenen enthalten, sind eine Sammlung spezifischer Rezepte, Klassen und Konfigurationsdateien. Sie könnten eine Ebene mit dem Namen meta-raspberry haben (Alle Ebenen beginnen per Konvention mit meta- ) mit Rezepten, die nur für den Raspberry Pi gelten.

Yocto hilft Ihnen dabei, eine Linux-Distribution zu erstellen, deren Referenzdistro heißt poky . Das primäre Build-Tool ist ein Python-Befehlszeilentool namens bitbake .Es analysiert alle Rezepte und sammelt dann nacheinander den Quellcode, kompiliert die gesamte Software und packt diese dann in ein Image für Ihr Board.

Yocto richtet sich an eingebettete Linux-Geräte, bei der Arbeit verwenden wir es, um unsere eigene Linux-Distribution (nicht boot2qt) zu erstellen, die auf den Kaffeemaschinen läuft. Viele verschiedene Boards werden unterstützt, die meisten Hersteller bieten ein sogenanntes Boardsupport Package (bsp) an. Oft enthält diese einen Kernel und Treiber für Ihr Board. Es gibt ein Board Support Package für den Raspberry Pi, das wir verwenden werden.

boot2qt ist eine Reihe von Schichten für Yocto, die ein einfaches Linux-System aufbauen, das ohne Desktop direkt in eine Qt-Anwendung startet. Es erstellt auch ein Cross-Compile-SDK für Ihren Desktop, das Sie in Qt Creator verwenden können, um Ihre Anwendung für das Zielgerät zu cross-kompilieren. Oft hat das Gerät, für das Sie entwickeln, nicht die gleiche CPU-Architektur wie Ihre Desktop-Workstation. Um das Ganze abzurunden, lässt es sich auch in Qt Creator integrieren, sodass Sie Ihre Anwendung mit einem Klick über das Netzwerk auf Ihrem Gerät bereitstellen und ausführen können.

Alle drei Teile ersparen Ihnen eine Menge Arbeit. Da wir unseren eigenen Yoctobuild haben, weiß ich, was für eine Arbeit das bedeutet, der boot2qt-Stack spart so viel Zeit, solange Ihr Board unterstützt wird. Sie können die Liste der Boards hier für Qt 5.15 und hier für Qt 6.2 sehen.

boot2qt Stellen Sie auch eine Reihe von Skripten bereit, um den yocto zu erstellen Setup sehr einfach, daher ist der Prozess, den Sie in dieser Anleitung sehen, nicht derselbe wie ein standardmäßiger yocto Konfiguration. Es ist speziell für boot2qt und für den Raspberry Pi 4.

Zusammenfassend also boot2qt bietet eine Ebene auf Yocto, die die Integration zwischen Ihrem eingebetteten Linux-Gerät und der Qt-Tool-Suite hinzufügt und so eine Menge Zeit bei manueller Arbeit spart.

Entwicklungshost

Die Maschine, die Ihren boot2qt bauen wird image (der Host, der bitbake ausführt ) benötigt ein paar Pakete, bevor wir mit dem Bau beginnen können. Sie benötigen mindestens 50 GB freien Speicherplatz, aber mein Host hat 300 GB. Das Cross-Compilieren aller Pakete nimmt sehr viel Zeit in Anspruch. Je mehr Kerne und RAM Sie haben, desto besser. Meine Test-Build-Maschine hat 4 Kerne und 8 GB RAM, der gesamte Imagebuild dauerte ganze 3 Tage. Auf der Arbeit haben wir ein paar bullige Server, dort dauert der Aufbau ca. 2 Stunden. Yocto unterstützt inkrementelle Builds. Wenn Sie also ein Rezept ändern, muss nur dieser Teil neu erstellt werden, nicht alle anderen Teile.

Auf meiner Build-Maschine läuft Ubuntu 20.04 für den Qt 5.15-Build und Debian 11 für den Qt 6-Build. Installieren Sie zuerst die erforderlichen Pakete:

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

Dies sind etwas mehr Pakete als die Qt-Site empfiehlt, ich hatte Build-Probleme beim Erstellen von qbsp Schicht, aus der die meisten zusätzlichen Pakete kommen.

Als nächstes benötigen Sie repo , ein Git-Verwaltungstool von Google. Es verbirgt den größten Teil der Komplexität von Submodulen und verschiedenen Repos, indem alle diese zusätzlichen Informationen in einer Manifestdatei abgelegt werden. Sie können es mit apt installieren:

apt install repo

Wenn es sich nicht im Repository befindet, überprüfen Sie die Anweisungen. Der Installationsprozess ist nur eine einfache Kopie einer ausführbaren Datei.

Erstellen Sie einen Ordner, in dem sich alles von yocto befindet:

mkdir b2qt
cd b2qt

Verwenden Sie den repo Tool zum Klonen aller Git-Repositories des Yocto-Projekts und boot2qt auf einmal. Zuerst für die richtige Qt-Version initialisieren:

# 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

Synchronisieren Sie dann die Repositories:

repo sync

Sie müssen angeben, für welches Board Sie bauen möchten, und dann das Quellenaskript:

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

Dieser Schritt muss bei jedem Login wiederholt werden .

Ausgabe:

### 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/

Sie sollten sich jetzt in einem Ordner namens build-raspberrypi4 befinden . Verwenden Sie den repo Tool und Beschaffung dieses Skripts hat eine raffinierte Ordnerstruktur für yocto erstellt:

  • build-$boardname :Build-Verzeichnis für das Board, Sie befinden sich in diesem Ordner, nachdem Sie den setup-environment.sh bezogen haben Datei.
  • sources :hat alle bitbake Schichten und Rezepte
  • download :Ordner, in dem der gesamte Quellcode heruntergeladen wird (Git-Repos, tar.gz-Archive)

Im build-* Verzeichnis gibt es einen conf Ordner, der zwei wichtige Dateien enthält. bblayers.conf und local.conf . Ich hatte Probleme mit oom-killer beim Erstellen des Bildes die do_compile von qtwebengine stürzte immer wieder ab (getötet). Ich musste die folgenden Variablen auf 1 setzen , um den Buildpass zu erstellen:

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

Dies liegt wahrscheinlich an meiner begrenzten Hardware für den Build-Rechner, aber wenn Sie während eines Builds Probleme mit dem Killer wegen Speichermangels haben, wissen Sie, wo Sie suchen müssen.

Sie sind jetzt eingerichtet. Ich empfehle Ihnen, ein screen zu starten oder tmux Sitzung, da der Build sehr lange dauern wird.

Boot2qt erstellen

Für Qt 6 läuft der folgende Schritt ohne Probleme, für Qt 5 müssen Sie einige manuelle Patches durchführen. Die Patches, die ich machen musste, sind am Ende dieses Artikels. Wenn Sie für Qt 5.15 LTS bezahlen, haben Sie keine Probleme. Die letzte Open-Source-Version von Qt 5 ist derzeit 5.15.2 und die kommerzielle Version ist 5.15.8. In der kommerziellen Version sind diese Probleme behoben, in der Open-Source-Version müssen wir einige Rezepte selbst bearbeiten und neuere Firmware herunterladen.

Der folgende Befehl erstellt den vollständigen boot2qt image (und alle Pakete), die Sie auf eine SD-Karte flashen können:

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

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

Der Build-Prozess dauert lange, da er den gesamten Quellcode kompiliert. Die Ausgabe ist wie folgt für 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)

Am Ende der Ausgabe sehen Sie verschiedene Aufgaben, die ausgeführt werden, es könnte ein do_fetch sein (Quelle herunterladen), do_compile (Querkompilieren des Codes) oder ado_package (ein Paket erstellen) oder ein paar andere do_* Schritte.

Sie sehen, dass es fast 7000 sind Aufgaben, also wird es wieder viel Zeit in Anspruch nehmen. Überprüfen Sie regelmäßig, da Änderungen dazu führen, dass Ihr Build fehlschlägt. Yocto-Fehlermeldungen werden einschließlich Protokolldateien gelöscht.

Für Qt 6.2 sieht die Ausgabe wie folgt aus:

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)

Noch mehr Aufgaben, It's Over 9000!.

Wie in der Einleitung erwähnt, hatte ich Probleme beim Kompilieren von Qt WebEngine, die durch die Verwendung weniger gleichzeitiger Kerne gelöst wurden. Für Qt 5.15.2 gab es weitere Probleme, aber diese Korrekturen finden Sie weiter unten auf dieser Seite. Wenn alles aufgebaut ist, fahren Sie mit dem nächsten Absatz fort, in dem es um das Flashen des Bildes geht.

Flashen des Yocto-Image

Sobald der Yocto-Build abgeschlossen ist, sollten Sie eine Image-Datei haben, die Sie auf eine SD-Karte flashen können, um den Raspberry Pi zu booten. Yocto generiert viele weitere Dateien, Pakete für jede einzelne Software, Hilfsdateien wie Gerätebäume und ein paar andere Dateien, im Moment interessiert uns nur die Bilddatei.

Die beiden unterschiedlichen boot2qt Versionen (Qt 5 und Qt 6) erstellen eine andere Bilddatei. Qt 5 hat ein Bild, das Sie einfach dd können auf eine SD-Karte laden und booten, Qt 6 hat einen bmap Datei. bmap ist ein spezielles Format, das schneller zu flashen sein soll und Daten während des Flashens verifiziert, das ursprünglich von Intel für ihr Tizen-Projekt erstellt wurde.

Für Qt 5 erhalten Sie Folgendes in b2qt/build-raspberrypi4/tmp/deploy/images/raspberrypi4 Ordner:

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

Ausgabe:

-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

Die letzte Datei, die *-sdimg Datei, kann mit dd auf Ihre SD-Karte geflasht werden :

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

Ich verwende einen externen SD-Kartenleser, wenn Sie einen eingebauten Leser haben, sollten Sie wahrscheinlich of=/dev/mmcblk0 verwenden als Ausgabegerät, nicht /dev/sdX . Beachten Sie, dass die Bilddatei ein Datum hat, und Sie sollten den Dateinamen in meinem Beispiel durch den Namen Ihrer Build-Ausgabedatei ersetzen.

Für Qt 6 haben Sie einen bmap Bilddatei Datei:

-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

Wenn Sie Ubuntu ausführen, müssen Sie bmap-tools installieren Paket und verwenden Sie den folgenden Befehl, um das Image auf die SD-Karte zu flashen:

$ 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'

Wenn Sie den bmap nicht haben Paket, extrahieren Sie einfach den *.rootfs.wic.bz2 Datei und verwenden Sie dd um es auf Ihre SD-Karte zu schreiben. Dauert etwas länger und es fehlt die Validierung geschriebener Daten, funktioniert aber genauso gut.

Einmal auf die SD-Karte geschrieben, stecken Sie sie in Ihren Raspberry Pi und booten Sie. Nach einer kurzen Startsequenz sollten Sie mit einem netten Boot 2 Qt-Bildschirm begrüßt werden.

Bei Qt 6 wird die IP-Adresse auf dem Bildschirm ausgedruckt. Sie können mit dem Benutzernamen root eine SSH-Verbindung zu dieser IP herstellen und kein Passwort. Wenn alles gut gegangen ist, sollten Sie mit einem Shell-Prompt begrüßt werden. Wenn ja, fahren Sie mit der Qt Creator-Integration fort. Im Fall von Qt 5 können Sie sofort einige Demoanwendungen ausführen.

Qt Creator-Integration

Ein großer Vorteil von boot2qt ist die Integration mit den anderen Qt-Tools, wie dem IDE Qt Creator.

Qt Creator hat das Konzept von Kits, das im Grunde eine Compilerkonfiguration ist. Sie können mehrere Versionen von Qt oder GCC (oder CLANG) installiert haben, und innerhalb eines Kits teilen Sie Qt Creator mit, welche spezifischen Versionen verwendet werden sollen. Ich habe spezielle Kits für Qt 5.15, sowohl für Android als auch für Desktop-Linux, und für Qt 6.2. Ich habe auch ein Cross-Compiler-Kit installiert, mit dem ich von meinem x86-Desktop aus für den Raspberry Pi kompilieren kann.

Yocto kann ein natives SDK erstellen, das alle erforderlichen Kompilierungstools für Ihre spezifische Umgebung enthält. boot2qt erweitert dies, es enthält auch den gesamten Qtstack im Cross-Compile-SDK und einige Hilfsskripte.

Die Schritte zum Integrieren Ihres Geräts in Qt Creator sind:

  • Erstellen Sie das Cross-Compile-SDK
  • Installieren Sie das Cross-Compile-SDK
  • Fügen Sie das SDK als Kit zu Qt Creator hinzu
  • Klonen Sie dieses Kit und richten Sie es richtig ein
  • Fügen Sie ein Remote-Gerät hinzu (Ihr Pi)
  • Aktualisieren Sie das Kit, um es auf dem Gerät bereitzustellen
  • Fügen Sie das Kit zu Ihrem Projekt hinzu

Viele bewegliche Teile, aber sobald Sie alles eingerichtet und ausgeführt haben, ist es ein Kinderspiel. Qt Creator kompiliert Ihre App cross-kompiliert und kopiert sie direkt auf Ihr Gerät, ohne manuelle Aufgaben.

Erstellen des Cross-Compile-SDK

Sie müssen das SDK erstellen, bevor Sie es verwenden können, es wird nicht automatisch erstellt, wenn Sie das Boot-Image erstellen. Stellen Sie sicher, dass Sie sich im b2qt befinden Ordner und haben die Umgebung eingerichtet:

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

Führen Sie den Bitbake-Befehl aus, um das SDK zu erstellen:

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

Der Build kann je nach den Spezifikationen Ihres Hostcomputers einige Stunden dauern. Nicht so lange wie das gesamte Bild aufzubauen, aber immer noch eine ganze Weile. Die Ausgabe sieht der früheren Ausgabe, die Sie beim Erstellen des Bildes gesehen haben, sehr ähnlich:

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)

Sobald der Build abgeschlossen ist, haben Sie ein installierbares Shell-Skript im tmp/deploy/sdk Ordner:

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

Sie können b2qt-x86_64-meta-toolchain-b2qt-embedded-qt6-sdk-raspberrypi4.sh ausführen Datei, um das SDK auf Ihrem lokalen Rechner zu installieren:

$ ./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

Der Build-Befehl für Qt 5 lautet:

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

Die Ausgabe ist fast identisch, und sobald dieser Build fertig ist, haben Sie das Installationsprogramm im selben Ordner, 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

Dieses Skript kann genauso wie das von Qt 6 installiert werden, es gibt keine Problemumgehungen oder Probleme:

$ ./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

Kit in Qt Creator hinzufügen

Das Konfigurieren von Kits in Qt Creator ist ein langwieriger Prozess, aber boot2qt stellt auch ein Skript bereit, um diesen Teil etwas einfacher zu machen. Sobald Sie das nativeSDK installiert haben, können Sie den configure-qtcreator.sh verwenden Skript, um ein Kit hinzuzufügen. Schließen Sie zuerst Qt Creator und führen Sie dann das Skript aus:

/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 :verweist auf die Datei, die der SDK-Installer Ihnen als Quelle mitteilt.
  • --qtcreator :zeigt auf den Ordner, in dem QtCreator installiert ist. Ich habe es auf einer zusätzlichen Festplatte, mein Pfad ist anders
  • --name :der Name des Kits

Sie können dieses Kit später nicht mehr bearbeiten, deshalb habe ich -template hinzugefügt zum Namen. Wir können Änderungen vornehmen, aber das Kit muss zuerst geklont werden.

Ausgabe:

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

Starten Sie Qt Creator, navigieren Sie zu Preferences , dann Kits . Sie sollten das neue Kit sehen, klicken Sie auf Clone Schaltfläche:

Die wichtigste zu ändernde Einstellung ist Qt Version . Ich bin mir nicht sicher, warum es es nicht erkannt hat, aber für mich wurde None angezeigt . Wählen Sie im Dropdown-Menü die richtige Qt-Version aus. Wenn Sie sich nicht sicher sind, welchen Sie verwenden sollen, wechseln Sie zu Qt Versions Registerkarte und überprüfen Sie, welche Sie benötigen. Hier ist ein Bild der Einstellungen, die ich habe:

Sie können dieses Kit jetzt für Ihr eigenes Projekt konfigurieren, aber bevor wir das tun, fügen Sie Ihren Pi hinzu (indem Sie die Datei boot2qt ausführen). image) als Remotegerät zum Bereitstellen.

Hinzufügen eines Remote-Geräts

Auch in den Einstellungen unter Devices . Klicken Sie auf Add Taste. Fügen Sie Generic Linux Device hinzu mit den folgenden Einstellungen, aber ersetzen Sie die IP durch die IP Ihres Boards:

Der boot2qt Der Benutzername von image ist root und es gibt kein Passwort. Sie können einen öffentlichen Schlüssel bereitstellen, dies ist jedoch nicht erforderlich. Sobald Ihr Gerät hinzugefügt wurde, verwenden Sie die Schaltfläche Test, um sicherzustellen, dass alles funktioniert.

Gehen Sie zurück zu den Kit-Einstellungen und wählen Sie dieses Gerät unter Device aus herunterfallen.

Nachdem Sie das Gerät zum Kit hinzugefügt haben, können Sie das Kit für Ihr Projekt konfigurieren. Öffnen Sie Ihr Projekt und klicken Sie auf Project Schaltfläche im Menü auf der linken Seite. Fügen Sie das neue Kit hinzu, indem Sie darauf klicken, und erstellen Sie dann Ihr Projekt. Die Compiler-Ausgabe sollte den Pfad zum Yocto SDK anstelle Ihres regulären Compilers anzeigen:

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

Bereitstellung mit einem Klick

Die Qt-Dokumentation listet eine der Optionen unter Run auf Schritt des Kits als Change Default App , aber ich habe diese Option nicht, wahrscheinlich weil ich qbsp nicht installiert habe Paket. Dies ist jedoch kein großes Problem, da wir Qt Creator den richtigen Befehl einfach per Hand mitteilen können.

Unter dem Run überprüfen Sie die Alternate executable on device und ändern Sie den Pfad zu /usr/bin/appcontroller . Fügen Sie den vollständigen Pfad Ihrer App zu Command Line Arguments hinzu Textfeld, wie im Bild unten. Der vollständige Pfad zu Ihrer App wird im selben Einstellungsdialog aufgeführt:

Bei der nächsten Bereitstellung werden alle laufenden Instanzen von appcontroller beendet und starten Sie es mit Ihrer Anwendung als Befehlszeilenargument, wodurch Ihre App effektiv auf dem Gerät bereitgestellt wird.

Ändern der standardmäßigen boot2qt-Startanwendung in Yocto

Sie können die Standard-App ändern, die gestartet wird, sobald Ihr System mit dem folgenden Befehl ausgeführt wird:

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

Was das tut, ist nicht viel mehr als einen Symlink zu /usr/bin/b2qt zu erstellen .

Möglicherweise möchten Sie Ihre App jedoch in das Image backen. Dies ist ein schneller kurzer Abschnitt, um Ihre eigene Ebene und Ihr eigenes Rezept zu erstellen und dieses Rezept in das Bild einzufügen, indem Sie das Qt-Bild erweitern. Wir tun dies, indem wir ein Rezept erstellen, das Ihre Binärdatei im Dateisystem und Symlinksit platziert und das Standard-Image erweitert.

Wenn Sie vorhaben, Produktionsimages über dieses Handbuch zu versenden, denken Sie daran, dass dies ein Entwicklungsimage ist, SSH weit offen ist und im Image noch viel übrig ist, um korrekt eingerichtet zu werden. Bitte tauchen Sie ein bisschen mehr in Yocto ein, um mehr darüber zu erfahren.

Erstellen Sie zunächst einige Ordner für Ihre Ebene im b2qt Ordner:

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

Bearbeiten Sie die folgende Datei:

sources/meta-raymii/conf/layer.conf

Platzieren Sie den folgenden Inhalt:

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"

Bearbeiten Sie als Nächstes die folgende Datei, die das Rezept Ihrer App ist:

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

Das Dateinamenformat (myapp underscore versionMajor.versionMinor ) ist wichtig. Verwechseln Sie nicht den underscore für einen dash . Eine neuere Version Ihrer App könnte myapp_1.1.bb heißen , oder Sie könnten die PR="r0" erhöhen für eine Nebenversion.

Inhalt:

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 \
              "

Dieses Rezept kopiert Ihre App mit den richtigen Berechtigungen an die richtige Stelle und erstellt einen Symlink (lnr ) bis /usr/bin/b2qt . Die DEPENDS line stellt sicher, dass die relevanten Qt-Teile installiert sind. Mit boot2qt Das ist der Fall, aber wenn Sie diese Zeile weglassen, erhalten Sie einen Build-Fehler, da Yocto intelligent genug ist, um Ihre ausführbare Programmdatei zu scannen.

Stellen Sie sicher, dass die cross-kompilierte Version Ihres Programms in files Ordner:

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

Fügen Sie die Ebene zur Yocto-Build-Konfiguration hinzu:

build-raspberrypi4/conf/bblayers.conf

Vergessen Sie unten nicht den abschließenden Schrägstrich (\ ):

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

Die folgende Datei ist ein .bbappend -Datei, die, wenn sie den gleichen Namen, Pfad und die gleiche Version hat, wie zu erwarten etwas an das Original anhängt. In diesem Fall erweitern wir den Standardwert b2qt-embedded-qt6-image Bild, um unseren myapp einzufügen Rezept in der Installation. Dies gilt auch für Qt 5, ändern Sie einfach den Dateinamen entsprechend. Bearbeiten Sie diese Datei

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

Inhalt:

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

Wenn Sie alle oben genannten Schritte ausgeführt haben, erstellen Sie das Image neu (bitbake b2qt-embedded-qt6-image ) und flashen Sie es auf Ihre SD-Karte. Nach dem Hochfahren wird nun anstelle des Standardprogramms Ihr eigenes Programm gestartet.

Wenn Sie sicherstellen möchten, dass Sie sich auf dem richtigen Bild befinden, können Sie die Datei /etc/build überprüfen Einmal über SSH angemeldet, um die Ebenen und Git-Commits zu sehen, die zum Erstellen des Bildes verwendet wurden:

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

Die image-buildinfo Klasse schreibt Informationen in das Zieldateisystem und das Qt-Image hat diese Klasse standardmäßig aktiviert. Das Bild erbt meta-boot2qt/classes/deploy-buildinfo.bbclass die image-buildinfo erbt und erweitert es mit einigen Qt-Versionsinformationen.

Probleme mit Qt 5.15.2

Beim Erstellen von boot2qt für 5.15.2 sind einige Probleme aufgetaucht. Upstream-Git-Repositories ändern ihren Zweignamen, daher musste ich für die Schriftarten einige Rezepte für Schriftarten aktualisieren:

  • 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

Ändern Sie Folgendes:

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

Fügen Sie ;branch=main hinzu zum Ende:

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

Spülen und wiederholen Sie dies für alle anderen Schriftrezepte, die sich beschweren.

Mein Raspberry Pi 4b 8 GB konnte mit diesem Image nicht booten, der Bootloader beschwert sich mit folgendem Fehler:

start4x.elf is not compatible
This board requires newer software

Ich bin mir nicht sicher, ob dies spezifisch für die 8-GB-Version ist, ich habe nur einen Raspberry Pi 4, daher kann ich es nicht auf einem 4-GB-Modell testen. Versuchen Sie zuerst, das Image zu flashen, und aktualisieren Sie die folgenden Rezepte nur, wenn das gleiche Problem auftritt.

Es gibt zwei Rezepte, die Sie aktualisieren müssen, um eine neuere Firmware-Datei zu erhalten. In dem früheren Beispiel für die Yocto-Schicht, um die Standard-App zu ändern, habe ich Überschreibungen verwendet, aber in diesem Fall erzwinge ich brutal eine Lösung, indem ich andere Rezepte überschreibe. Nicht der schönste Weg, aber es funktioniert.

Aktualisieren Sie die folgende Datei:

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

Entfernen Sie alle vorhandenen Inhalte und fügen Sie Folgendes ein:

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}"

Aktualisieren Sie die folgende Datei:

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

Entfernen Sie alle vorhandenen Inhalte und fügen Sie Folgendes ein:

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"

Beide Rezepte stammen aus dem neuesten Master-Zweig des meta-raspberry Schicht, aber die letzte Datei hat die Doppelpunkte (: ) durch Unterstriche ersetzt (_ ), da die ältere yocto-Version keine Doppelpunkte unterstützt (: ).

Wie in der Einleitung erwähnt, werden diese Probleme behoben, wenn Sie für die kommerzielle LTS-Version von Qt5.15 bezahlen. Auf der Arbeit haben wir diese Lizenz, aber ich habe den kommerziellen boot2qt 5.15-Quellcode ausdrücklich nicht angeschaut , habe nur mein allgemeines Wissen zur Fehlerbehebung angewendet, um diese Fehler zu beheben. Der Fonts-Fix ist öffentlich auf der qt-Site und im start4x.elf Ausgabe stammt von meta-raspberry Schicht, keine boot2qt-Schicht. Dieses Problem könnte auch daran liegen, dass ich mit einem Bootloader experimentiert habe, der auch das Booten über das Netzwerk unterstützt.