Cet article est le premier d'une série à propos de la BeagleBoneBlack par l'association Šikula Robotik. Il présente ce qui est inclus dans le colis, puis explique comment installer une autre distribution Linux, en l'occurrence ArchLinuxARM, et détaille ce qui se produit lors du démarrage.
En tant qu'association de robotique, Šikula Robotik construit des robots. Pour la coupe de France de robotique 2014, nous avons décidé de doter le robot de la récente BeagleBoneBlack.
La BeagleBoneBlack est une carte de développement open-source de la “BeagleBoard.org Foundation”. Elle dispose d'un processeur AM335x 1GHz ARM® Cortex-A8 avec 512Mo de RAM DDR3 de sorte qu'elle peut faire tourner des systèmes complexes tel que Linux. Dans notre contexte, elle a quelques périphériques utiles, comme l'I²C, des PWM, un tas de GPIO et même deux QEP pour décoder (matériellement) les signaux des encodeurs en quadrature que nous utilisons pour mesurer le mouvement du robot. Il y a également une mémoire embarquée de 2Go ; mais le but de cet article n'est pas de présenter la carte elle-même, donc je m'arrête là. Des présentations détaillées sont largement disponibles sur Internet de toute façon.
La Beagle Bone Black
Au moment où j'écris, RS vend cette carte 48,08€ (TVA incluse). Grâce à notre partenariat avec RS, nous avons eu une petite réduction. Celle-ci nous a permis d'acheter plusieurs BBB afin que nous puissions travailler sur le même système séparrément, ce qui est très pratique lorsque les membres sont séparrés de plusieurs centaines de kilomètres.
La BBB arrive dans un petit colis dans lequel nous trouvons un câble USB, un guide de démarrage rapide et la BBB elle-même. Branchons-la, et voyons ce qui arrive. La led “Power” s'allume et quelques secondes plus tard, la led “user” clignote. Sur l'ordinateur, un disque USB apparait un peu plus tard et une interface usb-net offre une connection réseau à la carte. En se connectant à http://192.168.7.2:3000/ la page afiche une jolie interface de programmation directement hébergée sur la carte par la distribution d'usine. Sympathique, beaucoup de choses peuvent être faites avec ça... mais Šikula Robotik ne va pas utilise ce système du tout.
La distribution Linux d'usine apparaît comme un périphérique mass storage et dispose d'un éditeur de script embarqué
Commençons par installer un nouveau système sur la carte. Pour cette première étape, nous allons utiliser la carte SD comme système de fichiers racine (tous les fichiers de Linux sont stockés sur la carte SD) pour que ce soit facilement copiable, remplaçable, etc.
Nous avons choisi ArchLinuxARM, qui est une distribution Linux pour ordinateurs à base de processeur ARM. Il y a d'autres distributions qui peuvent tourner sur la BBB, comme Gentoo, Debian, Ångström, LinuxCNC, Fedora, Ubuntu, Android... mais en tant qu'utilisateur de ArchLinux sur portable depuis plusieurs années, je préfère celle-ci. Même si ARM n'est pas une architecture officiellement supportée par ArchLinux, ArchLinuxARM est une projet indépendant qui partage l'esprit et les outils d'ArchLinux, et en vérité elles sont très proches l'une de l'autre.
Logo ArchLinuxARM
Sur leur site Web, <http://archlinuxarm.org/>, il y a un menu avec toutes les cartes que l'équipe ArchLinuxARM supporte officiellement. Au moment de la rédatcion, il y a 35 cartes supportées. La BBB peut être trouvée dans Platforms > ARMv7 (sa version de cœur ARM) > TI (le fondeur de son processeur) > BeagleBone Black.
La page présente la carte dans l'onglet “Overview” tandis que les instructions sont données dans l'onglet “Installation”. Il y a juste à suivre les instructions pour créer la carte SD amorçable : partitionner, formatter, et remplir avec les données initiales. Éjectons la carte SD et la plaçons-la dans la BBB. C'est tout.
Pour observer ce qu'il se passe, nous branchons un convertisseur USB-série 3.3V (LVTTL) sur le connecteur serie J1. Le connecteur suit la convention des câbles FTDI, avec le signal GND du côté du point imprimé sur la carte.
Brochage du connecteur série de la BBB
Allumons la carte, avec la carte SD insérée dans le connecteur SD et le bouton de boot enfoncé (c'est le bouton proche de la carte SD, vous ne pouvez pas le manquer). La carte démarre en plusieurs étapes.
En premier lieu, c'est le code contenu dans la ROM du processeur AM335x, un minuscule code du fabricant pouvant seulement s'exécuter, qui se lance. Sa seule tâche est de trouver et charger le “Secondary Program Loader” quelque part dans les différents périphériques supportés par le processeur (NAND flash, SD card...).
Le second acteur est donc ce SPL. Puisqu'il est chargé dans la RAM interne du processeur, il doit être assez petit. Fondammentalement, il initialise quelques composants essentiels pour l'étape d'après, en particulier le contrôleur SD depuis lequel charger le bootloader et le contrôleur de RAM externe dans laquelle le code va être stoqué et exécuté. Le SPL affiche des messages sur la liaison série de débug, démarrant avec son nom “U-Boot SPL 2013.04-dirty”. Sur la carte SD, il est contenu dans le fichier MLO.
Lorsque le bootloader est en RAM (externe 512Mo), il est executé. Sur la console, nous pouvons lire “U-Boot 2013.04-dirty” qui est le premier message du bootloader nommé “(das) U-Boot” dans ce cas-ci. Il a énormément d'espace pour faire son travail désormais. Il est capable de faire plein de choses comme dialoguer avec des périphériques i2c, lire des fichiers, avoir des connexions Ethernet... dans le but de réussir sa mission : charger le noyau. Sur la carte SD, il est contenu dans le fichier u-boot.bin.
En développement, le noyau peut être chargé depuis le réseau ; sur la carte, il peut être chargé depuis la eMMC ou la carte SD. Dans notre cas, U-Boot est configuré pour trouver un script sur la première partition. Il le charge et l'exécute.
Ce script uEnv.txt réalise beaucoup de choses, mais il peut être résumé à : trouver zImage (le noyau) sur la seconde partition et le charger en RAM, ensuite charger am335x-boneblack.dtb (un fichier qui décrit la carte) depuis la seconde partition, et démarrer le noyau en lui donnant le fichier dtb. [Il y avait une erreur dans le script de boot (il utilisait la commande bootm au lieu de bootz pour une image zImage) mais un ticket est déjà présent sur le bug tracker. Ce sera probablement corrigé très vite.]
“Starting kernel ...” : C'est le dernier message du bootloader. À partir de là, le noyau s'auto-décompresse et commence à initialiser tout le matériel et l'environnement logiciel que nous utilisons. À ce moment, les anciens programmes de boot n'existent plus en RAM : Linux a le contrôle total !
Lorsque le noyau est prêt, il lance le premier processus de l'espace utilisateur connu sous le nom de processus init. Dans ArchLinux ce programme est systemd. Cette phase commence avec l'affichage du message “Welcome to Arch Linux ARM!”. Le programme init lance les démons et un tas de choses. Finalement le système est prêt et affiche une invite de commande.
Le processus de démarrage complet a pris 16s sur ma carte.
Le processus de démarrage en image
C'est la fin du premier article. Le prochain parlera des réseaux filaires et en particulier le réseau via USB.