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. (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

 

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 ..

 

Ajout d’un nouveau meta, exemple du meta-raspberrypi

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 ..

 

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 :

overview_install

 

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.

conf

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 \

"

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"

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"

 

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"

 

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.

 

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.learnopencv.com/

https://www.learnopencv.com/install-opencv3-on-ubuntu/

https://www.learnopencv.com/read-write-and-display-a-video-using-opencv-cpp-python/

https://www.learnopencv.com/color-spaces-in-opencv-cpp-python/

https://www.learnopencv.com/object-tracking-using-opencv-cpp-python/

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

http://www.linuxembedded.fr/2016/05/la-mise-au-point-des-recettes-yocto/

https://stackoverflow.com/questions/45627686/how-to-delete-deploy-images-beaglebone-dir-in-yocto

https://raspberrypi.stackexchange.com/questions/57155/how-do-i-used-yocto-to-build-an-sdcard-image-for-my-raspberry-pi-3-model-b