GNU/Linux >> Tutoriels Linux >  >> Linux

Comment lier un périphérique USB sous un nom statique ?

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.


Linux
  1. Comment identifier le chipset d'un périphérique USB sous Linux ?

  2. Comment obtenir des informations sur le fournisseur et le produit USB par programmation sous Linux ?

  3. Comment sélectionner un numéro de port statique pour une application personnalisée ?

  4. Mappage d'un numéro de périphérique sur un nom de périphérique logique

  5. Comment puis-je être sûr d'avoir branché un appareil sur un port USB 3 ?

Comment trouver l'utilisation de la bande passante d'un périphérique USB sous Linux

Comment utiliser une clé USB sur Debian 10

Comment monter le périphérique USB Leapfrog Tag ?

Comment afficher une notification lorsqu'un périphérique USB est inséré ?

Comment mapper une adresse IP statique sur votre domaine (avec l'exemple de GoDaddy)

Comment vérifier la puissance qu'un port USB peut fournir ?