我虽未尝试过,但
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,我使用
udevadm
找到了其 udev 路径(请参阅下面代码中的注释),然后将其硬编码到了下面的程序中:
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;
}
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"是具有VID:PID 0403:6001的正确条目。请参阅usb.ids。
希望这可以帮到你,
祝好!
/usr/share/usb.ids
。找不到任何规范来管理此文件的位置。 - P Shved