Minitel sur Raspberry Pi

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.

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

Bonjour Minitel !

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

Posté par x0r à 10 commentaires • Tags : linux minitel serie terminal raspbian raspberrypi mgetty crosscompilation crossdev arm

Commentaires

Poster un commentaire

#1 — P481O

Bonjour, les deux article sur le minitel m'intéresse, je pensais aussi relier un minitel à une Raspberry Pi mais en me passant du convertisseur USB -> série, en passant directement par les GPIO 15 (RXD), GPIO 14 (TXD) et une des masse.

#2 — x0r

En effet, c'est une idée, et à mon avis pas trop dur à implémenter, du moment qu'on modifie le circuit d'adaptation des niveaux. Il me semble que c'est un UART basique qui fonctionne avec des signaux de 3,3 V. Le circuit sera donc le même, avec cependant des valeurs différentes pour les valeurs des résistances : R1 = R2 = 4,7 kΩ et R3 = 12 kΩ devraient théoriquement marcher.

Si j'ai l'occasion de mettre la main sur une breadboard, je tâcherai de protéger le tout avec deux optocoupleurs pour éviter de cramer mes ports... :)

#3 — lh

Bonour, J'ai tenté ces valeurs de résistances en mettant le 3.3V à la place de DTR+DCD mais les caractères ne sont pas bons. Dans le sens Rpi->Minitel, j'ai des carrés blancs qui s'affichent sue le minitel. Si je tapes qq chose sur le clavier du minitel, j'ai des caractères 'x' sur minicom coté Rpi. La conf de Minicom a été testé sur PC avec l'autre montage avec succès. Une idée ? Changer les résistances ?

#4 — lh

En empruntant un oscillo, j'ai compris pourquoi ça ne marche pas. Les signaux TTL du Raspberry sont inversé par rapport aux signaux RS232 d'un PC ... Le montage n'est donc pas correct pour fonctionner avec des signaux TTL.

#5 — HanzoHatoryv

Bonjour, Tout d'abord, merci X0r pour cet excellent tuto ! J'ai pu connecter le minitel directement aux pins uart du Raspberry pi, je poste ici ma démarche, je pense que cela peut en aider quelque uns : - le minitel detecte bien les états hauts à 3,3 V du raspberry pi, donc on peut directement relier l'uart Tx du Rpi au Rx du minitel. - par contre le minitel envoie des signaux 5v, j'ai utilisé un simple pont diviseur de tension pour pour connecter le Tx du minitel au Rx du Rpi. Après un long tâtonnement les valeurs 10k et 38k pour les resitances du pont diviseur ont marchés nickel. - Bien entendu, il faut relier les masses.

Voici un schéma de ma petite réalisation : http://www.hostingpics.net/viewer.php?id=661109RpiMinitelConnection.png

Attention par contre, ce montage ne protège pas le raspberry Pi des surtensions éventuelles ! Mais il a le mérite d'être simple et pas cher :) .

#6 — Edgar Bonet

Bonjour ! Merci d'abord à x0r pour cet article ! Pour ma part j'ai fait à peu près le contraire de ce qu'a fait HanzoHatoryv :

1) Le Tx du Minitel va direct dans le Rx du Raspberry. C'est que le Minitel que j'ai utilisé (Minitel 1) a une sortie en collecteur ouvert. Donc non, il n'envoie jamais 5 V. D'après la doc que j'ai lue il semblerait que le Minitel 1B c'est pareil.

2) Dans le sens Raspberry → Minitel je passe par un circuit d'adaptation (2 transistors NPN et deux résistances de 51 kΩ) car l'entrée du Minitel a une résistance de pull-up qui autrement injecterait du courant dans le Raspberry. Il est possible que le Raspberry puisse encaisser ce courant sans broncher, mais comme il et pas prévu pour, j'ai pas voulu prendre de risque. Après réflexion, je pense que je dois pouvoir remplacer ce circuit par une simple résistance à la masse dans la gamme des 20 kΩ. Je testerai après les vacanes et je vous tiens au courant.

#7 — Pilatomic

Bonjour. Merci beaucoup pour cet article, qui m'a beaucoup aidé. J'utilise pour ma part une interface USB dont je décris la réalisation ici : http://pilatomic.free.fr/wordpress/?p=361.

Après de nombreux essais, j'ai finalement réussi à faire fonctionner mgetty : il suffit en fait, dans le fichier policy.h que l'on modifie pour prendre en compte gettydefs, de commenter les lignes en rapport avec FIDO et autoPPP.

Mgetty fonctionne alors normalement, mis à part l'apparition d'un caractère parasite dans le champ login ( il faut d'ailleurs l'effacer sans quoi le nom d'utilisateur n'est pas reconnu).

#8 — jano31

Bonjour, D'accord avec Edgar. Cependant, en toute logique, TX minitel étant en collecteur ouvert, il faudrait une résistance de rappel au +3,3V du RPI pour définir un 1 logique. J'utilise pour ma part une résistance de 4,7K à cette fin. Mais ce tirage (pull_up) semblant être activé de façon interne sur la broche GPIO15 (RXD0), on peut apparemment se dispenser de cette résistance. C'est d'ailleurs bizarre car la doc wiki indique plutôt un pull_down sur cette broche, ce qui est contraire à l'observation. Par contre, dans le sens Raspberry vers Minitel, la liaison peut être directe (comme le fait HanzoHatoryv) car le rappel interne au minitel ne fait pas apparaitre de tension supérieure à 3,3V et l'intensité éventuellement injectée ne dépasse pas les 100 microampères. On peut cependant par sécurité intercaler une résistance de 1K en série pour limiter tout éventuel courant excessif lors de la mise sous tension. Enfin, pour éviter les problèmes d'alimentations multiples ou les conflits à la mise sous tension, il est possible d'alimenter le RPI à partir de la broche 5 de la DIN du Minitel : il suffit d'intercaler un convertisseur continu-continu 12V vers 5V (un régulateur série chaufferait trop!). Celui que j'utilise fonctionne bien jusqu'à 8 V en entrée et peut fournir plus d'un ampère sans chauffer.

#9 — Pilatomic

Je viens de constater un problème assez important : que j'utilise le minitel avec getty ou mgetty, si je lance une commande apt-get install, au début tout se passe bien, puis des carrés blanc apparaissent, et finalement j'ai un message qui me dit "apt-get stopped". rencontrez vous le même problème ?

#10 — Alexandre MONTARON

@Pila ... juste pour répondre a tout le monde puisqu'on en a déjà parlé ensemble : En gros, il est repassé en 8bits (sans parité) plutôt que 7 parité pair pour une raison inconnue ... ça m'arrivait avec Emacs (mais pas vi) ça m'arrive plus...

Alex. - http://canal.chez.com/terminfo.htm

Poster un commentaire