2010-07-19 9 views
14

Verwenden von udev, ich konnte diese Informationen für ein bestimmtes USB-Gerät erhalten:Wie man USB Vendor und Produktinfo programmatisch unter Linux bekommt?

idVendor: 13b1 
idProduct: 0018 
manufacturer: 
product: USB 2.0 Network Adapter ver.2 
serial: 00FFFF 

Jetzt mag ich die vollen Zeichenfolge erhalten, die mit dem Hersteller- und Produkt-IDs zugeordnet ist. Ich fand, dass die Datei /usr/share/misc/usb.ids die Informationen enthält, die ich suche:

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 

Aber es ist mir nicht klar, wie ich diese Daten in meiner Anwendung abrufen soll. Ist eine API verfügbar oder soll ich die Datei nur analysieren? Wenn ich es analysiere, ist /usr/share/misc/usb.ids immer der richtige Ort?

+1

Auf meinem System ist es '/ usr/share/usb.ids'. Kann keinen Standard finden, der den Ort für diese Datei regelt. –

+2

Hier ist die neueste Version: http://www.linux-usb.org/usb.ids und die Schnittstelle für das Einreichen von ihnen: http://www.linux-usb.org/usb-ids.html – endolith

+0

Auf Android, Mein C-Programm verwendet * libusbhost *, das Callbacks für das Einfügen/Entfernen von Geräten bereitstellt. Alle Gerätedeskriptoren werden von der lib zur Verfügung gestellt. –

Antwort

17

lsusb Befehl fragt Informationen über derzeit eingesteckte USB-Geräte ab. Sie können ihre -d Option zur Abfrage einen bestimmten Verkäufer/Produkt verwenden (aber es scheint derzeit angeschlossenen Geräte nur zur Arbeit):

$ 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 

können Sie:

$ lsusb -d 0e21:0750 
Bus 001 Device 005: ID 0e21:0750 Cowon Systems, Inc. 

Sie Informationen für alle Geräte zeigen machen Sie es auch wortreich (lsusb -v) und Drucken viel von Sachen.

Beachten Sie, dass beim Zugriff auf Informationen über das System in Linux-Betriebssystemen die Shell-Befehle (z. B. lsusb) bevorzugt verwendet werden, um die Systemdateien, auf die diese Befehle zugreifen, direkt zu analysieren.

+0

Also muss ich lsusb mit popen dann anrufen? – StackedCrooked

+1

@Stacked, ja (für C), aber das hängt von einer Sprache ab, in der du dich entwickelst. Aber so oder so wirst du etwas aus einem Stream lesen und 'lsusb -d ...' über 'popen' scheint es zu erfordern weniger Tastenanschläge als das Parsen der gesamten Datei mit Beschreibungen. –

1

Ihr USB-Gerät muss die Hersteller- und Produkt-IDs nicht mit den tatsächlichen korrekten Namen übereinstimmen.

Es wäre sicherer, diese Informationen vom Gerät selbst mit etwas wie libusb oder lsusb zu bekommen.

3

Auf meinem Ubuntu-System, die lsusb(1) Manpage sagt, dass /var/lib/usbutils/usb.ids der Speicherort der ID-Datei ist; In der Tat gibt es zwei symbolische Links, von denen einer /usr/share/misc/usb.ids ist. Ich würde die tatsächliche Lage vertrauen, bevor die Symlinks zu vertrauen:

$ 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 
3

habe nicht versucht, mich, aber libudev's udev_device_get_property_value sollte es sein; Es wird in pulseaudio's udev-util.c als udev_device_get_property_value(card, "ID_VENDOR_FROM_DATABASE")) verwendet.

Hier ist ein kleines Beispiel, das ich nur zusammen basierend auf udev-util.c - beachten Sie, dass ich ein Arduino Duemillanove mit FTDI FT232 Chip verwendet habe, Pfad, das udev ich udevadm finden (siehe Kommentare im Code unten) und ich dann fest einprogrammiert es in dem unten stehenden Programm, 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; 
} 

Dieses Programm (mit dem Arduino angeschlossen) Ausgänge:

$ ./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. 

... und „FT232 USB-Seriell (UART) IC "ist der richtige Eintrag für VID: PID 0403: 6001 in usb.ids.

Hoffen, dass dies hilft,
Prost!

+0

Wie initialisiert man struct udev * udev ;? struct udev * udev = NULL? Weil mein Code-Checker dafür einen Fehler gibt. Vielen Dank. – sree