ttyUSB0 ? ttyUSB2 ? Non, ttyUSB1… Graaaahh ! udev !

J’ai acheté il y a quelque temps plusieurs de ces petites choses :

Des convertisseurs USB/Série en TTL (0-5V). Ceci permet de connecter directement, sans max232, un adaptateur USB/Série à un montage à base de microcontrôleur (genre Atmel AVR) ou un système embarqué (genre Fonera, remarquez le cavalier permettant de choisir 5V ou 3.3V, convitude). Seulement, voilà :
je branche un adaptateur, il est accessible via /dev/ttyUSB0
j’en branche un autre qui devient /dev/ttyUSB1
je débranche le premier et en branche deux autres et ça devient la fête aux ttyUSB*

Où est ma Fonera 1, où est mon Attiny2313, où est ma Fonera 2… etc…  ?

On trouve dans /sys/bus/usb-serial/devices plein de choses intéressantes avec udevinfo -a -p. Parmi lesquelles :
ATTRS{manufacturer}== »FTDI »
ATTRS{product}== »FT232R USB UART »
ATTRS{serial}== »A90066ai »
Du coup, il ne reste plus qu’à se construire des petites règles sympathiques dans un fichier placé dans /etc/udev/rules.d :
SUBSYSTEMS== »usb », KERNEL== »ttyUSB* », ATTRS{product}== »FT232R USB UART »,
SYSFS{serial}== »A90066j7″, SYMLINK+= »TTYUSB0″
SUBSYSTEMS== »usb », KERNEL== »ttyUSB* », ATTRS{product}== »FT232R USB UART »,
SYSFS{serial}== »A90066ac », SYMLINK+= »TTYUSB1″
SUBSYSTEMS== »usb », KERNEL== »ttyUSB* », ATTRS{product}== »FT232R USB UART »,
SYSFS{serial}== »A900669W », SYMLINK+= »TTYUSB2″
SUBSYSTEMS== »usb », KERNEL== »ttyUSB* », ATTRS{product}== »FT232R USB UART »,
SYSFS{serial}== »A90066ai », SYMLINK+= »TTYUSB3″
On redémarre udev avec un petit /etc/init.d/udev restart et on marque des petits chiffres au feutre indélébile sur les adaptateurs. A la connexion du périphérique identifié par son numéro de série, un lien symbolique est créé dans /dev. Peu importe le /dev/ttyUSB*, le lien symbolique donne toujours accès au bon périphérique.

Done.

PS : ça marche pour plein de périphériques. Ceci inclus les clef USB par exemple :
BUS== »usb », SYSFS{serial}== »123456789ABCDEF », NAME= »%k », SYMLINK= »usbkey1″