将物理USB设备路径映射到lsusb返回的总线/设备号


9

我需要获取连接的USB设备的标题。我可以做到这一点lsusb

在我编写规则时,udev允许一些替换:例如,我们可以$kernel用来获取设备的名称或$devpath获取设备的路径。

但是问题是lsusb返回这样的字符串:

Bus 005 Device 032: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

但是udev的devpath是:

/devices/pci0000:00/0000:00:1d.0/usb5/5-2 

总线号相同(5),但号不同:Device 032似乎是一些逻辑号(当我重新连接设备时,此数字会增加),并且2似乎是物理设备号。

因此udev返回物理编号,我需要获取逻辑编号。然后,我可以像这样检索数据:lsusb -D /dev/bus/usb/005/032

因此,如何032通过类似的物理路径获取逻辑设备号/devices/pci0000:00/0000:00:1d.0/usb5/5-2

Answers:


5

首先,我们需要添加到/sys返回的路径之前udev,以使该路径变为:/sys/devices/pci0000:00/0000:00:1d.0/usb5/5-2。然后转到该目录,其中将包含多个文件。除其他外,还有busnumdevnum文件,它们包含这些“逻辑”数字。因此,在bash脚本中,我们可以像这样检索它们:

devpath='/devices/pci0000:00/0000:00:1d.0/usb5/5-2'

busnum=$(cat "/sys/$devpath/busnum")
devnum=$(cat "/sys/$devpath/devnum")

# we might want to make busnum and devnum have leading zeros
# (say, "003" instead of "3", and "012" instead of "12")
busnum=$(printf %03d $busnum)
devnum=$(printf %03d $devnum)

# now, we can retrieve device data by   lsusb -D /dev/bus/usb/$busnum/$devnum

echo "busnum=$busnum, devnum=$devnum"

另外请注意,udev可以返回这些busnumdevnum直接:在RUN+="..."我们可以使用替代$attr{busnum}$attr{devnum}分别。


1
我对udevvs lsusbsys/devices/..vs. 的不同用法感到困惑,/dev/bus/usb/..并从您的答案来看,您似乎是知道的:)也许您可以阐明这两个问题?askubuntu.com/questions/342061/power-on-off-usb-portsaskubuntu.com/questions/498950/...
坚果约整洁的

@nuttyaboutnatty,很遗憾,我无法给您提供任何有关您的问题的提示(关于关闭设备电源)。这些天我只是在学习linux知识,而我与任何一位专家都相距甚远。/sys/devices/...vs /dev/.../sys由内核填充,很少,它表示实际的内核设备层次结构。Udev是一个用户空间守护程序,用于处理/sys层次结构并填充/dev/...(考虑规则)。因此,udev对/dev内容完全负责。
德米特里·法兰克

1

公认的答案确实并没有太大帮助。我终于通过探测idProduct和idVendor(如果存在)找到了一种方法。这是一个shell脚本

#!/bin/bash
{ 
  cd /sys/bus/usb/devices
  for i in *; do 
    [ -e $i/idProduct ] && echo $(cat $i/idVendor $i/idProduct) $i
  done
}

这就是我在系统上得到的。

$ ./script
0424 2514 1-3
8087 0024 2-1
0a5c 21e6 2-1.4
8087 0024 4-1
1d6b 0002 usb1
1d6b 0002 usb2
1d6b 0003 usb3
1d6b 0002 usb4

$ lsusb
Bus 004 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 006: ID 0a5c:21e6 Broadcom Corp. BCM20702 Bluetooth 4.0 [ThinkPad]
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

在这里我可以看到,例如0a5c:21e6,这是一个蓝牙设备,映射到2-1.4

为了更加方便,您可以在shell中将此定义为一个函数,例如

$ cat >> ~/.bashrc << ENDL
gousb() {
  for i in /sys/bus/usb/devices/*; do 
    if [ -e \$i/idProduct ]; then
      if [ \$(cat \$i/idVendor):\$(cat \$i/idProduct) = \$1 ]; then 
        cd \$i
        return
      fi
    fi
  done

  echo "\$1 not found :-("
}
ENDL
$ source ~/.bashrc
$ gousb 0a5c:21e6
$ pwd 
/sys/bus/usb/devices/2-1.4
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.