使用udev我已经能够获得某个USB设备的这个信息:
idVendor: 13b1 idProduct: 0018 manufacturer: product: USB 2.0 Network Adapter ver.2 serial: 00FFFF
现在我想获得与供应商和产品ID相关的完整string。 我发现文件/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可用,或者我应该parsing文件? 如果我selectparsing它,那么/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操作系统中访问系统信息时,最好通过shell命令(比如lsusb
)来执行,而不是直接解析这些命令访问的系统文件。
在我的Ubuntu系统上, lsusb(1)
联机帮助页说/var/lib/usbutils/usb.ids
是id文件的位置; 实际上,有两个符号链接,其中之一就是/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
自己没有尝试过 ,但libdev的udev_device_get_property_value应该是它; 它被用在udev_device_get_property_value(card, "ID_VENDOR_FROM_DATABASE"))
pulseaudio的udev-util.c中。
下面是一个基于udev-util.c
的小例子,注意我使用了一个带有FTDI FT232芯片的Arduino Duemillanove,它的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-串行(UART)IC”是usb.ids中 VID:PID 0403:6001的正确条目。
希望这可以帮助,
干杯!
您的USB设备不需要将供应商和产品ID匹配到实际正确的名称。
从设备本身获取这些信息比如libusb
或lsusb
会更安全。