Як отримати зв’язок шини та пристрою для a / dev / ttyUSB


14

Мені потрібно написати сценарій для перезавантаження 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

Але я не можу отримати стосунки.

Відповіді:


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 /
Ернесто Кампогермосо

Дякую за виправлення - я відредагував відповідь із цією зміною та додав команду find для друку інформації.
John S Gruber

@JohnSGruber Добре, але як це встановити ?!
Dr.jacky

1
@ Mr.Hyde: Ви не можете встановити / dev / ttyUSB; можна встановити лише деякий пристрій, який працює як дисковий накопичувач.
John S Gruber

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 рядки виводу. Ми могли б отримати більше фантазії тут, але ми лише робимо припущення, що найближчі батьківські "буснум" і "девнум" збираються зарахувати першими.

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.