Capitolo 1. Introduzione
$ 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
- 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.
Monitoraggio avanzato e aggiornamenti over-the-air (OTA) per dispositivi embedded
L’integrazione con la piattaforma Memfault aggiunge funzionalità di diagnostica avanzata alle soluzioni Variscite. Gli sviluppatori avranno accesso a dati preziosi dei dispositivi finali, come metriche delle prestazioni, eventi di sistema e statistiche operative, senza bisogno di accesso fisico. Uno strumento di manutenzione proattiva che permetterà agli ingegneri di individuare e risolvere i problemi senza attendere il feedback dell’utente finale.