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 Commit7c846e23de9346d318fbdc8ac92dcc72b90fb6ce
- 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 densetup-environment.sh
bezogen haben Datei.sources
:hat allebitbake
Schichten und Rezeptedownload
: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önnenbmaptool 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: