Udevを使用して、特定のUSBデバイスに関するこの情報を取得できました。
idVendor: 13b1
idProduct: 0018
manufacturer:
product: USB 2.0 Network Adapter ver.2
serial: 00FFFF
次に、ベンダーIDと製品IDに関連付けられている完全な文字列を取得します。ファイル/usr/share/misc/usb.ids
には、私が探している情報が含まれています。
13b1 Linksys
000b WUSB11 v4.0 802.11b Adapter
000d WUSB54G Wireless Adapter
0011 WUSB54GP v4.0 802.11g Adapter
0018 USB200M 10/100 Ethernet Adapter
001a HU200TS Wireless Adapter
001e WUSBF54G 802.11bg
0020 WUSB54GC 802.11g Adapter [ralink rt73]
0023 WUSB54GR
0024 WUSBF54G v1.1 802.11bg
ただし、アプリケーションでこのデータをどのように取得する必要があるのかは明確ではありません。利用可能なAPIはありますか、それともファイルを解析するだけですか?解析することを選択した場合、/usr/share/misc/usb.ids
常に正しい場所になりますか?
lsusb
コマンドは、現在接続されているUSBデバイスに関する情報を照会します。 -d
特定のベンダー/製品をクエリするオプション(ただし、現在接続されているデバイスでのみ機能するようです):
$ lsusb -d 0e21:0750
Bus 001 Device 005: ID 0e21:0750 Cowon Systems, Inc.
すべてのデバイスの情報を表示できます。
$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 0421:01c7 Nokia Mobile Phones
Bus 001 Device 003: ID 0bda:8187 Realtek Semiconductor Corp. RTL8187 Wireless Adapter
Bus 001 Device 005: ID 0e21:0750 Cowon Systems, Inc.
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 002: ID 046d:c01b Logitech, Inc. MX310 Optical Mouse
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
冗長にすることもできます(lsusb -v
)と印刷たくさんもの。
Linux OSでシステムに関する情報にアクセスする場合、これらのコマンドがアクセスするシステムファイルを直接解析するよりも、シェルコマンド(lsusb
など)を介して行う方がはるかに好ましいことに注意してください。
これを自分で試したことはありません、しかし libudevのudev_device_get_property_value である必要があります。 pulseaudioのudev-util.c でudev_device_get_property_value(card, "ID_VENDOR_FROM_DATABASE"))
として使用されます。
これは、udev-util.c
に基づいてまとめた小さな例です。ArduinoDuemillanoveとFTDI FT232チップを使用していることに注意してください。そのudevパスはudevadm
を使用して見つけます(以下のコードのコメントを参照) )、次に以下のプログラムでハードコードしましたudevl.c
:
// Sudo apt-get install libudev-dev
// build with: gcc -o udevl -ludev -Wall -g udevl.c
#include <stdio.h>
#include <libudev.h>
int main( int argc, char **argv )
{
const char *v;
char t[256];
struct udev *udev;
struct udev_device *card = NULL;
if (!(udev = udev_new())) {
fprintf(stderr, "Failed to allocate udev context.\n");
return -1;
}
// $ lsusb | grep FT232
// Bus 002 Device 002: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
// $ udevadm info --name=/dev/ttyUSB0 --attribute-walk | grep "looking at device"
// looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0'
// (that one is under /sys)
// hardcode that path below:
// udev_get_sys_path(udev) for me: '/sys'
sprintf(t, "%s/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0", udev_get_sys_path(udev));
fprintf(stdout, " path: %s\n", t);
card = udev_device_new_from_syspath(udev, t);
fprintf(stdout, " udev_device: 0x%08X\n", (unsigned int)card);
if ((v = udev_device_get_property_value(card, "ID_MODEL_FROM_DATABASE")) )
fprintf(stdout, "got ID_MODEL_FROM_DATABASE: %s\n", v);
else
fprintf(stdout, "failed getting ID_MODEL_FROM_DATABASE: %s\n", v);
fprintf(stdout, "Done.\n");
if (card)
udev_device_unref(card);
if (udev)
udev_unref(udev);
return 0;
}
このプログラム(Arduinoが接続されている)の出力:
$ ./udevl
path: /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-2/2-2:1.0/ttyUSB0/tty/ttyUSB0
udev_device: 0x09FBF080
got ID_MODEL_FROM_DATABASE: FT232 USB-Serial (UART) IC
Done.
...そして「FT232 USB-Serial(UART)IC」は sb.ids のVID:PID 0403:6001の正しいエントリです。
お役に立てれば、
乾杯!
私のUbuntuシステムでは、lsusb(1)
のマンページに、/var/lib/usbutils/usb.ids
がIDファイルの場所であると記載されています。実際、2つのシンボリックリンクがあり、そのうちの1つは/usr/share/misc/usb.ids
です。シンボリックリンクを信頼する前に、実際の場所を信頼します。
$ ls -l /usr/share/misc/usb.ids /var/lib/misc/usb.ids /var/lib/usbutils/usb.ids
lrwxrwxrwx 1 root root 25 2010-04-29 18:08 /usr/share/misc/usb.ids -> /var/lib/usbutils/usb.ids
lrwxrwxrwx 1 root root 19 2010-04-29 18:08 /var/lib/misc/usb.ids -> ../usbutils/usb.ids
-rw-r--r-- 1 root root 368377 2009-11-06 09:26 /var/lib/usbutils/usb.ids
lsusb
あなたはこのようなものを手に入れます
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 009: ID 138a:0010 Validity Sensors, Inc. VFS Fingerprint sensor
Bus 001 Device 008: ID 13d3:3491 IMC Networks
次に:ID 1d6b:0003
は次のように表示されます:vendor = 1d6b
およびproduct = 0003
USBデバイスは、ベンダーIDと製品IDを実際の正しい名前と一致させる必要はありません。
libusb
やlsusb
のようなものを使用して、デバイス自体からこの情報を取得する方が安全です。