Come ottenere la relazione bus e dispositivo per un / dev / ttyUSB


14

Devo scrivere uno script per riavviare i dongle USB. Ho tutti gli strumenti ma non riesco a collegare il mio / dev / ttyUSBx a BUS e DISPOSITIVI fisici. Un problema è che ho tre chiavi hardware con lo stesso fornitore ID e prodotto ID.

Se faccio lsusb l'output è:

Bus 001 Device 004: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 006: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 007: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 002: ID 80ee:0021
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

E l'ho allegato a:

/dev/ttyUSB0
/dev/ttyUSB3
/dev/ttyUSB5

Ma voglio sapere quale dispositivo è collegato con quale dispositivo Bus. Con l'esempio ho bisogno di ottenere quanto segue:

/dev/ttyUSB0 -> Bus 001 Device 006
/dev/ttyUSB3 -> Bus 001 Device 004
/dev/ttyUSB5 -> Bus 001 Device 007

Sto usando Ubuntu Server 10.04 e ho testato gli strumenti:

lsusb
hal
lsmod

Ma non riesco a capire la relazione.

Risposte:


11

Dal momento che non ho il tuo hardware, non posso darti una risposta esatta.

Ti suggerirei di andare al dispositivo in questione, ad esempio:

ls -l /dev/ttyUSB0

e ottenere i numeri di nodo principali e secondari. Diciamo che sono 116, 7

Quindi vai a:

ls -l /sys/dev/char/116:7

( charpoiché un tty è un dispositivo a caratteri, se si stesse rintracciando un dispositivo a disco, si specifica blockinvece di char)

Nell'output del comando vedrai qualcosa di simile a:

lrwxrwxrwx 1 root root 0 Sep 6 00:17 116:7 -> ../../devices//sys/devices/pci0000:00/0000:00:13.5/pci0000:00/0000:00:13.5/usb1/1-3/1-3:1.1/sound/card1/pcmC1D0c

La directory /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/e le sue sottodirectory contengono molte informazioni sul dispositivo. Ad esempio, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnume /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum. Sul mio sistema corrispondono al numero di bus e dispositivo menzionato nelle voci hotplug del dispositivo in / var / log / syslog.

Qualcos'altro che funziona sul mio sistema per / dev / video0:

find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null

Grazie mille! Ho litigato per questo per molte volte. Solo per altri visitatori: Nel mio Ubuntu Ubuntu 10.04.2 LTS la directory del dispositivo è / sys / dev / char / invece di / sys / char /
Ernesto Campohermoso

Grazie per la correzione - Ho modificato la risposta con quella modifica e ho aggiunto un comando find per stampare le informazioni.
John S Gruber,

@JohnSGruber Ok, ma come montarlo ?!
Dr.jacky,

1
@ Mr.Hyde: non è possibile montare un / dev / ttyUSB; è possibile montare solo alcuni dispositivi che funzionano come un'unità disco.
John S Gruber,

10

Non esiste davvero un buon modo per mappare dispositivi a caratteri come /dev/ttyUSB0il dispositivo USB corrispondente e i numeri di bus. MA è possibile!

Qualcosa del genere potrebbe funzionare:

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

Da lì, otterrai un sacco di informazioni sul dispositivo e sui suoi dispositivi principali. Ora, si tratta solo di analizzare quei dati per ottenere quello che vuoi. L'ho usato in passato:

echo /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/"

Ora, se non è un boccone, non so cosa sia! Analizziamolo:

udevadm info --name=/dev/ttyUSB0 --attribute-walk - restituisce informazioni sul dispositivo e sui suoi dispositivi principali

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'- analizza questi dati e restituisce tutte le righe contenenti l'attributo "devnum" o "busnum". Supponiamo che "busnum" sia elencato per primo ... e in tal caso ... possiamo semplicemente prendere le prime due righe di output.

head -n 2- Prendi le prime 2 linee di output. Potremmo essere più fantasiosi qui, ma stiamo solo supponendo che il "busnum" e il "devnum" dei genitori più vicini verranno elencati per primi.

awk '{$1 = sprintf("%03d", $1); print}' - Prende quelle cifre e le riempie di zeri.

echo /dev/bus/usb... - tutto questo jazz è racchiuso in echoun'affermazione per sostituire le nuove linee con spazi. È possibile aggiungere -na echose si desidera tagliare la nuova riga finale.

tr " " "/" - Sostituisci gli spazi nell'output con barre rovesciate

Questo produrrà qualcosa di simile:

/dev/bus/usb/001/011

... che, ovviamente, è il dispositivo. Se lo desideri, puoi facilmente produrre qualcosa di simile busnum:001 devnum:011con alcune modifiche:

echo `udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\1\ \4/p' | head -n 2 | awk '{$1 = sprintf("%s:%03d", $1, $2); print $1;}'`

1

Puoi trovare tutte le informazioni sul nodo usando il comando seguente:

udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/

Rimuovere la barra finale. Dà "syspath non trovato".
nvd,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.