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"
