使用udev我已经能够获得某个USB设备的这些信息:
idVendor: 13b1
idProduct: 0018
manufacturer:
product: USB 2.0 Network Adapter ver.2
serial: 00FFFF
Run Code Online (Sandbox Code Playgroud)
现在我想获得与供应商和产品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
Run Code Online (Sandbox Code Playgroud)
但是,我不清楚应该如何在我的应用程序中检索此数据.是否有可用的API或我应该解析文件?如果我选择解析它,那么/usr/share/misc/usb.ids总是正确的位置?
P S*_*ved 20
lsusb命令查询有关当前插入的USB设备的信息.您可以使用其-d选项查询某个供应商/产品(但它似乎仅适用于当前插入的设备):
$ lsusb -d 0e21:0750
Bus 001 Device 005: ID 0e21:0750 Cowon Systems, Inc.
Run Code Online (Sandbox Code Playgroud)
您可以显示所有设备的信息:
$ 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
Run Code Online (Sandbox Code Playgroud)
你也可以使它变得冗长(lsusb -v)并打印很多东西.
请注意,在Linux OS中访问有关系统的信息时,最好通过shell命令(例如lsusb)执行此操作,而不是直接解析这些命令访问的系统文件.
这个我自己没试过,不过应该是libudev 的 udev_device_get_property_value吧;它在pulseaudio 的 udev-util.c 中用作udev_device_get_property_value(card, "ID_VENDOR_FROM_DATABASE")).
这是我刚刚放在一起的一个小例子,基于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;
}
Run Code Online (Sandbox Code Playgroud)
该程序(附有 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.
Run Code Online (Sandbox Code Playgroud)
...和“FT232 USB-Serial (UART) IC”是usb.ids 中VID:PID 0403:6001 的正确条目。
希望这会
有所帮助,干杯!
| 归档时间: |
|
| 查看次数: |
51442 次 |
| 最近记录: |