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.