Je n'ai pas essayé moi-même , mais la valeur udev_device_get_property_value de libudev devrait l'être ; il est utilisé dans udev-util.c de pulseaudio comme udev_device_get_property_value(card, "ID_VENDOR_FROM_DATABASE"))
.
Voici un petit exemple que je viens de mettre en place, basé sur udev-util.c
- notez que j'ai utilisé un Arduino Duemillanove avec une puce FTDI FT232, dont je trouve le chemin udev en utilisant udevadm
(voir les commentaires dans le code ci-dessous), puis je l'ai codé en dur dans le programme ci-dessous, 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;
}
Ce programme (avec l'Arduino attaché) affiche :
$ ./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.
... et "FT232 USB-Serial (UART) IC" est la bonne entrée pour VID:PID 0403:6001 dans usb.ids.
J'espère que cela t'aides,
Santé !
lsusb
La commande demande des informations sur les périphériques USB actuellement connectés. Vous pouvez utiliser son -d
option pour interroger un certain fournisseur/produit (mais cela semble fonctionner uniquement pour les appareils actuellement branchés) :
$ lsusb -d 0e21:0750
Bus 001 Device 005: ID 0e21:0750 Cowon Systems, Inc.
Vous pouvez afficher des informations pour tous les appareils :
$ 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
Vous pouvez également le rendre verbeux (lsusb -v
) et en imprimant beaucoup de trucs.
Notez que lors de l'accès aux informations sur le système sous Linux, il est préférable de le faire via des commandes shell (telles que lsusb
) que d'analyser directement les fichiers système auxquels ces commandes accèdent.