web-dev-qa-db-ja.com

物理USBデバイスパスを、lsusbによって返されたバス/デバイス番号にマップします。

接続されている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を取得するにはどうすればよいですか?

9
Dmitry Frank

まず、udevによって返されるパスの前に/sysを付加する必要があります。これにより、パスは/sys/devices/pci0000:00/0000:00:1d.0/usb5/5-2のようになります。次に、このディレクトリに移動すると、その中にいくつかのファイルがあります。特に、busnumファイルとdevnumファイルがあり、これらの「論理」番号が含まれています。したがって、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はこれらのbusnumおよびdevnumを直接返すことができることに注意してください。RUN+="..."では、置換$attr{busnum}および$attr{devnum}をそれぞれ使用できます。

5
Dmitry Frank

受け入れられた答えは本当に私をそれほど助けませんでした。最終的に、idProductとidVendorが存在するかどうかを調べることで方法を見つけました。これがシェルスクリプトです

#!/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

ここで、たとえば、Bluetoothデバイスである0a5c:21e62-1.4にマッピングされていることがわかります。

さらに便利なように、これをシェルの関数として定義できます。

$ 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
0
kristopolous