Yocto est un projet collaboratif, soutenu par la Linux Foundation, qui fournit des modèles, outils et méthodes pour vous aider à créer des systèmes embarqués (plus d’informations : https://linuxfr.org/news/yocto-ce-n-est-pas-un-systeme-embarque-mais)
Pré-requis
Il est conseillé pour le bon déroulement des opérations suivantes d’utiliser une machine avec ubuntu dans sa dernière version LTS.
Niveau matériel, compter minimum un processeur 3 cores (cas des machines virtuelles par exemple) avec au moins 4 Go de RAM (les compilations sont gourmandes en ressources). Enfin prévoyez un espace disque minimum de 150 Go. Des modifications sont possibles pour réduire l’empattement en mémoire.
La commande suivante permet d’installer le nécessaire à l’utilisation de yocto :
sudo apt-get install gawk wget git-core 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
En complément, les librairies et outils suivants peuvent être installés :
sudo apt-get install gitk libhighgui-dev
Langage du code : JavaScript (javascript)
Installation de yocto
L’installation de yocto est relativement simple, il suffit de télécharger le dépôt et d’aligner les branches sur le bon SHA1 dans git.
Dans un premier temps, placez vous dans un dossier de votre choix pour le téléchargement. Tout au long du reste de ce documents je me trouverai dans mon /home/Views/
git clone git://git.yoctoproject.org/poky
cd poky
git checkout master
cd ..
git clone https://github.com/openembedded/meta-openembedded.git
cd meta-openembedded
git checkout master
cd ..
Langage du code : PHP (php)
Ajout d’un nouveau meta, exemple du meta-raspberry
Afin de pouvoir compiler sur la raspberry, nous allons devoir ajouter le layer correspondant. Ce layer contient tout le nécessaire pour réaliser des cross compilation vers la raspberry pi, quelque soit la version. Il suffit de spécifier la machine cible, nous le verrons par la suite.
Ce dossier s’ajoute très simplement comme lors du téléchargement de yocto. (Nous nous trouvons dans le dossier /home/Views/poky)
git clone git://git.yoctoproject.org/meta-raspberrypi
cd meta-raspberry
git checkout 79ea44b997a6eb6e2f0d36b1d583c85fa9e37f36
cd ..
Langage du code : PHP (php)
L’installation de yocto est à présent terminé. Il faut à présent le configurer pour compiler une image utilisable par la raspberry.
Pour ce faire, nous allons utiliser le script présent dans la racine du dossier poky.
On a alors cette vue :
Le script que nous allons utiliser est oe-init-build-env
source oe-init-build-env
Ce script va créer un dossier build et nous déplacer dedans par la même occasion.
C’est dans le dossier conf de ce dossier build que nous allons travailler.
Plus spécifiquement, nous allons modifier le fichier bblayers.conf et local.conf.
Ainsi le fichier bblayer.conf est écrit ainsi (à adapter par rapport à votre install) :
# POKY_BBLAYERS_CONF_VERSION is increased each time build/conf/bblayers.conf
# changes incompatibly
POKY_BBLAYERS_CONF_VERSION = "2"
BBPATH = "${TOPDIR}"
BBFILES ?= ""
BBLAYERS ?= " \
/home/macross/Views/poky/meta \
/home/macross/Views/poky/meta-poky \
/home/macross/Views/poky/meta-yocto-bsp \
/home/macross/Views/poky/meta-raspberrypi \
/home/macross/Views/poky/meta-openembedded/meta-oe \
/home/macross/Views/poky/meta-openembedded/meta-python \
/home/macross/Views/poky/meta-openembedded/meta-multimedia \
/home/macross/Views/poky/meta-openembedded/meta-networking \
/home/macross/Views/poky/meta-openembedded/meta-filesystems \
"
Langage du code : PHP (php)
Pour ceux qui suivent dans le fond, j’ai ajouter les différents layers indiqués dans la documentation du meta-raspberrypi.
Concernant le fichier local.conf, les modifications sont plus importantes.
Tout d’abord, il faut rechercher la ligne où est indiqué la machine à compiler. Par défaut, elle est du type X86. Il faut la remplacer par la version de la raspberry pi que vous souhaitez compiler (voir documentations dans le meta associé). Dans mon cas c’est soit la V1 B ou la V2 que je souhaite utiliser.
MACHINE ??= "raspberrypi2"
Langage du code : JavaScript (javascript)
Les modifications plus importantes vont se faire par l’ajout de ligne à la fin du fichier local.conf.
LICENSE_FLAGS_WHITELIST = "commercial"
ENABLE_UART = "1"
INHERIT += "rm_work"
EXTRA_IMAGE_FEATURES += " package-management"
RM_OLD_IMAGE = "1"
IMAGE_FSTYPES = "tar.bz2 rpi-sdimg"
RM_WORK_EXCLUDE += " opencv"
Langage du code : JavaScript (javascript)
Ajout d’un nouveau programme à l’image
Afin d’ajouter un programme à l’image que nous allons générer, il faut se rendre dans le meta-raspberry/recipes-core/image afin d’éditer le fichier de l’image que nous souhaitons compiler. Dans notre cas, il s’agira de l’image rpi-basic-image qui se trouve dans le fichier rpi-test-image.bb.
Nous allons ajouter les lignes suivantes à la fin du fichier :
IMAGE_INSTALL_append += " packagegroup-core-ssh-openssh openssh-sftp-server"
IMAGE_INSTALL_append += " opencv opencv-samples"
Langage du code : JavaScript (javascript)
Ces différents éléments permettent d’ajouter le ssh, opencv et nodejs respectivement dans l’image que nous allons compiler.
Compilation et copie du résultat sur carte SD
Afin de compiler l’image il faut se trouver dans le dossier build via le script oe-init-build-env.
à présent nous pouvons lancer la commande suivante et aller nous coucher… compter plusieurs heures de compilation même avec une bonne machine. Ceci est dû au temps de récupération des sources très long.
bitbake rpi-test-image -k
Le -k permet de compiler un maximum de choses même en cas d’erreur.
Une fois la compilation terminé. L’image de la carte SD se trouve dans le dossier build/tmp/deploy/images//*.rpi-sdimg
Utiliser etcher (etcher.io) pour flasher votre carte SD et tenter de booter sur la raspberry.
Via ssh, le nom de connexion est root. pas de mot passe. De même en connexion directe.
Conclusion
Cet article est une introduction rapide à l’utilisation de yocto pour créer une image pour raspberry. De nombreux éléments peuvent être modifiés afin de réduire, d’une part la quantité de données a téléchargé et compilé, d’autre part le temps de compilation.
Bien évidemment, n’hésitez pas à creuser les ressources que je mets en lien plus bas.
Bon dev !
Ressources
https://linuxfr.org/news/yocto-ce-n-est-pas-un-systeme-embarque-mais
https://www.yoctoproject.org/docs/1.7/yocto-project-qs/yocto-project-qs.html
https://www.opencv-srf.com/p/introduction.html
https://www.packtpub.com/books/content/building-our-first-poky-image-raspberry-pi
http://www.yoctoproject.org/docs/current/yocto-project-qs/yocto-project-qs.html
http://kernelhacks.com/raspberry-pi-3-with-yocto/
https://github.com/openembedded/meta-openembedded
https://github.com/Nuand/bladeRF/wiki/Creating-Linux-based-Embedded-System-Images-with-Yocto
https://www.raspberrypi.org/forums/viewtopic.php?f=32&t=178398
http://www.jumpnowtek.com/rpi/Raspberry-Pi-Systems-with-Yocto.html
https://stackoverflow.com/questions/45627686/how-to-delete-deploy-images-beaglebone-dir-in-yocto