Yocto boot2qt für das Seeed reTerminal (Qt 6)

 C Programming >> C-Programmierung >  >> Tags >> Qt
Yocto boot2qt für das Seeed reTerminal (Qt 6)

In dieser Anleitung erstellen wir eine Linux-Distribution für Seeed reTerminal, indem wir das Yocto-Projekt und den boot2qt verwenden Stack bereitgestellt von Qt. Diese boot2qt Image kann auf das interne eMMC geschrieben werden und beim Hochfahren führt das Seeed reTerminal 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 reTerminal im Vollbildmodus ausführen, es wird direkt hineingebootet. Diese Anleitung behandelt Qt 6.2. Der Leitfaden behandelt auch das Ändern der Standardstart-App in Ihre eigene App, die Qt Creator-Integration und das Rotieren Ihrer Qt-App, sowohl Widgets als auch QML, letzteres über Wayland und Weston.

Der Hauptunterschied zwischen der von Seeed bereitgestellten Anleitung und dieser Anleitung besteht darin, dass diese Anleitung den eigenen boot2qt-Yocto-Stack von Qt verwendet und Qt 6 ausführt und hilft Ihnen beim Drehen.

Das Ausführen Ihrer eigenen Yocto-Distribution über das von Seeed bereitgestellte Standard-Debian-Image hat den Vorteil, dass es reproduzierbar ist und Sie die volle Kontrolle haben. Mit boot2qt Der Yocto-Stack macht den Einrichtungsprozess von Yocto viel einfacher und schneller. Durch die Verwendung Ihres eigenen Images wird keine andere Anwendung auf dem Gerät ausgeführt, sodass alle Ressourcen für Ihre App verfügbar sind. (Keine Desktop-Umgebung oder andere Software, es sei denn, Sie haben sie in das Image eingebaut.) Dies versichert Ihnen auch, dass Sie in Zukunft, sagen wir als Beispiel, 5 Jahre später, Ihr Image und Ihre Software immer noch erstellen können, da Ihr Yocto-Server erstellt wurde hat alle Quellen lokal.

Vollständige Offenlegung:Ich wurde von Seeed kontaktiert, sie schickten mir dieses reTerminal im Austausch für ein paar Artikel, dieser hier war der erste. Es ist keine Geldzahlung beteiligt und Seeed hat diesen Artikel vor der Veröffentlichung nicht überprüft. Für offiziellen Support besuchen Sie bitte das Seeed-Wiki.

Seeed hat mir tatsächlich 2 reTerminal-Einheiten geschickt. Der erste hatte einen festgefahrenen Boot-Modus-Schalter. Es bewegte sich nicht und brach später ab. Der Bootmodus-Schalter wird benötigt, um ein Image zu flashen, was für diese Yocto-Anleitung sehr wichtig ist. Ich habe sie kontaktiert und es wurde schnell ein Ersatzgerät geschickt. Seien Sie also vorsichtig mit Ihrem Boot-Modus-Schalter. Ich benutze jetzt eine Pinzette, um es zu wechseln, nur um besonders vorsichtig zu sein.

Änderungsprotokoll des Artikels:

  • 04-04-2022:Pfade in Shell-Befehlen korrigiert
  • 04-04-2022:Syntax in einigen Rezeptdateien korrigiert, einschließlich fehlender Schrägstriche
  • 04-04-2022:Hinweis bezüglich seeed-linux-dtoverlays hinzugefügt bei Commit 7c846e23de9346d318fbdc8ac92dcc72b90fb6ce
  • Danke an Ryan Bryngelson für die oben genannten Probleme und Korrekturen!

Was ist das reTerminal

Das reTerminal wird als zukunftsfähiges Human-Machine Interface (HMI) vermarktet. Das reTerminal wird von einem Raspberry Pi Compute Module 4 (cm4) angetrieben, das eine Quad-Core-ARM-Cortex-A72-CPU mit 1,5 GHz und einen kapazitiven 5-Zoll-IPS-Multitouch-Bildschirm mit einer Auflösung von 1280 x 720 ist. 4 GB RAM und 32 GB eMMC-Speicher sind integriert (nicht erweiterbar). Es verfügt über drahtlose Konnektivität mit Dualband-2,4-GHz-/5-GHz-Wi-Fi und Bluetooth 5.0 BLE.

Das reTerminal verfügt über eine Hochgeschwindigkeits-Erweiterungsschnittstelle und bietet viele I/O-Ports und Anschlüsse. Das Gerät verfügt über Sicherheitsfunktionen wie einen kryptografischen Co-Prozessor mit sicherer hardwarebasierter Schlüsselspeicherung. Es verfügt außerdem über integrierte Module wie Beschleunigungsmesser, Lichtsensor und Echtzeituhr. Das reTerminal verfügt über einen Gigabit-Ethernet-Port für schnellere Netzwerkverbindungen und über zwei USB 2.0 Type-A-Ports. Der 40-polige Raspberry Pi-kompatible GPIO-Header ermöglicht es den meisten oder allen Ihrer Hats und bestehenden Projekte, mit dem reTerminal zu arbeiten.

Sie können das reTerminal hier kaufen, der aktuelle Preis beträgt USD 195. Dazu gehört ein Rechenmodul 4.

Man könnte unverblümt sagen, dass das reTerminal eine Trägerplatine für das Compute Module 4 mit Multi-Touchscreen und praktischem Gehäuse ist. Meiner Meinung nach ist es viel mehr als das.

Zum Zeitpunkt des Schreibens dieses Artikels fehlt ein eingebauter Akku. Sie versorgen es über ein USB-Kabel oder indem Sie 5 V und Masse an die richtigen GPIO-Pins liefern.

Hinter einer kleinen Abdeckung befindet sich eine Hochgeschwindigkeitsschnittstelle, auf dem Bild oben mit Industrial High Speed Interface beschriftet . In den FAQ schreiben sie folgendes:

In Bezug auf die Hardware ist das reTerminal also solide und zukunftssicher. Wenn Sie eines kaufen, ist es mit einem vorinstallierten Compute Module und Raspbian einschließlich Treibern sowie einer Demoanwendung ausgestattet, sodass Sie sofort loslegen können. Hier gibt es keine chaotischen Lieferkettenprobleme, nur ein bisschen Wartezeit beim Versand eines Pakets aus China.

Was ist Yocto

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

Seeed hat hier eine eigene FAQ zu Yocto für das reTerminal . Diese FAQ behandelt die Grundlagen und enthält Tipps und Tricks zur Verwendung von Yocto. Ich empfehle Ihnen, auch diese Anleitung zu lesen, da sie verschiedene Teile erklärt. Meine Anleitung ist auf (Boot 2) Qt auf dem reTerminal zugeschnitten.

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 beim Erstellen einer Linux-Distribution, 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 zu erstellen (nicht boot2qt ) auf den Kaffeemaschinen laufen. 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. Für den Raspberry Pi gibt es ein Board Support Package, 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.

boot2qt stellt auch eine Reihe von Skripten bereit, um den yocto zu erstellen Die Einrichtung ist 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 das reTerminal.

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 Yocto-Setup

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 Image-Build dauerte mehr als 2 Tage. Auf der Arbeit haben wir ein paar bullige Server, da 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 Debian 11, aber Ubuntu 20.04 funktioniert bekanntermaßen auch. 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.

Google Repo

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.

Erste boot2qt-Einrichtung

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

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-64 && source ./setup-environment.sh 

Dieser Schritt muss bei jedem Login wiederholt werden .

Beachten Sie, dass wir raspberrypi-64 angeben . Dies liegt daran, dass reTerminal ein Raspberry Pi Compute Module 4 verwendet. Der meta-raspberry Layer verwendet diesen Namen sowohl für den regulären Pi 4 als auch für das Compute-Modul. Der Yocto-Layer von Seeed hat seit 3 ​​Tagen (zum Zeitpunkt des Schreibens) ein spezielles Board für das reTerminal, aber boot2qt hat keine Unterstützung dafür, also portieren wir in diesem Handbuch die spezifischen Anforderungen auf unser Build-Image.

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-64 befinden . Verwenden Sie den repo Tool und Beschaffung dieses Skripts hat eine raffinierte Ordnerstruktur für yocto erstellt:

  • build-raspberrypi4-64 :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 . Die erste definiert die Ebenen, die Ihr Build verwendet, und die zweite hat spezifische Konfigurationsoptionen für diesen spezifischen Build. Wir beginnen mit dem Hinzufügen der reTerminal-Schicht, die Konfigurationsdatei wird später behandelt.

Hinzufügen der Seeed-reTerminal-Schicht

Wir brauchen den reTerminal-Layer für den Gerätebaum und ein paar Treiber.

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

Ich habe diese Anleitung mit dem Commit 7c846e23de9346d318fbdc8ac92dcc72b90fb6ce getestet und mit Commit 57d1b68d73e625fe6a4cb14372a0cb7c42bae9c5 . Wenn die seeed-linux-dtoverlays Paket gibt einen Linker-Fehler wie unten aus:

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

Entfernen Sie dann ld-is-gold Option, die boot2qt distro.conf Datei aktiviert, wie wir es später in unserer lokalen Konfiguration tun:

DISTRO_FEATURES_remove = "ld-is-gold"

Ich habe dafür einen Upstream-Fehlerbericht erstellt. Wenn Sie Commit 7c846e23de9346d318fbdc8ac92dcc72b90fb6ce verwenden , der Fehler wird nicht angezeigt.

Sie müssen die Yocto-Version boot2qt hinzufügen verwendet, um die Schichtkonfiguration. Bearbeiten Sie die folgende Datei:

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

Fügen Sie hardknott hinzu zum LAYERSERIES_COMPAT Zeile:

LAYERSERIES_COMPAT_meta-reterminal = "honister hardknott"

Speichern und schließen. Wechseln Sie in unseren Build-Ordner:

cd ../build-raspberrypi4-64

Fügen Sie die Ebene zu unserer Konfiguration hinzu:

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

Erstellen unserer eigenen Ebene für b2qt-Bildüberschreibungen

Um einige Teile des Standardwertes b2qt-embedded-qt6-image zu überschreiben , müssen wir unsere eigene Ebene erstellen. Diese Ebene wird später weitere Anpassungen enthalten, aber für den ersten Build werden wir nur Teile des Bildes überschreiben. Warum überschreiben wir nicht einfach den Inhalt der Originaldatei? Durch die Verwendung eines .bbappend -Datei können wir unsere Änderungen getrennt halten, damit wir später wissen, was unsere spezifischen Änderungen sind. Es erleichtert auch das Anwenden von Upstream-Änderungen.

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

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"

Fügen Sie unseren Layer dem Yocto-Build für das reTerminal hinzu:

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

Nun zu den Änderungen am Standard boot2qt Bild. 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. Bearbeiten Sie diese Datei:

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

Fügen Sie Folgendes hinzu:

SUMMARY = "reTerminal changes for Qt image"

SPLASH = "psplash-raspberrypi"

IMAGE_FEATURES_append = " \
        splash \
        "

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

Wie Sie sehen können, beziehen sich die Änderungen auf das reTerminal-Image. Später werden wir unsere Anwendung hier hinzufügen, aber im Moment ist dies nur das Wesentliche, um ein bootfähiges Image zu erstellen.

Optimierung unseres local.conf für das reTerminal

Wir müssen der lokalen Konfigurationsdatei (conf/local.conf ). Alle diese haben mit der reTerminal-Hardware zu tun, mit Ausnahme der Entfernung von webengine . Wenn Ihre Qt-App eine Webengine verwendet, lassen Sie sie drin, andernfalls entfernen Sie sie. Wenn Sie es nicht einschließen, sparen Sie eine Menge Zeit beim Kompilieren und das Bild ist kleiner.

Die reTerminal-bezogenen Funktionen werden aus der offiziellen Schicht gezogen, aber für boot2qt geschwächt . Sie können den Backport hier sehen, eine ziemlich neue Hinzufügung zur reTerminal Yocto-Schicht, vor 3 Tagen, als Sie diesen Artikel geschrieben haben.

Der Unterschied zwischen local.conf und der b2qt-embedded-qt6-image.bbappend ist das local.conf ist nur für dieses Gerät. In meinem Fall habe ich auch einen raspberrypi4 machinebuild-Ordner für das Compute-Modul 4. Sie können auch Ihren eigenen distro.conf erstellen oder definieren Sie ein neues Gerät mit maschinenspezifischen Überschreibungen, aber für diesen Artikel local.conf ist einfach genug.

Bearbeiten Sie die folgende Datei:

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

Fügen Sie Folgendes hinzu:

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.%" 

Sie sind bereit für den ersten Build von boot2qt . Ich empfehle Ihnen, einen screen zu starten oder tmux Sitzung, da der Build lange dauern wird. Mein erster Build auf der zuvor beschriebenen Hardware dauerte mehr als 2 Tage.

Wenn Sie Commit 7c846e23de9346d318fbdc8ac92dcc72b90fb6ce verwenden , müssen Sie den MACHINE_EXTRA_RRECOMMENDS += "seeed-linux-dtoverlays" nicht hinzufügen . Die Gerätebaum-Overlays sind ein Patch in diesem Commit, später wurden sie zu einem Git-Submodul.

Bitbaking des Bildes

Mit boot2qt und dem reTerminal-Hardware-Layer-Setup können wir unseren ersten Build durchführen.

Stellen Sie sicher, dass Sie source haben -ed das Skript und befinden sich im richtigen Ordner:

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

Image-Erstellung starten:

bitbake b2qt-embedded-qt6-image

Die Ausgabe wird variieren. Zuerst listet es alle Ihre Ebenen und Konfigurationen auf, unten zeigt es die aktuelle Aufgabe. Beispielausgabe:

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)

Jetzt ist ein guter Zeitpunkt, um etwas anderes zu unternehmen und in ein paar Tagen wiederzukommen. Wenn Sie eine kräftige Maschine haben, wird der Build schneller sein, aber es wird immer noch eine Weile dauern.

Sobald der Build abgeschlossen ist, befindet sich das Bild im Ordner:

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

Das Bild ist ein 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. Wenn Sie Ubuntu ausführen, müssen Sie bmap-tools installieren Paket.

Flashen des Bildes

Da das reTerminal über ein Compute Module 4 mit eMMC verfügt, funktioniert der SD-Kartensteckplatz nicht. Sie müssen das Image mit einem vom Raspberry Pi bereitgestellten Tool auf den eMMC flashen. Dieses Tool heißt rpiboot , die Sie selbst bauen müssen. Beginnen Sie mit der Installation einer Abhängigkeit:

sudo apt install git libusb-1.0-0-dev

Als nächstes klonen Sie das Repo

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

Starten Sie den Erstellungsprozess:

make

Die oben genannten Schritte sind nur einmal. Sie haben jetzt den rpiboot Werkzeug in diesem Ordner. Jedes Mal, wenn Sie ein Image flashen, müssen Sie den folgenden Vorgang wiederholen.

Legen Sie den Startmodusschalter um. Seien Sie sehr vorsichtig, mein erstes Gerät hatte einen festgefahrenen Startmodusschalter. Ich benutze eine Pinzette, um den winzigen Schalter vorsichtig umzulegen.

Während man mit dem reTerminal rumspielt und ständig Bilder aufblitzt, empfehle ich das Gerät offen zu lassen, nicht die Kühlung oder die Plastikabdeckung zuzuschrauben. Auf diese Weise ist der Boot-Schalter leicht zugänglich. Mein Gerät wurde etwas heiß, aber nicht extrem.

Schließen Sie das USB-C-Kabel an und führen Sie rpiboot aus Dienstprogramm als root:

$ 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

Hängen Sie die Ordner aus, sonst schlägt das Flashen des Bildes fehl:

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

Flashen Sie das Image mit 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

Ausgabe:

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

Das Flashen dauert eine Weile, bei mir mit dem Standardbild dauert es etwa 5 Minuten. Der Dateiname des Bildes variiert, Datum und Uhrzeit sind darin enthalten. Schalten Sie den Startmodusschalter zurück (Vorsicht), entfernen Sie das USB-C-Stromkabel und stecken Sie es wieder ein.

Erster Start und eine kurze Zusammenfassung

Lehnen Sie sich zurück, entspannen Sie sich und genießen Sie das Booten Ihres eigenen, selbst erstellten Image. Gut gemacht!

Spielen Sie mit der Beispiel-App herum, Sie können auf "Mehr erfahren" klicken und ein wenig herumscrollen.

Möglicherweise stellen Sie fest, dass die Anwendung gedreht wird. Tatsächlich ist die Standardausrichtung des Bildschirms Hochformat, aber das Terminal ist Querformat. Die FAQ adressiert dies für Ubuntu und Debian, wir werden dies später beheben, wenn wir unsere eigene Qt-App bereitstellen. Die Lösung hängt davon ab, welche Art von Qt-App Sie ausführen möchten und ob Sie Zugriff auf den Quellcode dieser App haben.

Sie können auch ein Netzwerkkabel und ssh anschließen In das Gerät wird die IP-Adresse auf dem Bildschirm angezeigt.

Um zusammenzufassen, was Sie bereits erreicht haben:

  • Yocto installiert
  • boot2qt installiert stapeln
  • Anpassung von Yocto durch Erstellen Ihrer eigenen Ebene
  • ReTerminal-Hardwareschicht hinzugefügt
  • Erstellen Sie Ihr eigenes Bild
  • Auf das reTerminal geflasht.

Wenn Sie Änderungen an Yocto vornehmen, werden nachfolgende Builds schneller, da nur geänderte Dinge erneut ausgeführt werden müssen. Die Schritte, die Sie auf der Yoctoside immer ausführen müssen, sind:

  • cd b2qt/
  • export MACHINE=raspberrypi4-64 && source ./setup-environment.sh
  • (Änderungen vornehmen)
  • bitbake b2qt-embedded-qt6-image

Auf der reTerminal-Seite zum Flashen:

  • Drehen Sie die boot mode switch um und schließen Sie ein USB-C-Kabel an
  • ./rpiboot um das Image flashen zu können
  • 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
  • Stellen Sie den Startmodusschalter zurück
  • Entfernen Sie das Netzkabel und stecken Sie es wieder ein

Nachdem Sie Ihr Gerät eingerichtet haben, ist es an der Zeit, alle praktischen Funktionen zu nutzenboot2qt bietet uns vor allem die Integration mit der Qt IDE, Qt Creator. Es ermöglicht schnelles Entwickeln und Testen, direkt aus der IDE heraus können Sie es auf dem Gerät bereitstellen und Ihre Änderungen testen. Dieser Arbeitsablauf ist wirklich schön und schnell, einschließlich Debugging, Breakpoints usw.

Qt SDK- und Qt Creator-Integration

In meinem anderen Artikel über Yocto zum regulären Pi Compute Module 4 habe ich alle Schritte aufgeschrieben, die erforderlich sind, um das Qt SDK zu erstellen und es in Qt Creator zu integrieren. Da der Vorgang ziemlich lang ist, habe ich beschlossen, ihn hier nicht zu duplizieren, sondern Sie auf meine andere Anleitung zu verweisen, die voller Screenshots ist und den gesamten Vorgang erklärt.

Bitte lesen Sie diesen Artikel für die vollständige Anleitung. Das einzige, was sich ändert, ist der erste Befehl zu source der Setup-Datei exportieren wir den MACHINE Variable für die 64-Bit-Version, etwa so:

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

Als nächstes erstellen Sie das SDK, was eine Weile dauert:

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

Wenn Sie alle Schritte in meinem anderen Handbuch abgeschlossen haben, sollten Sie ein neues Qt-Kit in Qt Creator konfiguriert und ein neues Gerät zum Bereitstellen haben.

Ihre eigene App als Standard festlegen

Nachdem das Image nun funktioniert und Sie Ihre Qt-Integration eingerichtet haben, sollten Sie in der Lage sein, Ihre App über Qt Creator auf dem reTerminal auszuführen und bereitzustellen.

Wenn und nur wenn dies der Fall ist, fahren Sie mit der Anleitung fort. Wir werden den Standardwert b2qt ersetzen startupscreen App mit unserem eigenen kompilierten Programm.

In meinem Fall ist es eine Drag-and-Drop-Demo-App. Es wurde ein wenig modifiziert, um auch die aktuelle IP-Adresse anzuzeigen, was beim Debuggen auf dem Gerät nützlich ist.

Diese Demo-App ist cool, weil ich damit auch den Touchscreen überprüfen kann. Weiter unten in der Anleitung müssen bei einer Qt-Widgets-App die Drehung des Bildschirms und die Touchscreen-Drehung übereinstimmen, sonst wird die App gedreht, aber nicht die Berührung. Dann passieren sehr seltsame Dinge.

Erstellen Sie zunächst ein neues Rezept für Ihre App. Wir nennen es myapp für dieses Beispiel:

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

Im Ordner files/ wir gerade erstellt haben, platzieren Sie die kompilierte Binärdatei für Ihre App und nennen Sie sie myapp für dieses Anleitungsbeispiel. Stellen Sie sicher, dass die Architektur mit dem Pi 64-Bit-Build übereinstimmt:

$ 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

Erstellen Sie als nächstes die eigentliche Rezeptdatei mit dem Dateinamen myapp_1.0.bb (nicht im files Ordner, aber einen Ordner darüber). Der Unterstrich und die Versionsnummer sind wichtig, wenn Sie diese Zahl erhöhen, wird ein neues Paket von Yocto.Paste mit folgendem Inhalt gebaut:

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

Die Zeile, die mit lnr beginnt ersetzt den Build in b2qt startupscreen app (das ist ein symbolischer Link) zu Ihrer eigenen Anwendung. boot2qt wird mit einem simplelauncher ausgeliefert, der beim Booten den aktuellen Symlink bei /usr/bin/b2qt startet und es hat ein paar weitere Dienstprogramme (wie Start/Stopp oder das Ersetzen des Symlinks)

Fügen Sie den neuen myapp hinzu Rezept zu unserem benutzerdefinierten Bild .bbappend Datei:

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

Bearbeiten Sie IMAGE_INSTALL_append Abschnitt und fügen Sie myapp hinzu direkt über der kernel-modules Zeile:

        myapp \

Der gesamte Abschnitt sieht jetzt so aus:

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

Erstellen Sie nach den Änderungen ein neues Image:

bitbake b2qt-embedded-qt6-image

Flashen Sie das mit bmaptool wie oben beschrieben.

Weil wir an den Standard b2qt anhängen image, und weil wir unsere eigene Binärdatei neu symbolisieren, wo der b2qt Launcher es erwartet, sollte beim nächsten Booten nach dem Erstellen und Flashen eines Images Ihre eigene App starten.

Hier ist ein Bild meiner benutzerdefinierten App nach dem Start, immer noch falsch gedreht:

Wenn Sie eine neue Version Ihrer App hochladen möchten, ersetzen Sie den myapp binär im files Ordner und erhöhen Sie den PR = "r0" Zeile zu r1 . Dann bitbake ein neues Image und flashe es. Spülen und für jede Veröffentlichung wiederholen.

Wenn Sie eine neue Version nur testen möchten, können Sie auch bitbake myapp , dann erstellen Sie die App einfach ohne ein neues Image. Es wird einen neuen IPK geben Paket im tmp/deploy/ipk Ordner:

$ 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 diese Datei auf das Gerät übertragen und mit dem Paketmanager opkg installieren :

opkg install myapp_1.0-r2_cortexa72.ipk

Starten Sie dann entweder neu oder starten Sie startupscreen neu Dienst, um die neue App zu laden.

Wenn Sie jedoch nur neue Builds Ihrer App testen möchten, verwenden Sie die integrierte Qt Creator-Integration, die Sie zuvor eingerichtet haben. Funktioniert viel schneller und direkt von Qt Creator aus, einschließlich Remote-Debugging.

Rotation Ihrer App in b2qt

Die nächsten Abschnitte behandeln den Rotationsaspekt. Es unterscheidet sich für Qt-Widgets und Qt-QML-Apps und ist meiner Meinung nach ein großes Durcheinander. Die FAQ behandelt die Rotation und ich habe einen JapaneseSeeed-Blog gefunden, der die Rotation behandelt, aber das ist alles für den X11 Anzeigeserver.

boot2qt verwendet eglfs um Ihre App direkt auszuführen. EGLFS ist ein Plattform-Plug-in zum Ausführen von Qt-Anwendungen auf EGL und OpenGL ES 2.0, ohne ein tatsächliches Windowing-System wie X11 oder Wayland .

Mit eglfs , können Sie eine Umgebungsvariable festlegen, um Ihre Anwendung zu rotieren, aber das funktioniert nur, wenn Sie eine Qt-Widgets-App haben. Für eine QML-App müssen Sie entweder einen transform: Rotation {} hinzufügen zu Ihrem Programm oder führen Sie einen Anzeigeserver wie weston aus auf wayland und lassen Sie die Drehung behandeln. Wir behandeln alle Optionen in den nächsten Abschnitten, beginnend mit Qt-Widgets.

Qt-Widgets-Rotation

Die einfachste Option ist für eine Qt-Widget-Anwendung, Sie können 2 Umgebungsvariablen definieren, eine für die Rotation und eine für die Touchscreen-Rotation, das ist alles:

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

Warum verwendet man -90 und man verwendet 270 ? Denn als ich versuchte, 270 zu verwenden statt -90 , beim Start gab die App einen Fehler aus:Invalid rotation 270 specified in QT_QPA_EGLFS_ROTATION . Ich habe QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS versucht , aber das funktionierte nicht für die Touchscreen-Drehung.

Wie wenden wir das nun auf Yocto an? Es gibt eine Standard-QT-Umgebungsdatei in /etc/default/qt , die wir in unserem Yocto-Build überschreiben müssen. Erstellen Sie zunächst einen Ordner, in dem unser .bbappend überschrieben wird wird wohnen:

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

Kopieren Sie die Standardumgebungsdatei aus boot2qt Ebene in diesen Ordner:

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

Bearbeiten Sie defaults Datei:

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

Fügen Sie die beiden Zeilen unter den vorhandenen hinzu:

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

In meinem Fall werden die vom Benutzer programmierbaren Tasten nicht angezeigt, also ist der Touchscreen /dev/input/event0 . Es könnte event1 sein , aber Sie können dies mit evtest überprüfen Befehl:

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 ist der Touchscreen (tp steht für Touch-Panel).

Erstellen Sie einen .bbappend Datei, die das Standardrezept überschreibt:

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

Fügen Sie Folgendes hinzu:

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

Diese Zeile fügt den Ordner in unserer eigenen Ebene zum Paket hinzu, sodass nach den Dateien in diesem Ordner sowie im ursprünglichen Ordner gesucht wird. Ihr neuer Ordner wird zuerst überprüft. Das Yocto-Handbuch erklärt diese Variable und warum sie := verwendet ist wichtig.

Sie können überprüfen, ob Ihr .bbappend wird mit dem folgenden Befehl verwendet:

bitbake-layers show-appends default-qt-envs

Ausgabe:

=== 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 das Bild und flashen Sie es, jetzt sollte Ihre Qt-Widgets-App korrekt gedreht sein. Hier ist ein Bild der falsch gedrehten Beispiel-Qt-Widgets-Steuerungs-Demo-App:

Und hier ist die App mit den festgelegten Umgebungsvariablen, wie erwartet gedreht:

Qt-QML-Rotation

Bei einer QML-Anwendung ist die Drehung etwas schwieriger. Sie müssen entweder Änderungen am Quellcode vornehmen oder wayland verwenden und weston , ein Display-Manager und Server, die die Rotation handhaben. Die letztere Lösung ist nur, wenn Sie den Quellcode Ihrer Anwendung nicht ändern können.

Wenn Sie Ihren QML ändern können Quellcode, fügen Sie einen Rotation hinzu Umwandlung:

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

In diesem Fall gehe ich davon aus, dass die Drehung auf Ihrem Wurzelelement liegt. Nicht der Window , aber der Loader oder StackLayout , oder Rectangle im Fenster, was auch immer Ihr Wurzelelement ist.

Es sind keine Änderungen an der Umgebung erforderlich, laden Sie einfach eine neue Version Ihrer Anwendung wie oben beschrieben hoch.

Weston und Wayland

Wenn Sie Ihren Quellcode nicht ändern können, müssen Sie einen Display-Manager installieren. Wir verwenden Wayland und Weston, nicht X11 . Die Qt-Dokumentation enthält einen Artikel, der erklärt, warum nicht X11. Hier ist ein Zitat, das die wichtigen Bits zusammenfasst:

Qt hat auch einen Wayland Compositor, aber den werden wir nicht verwenden. Wir werden unseren myapp ausführen Programm als Client-Anwendung in Weston . Weston ist der Referenzkompositor, ähnlich wie der Fenstermanager in X11. Warum Westen? Es wird mit dem boot2qt ausgeliefert Yocto stapelt und kann ein Programm im Vollbildmodus ohne Dekorationen und Panels ausführen (unter Verwendung des kiosk Plugin).

Wir sind derzeit bei Weston Version 9. In Version 10 wird es Unterstützung für das Autostarten von Programmen geben, aber im Moment müssen wir das selbst tun, indem wir asystemd verwenden Service.

Wie wir es einige Male in dieser Anleitung getan haben, erstellen wir einen .bbappend file, um die Standardrezepte mit unseren Änderungen zu überschreiben. Erstellen Sie zunächst eine Ordnerstruktur:

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

Erstellen Sie in diesem Ordner eine Datei namens weston.ini und fügen Sie Folgendes ein:

# 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

Die standardmäßig ausgelieferte Konfiguration startet einen Desktop, aber wir ändern das. Diekiosk-shell.so Plugin führt eine App im Vollbildmodus ohne Fensterdekorationen aus. Der output Abschnitt, einschließlich transform=rotate-270 ist der magische Abschnitt, den Sie brauchen, um Ihre QML-Anwendung zu rotieren.

Erstellen Sie eine .bbappend Rezept:

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"

Das sieht aus wie das, was wir zuvor getan haben, um die standardmäßige Qt-Umgebung zu überschreiben. FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" fügt den aktuellen Ordner in unserer eigenen Ebene hinzu, in der wir gerade die Konfigurationsdatei abgelegt haben. Ich hatte einige vage Probleme, bei denen der Standardwert weston.ini Datei wurde nicht ersetzt, weshalb es so einen expliziten do_install_append gibt Sektion. Normalerweise ist das nicht erforderlich, aber in meinem Fall würde die Datei nicht ersetzt, wenn ich es nicht so gemacht hätte.

SYSTEMD_AUTO_ENABLE_${PN} = "enable" aktiviert den weston systemd-Dienst.

Stellen Sie jetzt sicher, dass weston beginnt und nicht b2qt oder die startupscreen , wir müssen noch ein paar .bbappend machen Rezepte zum Deaktivieren dieser systemd-Dienste. Es kann nur ein Anzeigedienst laufen, wenn b2qt läuft, dann weston wird nicht starten.

Erstellen Sie wie zuvor die folgende Datei:

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

Geben Sie die folgende Zeile ein:

SYSTEMD_AUTO_ENABLE_${PN} = "disable"

Dadurch wird startupscreen deaktiviert Dienst.

Wiederholen Sie das Obige für b2qt Dienst, der sich verwirrenderweise im default-qt-envs befindet Rezeptdatei:

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

Dieselbe Zeile wird eingefügt, um den systemd-Dienst zu deaktivieren:

SYSTEMD_AUTO_ENABLE_${PN} = "disable"

Der nächste Teil betrifft unser benutzerdefiniertes Bild .bbappend Datei, wo wir weston hinzufügen müssen zu den Distributionsfunktionen, um sicherzustellen, dass systemd bootet bis graphical Ziel und nicht multiuser Ziel:

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

Hängen Sie weston \ an zum IMAGE_FEATURES_append Abschnitt:

IMAGE_FEATURES_append = " \
        splash \
        weston \
        "

Fügen Sie den weston-init hinzu Paket im IMAGE_INSTALL_append Abschnitt:

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

Der letzte Teil beinhaltet die Aktualisierung unseres myapp Rezept mit systemd Dienst, der unsere Anwendung nach weston startet ist gestartet. Erstellen Sie eine neue Datei:

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

Platzieren Sie folgenden Inhalt:

[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

Wenn Sie eine Qt-App auf Wayland ausführen, ist der XDG_RUNTIME_DIR erforderlich Umgebungsvariable. Wir könnten dies fest auf /run/user/1000 codieren , was für dieses spezifische Setup funktionieren würde, aber wir können auch den loginctl verwenden Befehl zum Abfragen des tatsächlichen Pfads, der für alle zukünftigen Geräte und Setups funktioniert.

systemd hat keine Möglichkeit, einen Shell-Befehl als Environment auszuwerten Option, also verwenden wir einen Hack, um das zu tun. Zuerst führt es ExecStartPre aus Befehl, der eine Subshell zum Ausführen des Befehls startet und die Ausgabe in eine Datei in /tmp schreibt . Dann spezifizieren wir die ZeileEnvironmentFile , aber wichtig , beginnen Sie mit einem Bindestrich (- ). Dadurch wird die richtige Reihenfolge sichergestellt, zuerst der Befehl, dann die Datei. Nicht gut dokumentiert, ich habe einen Stackoverflow-Post gefunden, der es erklärt, aber ich kann das nicht mehr finden, um es als Quelle zu zitieren. Sobald die App beendet wird, wird die Umgebungsdatei entfernt.

Ändern Sie unser myapp_1.0.bb Rezept, um dieses systemd-Rezept einzuschließen:

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"

Durch Angabe von SYSTEMD_SERVICE , wird es standardmäßig beim Booten aktiviert.

Erstellen Sie ein neues Image und nach all dem Aufwand sollte eine korrekt gedrehte QML-Anwendung das Ergebnis sein:

In my personal opinion this rotation for QML is an area the Qt Company could improve,rather, make just as easy as Qt Widgets.

You can run any Qt app this way manually, compile and copy it via Qt Creator, or if you can't compile it, just copy it. Set the correct environment variables and run it. For example, the Qt built in Bear Whack example (fun game, under quick/touchinteraction ):

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

Here's a picture of Bear Whack:

And here's a picture of the SameGame demo running. Particles and effects arevery smooth on the reTerminal: