Как получить связь между шиной и устройством для / dev / ttyUSB

10

Мне нужно написать скрипт для перезагрузки USB-ключей. У меня есть все инструменты, но я не могу связать свой / dev / ttyUSBx с физической шиной и устройством. Проблема в том, что у меня есть три ключа с одинаковым идентификатором id и id.

Если я делаю lsusb, выход:

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

И я привязал его к:

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

Но я хочу знать, какое устройство связано с каким шинным устройством. В качестве примера мне нужно получить следующее:

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

Я использую Ubuntu Server 10.04, и я тестировал инструменты:

lsusb
hal
lsmod

Но я не могу получить отношения.

    
задан Ernesto Campohermoso 05.09.2012 в 22:21
источник

3 ответа

10

Поскольку у меня нет вашего оборудования, я не могу дать вам точный ответ.

Я предлагаю вам перейти к рассматриваемому устройству, например:

ls -l /dev/ttyUSB0

и получить номера основных и младших узлов. Скажем, это 116, 7

Затем перейдите к:

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

( char , поскольку tty является символьным устройством, если вы отслеживаете дисковое устройство, вы должны указать block вместо char )

В выводе команды вы увидите что-то вроде:

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

В каталоге /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/ и его подкаталогах содержится много информации об устройстве. Например, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnum и /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum . В моей системе они соответствуют номеру шины и устройства, указанному в записях hotplug устройства в / var / log / syslog.

Что-то еще, что работает в моей системе для / dev / video0:

find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null
    
ответ дан John S Gruber 06.09.2012 в 04:49
источник
7

На самом деле не существует хорошего способа сопоставления символьных устройств, таких как /dev/ttyUSB0 , с соответствующими USB-устройствами и номерами шин. НО, возможно!

Что-то вроде этого может работать:

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

Оттуда вы получите кучу информации об устройстве и его родительских устройствах. Теперь все дело в разборе этих данных, чтобы получить то, что вы хотите. Я использовал это в прошлом:

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

Теперь, если это не глоток, я не знаю, что это такое! Давайте сломаем это:

udevadm info --name=/dev/ttyUSB0 --attribute-walk - возвращает информацию об устройстве и его родительских устройствах

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"//p' - анализирует эти данные и возвращает любые строки, содержащие атрибут «devnum» или «busnum». Предположим, что «busnum» указан первым ... и в этом случае ... мы можем просто захватить первые две строки вывода.

head -n 2 . Захватите первые 2 строки вывода. Мы могли бы получить больше фантазии здесь, но мы просто делаем предположение, что первые «busnum» и «devnum» самого близкого родителя будут перечислены первыми.

awk '{ = sprintf("%03d", ); print}' - принимает эти цифры и заполняет их нулями.

echo /dev/bus/usb ... - весь этот джаз завернут в оператор echo , чтобы заменить новые строки пробелами. Вы можете добавить -n к echo , если хотите отрезать конечную новую строку.

tr " " "/" - заменить пробелы на выходе косой чертой

Это приведет к тому, что:

/dev/bus/usb/001/011

... который, конечно же, является устройством. Если вы хотите, вы можете легко вывести что-то наподобие busnum:001 devnum:011 с помощью нескольких настроек:

echo 'udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\ /p' | head -n 2 | awk '{ = sprintf("%s:%03d", , ); print ;}''
    
ответ дан BMiner 13.02.2014 в 21:54
0

Вы можете найти всю информацию об узле, используя следующую команду:

udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/
    
ответ дан ravibhuva9955 28.04.2014 в 06:42