Kapitel 1. Einführung

1.1. Übersicht

Dieser Artikel zeigt, wie man einen Yocto BSP-Schicht für eine benutzerdefinierte Trägerplatte erstellt, die für ein Variscite System on Module / Computer on Module entwickelt wurde. Sie werden lernen, wie man eine Metaschicht erstellt, die eine 'Hello, World!'-Anwendung kompiliert und installiert. Anschließend wird sie durch Hinzufügen einer Maschinenkonfigurationsdatei in eine BSP-Schicht umgewandelt.

Das Dokument ist in drei Teile gegliedert:

1. Vorbereiten der Umgebung für die Erstellung von Yocto:

2. Erstellen einer neuen Meta-Schicht über Variscite Yocto BSP:

3. Erstellen Sie eine neue Meta-Schicht und ändern Sie sie in eine Meta-BSP-Schicht mit einer Maschinenkonfigurationsdatei:

1.2. Voraussetzungen

1.2.1. Variscite Hardware

Dieses Dokument verwendet das Variscite DART-MX8M-MINI Modul als Beispiel:

DART-MX8M-MINI Hauptspezifikationen
DART-MX8M-MINI System on Module (SoM) - DART Pin2Pin family CPU: NXP i.MX 8M Mini

Speicher:
Bis zu 4GB LPDDR4-3000

GPU:
Vivante™ GC7000Lite 3D and GC520L 2DWeitere Informationen finden Sie im DART-MX8M-MINI -Software-Wiki und auf der Produktseite von Variscite

1.2.2. Variscite Software

Dieses Dokument verwendet Variscite's Yocto Dunfell BSP als Beispiel:

Yocto-Projekt  Informationen

Yocto Dunfell 3.1 (basierend auf FSL Community BSP).

Besuchen Sie Variscite's Software Wiki für eine vollständige Anleitung, wie man Yocto aus dem Quellcode erstellt.

🛈  Die nachstehenden Verfahren sind kompatibel mit allen Variscite System on Modules.

1.3. Einrichten der Yocto-Projektumgebung

1.3.1. Installieren Sie die erforderlichen Pakete

Die folgenden Pakete müssen auf dem Host-Rechner (in diesem Beispiel auf Basis von Ubuntu 20.04 64-bit) installiert sein:

1. Installieren Sie die wesentlichen Pakete, damit Yocto auf dem Host-Rechner funktioniert:

$ apt install gawk wget git diffstat unzip texinfo gcc-multilib build-essential \
      chrpath socat cpio python python3 python3-pip python3-pexpect \
      xz-utils debianutils iputils-ping libsdl1.2-dev xterm tree
$ apt install autoconf libtool libglib2.0-dev libarchive-dev sed cvs subversion \
      coreutils texi2html docbook-utils python-pysqlite2 help2man make \
      gcc g++ desktop-file-utils libgl1-mesa-dev libglu1-mesa-dev \
      mercurial automake groff curl lzop asciidoc u-boot-tools dos2unix \
      mtd-utils pv libncurses5 libncurses5-dev libncursesw5-dev \
      libelf-dev zlib1g-dev bc rename

🛈  Der apt-Paketmanager muss möglicherweise Root-Rechte (sudo) verwenden, um die Pakete zu installieren.

2. Wenn git noch nicht konfiguriert ist:

$ git config --global user.name "Your Name" ①
$ git config --global user.email "Your Email" ②

❶ Ändern Sie "Your Name" in Ihren Namen.
❷ Ändern Sie "Your Email" in Ihre E-Mail-Adresse.

1.3.2. Repo-Tool abrufen

1. Um das Repo-Manifest von Variscite zu verwenden, muss das Tool repo installiert sein:

$ mkdir ~/bin ①
$ curl https://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ export PATH=~/bin:$PATH

❶ Dieser Schritt ist möglicherweise nicht erforderlich, wenn der bin-Ordner bereits existiert.

1.3.3. Yocto Dunfell abrufen

1. Laden Sie die letzte Revision des Dunfell-Manifests von Variscite herunter:

$ mkdir ~/var-fslc-yocto
$ cd ~/var-fslc-yocto
$ repo init -u https://github.com/varigit/variscite-bsp-platform.git \
            -b dunfell -m default.xml
$ repo sync -j$(nproc) ①

❶ Der Schritt der Repo-Synchronisierung kann eine Weile dauern

Kapitel 2. Benutzerdefinierte Yocto-Meta-Schicht

Die Yocto-Schichten sind Repositories, die zugehörige Metadaten (d. h. Anweisungen) enthalten, die dem Yocto-Build-System mitteilen,
wie ein Ziel-Image zu erstellen ist. Das Schichtenmodell des Yocto-Projekts erleichtert die Zusammenarbeit, den Austausch,
die Anpassung und die Wiederverwendung innerhalb der Yocto-Projekt Entwicklungsumgebung.
Schichten trennen Informationen für das Projekt logisch voneinander. Eine Schicht kann zum Beispiel dazu dienen,
alle Konfigurationen für eine bestimmte Hardware zu speichern.

2.1. Eine neue Schicht erstellen

1. Richten Sie die Umgebung für die Erstellung der neuen Schicht ein:

$ cd ~/var-fslc-yocto/
$ MACHINE=imx8mm-var-dart DISTRO=fslc-xwayland . setup-environment build ①

❶ Der obige Befehl ist nur für das erstmalige Build-Setup obligatorisch.
Wenn Sie eine neuere Build-Sitzung neu starten oder ein anderes Terminal verwenden, führen Sie einfach aus:

$ cd ~/var-fslc-yocto/
$ source setup-environment build

a. Erstellen Sie eine Umgebungsvariable für das Quellenverzeichnis:

$ export SDIR=~/var-fslc-yocto/sources/
  • Diese Umgebungsvariable wird nur für diese Shell und ihre Kindprozesse gesetzt.
    Wird die Shell/Terminal geschlossen und eine neue gestartet, bleibt diese Einstellung nicht erhalten.

2. Verwenden Sie das Skript bitbake-Schichten, um eine neue Schicht im Quellenverzeichnis zu erstellen und hinzuzufügen:

$ cd ~/var-fslc-yocto/build
$ bitbake-layers create-layer ../sources/meta-<custom_layer>
$ bitbake-layers add-layer ../sources/meta-<custom_layer>

Ersetzen Sie <custom_layer> durch den von Ihnen gewünschten Namen.

3. Dieses Skript erstellt eine minimale Dateistruktur für eine neue Schicht unter
dem unten angegebenen Pfad. Dies kann mit dem Tree-Befehl überprüft werden.

🗁 ~/var-fslc-yocto/sources/meta-<custom_layer>

Untersuchen Sie die Dateistruktur mit dem Befehl tree :

$ tree $(SDIR)/meta-<custom_layer>
├── COPYING.MIT
├── README
├── conf
│   └── layer.conf
└── recipes-example
    └── example
        └── example_0.1.bb

2.1.1. Ein einfaches "Hello, World!" erstellen Beispielrezept

1. Erstellen Sie ein Verzeichnis zum Hosten der Anwendung in der Metaschicht:

$ cd $SDIR/meta-<custom_layer>
$ mkdir -p recipes-<custom_recipe_dir>/hello-world/hello-world

Ersetzen Sie <custom_recipe_dir> durch den von Ihnen gewünschten Namen.

2. Erstellen Sie das Rezept (. bb Datei) für die Anwendung:

$ cd $SDIR/meta-<custom_layer>/recipes-<custom_recipe_dir>/hello-world/
$ touch hello-world_1.0.0.bb

Fügen Sie dann die folgenden Anweisungen in das Rezept ein:

📄 ~/var-fslc-yocto/sources/meta-<custom_layer>/recipes-<custom_recipe_dir>/hello-world/hello-world_1.0.0.bb

SUMMARY = "A simple Hello World application"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://hello_world.c"

TARGET_CC_ARCH += "${LDFLAGS}"

S = "${WORKDIR}"

do_compile() {
  ${CC} -Wall hello-world.c -o hello-world
}

do_install() {
  install -d ${D}${bindir}
  install -m 0755 ${S}/hello-world ${D}${bindir}
}

3. Erstellen Sie eine einfache C Programmiersprachen-Quelldatei, die "Hello, World!" ausgibt :

$ cd $SDIR/meta-<custom_layer>/recipes-<custom_recipe_dir>/hello-world/hello-world/
$ touch hello_world.c

Fügen Sie dann den folgenden Quellcode in die Datei ein

📄 ~/var-flsc-yocto/sources/meta-<custom_layer>/recipes-<custom_recipe>/hello-world/src/hello_world.c

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
  printf("Hello, World!\n");
  return EXIT_SUCCESS;
}

4. Öffnen Sie die Datei local.conf  :

📄 ~/var-fslc-yocto/build/conf/local.conf

Fügen Sie dann die folgende Zeile am Ende der Datei hinzu, um das Paket in jedes Image einzubinden, das Sie als nächstes erstellen:

IMAGE_INSTALL_append = " hello-world"

5. Erstellen Sie das Core-Image-Basis-Image (zum Beispiel):

$ cd ~/var-fslc-yocto/build/
$ bitbake core-image-base ①

❶ Dieser Schritt kann je nach den Spezifikationen Ihres Computers mehrere Stunden in Anspruch nehmen

Die Anwendung "Hello, World!" wird nach /usr/bin/hello-worldinstalliert, wie in der Funktion do_install() des obigen Rezepts definiert.

Kapitel 3. Benutzerdefinierte Yocto BSP-Schicht

Das folgende Beispiel zeigt, wie man eine benutzerdefinierte BSP-Schicht erstellt.
Der Prozess ist im Grunde derselbe wie bei der im vorherigen Beispiel erstellten Metaschicht.
In einer BSP-Metaschicht ist jedoch eine Maschinenkonfigurationsdatei für die benutzerdefinierte Karte enthalten.
Die Maschinenkonfigurationsdatei wird verwendet, um die Umgebung für die benutzerdefinierte Karte zu konfigurieren.
Dies beinhaltet in der Regel Änderungen am Bootloader und Kernel.

3.1. Eine neue Maschine erstellen

1. Verwenden Sie das Skript bitbake-layers , um eine neue Schicht im Quellenverzeichnis zu erstellen und hinzuzufügen:

$ cd ~/var-fslc-yocto/build
$ bitbake-layers create-layer ../sources/meta-<custom_bsp>
$ bitbake-layers add-layer ../sources/meta-<custom_bsp>

Ersetzen Sie <custom_bsp> durch Ihren bevorzugten Namen.

2. Erstellen Sie die Maschinenkonfigurationsdatei unter Verwendung der Datei imx8mm-var-dart.conf als Basis:

$ mkdir -p $SDIR/meta-<custom_bsp>/conf/machine
$ cd $SDIR/meta-<custom_bsp>/conf/machine
$ touch imx8mm-var-dart-<custom_board>.conf

Ersetzen Sie <custom_board> durch den von Ihnen gewünschten Namen.

Die Konfigurationsdatei imx8mm-var-dart.conf, die als Grundlage verwendet wird, befindet sich unter:

📄 ~/var-fslc-yocto/sources/meta-variscite-fslc/conf/machine/imx8mm-var-dart.conf

Fügen Sie den folgenden Inhalt in die soeben erstellte Konfigurationsdatei ein:

📄 ~/var-fslc-yocto/sources/meta-<custom_bsp>/conf/machine/imx8mm-var-dart-<custom_board>.conf

require conf/machine/imx8mm-var-dart.conf
MACHINEOVERRIDES_EXTENDER_imx8mm-var-dart-<custom_board> = "imx8mm-var-dart"

Der resultierende MACHINEOVERRIDES-Wert lautet:

MACHINEOVERRIDES="aarch64:imx:use-nxp-bsp:mx8:mx8m:imxdrm:imxvpu:imxgpu:imxgpu2d:imxgpu3d:mx8mm:imx8mm-var-dart:imx8mm-var-dart-<custom_board>"

3. Um einen neuen Gerätebaum (dtb) zu verwenden, fügen Sie die folgende Zeile am Ende der Datei imx8mm-var-dart-<custom_board>.conf ein:

KERNEL_DEVICETREE = " freescale/imx8mm-var-dart-<custom_board>.dtb "

Natürlich müssen Sie dem Kernel-Quellbaum auch die eigentliche Gerätebaum-Quelldatei (dts) hinzufügen.
Sie können entweder das Kernel-Rezept anpassen, um Ihre Gerätebaum-Quelldatei als Patch hinzuzufügen,
oder Ihre eigene Kopie des Kernel-Repositorys mit Ihren Änderungen verwenden. Um das Kernelrezept anzupassen,
können Sie eine bbappend-Datei zu Ihrer eigenen BSP-Schicht hinzufügen, die Sie gerade erstellt haben. Zum Beispiel:

📄 ~/var-fslc-yocto/sources/meta-<custom_bsp>/recipes-kernel/linux/linux-variscite_%.bbappend

4. Die Dateistruktur sollte wie folgt aussehen:

$ tree $SDIR/meta-<custom_bsp>
.
├── conf
│   ├── layer.conf
│   └── machine
│       └── imx8mm-var-dart-<custom_board>.conf
├── COPYING.MIT
├── README
└── recipes-example
    └── example
        └── example_0.1.bb

3.2. Erstellen des benutzerdefinierten Bildes

1. Ändern Sie die MACHINE in der lokalen Konfigurationsdatei (local.conf):

📄 ~/var-fslc-yocto/build/conf/local.conf

a. Ändern Sie imx8mm-var-dart:

MACHINE ??= 'imx8mm-var-dart'

b. Zu imx8mm-var-dart-<custom_board>:

MACHINE ??= 'imx8mm-var-dart-<custom_board>'

2. Führen Sie den Befehl bitbake aus:

$ cd ~/var-fslc-yocto/build/
$ bitbake core-image-base ①

❶ Dieser Schritt kann je nach den Spezifikationen Ihres Computers mehrere Stunden in Anspruch nehmen

Dies erzeugt eine .wic Datei für das benutzerdefinierte Board Image:

📄 ~/var-fslc-yocto/build/tmp/deploy/images/imx8mm-var-dart-<custom_board>/core-image-base-imx8mm-vardart-<
custom_board>.wic

3.3. Flashen Sie das benutzerdefinierte Image auf die SD-Karte

1. So flashen Sie das benutzerdefinierte Board-Image:

$ cd ~/var-fslc-yocto/build/tmp/deploy/images/imx8mm-var-dart-<custom_board>/
$ zcat core-image-base-imx8mm-var-dart-<custom_board>.wic.gz | sudo dd of=/dev/sdX bs=1M status=progress conv=fsync ①

❶ Stellen Sie sicher, dass Sie den richtigen Pfad zur SD-Karte anstelle von  /dev/sdX ( z.B. /dev/sdb ) verwenden  . Um dies zu überprüfen, verwenden Sie den Befehl lsblk .

SEIEN SIE VORSICHTIG, dass Sie nicht den Pfad zur primären Festplatte verwenden - er kann das Host-Betriebssystem überschreiben.

2. Nach diesen Schritten setzen Sie die SD-Karte in das Custom Board ein und schalten es ein, um das Custom BSP zu starten.