Jak dopasować urządzenie ttyUSBX do urządzenia szeregowego USB

22

opcjonalny sterownik poprawnie dopasował identyfikator USB i ładuje sterownik dla tego urządzenia. Na przykład

# lsusb
Bus 001 Device 002: ID 19d2:0031 ONDA Communication S.p.A. ZTE MF636
Bus 001 Device 003: ID 12d1:14ac Huawei Technologies Co., Ltd.

Tworzy także urządzenia ttyUSBX do zarządzania sprzętem

crw-rw---- 1 root uucp 188, 0 Jul  4 13:48 /dev/ttyUSB0
crw-rw---- 1 root uucp 188, 1 Jul  4 13:49 /dev/ttyUSB1
crw-rw---- 1 root uucp 188, 2 Jul  4 13:35 /dev/ttyUSB2
crw-rw---- 1 root uucp 188, 3 Jul  4 13:37 /dev/ttyUSB3
crw-rw---- 1 root uucp 188, 4 Jul  4 13:37 /dev/ttyUSB4
crw-rw---- 1 root uucp 188, 5 Jul  4 13:37 /dev/ttyUSB5
crw-rw---- 1 root uucp 188, 6 Jul  4 13:37 /dev/ttyUSB6
crw-rw---- 1 root uucp 188, 7 Jul  4 13:37 /dev/ttyUSB7

Mam jednak więcej niż jedno urządzenie szeregowe USB i chcę wiedzieć, który ttyUSB jest dla którego USBID. Dawny. / dev / ttyUSB1 -> 19d2: 0031

Czy znasz punkt, w którym mogę uzyskać te informacje?

konkurs morski
źródło
Jeśli znasz szczegóły, takie jak sprzedawca / produkt, to odpowiedź jest świetna
kamera douszna

Odpowiedzi:

13

Spójrz na system plików sysfs. Przykład mojego numeru seryjnego USB:

$ lsusb
Bus 003 Device 016: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
$ ls -l /sys/bus/usb-serial/devices
lrwxrwxrwx 1 root root 0 Jul  4 17:37 ttyUSB0 -> ../../../devices/pci0000:00/0000:00:1c.0/0000:02:00.0/usb3/3-1/3-1:1.0/ttyUSB0
$ $ grep PRODUCT= /sys/bus/usb-serial/devices/ttyUSB0/../uevent
PRODUCT=67b/2303/300

Jak widać, ttyUSB0mapy 067b:2303na moim komputerze. Inne miejsca warte odwiedzenia /sys/class/tty/. Zwróć uwagę na dowiązania symboliczne.

Lekensteyn
źródło
zrobiłeś coś, żeby na liście znalazło się również PRODUKT?
Igor Stoppa,
@IgorStoppa, Spróbuj catw ueventpliku z wyniku find /sys -name ttyACM0, na przykład. Zastąp nazwę węzła urządzenia szeregowego.
sherrellbc
9

Możesz spróbować sprawdzić, czy twoje urządzenia są zarejestrowane pod / dev / serial / by-id /

ls -l / dev / serial / by-id

Nazwy te powinny być spójne i będą wskazywać (dowiązanie symboliczne) do poprawnego ttyUSBx

Waxhead
źródło
Czy możesz dodać wyjaśnienia, przykłady itp. Odpowiedź Oneline nie jest tak dobra w SE
Romeo Ninov
@RomeoNinov Ok, dodałem trochę wyjaśnień zgodnie z twoją prośbą. Nie jest to wcale trudniejsze niż po prostu przeszukanie innego katalogu, więc nie widzę, jak uczynienie odpowiedzi bardziej złożoną niż jest w stanie coś poprawić. Przepraszam za to.
Waxhead
Mam dwa identyczne adaptery (dwa Arduinos) podłączone do Raspberry Pi. ls -l /dev/serial/by-idzwraca tylko jeden adapter ../../ttyUSB1, podczas gdy ls -l /sys/bus/usb-serial/devicespokazuje mi oba. Więc nie sądzę, że to dobra odpowiedź.
Daniel F
6

Miałem podobny problem .

Napisz to do /etc/udev/rules.d/50-usb.rules

SUBSYSTEM=="tty", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0031", SYMLINK+="ONDA"
SUBSYSTEM=="tty", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14ac", SYMLINK+="HUAWEI"

do końca. Restart.

Teraz możesz użyć, /dev/ONDAaby dostać się do urządzenia ONDA.

Jeśli chcesz, aby użytkownicy inni niż root mogli z nich korzystać, dodaj

, MODE="0666"

do końca każdej linii.

Nick ODell
źródło
Zrobiłem to i sprawdziłem pliki, do których prowadzą. produkt mam wiele interfejsów, takich jak dysk twardy, szeregowy USB. Oczekiwałem powiązania z / dev / ttyACM0, ale było to / dev / sda. w jakikolwiek sposób zdefiniować w pliku reguł, który typ urządzenia powinna stosować reguła? Napisałem zasady w /etc/udev/rules.d/99-ftdi.rules
nurp
ok znalazłem to: dodałem SUBSYSTEM == "tty" do parametrów reguły. wartość tę można znaleźć w danych wyjściowych udevadm info --name=/dev/ttyACM0
nurp
3

Chciałbym użyć udev i napisać kilka reguł, które tworzą dowiązania symboliczne dla urządzeń.

Aby uzyskać wystarczającą ilość informacji do rozróżnienia urządzeń, spróbuj czegoś takiego dla wszystkich urządzeń:

$ udevadm info --query all --name /dev/ttyUSB0 --attribute-walk
Mathias Weidner
źródło
1

Poniższe polecenia podadzą mi listę nazw urządzeń ttyUSB, które są powiązane z 19d2: 0016 (który jest identyfikatorem „trybu modemu” dla drążka ZTE MF831 LTE, twoje mogą się różnić.):

    for i in $(find -L /sys/bus/usb/devices/ -maxdepth 2 -name "ttyUSB*"); do
        egrep -i "v19d2p0016(.*)in02" $i/../modalias >/dev/null && echo "/dev/${i##*/}"
    done

Spowoduje to zapętlenie listy plików o nazwie ttyUSB *, w tym dowiązań symbolicznych, w / sys / bus / usb / devices. W wynikach szukamy pliku o nazwie modalias i szukamy ciągu zawierającego identyfikator dostawcy „v” „19d2” i identyfikator produktu „p” 0016. Jeśli dane wyjściowe są zgodne, powtórzymy ciąg znaków poprzedzony „/ dev / „przed USB? Nazwa. Afaik pierwszy lub zwykle ostatni (najwyższy numer) to port modemu dla urządzeń ZTE. Możesz wysłać wyniki do pliku w / tmp / i odpowiednio nagłówkiem -n1 lub tail -n1. Jeśli masz huby, być może będziesz musiał zwiększyć maxdepth.

To nie jest najbardziej elegancki sposób, ale będzie działał na prawie każdym wariancie Linuksa.

epek
źródło