How to get Bus and Device relationship for a /dev/ttyUSB
I need to write an script for restart USB dongles. I have all tools but I can’t link my /dev/ttyUSBx to physical BUS and DEVICE. An issue is that I have three dongles with the same id vendor and id product. If I do lsusb the output is:
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
But I want to know which device is related with which Bus Device. By example I need to get the following:
/dev/ttyUSB0 -> Bus 001 Device 006 /dev/ttyUSB3 -> Bus 001 Device 004 /dev/ttyUSB5 -> Bus 001 Device 007
3 Answers 3
Since I don’t have your hardware I can’t give you an exact answer.
I’d suggest that you go to the device in question, for example:
and obtain the major and minor node numbers. Let’s say they are 116, 7
( char , because a tty is a character device, if you were tracing down a disk device you would specify block instead of char )
In the output from the command you will see something a little like:
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
The directory /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/ and its subdirectories have much information on the device. As an example, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnum and /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum . On my system these match the bus and device number mentioned in the device hotplug entries in /var/log/syslog.
Something else that works on my system for /dev/video0:
find /sys/dev -lname '*video0' -exec cat <>/device/busnum <>/device/devnum \; 2>/dev/null
Thank you very much!, I have fighting with this for many time. Just for further visitors: In my ubuntu Ubuntu 10.04.2 LTS the device directory is /sys/dev/char/ instead of /sys/char/
Thanks for the correction—I’ve edited the answer with that change, and added a find command to print the information.
@Mr.Hyde: You can’t mount a /dev/ttyUSB; only some device that operates like a disk drive can be mounted.
There really isn’t a good way to map character devices like /dev/ttyUSB0 to the corresponding USB device and bus numbers. BUT, it is possible!
Something like this might work:
udevadm info —name=/dev/ttyUSB0 —attribute-walk
From there, you’ll get a bunch of information about the device and its parent devices. Now, it’s just all about parsing those data to get what you want. I’ve used this in the past:
echo /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk ''` | tr " " "/"
Now, if that’s not a mouthful, I dunno what is! Let’s break it down:
udevadm info —name=/dev/ttyUSB0 —attribute-walk — returns info about the device and its parent devices
sed -n ‘s/\s*ATTRS==\»\([^\»]\+\)\»/\4/p’ — parses these data and returns any lines containing the «devnum» or «busnum» attribute. We’ll assume that «busnum» is listed first. and in that case. we can just grab the first two lines of output.
head -n 2 — Grab the first 2 lines of output. We could get more fancy here, but we are just making an assumption that the closest parent’s «busnum» and «devnum» are going to be listed first.
awk » — Takes those digits and pads them with zeros.
echo /dev/bus/usb . — all this jazz is wrapped up into an echo statement to replace the newlines with spaces. You can add the -n to echo if you want to cut off the trailing newline.
tr » » «/» — replace the spaces in the output with forward slashes
This will output something like:
. which, of course, is the device. If you’d like, you can easily output something like busnum:001 devnum:011 with a few tweaks:
echo `udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS==\"\([^\"]\+\)\"/\1\ \4/p' | head -n 2 | awk ''`
Usb bus device linux
Команда lsusb позволяет задействовать одноименную утилиту, предназначенную для вывода информации о USB-шинах и подключенных к ним устройствах. Каждое из устройств имеет пару 16-битных идентификаторов: идентификатор производителя (Vendor ID) и идентификатор устройства (Device ID), которые следует использовать для идентификации устройств и поиска драйверов в случае их отсутствия в ядре ОС, а также несколько дополнительных идентификаторов, устанавливаемых производителем. В составе дистрибутивов Linux имеется файл базы данных устройств, содержащий названия устройств с известными идентификаторами. Данная команда крайне полезна для идентификации и диагностики устройств компьютера. Она выводит результаты в формате списка, который может фильтроваться с помощью утилиты grep.
Базовый синтаксис команды выглядит следующим образом:
Утилита может вызываться как без параметров, так и с ними. Наиболее полезными параметрами являются параметр -t, предназначенный для вывода информации в древовидном формате, параметр -v для вывода подробной информации об устройствах, а также параметры -s и -d для вывода информации об устройствах на заданных шинах и с заданными идентификаторами соответственно.
Примеры использования
Вывод списка USB-устройств
Для вывода списка USB-устройств достаточно использовать утилиту без каких-либо параметров. Прав суперпользователя для выполнения команды не требуется.
$ lsusb
Bus 002 Device 005: ID 12d1:1436 Huawei Technologies Co., Ltd. Broadband stick
Bus 002 Device 003: ID 148f:7601 Ralink Technology, Corp. MT7601U Wireless Adapter
Bus 002 Device 002: ID 214b:7250 USB2.0 HUB
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 002: ID 0000:3821 SiliconWin mouse
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 002: ID 04f3:0103 Elan Microelectronics Corp. ActiveJet K-2024 Multimedia Keyboard
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Вывод имеет строго регламентированную структуру. По сути, параметры устройств разделены пробелами. Возьмем последнюю строку в качестве примера:
- Номер шины: Bus 003
- Номер устройства на шине: Device 001
- Идентификаторы производителя и устройства: 1d6b:0001
- Название устройства: Linux Foundation 1.1 root hub
Несложно убедиться, что все строки имеют схожий формат. При этом в списке отражена информация как об обычных USB-устройствах (таких, как клавиатуры и мыши), так и о специализированных устройствах (таких, как хабы).
Вывод подробной информации о USB-устройствах
Для того, чтобы вывести подробную информацию о USB-устройствах, следует использовать комбинацию параметр -v:
$ lsusb -v
…
Bus 002 Device 003: ID 148f:7601 Ralink Technology, Corp. MT7601U Wireless Adapter
Couldn’t open device, some information will be missing
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.01
bDeviceClass 0
bDeviceSubClass 0
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x148f Ralink Technology, Corp.
idProduct 0x7601 MT7601U Wireless Adapter
bcdDevice 0.00
iManufacturer 1
iProduct 2
iSerial 3
bNumConfigurations 1
Configuration Descriptor:
bLength 9
bDescriptorType 2
wTotalLength 0x004a
bNumInterfaces 1
bConfigurationValue 1
iConfiguration 0
bmAttributes 0x80
(Bus Powered)
MaxPower 160mA
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 8
bInterfaceClass 255 Vendor Specific Class
bInterfaceSubClass 255 Vendor Specific Subclass
bInterfaceProtocol 255 Vendor Specific Protocol
iInterface 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x84 EP 4 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x85 EP 5 IN
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x08 EP 8 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x04 EP 4 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x05 EP 5 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x06 EP 6 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x07 EP 7 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x09 EP 9 OUT
bmAttributes 2
Transfer Type Bulk
Synch Type None
Usage Type Data
wMaxPacketSize 0x0200 1x 512 bytes
bInterval 0
…
Данный вывод является крайне обширным и содержит огромное количество параметров конфигурации USB-устройств. Он может использоваться для диагностики и идентификации устройств, причем в случае исполнения команды от лица суперпользователя, информации будет еще больше (обратите внимание на предупреждение в начале вывода).
Вывод информации о заданных USB-шинах и устройствах
Для того, чтобы вывести информацию о заданной USB-шине и устройствах на ней достаточно использовать параметр -s и передать утилите идентификатор интересующей шины:
$ lsusb -s 003:
Bus 003 Device 002: ID 04f3:0103 Elan Microelectronics Corp. ActiveJet K-2024 Multimedia Keyboard
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
$ lsusb -s 003:002
Bus 003 Device 002: ID 04f3:0103 Elan Microelectronics Corp. ActiveJet K-2024 Multimedia Keyboard
При использовании лишь идентификатора шины следует использовать двоеточие в конце идентификатора.
Что касается информации об устройствах, то совместно с параметром -d может использоваться как идентификатор производителя:
$ lsusb -d 04f3:
Bus 003 Device 002: ID 04f3:0103 Elan Microelectronics Corp. ActiveJet K-2024 Multimedia Keyboard
Так и идентификатор устройства:
$ lsusb -d :0103
Bus 003 Device 002: ID 04f3:0103 Elan Microelectronics Corp. ActiveJet K-2024 Multimedia Keyboard
Не стоит забывать о двоеточии, которое указывает на используемый идентификатор: идентификатор производителя должен иметь двоеточие в конце, идентификатор устройства — в начале.