On attendait cette possibilité depuis la sortie du Raspberry Pi. Coincés par ce démarrage sur la carte SD imposé par les précédents SoC, on attendait l’arrivée de cette nouvelle.
Eh bien ça y est il est possible de booter sur une clé USB avec le Raspberry Pi 3 ! Bon, ça nécessite quelques manipulations mais après… ça fonctionne.
Booter le Raspberry Pi 3 sur sur un périphérique de stockage USB
Comment démarre le SoC
En fait ce qui nous intéresse ici, ce sont les toutes premières secondes de ce démarrage. Juste après que vous ayez branché la prise micro-usb d’alimentation, ou appuyé sur le bouton reset fraîchement installé sur votre Raspberry Pi. Dans un premier temps, le signal RUN s’établit, le SOC se réveille. Le SOC c’est le System On a Chip (Système Sur une Puce) de Broadcom. Ce SOC BCM2837 contient un processeur ARM cadencé à 1,2 GHz, un GPU VideoCore IV, de la mémoire cache et d’autres babioles qui accompagnent généralement les microprocesseurs (GPIO, timers, BUS divers et variés – I2C – SPI, contrôleur d’interruption – PIC, contrôleur de mémoire -MMU, UART…).
A la mise sous tension, seul le GPU est activé. Le processeur ARM reste en veille, la SDRAM est désactivée. Le SOC comporte une ROM (Read Only Memory – Mémoire Morte) dans laquelle le fabricant a programmé le premier étage du bootloader. Lors de son réveil, le GPU est paramétré pour exécuter le programme qui est dans cette ROM. C’est ce qu’il fait et le firmware contenu en ROM a pour seul objectif d’accéder à la carte micro SD, qui doit être formatée en FAT (enfin, au moins la première partition)… SAUF si on a modifié un registre de l’OTP (One Time Programmable memory) qui dit au BCM2837 (celui qui équipe le Raspberry Pi 3) que lorsqu’il démarre, il va déjà voir s’il y a une carte SD opérationnelle. Si ce n’est pas le cas, il peut baguenauder et essayer de démarrer sur l’USB le SPI ou l’Ethernet…
Donc ce que je vous propose de faire c’est de commencer cette modif, prévoyez un peu de temps quand même…
Ce tutoriel est paru sur le blog raspberrypi.org, en voici une traduction.
Attention !
Mise à jour du firmware
Commencez par une mise à jour du systéme
sudo apt-get update sudo apt-get upgrade
Ensuite on met à jour le firmware dans /boot (start.elf et bootcode.bin) mais avec la version de la branche NEXT (expérimentale) : sudo BRANCH=next rpi-update
pi@raspberrypi:~ $ sudo BRANCH=next rpi-update *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom *** Performing self-update *** Relaunching after update *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom *** Downloading specific firmware revision (this will take a few minutes) % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 168 0 168 0 0 294 0 --:--:-- --:--:-- --:--:-- 294 100 51.1M 100 51.1M 0 0 413k 0 0:02:06 0:02:06 --:--:-- 468k *** Updating firmware *** Updating kernel modules *** depmod 4.4.15-v7+ *** depmod 4.4.15+ *** Updating VideoCore libraries *** Using HardFP libraries *** Updating SDK *** Running ldconfig *** Storing current firmware revision *** Deleting downloaded files *** Syncing changes to disk *** If no errors appeared, your firmware was successfully updated to 47d64831ccbc99080f98c1bc8948717c3416cb0f *** A reboot is needed to activate the new firmware
Autorisation du boot USB
On va modifier le fichier config.txt pour autoriser le boot USB :
echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
Ceci ajoute program_usb_boot_mode=1
à la fin du fichier /boot/config.txt
.
On peut maintenant redémarrer le Raspberry Pi et vérifier que le registre 1 de l’OTP a bien été modifié
sudo reboot
et pour vérifier le registre :
pi@raspberrypi:~ $ vcgencmd otp_dump | grep 17: 17:3020000a pi@raspberrypi:~ $
Vérifiez bien que la valeur du registre 17 est 3020000a ! (0x3020000a pour ceux qui parlent couramment en hexadécimal