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

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

我需要编写一个用于重启 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

但我无法建立这种关系。

答案1

确实没有好的将字符设备映射/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可以添加 to -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;}'`

答案2

由于我没有您的硬件,所以我无法给您确切的答案。

我建议您转到有问题的设备,例如:

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

答案3

您可以使用以下命令找到有关节点的许多信息:

udevadm info -a -p /sys/bus/usb-serial/devices/<specific tty>/

  例如

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

  最后一个斜线是可选的

如果没有组件,您将看到“未找到 syspath”

在许多情况下,此命令带来相同的信息udevadm info --name=/dev/<specific tty> --attribute-walk

相关内容