USB-Gerätedeskriptoren
Der Gerätedeskriptor enthält Informationen zu einem USB-Gerät als Ganzes. In diesem Artikel werden die USB_DEVICE_DESCRIPTOR-Struktur beschrieben und Informationen dazu enthalten, wie ein Clienttreiber eine Get-Deskriptor-Anforderung senden kann, um den Gerätedeskriptor abzurufen.
Jedes USB-Gerät (Universal Serial Bus) muss einen einzelnen Gerätedeskriptor bereitstellen können, der relevante Informationen zum Gerät enthält. Die USB_DEVICE_DESCRIPTOR-Struktur beschreibt einen Gerätedeskriptor. Windows verwendet diese Informationen, um verschiedene Informationssätze abzuleiten. Die Felder "idVendor" und "idProduct" geben z. B. Lieferanten- bzw. Produkt-IDs an. Windows verwendet diese Feldwerte, um eine Hardware-ID für das Gerät zu erstellen. So zeigen Sie die Hardware-ID eines bestimmten Geräts an:
- Öffnen Sie Geräte-Manager.
- Klicken Sie mit der rechten Maustaste auf das USB-Gerät, und wählen Sie "Eigenschaften" aus.
- Wählen Sie im Eigenschaftendialogfeld die Registerkarte "Details " aus.
- Dropdownliste der Eigenschaftsliste .
- Auswählen der Hardware-IDs-Eigenschaft
Die Werte geben die Hardware-IDs ("USB\XXX") an, die Windows generiert.
Das bcdUSB-Feld der USB_DEVICE_DESCRIPTOR-Struktur gibt die Version der USB-Spezifikation an, der das Gerät entspricht. Beispielsweise gibt 0x0200 an, dass das Gerät gemäß der USB 2.0-Spezifikation entworfen wurde. Der bcdDevice-Wert gibt die vom Gerät definierte Revisionsnummer an.
Der USB-Treiberstapel verwendet bcdDevice zusammen mit idVendor und idProduct, um Hardware und kompatible IDs für das Gerät zu generieren. Sie können diese Bezeichner in Geräte-Manager anzeigen. Der Gerätedeskriptor gibt auch die Gesamtanzahl der Konfigurationen an, die das Gerät unterstützt.
Ein Gerät meldet möglicherweise andere Informationen in der Gerätebeschreibung, wenn das Gerät eine Verbindung mit dem Hostcomputer in hoher Geschwindigkeit herstellt, als wenn es in voller Geschwindigkeit verbunden ist. Ein Gerät darf die informationen, die im Gerätedeskriptor enthalten sind, während der Lebensdauer einer Verbindung, einschließlich während der Energiezustandsänderungen, nicht ändern.
Der Host ruft den Gerätedeskriptor über eine Steuerungsübertragung ab. Bei der Übertragung ist der Anforderungstyp GET DESCRIPTOR, und der Empfänger ist das Gerät. Der Clienttreiber kann diese Übertragung auf zwei Arten initiieren: mithilfe des Framework-USB-Zielgeräteobjekts oder durch Senden einer URB mit den Anforderungsinformationen.
Abrufen des Gerätedeskriptors
Ein Windows Driver Frameworks (WDF)-Clienttreiber kann den Gerätedeskriptor erst abrufen, nachdem das Framework-USB-Zielgerätobjekt erstellt wurde.
Ein Kernelmodus-Treiberframework (KMDF)-Treiber muss ein WDFUSBDEVICE-Handle für das USB-Zielgerätobjekt abrufen, indem WdfUsbTargetDeviceCreate aufgerufen wird. In der Regel ruft ein Clienttreiber WdfUsbTargetDeviceCreate in der EvtDevicePrepareHardware-Rückrufimplementierung des Treibers auf. Danach muss der Clienttreiber die WdfUsbTargetDeviceGetDeviceGetDeviceDescriptor-Methode aufrufen. Nach Abschluss des Aufrufs wird der Gerätedeskriptor in der vom Anrufer zugewiesenen USB_DEVICE_DESCRIPTOR Struktur empfangen.
Ein UMDF-Treiber (User-Mode Driver Framework) muss das Framework-Geräteobjekt für einen IWDFUsbTargetDevice-Zeiger abfragen und dann die IWDFUsbTargetDevice::RetrieveDescriptor-Methode aufrufen und USB_DEVICE_DESCRIPTOR_TYPE als Deskriptortyp angeben.
Der Host kann auch den Gerätedeskriptor abrufen, indem er eine URB sendet. Diese Methode gilt nur für Kernelmodustreiber. Ein Clienttreiber sollte jedoch nie eine URB für diesen Anforderungstyp senden müssen, es sei denn, der Treiber basiert auf dem Windows-Treibermodell (WDM). Ein solcher Treiber muss eine URB-Struktur zuweisen und dann das UsbBuildGetDescriptorRequest-Makro aufrufen, um das Format der URB für die Anforderung anzugeben. Der Treiber kann dann die Anforderung senden, indem er die URB an den USB-Treiberstapel sendet. Weitere Informationen finden Sie unter How to Submit an URB.For more information, see How to Submit an URB.
Dieses Codebeispiel zeigt einen UsbBuildGetDescriptorRequest-Aufruf, der den puffer formatiert, auf den pURB mit der entsprechenden URB verweist:
UsbBuildGetDescriptorRequest(
pURB, // Points to the URB to be formatted
sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
USB_DEVICE_DESCRIPTOR_TYPE,
0, // Not used for device descriptors
0, // Not used for device descriptors
pDescriptor, // Points to a USB_DEVICE_DESCRIPTOR structure
NULL,
sizeof(USB_DEVICE_DESCRIPTOR),
NULL
);
Beispielgerätedeskriptor
Dieses Beispiel zeigt den Gerätedeskriptor für ein USB-Webcamgerät (siehe USB-Gerätelayout), das mithilfe der USBView-Anwendung abgerufen wird:
Device Descriptor:
bcdUSB: 0x0200
bDeviceClass: 0xEF
bDeviceSubClass: 0x02
bDeviceProtocol: 0x01
bMaxPacketSize0: 0x40 (64)
idVendor: 0x045E (Microsoft Corporation)
idProduct: 0x0728
bcdDevice: 0x0100
iManufacturer: 0x01
0x0409: "Microsoft"
iProduct: 0x02
0x0409: "Microsoft LifeCam VX-5000"
0x0409: "Microsoft LifeCam VX-5000"
iSerialNumber: 0x00
bNumConfigurations: 0x01
Im vorherigen Beispiel wurde das Gerät gemäß USB-Spezifikation, Version 2.0, entwickelt. Beachten Sie die Werte "bDeviceClass", "bDeviceSubClass" und "bDeviceProtocol" . Diese Werte deuten darauf hin, dass das Gerät einen oder mehrere USB-Schnittstellenzuordnungsdeskriptoren enthält, die zum Gruppieren mehrerer Schnittstellen pro Funktion verwendet werden können. Weitere Informationen finden Sie unter USB Interface Association Descriptor.
Sehen Sie sich als Nächstes den Wert von "bMaxPacketSize0" an. Dieser Wert gibt die maximale Paketgröße des Standardendpunkts an. Dieses Beispielgerät kann bis zu 64 Byte Daten über seinen Standardendpunkt übertragen.
Zum Konfigurieren des Geräts ruft der Clienttreiber in der Regel Informationen zu den unterstützten Konfigurationen auf dem Gerät ab, nachdem die Gerätebeschreibung abgerufen wurde. Um die Anzahl der vom Gerät unterstützten Konfigurationen zu ermitteln, prüfen Sie das bNumConfigurations-Element der zurückgegebenen Struktur. Dieses Gerät unterstützt eine Konfiguration. Um Informationen zu einer USB-Konfiguration zu erhalten, muss der Treiber USB-Konfigurationsdeskriptoren abrufen.