Yocto UART

Diese Seite beschreibt die Erstellung eines Yocto Image (Kirkstone 4.0.6) für den Raspberry Pi 2 mit Ansteuerung der UART0 als Konsole. Das Entwicklungssystem läuft unter Debian 11 (bullseye).

Ein schneller Einstieg in das Bauen eines Yocto Images ist unter "Yocto Project Quick Build" beschrieben. Zusätzlich zu den dort aufgezählten Paketen für das Entwicklungssystem sollte das Paket bmap-tools zum Schreiben des erzeugten Images <image>.wic.bz2 auf SD-Card installiert werden.

GIT Server

Auf irgendeinem GIT Server sollte ein leeres Repository 'conf' für die yocto Konfiguration angelegt werden. Das erleichtert das Aufsetzen weiterer Entwicklungssysteme und das Update auf eine neuere Version von Yocto.

Yocto clone

Mit den folgenden Befehlen wird der Branch Kirkstone von Yocto geclont, das Directory build angelegt und das oben erzeugte GIT Repository 'conf' geclont.

cd ~
git clone -b kirkstone git://git.yoctoproject.org/poky
# Dadurch entsteht das Directory poky (ca. 260 MB)
cd ~/poky
# noch kein Directory poky/build vorhanden
mkdir build
cd build
# in das aktuelle Directory poky/build das leere Repository 'conf' des GIT-Servers holen
git clone git@linux99:/home/git/conf.git

Erste Konfiguration erzeugen

Mit den folgenden Befehlen wird die erste Konfiguration erzeugt und im GIT Repository 'conf' abgelegt.

cd ~/poky
source oe-init-build-env
# Commit der durch 'source oe-init-build-env' erzeugten ersten Konfiguration
cd conf
git add *.conf *.cfg
git commit -m "initial configuration created by source oe-init-build-env"
git push

Layer Raspberry Pi holen

Mit den folgenden Befehlen wird der zum gewählten Yocto Branch passende Layer für den Raspberry geclont, das gewünschte Raspberry Modell ausgewählt, die UART0 aktiviert, der Layer für den Raspberry zu den bitbake Layern hinzugefügt und danach alles wieder im GIT Repository 'conf' abgelegt.

cd ~/poky
git clone -b kirkstone git://git.yoctoproject.org/meta-raspberrypi
# "MACHINE" konfigurieren. UART einschalten. uart0.dtbo mit ins Image packen.
cd build/conf
# local.conf so modifizieren
MACHINE ?= "raspberrypi2"
ENABLE_UART = "1"
RPI_KERNEL_DEVICETREE_OVERLAYS:append = " overlays/uart0.dtbo"
# Den Layer für den Raspberry in bblayers.conf hinzufügen
cd ..
bitbake-layers add-layer ~/poky/meta-raspberrypi/
cd conf
# Commit ins git repository "conf"
git commit -m "configuration for raspberry pi 2 added"
git push

Build Image

Mit der genannten Konfiguration wird dann das Image core-image-minimal gebaut:

cd ~/poky/build
time bitbake core-image-minimal
   real   244m4.373s
   user   0m21.839s
   sys    0m2.975s

Image auf SD-Card schreiben

Das Image wird anschließend auf die SD-Card geschrieben. "bmaptool" schreibt dabei nur die genutzten Bereiche der Partitionen.

# Image auf SD-Card schreiben (als root)
cd ~/poky/build/tmp/deploy/images/raspberrypi2
# Größe core-image-minimal-raspberrypi2.wic.bz2: 12582912
bmaptool copy core-image-minimal-raspberrypi2.wic.bz2 /dev/sdg

Image booten

Das Image bootet auf einem Raspberry Pi 2 in ungefähr 20 Sekunden. Mit minicom sieht das so aus:

Das Entwicklungssystem ist dabei über einen USB-to-serial-TTL-Adapter (K1USB-TTL) so angeschlossen:

GPIO Function   GPIO PIN    K1USB-TTL Function    K1USB-TTL Color
Ground          6           Ground                black
TX              8           RX                    white
RX              10          TX                    green

Partitionen der SD-Card

Die Partitionierung einer 16GB-SD-Card sieht so aus: