Maintenant que j'ai cette magnifique petite machine à 35 USD sous la main,
pourquoi pas essayer de brancher le Minitel dessus, comme sur un PC classique ?
Ce post est la suite de l'article Minitel comme terminal Linux, et
je vous invite à y jeter un coup d'œil avant de continuer. Il expliquera
comment tester rapidement le Minitel, puis les aspects qui diffèrent par rapport
à un PC classique sous Linux. Enfin, il expliquera dans les grandes lignes comment
cross-compiler minicurses sur Gentoo
pour Raspberry Pi.

Le matériel
Il vous faut :
- Un Raspberry Pi et un OS (j'utilise Raspian ici) ;
- Le câble série nécessaire, qui est toujours le même que celui
pour PC ;
- Un convertisseur USB-série compatible avec le driver
pl2303
sous Linux
(c'est-à-dire à peu près n'importe quel câble trouvable à une dizaine
d'euros rue Montgallet).
Nous n'aborderons pas la fabrication du câble série, qui est
expliquée en détail dans l'article précédent.
Un petit test
Rien de tel qu'un petit test avant de passer à la suite :
$ stty -F /dev/ttyUSB0 1200 istrip cs7 parenb -parodd brkint \
ignpar icrnl ixon ixany opost onlcr cread hupcl isig icanon \
echo echoe echok
$ echo 'bonjour Minitel !' > /dev/ttyUSB0

Ça, ça marche bien, et c'est plutôt rassurant.
Compiler mgetty comme il faut
Pour faire fonctionner un terminal Minitel sur le Raspberry Pi, les
instructions d'origine peuvent être suivies si on souhaite se
contenter d'un agetty
et d'un prompt de login pas vraiment joli à voir.
oui
Pour y remédier, il faudra procéder comme dans mon article
d'origine, c'est-à-dire appliquer un patch pour utiliser
/etc/gettydefs
pour que le prompt de login s'affiche correctement. C'est
pourquoi nous serons toujours amenés à compiler mgetty
depuis les sources,
plutôt que d'installer le paquet binaire.
Nous procéderons à la compilation de mgetty
directement sur le Raspberry Pi
par souci de simplicité, mais il va de soi que ce sera certainement plus
rapide de le cross-compiler depuis une machine plus grosse.
Ajouter d'abord une ligne deb-src
dans /etc/apt/sources.list
identique à
celle-ci :
deb-src http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib rpi
puis
$ mkdir src; cd src
$ sudo apt-get source mgetty
Maintenant que nous avons récupéré les sources et les patchs Debian pour
mgetty
, appliquer celui pour utiliser
gettydefs :
$ wget http://x0r.fr/blogstuff/mgetty-use-gettydefs.patch
$ patch -d mgetty-1.1.36 -p1 < mgetty-use-gettydefs.patch
Installer ensuite les dépendances nécessaires à la compilation :
$ sudo apt-get build-dep mgetty
Prendre un café.
$ cd mgetty-1.1.36
$ dpkg-buildpackage -rfakeroot -uc -b
Prendre un deuxième café, et regretter amèrement de ne pas avoir pris le temps
de regarder comment cross-compiler cet outil.
Une fois que c'est terminé, remontez dans le répertoire parent, et admirez la flopée de
nouveaux fichiers .deb
. Bien entendu, nous allons installer mgetty
.
$ cd ..
$ sudo dpkg -i mgetty_1.1.36-1.6_armhf.deb
L'instant de vérité : mgetty ne marche pas ! (mais getty, oui)
L'identifiant T0
est déjà utilisé pour le port série intégré au SoC du
Raspberry Pi, donc nos ajouts à /etc/inittab
portent l'identifiant T1
.
Et donc, pour une raison étrange, mgetty
ne marche pas. En effet, en
essayant de mettre une ligne comme celle-ci dans /etc/inittab
, comme cela
aurait été d'usage :
T1:23:respawn:/sbin/mgetty -br ttyUSB0 4800v23 -i /etc/issue.mgetty
alors, rien n'apparaît à l'écran. Après avoir lâché strace
, il semble que mgetty
ouvre correctement le port série, que les appels système write(2) fonctionnent, mais
qu'il se bloque sur le read(2) du login. Cependant, en utilisant le getty
traditionnel, avec la ligne
T1:23:respawn:/sbin/getty -L ttyUSB0 4800 minitel1b-80
moyennant le prompt de login hideux, cela fonctionne parfaitement.
Il faudrait donc que je détermine exactement pourquoi je n'ai aucun affichage
sur le Minitel avec mgetty, alors que getty fonctionne.
Cross-compiler minicurses pour Raspberry Pi
Bien évidemment, je ne pouvais pas m'arrêter là, et j'étais curieux de savoir si
ma bibliothèque minicurses fonctionne bien.
Cette fois, je l'ai cross-compilée à l'aide d'un crossdev configuré pour
Raspberry Pi. J'aurais aussi
pu compiler minicurses directement sur le Raspberry, mais pour des bibliothèques
plus conséquentes, cela devient assez vite fastidieux.
Je vous invite à lire le Gentoo Embedded Handbook afin de comprendre un peu mieux ce qui se passe.
D'abord, il faut installer les bibliothèques qui vont bien. Si on utilise crossdev
pour la première fois, le Embedded Handbook précise qu'il ne faut pas oublier
de lancer la commande
# emerge-wrapper --init
Ma bibliothèque a pour dépendance la bibliothèque netpbm. Cependant, le
packaging a l'air d'avoir été fait comme un pied, et pkg-config
donne
quelques problèmes.
Pour que la compilation de netpbm fonctionne :
# armv6j-hardfloat-linux-gnueabi-emerge -va libpng libxml2
# vi /usr/armv6j-hardfloat-linux-gnueabi/usr/lib/pkgconfig/libpng.pc
Changer ensuite prefix
en /usr/armv6j-hardfloat-linux-gnueabi/usr
. Faire de même
avec libxml2.pc
, puis :
# armv6j-hardfloat-linux-gnueabi-emerge -va netpbm
Avec autotools, cross-compiler, c'est magique. Une fois minicurses détaré :
$ LDFLAGS="-L/usr/armv6j-hardfloat-linux-gnueabi/usr/lib" \
./configure \
--host=armv6j-hardfloat-linux-gnueabi \
--prefix=/usr/armv6j-hardfloat-linux-gnueabi/
$ make
$ file ./src/.libs/libminicurses.so.0.3.2
./src/.libs/libminicurses.so.0.3.2: ELF 32-bit LSB shared object, ARM,
version 1 (SYSV), dynamically linked, not stripped
et pour les programmes d'exemple :
$ cd examples/
$ CC=armv6j-hardfloat-linux-gnueabi-gcc make
À présent, vous pourrez tester les programmes d'exemple pour voir que peu
importe la taille de la bécane sur laquelle tourne minicurses, tant qu'il y a
un Linux dessus, il n'y a aucun problème.
Conclusion
J'espère publier un tutoriel un peu plus compréhensible pour la compilation croisée
de minicurses une fois que j'aurai fini de publier la version 0.4, qui devrait
apparaître sous peu.
J'espère également que cet article ouvre, à terme, la voie de « hacks » à base
de Minitel et de Raspberry Pi. On pourrait alors, par exemple, envisager un
projet de domotique avec des appareils contrôlés avec un Raspberry Pi, et
fournissant une interface d'administration par Minitel. Ce serait une belle
façon de recycler ces terminaux qui, pour certains, ont déjà fêté leur
30e anniversaire.