So erhalten Sie eine Bus- und Gerätebeziehung für ein / dev / ttyUSB

14

Ich muss ein Skript schreiben, um USB-Dongles neu zu starten. Ich habe alle Tools, aber ich kann mein / dev / ttyUSBx nicht mit dem physischen BUS und DEVICE verknüpfen. Ein Problem ist, dass ich drei Dongles mit demselben ID-Anbieter und demselben ID-Produkt habe.

Wenn ich lsusb mache, ist die Ausgabe:

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

Und ich habe es angehängt an:

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

Aber ich möchte wissen, welches Gerät mit welchem ​​Busgerät zusammenhängt. Zum Beispiel muss ich Folgendes bekommen:

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

Ich benutze Ubuntu Server 10.04 und habe die Tools getestet:

lsusb
hal
lsmod

Aber ich kann die Beziehung nicht bekommen.

Ernesto Campohermoso
quelle

Antworten:

11

Da ich Ihre Hardware nicht habe, kann ich Ihnen keine genaue Antwort geben.

Ich würde vorschlagen, dass Sie zum fraglichen Gerät gehen, zum Beispiel:

ls -l /dev/ttyUSB0

und erhalte die Haupt- und Nebenknotennummern. Nehmen wir an, sie sind 116, 7

Dann geh zu:

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

( char, da tty ein Zeichengerät ist, wenn Sie ein Plattengerät aufspüren würden, das Sie blockanstelle von angeben würden char)

In der Ausgabe des Befehls sehen Sie etwas wie:

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

Das Verzeichnis /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/und seine Unterverzeichnisse enthalten viele Informationen zum Gerät. Als Beispiel /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnumund /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum. Auf meinem System stimmen diese mit der in den Geräte-Hotplug-Einträgen in / var / log / syslog angegebenen Bus- und Gerätenummer überein.

Noch etwas, das auf meinem System für / dev / video0 funktioniert:

find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null
John S Gruber
quelle
Vielen Dank! Ich kämpfe schon seit langer Zeit damit. Nur für weitere Besucher: In meinem Ubuntu Ubuntu 10.04.2 LTS ist das Geräteverzeichnis / sys / dev / char / anstelle von / sys / char /
Ernesto Campohermoso
Vielen Dank für die Korrektur. Ich habe die Antwort mit dieser Änderung bearbeitet und einen Suchbefehl hinzugefügt, um die Informationen auszudrucken.
John S Gruber
@JohnSGruber Ok, aber wie wird es montiert ?!
Dr.jacky
1
@ Mr.Hyde: Du kannst ein / dev / ttyUSB nicht mounten; Es kann nur ein Gerät gemountet werden, das wie ein Festplattenlaufwerk funktioniert.
John S Gruber
10

Es gibt wirklich keine gute Möglichkeit, Zeichengeräte /dev/ttyUSB0den entsprechenden USB-Geräte- und Busnummern zuzuordnen . ABER es ist möglich!

So etwas könnte funktionieren:

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

Von dort erhalten Sie eine Reihe von Informationen über das Gerät und seine übergeordneten Geräte. Jetzt geht es nur noch darum, diese Daten zu analysieren, um das zu erhalten, was Sie wollen. Ich habe das in der Vergangenheit benutzt:

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 " " "/"

Wenn das kein Bissen ist, weiß ich nicht, was ist! Lassen Sie es uns aufschlüsseln:

udevadm info --name=/dev/ttyUSB0 --attribute-walk - Gibt Informationen über das Gerät und seine übergeordneten Geräte zurück

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'- analysiert diese Daten und gibt alle Zeilen zurück, die das Attribut "devnum" oder "busnum" enthalten. Wir gehen davon aus, dass "busnum" zuerst aufgeführt wird ... und in diesem Fall können wir nur die ersten beiden Zeilen der Ausgabe abrufen.

head -n 2- Nehmen Sie die ersten 2 Zeilen der Ausgabe. Wir könnten hier etwas ausgefallener sein, gehen aber nur davon aus, dass das "Busnum" und "Devnum" der nächstgelegenen Eltern zuerst aufgeführt werden.

awk '{$1 = sprintf("%03d", $1); print}' - Nimmt diese Ziffern und füllt sie mit Nullen auf.

echo /dev/bus/usb... - all dieser Jazz ist in ein echoStatement eingepackt , um die Zeilenumbrüche durch Leerzeichen zu ersetzen. Sie können das -nto hinzufügen , echowenn Sie die abschließende Newline abschneiden möchten.

tr " " "/" - Ersetzen Sie die Leerzeichen in der Ausgabe durch Schrägstriche

Dies wird ungefähr so ​​aussehen:

/dev/bus/usb/001/011

... das ist natürlich das Gerät. Wenn Sie möchten, können Sie ganz einfach etwas busnum:001 devnum:011mit ein paar Änderungen ausgeben :

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;}'`
BMiner
quelle
1

Sie können alle Informationen über den Knoten mit dem folgenden Befehl finden:

udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/
ravibhuva9955
quelle
Bitte entfernen Sie den abschließenden Schrägstrich. Es gibt "Syspath nicht gefunden".
nvd