如何获得/ dev / ttyUSB的总线和设备关系


14

我需要编写一个脚本来重新启动USB软件狗。我拥有所有工具,但是无法将/ dev / ttyUSBx链接到物理BUS和DEVICE。问题是我有三个具有相同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

但是我无法建立关系。

Answers:


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 /
Ernesto Campohermoso 2012年

感谢您的更正-我已经修改了答案并添加了find命令以打印信息。
John S Gruber 2012年

@JohnSGruber好的,但是如何安装呢?
Dr.jacky '16

1
海德先生:您无法挂载/ dev / ttyUSB;只能安装某些操作类似于磁盘驱动器的设备。
John S Gruber'2

10

确实没有一种将字符设备映射到相应的USB设备和总线号的方法/dev/ttyUSB0但是,有可能!

这样的事情可能会起作用:

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语句,用空格替换换行符。如果您想切断尾随的换行符-necho则可以添加到。

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/

请删除斜杠。它给出“找不到系统路径”。
nvd
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.