GNU/Linux >> Linux Esercitazione >  >> Linux

Come associare il dispositivo USB con un nome statico?

Come suggerito, puoi aggiungere alcune regole udev. Ho modificato il /etc/udev/rules.d/10-local.rules contenere:

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"

Puoi controllare le variabili del tuo dispositivo eseguendo

udevadm info -a -p  $(udevadm info -q path -n /dev/ttyUSB0)

C'è una guida più approfondita che puoi leggere su http://www.reactivated.net/writing_udev_rules.html


La sintassi della regola sopra può funzionare su alcune distribuzioni, ma non ha funzionato sulla mia (Raspbian). Dal momento che non ho mai trovato un solo documento che spieghi tutti i dettagli, ho scritto il mio, che si trova qui. Questo è ciò a cui si riduce.
1. scopri cosa c'è su ttyUSB:

dmesg | grep ttyUSB  

2. Elenca tutti gli attributi del dispositivo:

udevadm info --name=/dev/ttyUSBx --attribute-walk

(con il/i numero/i del tuo dispositivo invece di x, ovviamente). Scegli un set di identificatori univoci, ad esempio idVendor + idProduct. Potresti anche aver bisogno di SerialNumber se hai più di un dispositivo con lo stesso idVendor e idProduct. I numeri di serie devono essere univoci per ogni dispositivo.
3. Crea un file /etc/udev/rules.d/99-usb-serial.rules con qualcosa di simile a questa riga:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name" 

(supponendo che non sia necessario un numero di serie lì, e ovviamente con i numeri per idVendor e idProduct che hai trovato nel passaggio 2.
4. Carica la nuova regola:

sudo udevadm trigger

5. Verifica cosa è successo:

ls -l /dev/your_device_name  

mostrerà a quale numero ttyUSB è andato il collegamento simbolico. Se è /dev/ttyUSB1 , quindi verifica chi lo possiede e a quale gruppo appartiene:

ls -l /dev/ttyUSB1   

Quindi solo per il gusto di farlo:

udevadm test -a -p  $(udevadm info -q path -n /dev/your_device_name)

Il problema dei dispositivi USB multipli identici

Ho un Rasperry Pi con quattro fotocamere. Scatto foto con fswebcam che identifica le telecamere come /dev/video0 .. video3 . A volte la fotocamera è video0 , vide02 , video4 e video6 ma possiamo dimenticarcene per ora.

Ho bisogno di un ID persistente per identificare un numero di telecamera in modo che, ad es. video0 è sempre la stessa macchina fotografica perché sottotitolo le immagini. Sfortunatamente ciò non avviene in modo affidabile:all'avvio, le videocamere vengono enumerate come video0 ..video3 ma non sempre allo stesso modo.

Le telecamere hanno tutte lo stesso ID e numero di serie.

La soluzione a questo problema riguarda le regole udev, ma ci sono anche molti ami da pesca.

Se dai il comando

udevadm info –attribute-walk –path=/dev/video0

ottieni un massetto di output ma i bit salienti sono

KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.

Il bit KERNELS è una porta hub USB. Con quattro videocamere ce ne sono quattro - non cambiano al riavvio , ma le video{x} associato a una porta may cambia.

Quindi abbiamo bisogno di una regola udev per legare un numero video a una porta hub USB - qualcosa come:

KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0” 

Sembra semplice:accedi alla fotocamera con

fswebcam –d  $realpath /dev/camera0

Tranne che non funziona:se lo inserisci in una regola udev e il sistema ha assegnato video0 (all'avvio) a una porta diversa, la regola udev viene ignorata. Il collegamento simbolico a /dev/camera0 sostanzialmente dice no such device . Piazza uno.

Quello che vogliamo è associare un collegamento simbolico a un indirizzo hub USB, non un video{x} numero. Ci voleva un programma Python.

Il primo passaggio è stato eseguire

fswebcam –d /dev/video${x}  tst.jpg

per x tra 1 e 8. L'esistenza di tst.jpg dopo ogni chiamata identifica se c'è una telecamera su questo numero video. Da questo crea un elenco di numeri di video attivi. La mia esperienza è stata che sia 0,1,2,3 o 0,2,4,6 per le fotocamere che ho usato.

Altri possono ovviamente creare questo elenco utilizzando un processo diverso.

Quindi, per ogni numero di video nell'elenco esegui

udevadm info –attribute-walk –path=/dev/videox > dd

ed estrai il KERNELS= line da dd . Da questo processo si finisce con un elenco degli indirizzi delle porte USB per le fotocamere. Ordina questo elenco in modo che al passaggio successivo lo elabori sempre nello stesso ordine. Chiamalo "lista di indirizzi".

Esegui il udevadm … > dd di nuovo e crea un elenco simile a

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.

Ora scorri l'elenco degli indirizzi:per ogni voce trova la voce corrispondente dall'elenco dei video. Crea un nuovo elenco che assomigli a una raccolta di righe come

KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”

La x (numero del collegamento simbolico) viene sostituita dal numero di sequenza nell'elenco degli indirizzi.

Ora hai una regola udev che funziona. Un collegamento simbolico legato a un indirizzo hub USB, indipendentemente dal numero di video assegnato a quella porta all'avvio.

Scrivi l'elenco finale in un file /etc/udev/rules.d/cam.rules . Esegui udevadm trigger per attivarlo e il lavoro è fatto. /dev/camera2 sarà la stessa videocamera (porta USB) indipendentemente dal suo numero di video.


Linux
  1. 4 Modo utile per conoscere il nome del dispositivo USB collegato in Linux

  2. Come selezionare un numero di porta statico per un'app personalizzata?

  3. Mappatura di un numero di dispositivo al nome di dispositivo logico

  4. Come posso essere sicuro di aver collegato un dispositivo a una porta USB 3?

  5. Come determinare la versione USB 1.1 o 2.0

Come trovare l'utilizzo della larghezza di banda del dispositivo USB su Linux

Come utilizzare un'unità USB su Debian 10

Come montare il dispositivo USB Leapfrog Tag?

Come mostrare la notifica quando viene inserito un dispositivo USB?

Come mappare l'IP statico sul tuo dominio (con l'esempio di GoDaddy)

Come si controlla quanta potenza può fornire una porta USB?