接続されている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
を取得するにはどうすればよいですか?
まず、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}
をそれぞれ使用できます。
受け入れられた答えは本当に私をそれほど助けませんでした。最終的に、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:21e6
が2-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