Comme suggéré, vous pouvez ajouter des règles udev. J'ai modifié le /etc/udev/rules.d/10-local.rules
contenir :
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"
Vous pouvez vérifier les variables de votre appareil en exécutant
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
Il existe un guide plus détaillé que vous pouvez lire sur http://www.reactivated.net/writing_udev_rules.html
La syntaxe de règle ci-dessus peut fonctionner sur certaines distributions, mais ne fonctionnait pas sur la mienne (Raspbian). Comme je n'ai jamais trouvé un seul document expliquant tous les tenants et les aboutissants, j'ai rédigé le mien, à retrouver ici. C'est ce à quoi cela se résume.
1. découvrez ce qu'il y a sur ttyUSB :
dmesg | grep ttyUSB
2. listez tous les attributs de l'appareil :
udevadm info --name=/dev/ttyUSBx --attribute-walk
(avec le(s) numéro(s) de votre appareil au lieu de x, bien sûr). Choisissez un ensemble d'identifiants uniques, par exemple idVendor + idProduct. Vous pouvez également avoir besoin de SerialNumber si vous avez plusieurs appareils avec les mêmes idVendor et idProduct. Les numéros de série doivent être uniques pour chaque appareil.
3. Créez un fichier /etc/udev/rules.d/99-usb-serial.rules
avec quelque chose comme cette ligne :
SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name"
(en supposant que vous n'ayez pas besoin d'un numéro de série là-bas, et bien sûr avec les numéros pour idVendor et idProduct que vous avez trouvés à l'étape 2.
4. Chargez la nouvelle règle :
sudo udevadm trigger
5. Vérifiez ce qui s'est passé :
ls -l /dev/your_device_name
montrera à quel numéro ttyUSB le lien symbolique est allé. Si c'est /dev/ttyUSB1
, puis vérifiez qui en est propriétaire et à quel groupe il appartient :
ls -l /dev/ttyUSB1
Alors juste pour le fun :
udevadm test -a -p $(udevadm info -q path -n /dev/your_device_name)
Le problème de plusieurs périphériques USB identiques
J'ai un Rasperry Pi avec quatre caméras. Je prends des photos avec fswebcam
qui identifie les caméras comme /dev/video0
.. video3
. Parfois, la caméra est video0
, vide02
, video4
et video6
mais nous pouvons oublier cela pour l'instant.
J'ai besoin d'un ID persistant pour identifier un numéro de caméra afin que, par ex. video0
c'est toujours le même appareil car je légende les photos. Malheureusement, cela ne se produit pas de manière fiable - au démarrage, les caméras sont énumérées comme video0
..video3
mais pas toujours de la même façon.
Les caméras ont toutes le même identifiant et numéro de série.
La solution à ce problème implique des règles udev, mais il y a aussi beaucoup d'hameçons.
Si vous émettez la commande
udevadm info –attribute-walk –path=/dev/video0
vous obtenez une chape de sortie mais les bits saillants sont
KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.
Le bit KERNELS est un port concentrateur USB. Avec quatre caméras, il y en a quatre - elles ne changent pas au redémarrage, mais le video{x}
associé à un port peut changer.
Nous avons donc besoin d'une règle udev pour lier un numéro de vidéo à un port de concentrateur USB - quelque chose comme :
KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0”
Ça a l'air simple :accédez à l'appareil photo avec
fswebcam –d $realpath /dev/camera0
Sauf que cela ne fonctionne pas - si vous mettez cela dans une règle udev et que le système a alloué video0 (au démarrage) à un port différent, la règle udev est ignorée. Le lien symbolique vers /dev/camera0
dit en gros no such device
. Carré un.
Ce que nous voulons, c'est lier un lien symbolique à une adresse de concentrateur USB, pas un video{x}
Numéro. Il a fallu un programme Python.
La première étape était de courir
fswebcam –d /dev/video${x} tst.jpg
pour x
entre 1 et 8. L'existence de tst.jpg
après chaque appel identifie s'il y a une caméra sur ce numéro vidéo. À partir de là, faites une liste des numéros de vidéo actifs. D'après mon expérience, il s'agit soit de 0,1,2,3
ou 0,2,4,6
pour les caméras que j'ai utilisées.
D'autres peuvent bien sûr construire cette liste en utilisant un processus différent.
Ensuite, pour chaque numéro de vidéo de la liste, exécutez
udevadm info –attribute-walk –path=/dev/videox > dd
et extraire le KERNELS= line
à partir de dd
. À partir de ce processus, vous obtenez une liste des adresses de port USB pour les caméras. Triez cette liste afin qu'à l'étape suivante, vous la traitiez toujours dans le même ordre. Appelez cela la "liste d'adresses".
Exécutez le udevadm … > dd
chose à nouveau et faites une liste qui ressemble à
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.
Parcourez maintenant la liste d'adresses - pour chaque entrée, recherchez l'entrée correspondante dans la liste des vidéos. Créez une nouvelle liste qui ressemble à une collection de lignes comme
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”
Le x (numéro de lien symbolique) est remplacé par le numéro de séquence dans la liste d'adresses.
Vous avez maintenant une règle udev qui fonctionne. Un lien symbolique lié à une adresse de concentrateur USB, quel que soit le numéro de vidéo attribué à ce port au démarrage.
Écrivez la liste finale dans un fichier /etc/udev/rules.d/cam.rules
. Exécutez udevadm trigger
pour l'activer et le travail est fait. /dev/camera2
sera la même caméra (port USB) quel que soit son numéro de vidéo.