DiscoBSD: Ah, ah, ah, ah… Stayin’ Alive

DiscoBSD est un portage de 2.11BSD 1 vers des microcontrôleurs 32 bits modernes. Il s’agit en fait d’un fork de RetroBSD qui avait déjà porté 2.11BSD vers PIC32 (MIPS).

Cette distribution apporte le support de ARM Cortex M4, principalement pour les cartes Disco(very) et Nucleo de chez ST. Les modèles supportés sont:

Leur intérêt vient de leur prix nettement plus abordable que leurs équivalents MIPS. Elles intègrent, en plus, leur programmeur ST-Link: il suffit d’un câble USB pour les flasher. Comme j’ai déjà une STM32F4-discovery, c’était trop tentant d’essayer le dernier représentant de la branche 2 de BSD Unix. Pour info, la STM32F4-discovery est équipée de :

  • CPU STM32F407VGT6 – Cortex M4 @168MHz
  • 192 ko de RAM 2
  • 1 Mo de flash

Les mains dans le cambouis

Coté matos, à part un adaptateur UART vers usb pour accéder à la console série, vous aurez besoin d’un lecteur de carte SD compatible Arduino. La connexion du lecteur est décrite plus bas.
Bien sûr, on ne met pas un système d’exploitation complet de type UNIX dans les 1024ko de la mémoire d’un micro-contrôleur: seul, le noyau est « flashé » sur la carte.
Ici pas de bootloader, on exécute directement le noyau au démarrage. Notez que la taille du noyau fait moins de 100ko: avec 1Mo de flash, on a de la marge.
Toute la partie « userland » est contenue sur une carte mémoire au format UFS (L’image fait environ 200 Mo et inclus /, /home et la swap de 2Mo). Avec si peu de RAM (192 ko), l’OS utilise la swap pour tous les processus. Faudra pas s’attendre a des perfs de dingue. Mais avec seulement 100Mo d’espace disque, l’OS est livré complet avec le man, les jeux, et le compilateur C.

Construction depuis FreeBSD

Le projet ne prend en compte, pour la construction, que Linux ou OpenBSD (Pas sûr que ça compile « out of the box »). Pour le compiler sous FreeBSD, vous devrez installer les paquets suivants:

fusefs-libs
gcc-arm-embedded
gmake
st-link
git-lite

Récupérez le dépôt

git clone --branch lhondareyte-dev https://github.com/lhondareyte/discobsd.git

Construisez le « userland » et les tools:

export PATH=$PATH:/usr/local/gcc-arm-embedded/bin
cd discobsd
gmake

Flashez la carte SD:

dd if=discobsd/distrib/stm32/sdcard.img of=/dev/da0 bs=64k

Compilez le noyau (aka neuyo):

cd discobsd/sys/stm32/f4discovery
export PATH=$PATH:/usr/local/gcc-arm-embedded/bin
gmake
arm-none-eabi-objcopy -O binary -S unix.elf vmunix.bin

Connectez la carte à un port USB et flashez le noyau:

st-flash erase
st-flash write vmunix.bin 0x8000000

La console série est associée à l’UART2 (broches PA2 et PA3, respectivement TX et RX). Avec l’adaptateur USB/UART, connectez vous sur la console:

cu -l /dev/cuaU0 -s 115200

Et voilà un démarrage qui échoue lamentablement en panic (le lecteur de carte mémoire n’est pas connecté):

Pas de u-boot ou autre GRUB, pour nous aider. Le ‘disque dur’ doit être accessible.

Connexion du « stockage »

Le lecteur de carte SD est connecté au port SPI2 de la carte. Le protocole SPI utilise 3 signaux (MISO, MOSI et SCK). Connectez comme suit (voir sys/stm32/stm32f4xx_nucleo_sd.h):

Lecteur          STM4_Discovery
-------------------------------
    CS    <------------   PB12
   SCK    <------------   PB13
  MISO    ------------>   PB14
  MOSI    <------------   PB15
   GND    ------------>   GND
   VCC    <------------   3.3V ou 5V (voir article)

Attention à la tension d'alimentation, elle doit correspondre a votre module: s'il possède un régulateur 3.3V (Type AMS1117), connectez le au 5V sinon au 3V de la carte. Au besoin, vérifiez la tension d'alimentation en entrée de l'adaptateur (ou en sortie du régulateur si présent).

Après connexion du lecteur, ça donne ça:

Prenez soin d'effectuer un shutdown pour arrêter l'OS sous peine de devoir exécuter à nouveau fsck au boot suivant.

PS : Si vous n'avez pas de carte STM32F4 ou PIC32, vous pouvez toujours simuler 2.11BSD sur PDP11 avec SIMH.

Pour la route...

Liens

Notes

1 : 2.11BSD, dont les derniers patchs datent de 1991, est la dernière version d'UNIX BSD disponible pour PDP11.
2 : Bill avait raison: 640 ko, ça devrait être suffisant pour n'importe qui.

Un compilateur peut en cacher un autre

En recompilant NuttX sur FreeBSD 13 pour une carte bluepill (STM32F103C8T6), j’ai eu une mauvaise surprise: même si le code se compile correctement, le binaire ne fonctionne pas une fois arrivé sur la cible.
La classique « laide qui clignote » fonctionne sans problème, mais des fonctions avancées (USB par exemple) ne fonctionnent pas du tout.
En fait, il faut utiliser le compilateur devel/gcc-arm-embedded au lieu de devel/arm-none-eabi-gcc.

Notez que ce compilateur s’installe dans le répertoire /usr/local/gcc-arm-embedded. Pour l’utiliser, il faut exporter la variable PATH comme suit (/bin/sh):

export PATH=$PATH:/usr/local/gcc-arm-embedded/bin

Exemple de configuration NuttX avec authentification sur la console via le port USB :
Je n’ai pas encore compris l’intérêt d’avoir deux compilateurs différents, mais je ne désespère pas d’avoir une réponse.

La source.
 
La capture de terminal est réalisée avec asciinema et convertie avec gifcast

A propos de NuttX 9

Début décembre, le projet NuttX est passé dans le giron de la fondation Apache avec le programme « incubator » (cf. ce mail sur la liste de diffusion). Par la même occasion, il est passé sous licence Apache V2 qui est une licence permissive comme la licence BSD initiale.

La version 9.0 est donc la première à sortir depuis ce changement. En plus des nouveaux drivers/socs, la méthode de construction évolue: deux nouvelles dépendances apparaissent : flock qui permet de verrouiller un fichier depuis un script shell à l’instar de flock(2) et wget qu’on ne présente pas. Vous trouverez donc ces logiciels pour macOS sur la page dédiée.

Configuration minimale pour STM32 avec macOS

Petit récapitulatif des pré-requis minimums pour développer des applications pour STM32 sous macOS.

Si les « Xcode Command Line Tools » sont installés, vous n’avez pas besoin de make (gmake).

Enfin les modèles (templates) de Iván Stepaniuk sont biens utiles pour débuter.

Coté matériel, une carte « blue pill » et un programmateur stlink chinois disponibles sur Ebay/banggood/aliexpress feront l’affaire.