Jak uzyskać połączenie magistrali i urządzenia dla / dev / ttyUSB

14

Muszę napisać skrypt do ponownego uruchomienia klucza USB. Mam wszystkie narzędzia, ale nie mogę połączyć mojego / dev / ttyUSBx z fizyczną magistralą i urządzeniem. Problem polega na tym, że mam trzy klucze sprzętowe z tym samym identyfikatorem i identyfikatorem.

Jeśli zrobię lsusb, wynikiem będzie:

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

I załączyłem to do:

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

Ale chcę wiedzieć, które urządzenie jest powiązane z którym urządzeniem magistrali. Na przykład muszę uzyskać następujące informacje:

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

Używam Ubuntu Server 10.04 i przetestowałem narzędzia:

lsusb
hal
lsmod

Ale nie mogę uzyskać związku.

Ernesto Campohermoso
źródło

Odpowiedzi:

11

Ponieważ nie mam twojego sprzętu, nie mogę dać ci dokładnej odpowiedzi.

Sugeruję, aby przejść do danego urządzenia, na przykład:

ls -l /dev/ttyUSB0

i uzyskaj główny i pomocniczy numer węzła. Powiedzmy, że mają one 116, 7

Następnie idź do:

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

( charponieważ tty jest urządzeniem znakowym, gdybyś przeszukiwał urządzenie dyskowe, które określiłbyś blockzamiast char)

W danych wyjściowych polecenia zobaczysz coś trochę takiego:

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

Katalog /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/i jego podkatalogi zawierają wiele informacji na temat urządzenia. Jako przykład /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnumi /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum. W moim systemie są one zgodne z numerem magistrali i urządzenia wymienionym we wpisach hotplug urządzenia w / var / log / syslog.

Coś innego, co działa w moim systemie dla / dev / video0:

find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null
John S Gruber
źródło
Dziękuję bardzo !, walczę z tym od wielu lat. Dla dalszych odwiedzających: W moim Ubuntu Ubuntu 10.04.2 LTS katalog urządzeń to / sys / dev / char / zamiast / sys / char /
Ernesto Campohermoso
Dzięki za korektę - edytowałem odpowiedź z tą zmianą i dodałem polecenie find, aby wydrukować informacje.
John S Gruber,
@JohnSGruber Ok, ale jak to zamontować ?!
Dr.jacky
1
@ Mr.Hyde: Nie można zamontować / dev / ttyUSB; tylko niektóre urządzenia działające jak napęd dyskowy mogą zostać zamontowane.
John S Gruber
10

Naprawdę nie ma dobrego sposobu mapowania urządzeń znakowych, takich jak /dev/ttyUSB0odpowiadające im urządzenia USB i numery magistrali. ALE jest to możliwe!

Coś takiego może działać:

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

Stamtąd otrzymasz mnóstwo informacji o urządzeniu i jego urządzeniach nadrzędnych. Teraz chodzi tylko o parsowanie tych danych, aby uzyskać to, czego chcesz. Korzystałem z tego w przeszłości:

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

Teraz, jeśli to nie jest kęs, nie wiem, co jest! Rozbijmy to:

udevadm info --name=/dev/ttyUSB0 --attribute-walk - zwraca informacje o urządzeniu i jego urządzeniach nadrzędnych

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'- analizuje te dane i zwraca wszystkie wiersze zawierające atrybut „devnum” lub „busnum”. Zakładamy, że „busnum” jest wymienione jako pierwsze ... w takim przypadku… możemy po prostu pobrać pierwsze dwa wiersze wyniku.

head -n 2- Złap pierwsze 2 wiersze wyniku. Moglibyśmy uzyskać więcej fantazji, ale zakładamy, że „busnum” i „devnum” najbliższego rodzica zostaną wymienione jako pierwsze.

awk '{$1 = sprintf("%03d", $1); print}' - Pobiera te cyfry i uzupełnia je zerami.

echo /dev/bus/usb... - cały ten jazz jest zawarty w echooświadczeniu, które zastępuje nowe linie spacjami. Możesz dodać -ndo, echojeśli chcesz odciąć końcowy znak nowej linii.

tr " " "/" - zamień spacje na wyjściu ukośnikami do przodu

Spowoduje to wyświetlenie czegoś takiego:

/dev/bus/usb/001/011

... którym oczywiście jest urządzenie. Jeśli chcesz, możesz łatwo wyprowadzić coś busnum:001 devnum:011z kilkoma poprawkami:

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
źródło
1

Możesz znaleźć wszystkie informacje o węźle za pomocą poniższego polecenia:

udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/
ravibhuva9955
źródło
Usuń końcowy ukośnik. Daje „nie znaleziono syspath”.
nvd