Capitolo 1. Introduzione

1.1. Panoramica

Questo articolo dimostra come creare un livello Yocto BSP per una scheda portante personalizzata progettata per un Variscite System on Module / Computer on Module. Imparerai come creare un meta layer che compila e installa una applicazione "Hello, World!". Quindi, lo modificherai in un livello BSP aggiungendo un file di configurazione della macchina.

Il documento è diviso in tre parti:

1. Preparazione dell'ambiente per costruire Yocto:

2. Creazione di un nuovo meta-layer sopra Variscite Yocto BSP:

3. Creazione di un nuovo meta layer e modifica per renderlo un meta-layer BSP con un file di configurazione macchina:

1.2. Prerequisiti

1.2.1. Hardware Variscite

Questo documento utilizza il modulo Variscite DART-MX8M-MINI come esempio:

DART-MX8M-MINI Specifiche principali
DART-MX8M-MINI System on Module (SoM) - DART Pin2Pin family

CPU: NXP i.MX 8M Mini

Memoria: Fino a 4GB LPDDR4-3000

GPU:
Vivante™ GC7000Lite 3D and GC520L 2D

Per maggiori informazioni, visitare il Software Wiki DART-MX8M-MINI di Variscite e la pagina del prodotto

1.2.2. Software Variscite

Questo documento utilizza il BSP Yocto Dunfell di Variscite come esempio:

Progetto Yocto Informazioni

Yocto Dunfell 3.1 (basato su FSL Community BSP).

Visita il Software Wiki di Variscite per una guida completa su come creare Yocto dal codice sorgente.

🛈 Le seguenti procedure sono compatibili con tutti i Variscite System on Modules.

1.3. Impostazione dell'ambiente del progetto Yocto

1.3.1. Installare i pacchetti richiesti

I seguenti pacchetti devono essere installati sulla macchina host (basata su Ubuntu 20.04 64-bit, in questo esempio):

1. Installa i pacchetti essenziali affinché Yocto funzioni sulla macchina host:

$ 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

🛈  Il gestore di pacchetti apt potrebbe aver bisogno di usare i privilegi di root (sudo) per installare i pacchetti.

2. Se git non è ancora configurato:

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

❶ Cambia "Your Name" con il tuo nome.

❷ Cambia "Your Email" con il tuo indirizzo email.

1.3.2. Recupera strumento Repo

1. Per utilizzare il repo manifest di Variscite, deve essere installato lo strumento repo:

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

❶ Questo passaggio potrebbe non essere necessario se la cartella bin esiste già.

1.3.3. Recupera Yocto Dunfell

  1. Scarica l'ultima revisione del manifesto Dunfell da Variscite:
$ 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) ①

❶ Il passaggio di sincronizzazione di repo potrebbe richiedere un po' di tempo per completarsi

Capitolo 2. Meta Layer Yocto personalizzato

I layer di Yocto sono archivi che contengono metadati correlati (cioè insiemi di istruzioni) che indicano al sistema di compilazione Yocto come costruire un'immagine di destinazione.  Il modello a layer di Yocto Project facilita la collaborazione, la condivisione, la personalizzazione e il riutilizzo all'interno dell'ambiente di sviluppo di Yocto Project.  I layer separano logicamente le informazioni per il progetto. Ad esempio, un layerpuò essere utilizzato per contenere tutte le configurazioni per un particolare componente hardware.

2.1. Crea un nuovo layer

1. Imposta l'ambiente per creare il nuovo layer:

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

❶ Il comando precedente è necessario solo durante la prima configurazione della build.  Ogni volta che si riavvia una sessione di build più recente o si utilizza un terminale diverso, basta eseguire:

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

a. Crea una variabile d'ambiente per la directory dei sorgenti:

$ export SDIR=~/var-fslc-yocto/sources/
  • Questa variabile d'ambiente è impostata solo per questa shell e i suoi processi figli. Se la shell o il terminale vengono chiusi e ne viene avviato uno nuovo, questa impostazione non viene mantenuta.

2. Usa lo script bitbake-layers per creare e aggiungere un nuovo layer nella directory di origne:

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

Sostituisci <custom_layer> con il nome che preferisci.

3. Questo script crea una struttura di file minima per un nuovo layer nel percorso sottostante. Puoi controllarlo usando il tree command.

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

Ispeziona la struttura del file usando il tree command:

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

2.1.1. Crea un semplice "Hello, World!" Ricetta di esempio

1. Crea una directory per ospitare l'applicazione nel meta layer:

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

Sostituisci  <custom_recipe_dir> con il nome che preferisci.

2. Creare la ricetta (.bb file) per l'applicazione:

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

Quindi, aggiungi le seguenti istruzioni alla ricetta:

📄 ~/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. Crea un semplice file sorgente in linguaggio di programmazione C che stampi "Hello, World!":

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

Quindi, aggiungi il seguente codice sorgente al file:

📄 ~/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. Apri il file local.conf:

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

Quindi, aggiungi la seguente riga alla fine del file, per includere il pacchetto in qualsiasi immagine che creerai successivamente:

IMAGE_INSTALL_append = " hello-world"

5. Costruisci l'immagine core-image-base (ad esempio):

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

❶ Questo passaggio potrebbe richiedere diverse ore per essere completato, a seconda delle specifiche del tuo computer

L'applicazione "Hello, World!" verrà installata in /usr/bin/hello-world, come definito nella funzione do_install() della ricetta precedente.

Capitolo 3. Layer personalizzato Yocto BSP

L'esempio seguente mostra come creare un layer BSP personalizzato. Il processo è sostanzialmente lo stesso del meta-layer creato nell'esempio precedente. Tuttavia, in un meta layer BSP, è incluso un file di configurazione macchina per la scheda personalizzata. Il file di configurazione della macchina viene utilizzato per configurare l'ambiente per la scheda personalizzata. Ciò comporta generalmente modifiche nel Bootloader e nel Kernel.

3.1. Crea una nuova macchina

1. Usa lo script bitbake-layers per creare e aggiungere un nuovo layer nella directory dei sorgenti:

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

Sostituisci <custom_bsp> con il nome che preferisci.

2. Crea il file di configurazione della macchina utilizzando 0imx8mm-var-dart.conf come base:

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

Sostituisci <custom_board> con il nome che preferiscito.

Il file di configurazione imx8mm-var-dart.conf che verrà usato come base si trova in:

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

Aggiungi il seguente contenuto al file di configurazione appena creato:

📄 ~/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"

Il valore risultante di MACHINEOVERRIDES sarà:

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

3. Per usare un nuovo file device tree (dtb), aggiungi la riga seguente alla fine del file imx8mm-var-dart- <custom_board>.conf:

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

Naturalmente, dovrai anche aggiungere il file sorgente del device tree (dts) all'albero dei sorgenti del kernel.  È possibile modificare la ricetta del kernel per aggiungere il file sorgente del device tree come patch oppure utilizzare la propria copia del repository del kernel con le modifiche apportate.  Per modificare la ricetta del kernel, puoi aggiungere un file bbappend al tuo livello BSP appena creato. Ad esempio:

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

4. La struttura del file dovrebbe essere simile alla seguente:

$ 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. Crea l'immagine personalizzata

1. Modifica il file MACHINE nel file di configurazione locale (local.conf):

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

a. Change imx8mm-var-dart:

MACHINE ??= 'imx8mm-var-dart'

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

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

2. Esegui il comando bitbake:

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

❶ Questo passaggio potrebbe richiedere diverse ore per essere completato, a seconda delle specifiche del tuo computer

Questo genera un file .wic per l'immagine personalizzata della scheda:

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

3.3. Esegui il flashing dell'immagine personalizzata sulla scheda SD

1. Per eseguire il flashing dell'immagine personalizzata della scheda:

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

❶ Assicurati di utilizzare il percorso corretto della scheda SD invece di /dev/sdX  (ad esempio, /dev/sdb ). Per verificarlo, usa il comando  lsblk .

ATTENZIONE a non utilizzare il percorso del disco primario: potrebbe sovrascrivere il sistema operativo host.

2. Dopo questi passaggi, inserire la scheda SD nella scheda personalizzata e accendere per avviare il BSP personalizzato.