Freigeben über


USB-Gerätedeskriptoren

Der Gerätedeskriptor enthält Informationen zu einem USB-Gerät als Ganzes. Dieses Thema beschreibt die USB_DEVICE_DESCRIPTOR-Struktur und enthält Informationen dazu, wie ein Clienttreiber eine get-descriptor-Anforderung zum Abrufen des Gerätedeskriptors senden kann.

Jedes USB-Gerät (Universal Serial Bus) muss in der Lage sein, einen einzelnen Gerätedeskriptor bereitzustellen, der relevante Informationen über das Gerät enthält. Die USB_DEVICE_DESCRIPTOR-Struktur beschreibt einen Gerätedeskriptor. Windows verwendet diese Informationen, um verschiedene Informationssätze abzuleiten. Beispielsweise geben die Felder idVendor und idProduct die Anbieter- bzw. Produktbezeichner an. Windows verwendet diese Feldwerte, um eine Hardware-ID für das Gerät zu erstellen. Um die Hardware-ID eines bestimmten Geräts anzuzeigen, öffnen Sie Geräte-Manager, und zeigen Sie die Geräteeigenschaften an. Auf der Registerkarte Details gibt der Wert der Hardware-IDs-Eigenschaft die Hardware-ID ("USB\XXX") an, die von Windows generiert wird. Das Feld bcdUSB 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 Wert bcdDevice gibt die gerätedefinierte 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 Gesamtzahl der Konfigurationen an, die das Gerät unterstützt.

Ein Gerät meldet möglicherweise andere Informationen in seinem Gerätedeskriptor, wenn das Gerät mit einer Hochgeschwindigkeitskapazität mit dem Hostcomputer verbunden ist, als wenn es mit einer Kapazität mit voller Geschwindigkeit verbunden ist. Ein Gerät darf die im Gerätedeskriptor enthaltenen Informationen während der Lebensdauer einer Verbindung nicht ändern, auch nicht während der Energiezustandsänderung.

Der Host ruft den Gerätedeskriptor über eine Steuerungsübertragung ab. Bei der Übertragung lautet 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 WDF-Clienttreiber (Windows Driver Frameworks) kann den Gerätedeskriptor erst abrufen, nachdem das Framework-USB-Zielgeräteobjekt erstellt wurde.

Ein KMDF-Treiber muss durch Aufrufen von WdfUsbTargetDeviceCreate ein WDFUSBDEVICE-Handle für das USB-Zielgerätobjekt abrufen. In der Regel ruft ein Clienttreiber WdfUsbTargetDeviceCreate in der EvtDevicePrepareHardware-Rückrufimplementierung des Treibers auf. Danach muss der Clienttreiber die WdfUsbTargetDeviceGetDeviceDescriptor-Methode aufrufen. Nach Abschluss des Aufrufs wird der Gerätedeskriptor in der vom Aufrufer zugewiesenen USB_DEVICE_DESCRIPTOR-Struktur empfangen.

Ein UMDF-Treiber 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 niemals eine URB für diesen Anforderungstyp senden müssen, es sei denn, der Treiber basiert auf windows Driver Model (WDM). Ein solcher Treiber muss eine URB-Struktur zuordnen 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 übermittelt. Weitere Informationen finden Sie unter Übermitteln einer URB.

Dieses Codebeispiel zeigt einen UsbBuildGetDescriptorRequest-Aufruf, der den Puffer formatiert, auf den pURB verweist, mit der entsprechenden URB:

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), der 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 sehen Sie, dass das Gerät gemäß USB-Spezifikation, Version 2.0, entwickelt wurde. Beachten Sie die Werte bDeviceClass, bDeviceSubClass und bDeviceProtocol . Diese Werte geben an, 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 den Standardendpunkt übertragen.

In der Regel ruft der Clienttreiber zum Konfigurieren des Geräts Nach dem Abrufen des Gerätedeskriptors Informationen zu den unterstützten Konfigurationen auf dem Gerät ab. Überprüfen Sie den bNumConfigurations-Member der zurückgegebenen Struktur, um die Anzahl der vom Gerät unterstützten Konfigurationen zu ermitteln. Dieses Gerät unterstützt eine Konfiguration. Um Informationen zu einer USB-Konfiguration zu erhalten, muss der Treiber USB-Konfigurationsdeskriptoren abrufen.