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


14

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

Если я делаю 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

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

Ответы:


11

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

Я бы посоветовал вам перейти к соответствующему устройству, например:

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. В моей системе они соответствуют номеру шины и устройства, указанному в записях горячего подключения устройства в / var / log / syslog.

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

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

Большое спасибо! Я боролся с этим много раз. Просто для дальнейших посетителей: В моем Ubuntu Ubuntu 10.04.2 LTS каталогом устройств является / sys / dev / char / вместо / sys / char /
Эрнесто Кампоэрмосо

Спасибо за исправление - я отредактировал ответ с этим изменением и добавил команду поиска, чтобы распечатать информацию.
Джон С. Грубер

@JohnSGruber Хорошо, но как его смонтировать ?!
Dr.jacky

1
@ Mr.Hyde: Вы не можете смонтировать / dev / ttyUSB; только некоторое устройство, которое работает как дисковод, может быть установлено.
Джон С. Грубер

10

На самом деле не существует хорошего способа сопоставления символьных устройств, например, /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\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/"

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

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

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

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

awk '{$1 = sprintf("%03d", $1); 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\)\)}==\"\([^\"]\+\)\"/\1\ \4/p' | head -n 2 | awk '{$1 = sprintf("%s:%03d", $1, $2); print $1;}'`

1

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

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

Пожалуйста, удалите косую черту. Это дает "syspath not found".
NVD
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.