USB-Standarddeskriptoren

Ein USB-Gerät stellt Informationen über sich selbst in Datenstrukturen bereit, die als USB-Deskriptoren bezeichnet werden. Dieser Abschnitt enthält Informationen zu Geräte-, Konfigurations-, Schnittstellen- und Endpunktdeskriptoren und Möglichkeiten, sie von einem USB-Gerät abzurufen.

USB-Deskriptoren, die dem Gerätelayout zugeordnet sind

Die Hostsoftware ruft Deskriptoren von einem angefügten Gerät ab, indem sie verschiedene Standardsteuerungsanforderungen an den Standardendpunkt sendet(Abrufen von Deskriptoranforderungen, siehe USB-Spezifikationsabschnitt 9.4.3). Diese Anforderungen geben den Typ des abzurufenden Deskriptors an. Als Reaktion auf solche Anforderungen sendet das Gerät Deskriptoren, die Informationen über das Gerät, seine Konfigurationen, Schnittstellen und die zugehörigen Endpunkte enthalten. Gerätedeskriptoren enthalten Informationen über das gesamte Gerät. Konfigurationsdeskriptoren enthalten Informationen zu den einzelnen Gerätekonfigurationen. Zeichenfolgendeskriptoren enthalten Unicode-Textzeichenfolgen.

Jedes USB-Gerät macht einen Gerätedeskriptor verfügbar, der die Klasseninformationen des Geräts, die Hersteller- und Produktbezeichner sowie die Anzahl der Konfigurationen angibt. Jede Konfiguration macht ihren Konfigurationsdeskriptor verfügbar, der die Anzahl der Schnittstellen und Leistungsmerkmale angibt. Jede Schnittstelle macht einen Schnittstellendeskriptor für jede ihrer alternativen Einstellungen verfügbar, der Informationen über die Klasse und die Anzahl der Endpunkte enthält. Jeder Endpunkt innerhalb jeder Schnittstelle macht Endpunktdeskriptoren verfügbar, die den Endpunkttyp und die maximale Paketgröße angeben.

Betrachten wir beispielsweise das OsR FX2-Board-Gerätelayout (siehe USB-Gerätelayout). Auf Geräteebene macht das Gerät einen Gerätedeskriptor und einen Endpunktdeskriptor für den Standardendpunkt verfügbar. Auf Konfigurationsebene macht das Gerät einen Konfigurationsdeskriptor für Configuration 0 verfügbar. Auf Schnittstellenebene macht es einen Schnittstellendeskriptor für Alternative Einstellung 0 verfügbar. Auf Endpunktebene werden drei Endpunktdeskriptoren verfügbar gemacht.

Klassendiagramm des USB-Gerätedeskriptorlayouts.

USB-Gerätedeskriptor

Jedes USB-Gerät (Universal Serial Bus) muss in der Lage sein, einen einzelnen Gerätedeskriptor bereitzustellen, der relevante Informationen zum Gerät enthält. Windows verwendet diese Informationen, um verschiedene Informationssätze abzuleiten. Die Felder "idVendor " und "idProduct " geben beispielsweise 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 konzipiert ist. Der wert bcdDevice 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 Gesamtzahl der Vom Gerät unterstützten Konfigurationen an.

Der Host ruft den Gerätedeskriptor über eine Steuerungsübertragung ab. Microsoft stellt Programmierschnittstellen bereit, um den Deskriptor abzurufen.

Wenn Sie einen... Aufrufen...
UWP-App, die Windows.Devices.Usb verwendet UsbDevice.DeviceDescriptor
Win32-Desktop-App, die WinUSB-Funktionen verwendet WinUsb_GetDescriptor
UMDF-basierter Clienttreiber IWDFUsbTargetDevice::RetrieveDescriptor
KMDF-basierter Clienttreiber WdfUsbTargetDeviceGetDeviceDescriptor
WDM-basierter Clienttreiber UsbBuildGetDescriptorRequest
_URB_CONTROL_DESCRIPTOR_REQUEST

USB-Konfigurationsdeskriptor

Eine USB-Konfiguration enthält eine Reihe von Schnittstellen. Jede Schnittstelle besteht aus einer oder mehreren alternativen Einstellungen, und jede alternative Einstellung besteht aus einer Reihe von Endpunkten (siehe USB-Gerätelayout). Ein Konfigurationsdeskriptor beschreibt die gesamte Konfiguration, einschließlich ihrer Schnittstellen, alternativen Einstellungen und deren Endpunkte. Jede dieser Entitäten wird auch in ihrem Deskriptorformat beschrieben. Ein Konfigurationsdeskriptor kann auch benutzerdefinierte Deskriptoren enthalten, die vom Gerätehersteller definiert werden.

Daher ist nur der anfängliche Teil eines Konfigurationsdeskriptors mit 9 Bytes festgelegt. Der Rest ist abhängig von der Anzahl der Schnittstellen und deren alternativen Einstellungen sowie von endpunkten, die vom Gerät unterstützt werden. In diesem Dokumentationssatz werden die anfänglichen 9 Bytes als Konfigurationsdeskriptor bezeichnet. Die ersten beiden Bytes des Deskriptors geben die Gesamtlänge an.

Die folgende Tabelle zeigt den Konfigurationsdeskriptor für das USB-Webcamgerät:

Feld Wert
wTotalLength 0x02CA
bNumInterfaces 0x02
bConfigurationValue 0x01
iConfiguration 0x00
bmAttributes 0x80 (busbetrieben)
MaxPower 0xFA (500 mA)

Das Feld bConfigurationValue gibt die Nummer für die konfiguration an, die in der Firmware des Geräts definiert ist. Eine USB-Konfiguration gibt auch bestimmte Leistungseigenschaften an. BmAttributes enthält eine Bitmaske, die angibt, ob die Konfiguration das Remoteaktivierungsfeature unterstützt und ob das Gerät mit Bus- oder Selbststrom versorgt ist. Das Feld MaxPower gibt die maximale Leistung (in Milliampereeinheiten) an, die das Gerät vom Host beziehen kann, wenn das Gerät mit Busbetrieb betrieben wird. Der Konfigurationsdeskriptor gibt auch die Gesamtanzahl von Schnittstellen (bNumInterfaces) an, die das Gerät unterstützt.

Wenn Sie einen... Aufrufen...
UWP-App, die Windows.Devices.Usb verwendet UsbDevice.ConfigurationDescriptor , um den Teil der festen Länge abzurufen.
UsbConfiguration.Descriptors , um den gesamten Konfigurationssatz abzurufen.
Win32-Desktop-App, die WinUSB-Funktionen verwendet WinUsb_GetDescriptor
UMDF-basierter Clienttreiber IWDFUsbTargetDevice::RetrieveDescriptor
KMDF-basierter Clienttreiber WdfUsbTargetDeviceRetrieveConfigDescriptor
WDM-basierter Clienttreiber UsbBuildGetDescriptorRequest
_URB_CONTROL_GET_CONFIGURATION_REQUEST

USB-Schnittstellendeskriptor

Ein Schnittstellendeskriptor enthält Informationen zu einer alternativen Einstellung einer USB-Schnittstelle.

Die folgende Tabelle zeigt den Schnittstellendeskriptor für Alternative Einstellung 0 von Schnittstelle 0 für das Webcamgerät:

Feld Wert
bInterfaceNumber 0x00
bAlternateSetting 0x00
bNumEndpoints 0x01
bInterfaceClass 0x0E
bInterfaceSubClass 0x02
bInterfaceProtocol 0x00
iInterface 0x02
0x0409 "Microsoft LifeCam VX-5000"
0x0409 "Microsoft LifeCam VX-5000"

Beachten Sie im vorherigen Beispiel die Feldwerte bInterfaceNumber und bAlternateSetting . Diese Felder enthalten Indexwerte, die der Host zum Aktivieren der Schnittstelle und einer ihrer alternativen Einstellungen verwendet. Für die Aktivierung gibt eine Anwendung oder ein Treiber den Indexwert im Funktionsaufruf an. Basierend auf diesen Informationen erstellt der USB-Treiberstapel dann eine Standardsteuerungsanforderung (SET INTERFACE) und sendet sie an das Gerät. Beachten Sie das Feld bInterfaceClass . Der Schnittstellendeskriptor oder der Deskriptor für eine der alternativen Einstellungen gibt einen Klassencode, eine Unterklasse und ein Protokoll an. Der Wert von 0x0E gibt an, dass die Schnittstelle für die Videogeräteklasse gilt. Beachten Sie auch das Feld iInterface . Dieser Wert gibt an, dass dem Schnittstellendeskriptor zwei Zeichenfolgendeskriptoren angefügt werden. Zeichenfolgendeskriptoren enthalten Unicode-Beschreibungen, die während der Geräteaufzählung verwendet werden, um die Funktionalität zu identifizieren.

Wenn Sie einen... Aufrufen...
UWP-App, die Windows.Devices.Usb verwendet UsbInterfaceSetting.Descriptors , um einen bestimmten Deskriptor für eine bestimmte alternative Einstellung abzurufen.
UsbInterface.Descriptors zum Abrufen von Deskriptoren für alle Einstellungen einer Schnittstelle.
Win32-Desktop-App, die WinUSB-Funktionen verwendet WinUsb_GetDescriptor
UMDF-basierter Clienttreiber IWDFUsbInterface::GetInterfaceDescriptor
KMDF-basierter Clienttreiber WdfUsbInterfaceGetDescriptor
WDM-basierter Clienttreiber UsbBuildGetDescriptorRequest
_URB_CONTROL_GET_CONFIGURATION_REQUEST und analysieren Sie dann die einzelnen Schnittstellendeskriptoren. Weitere Informationen finden Sie unter Auswählen einer Konfiguration für ein USB-Gerät.

USB-Endpunktdeskriptor

Jeder Endpunkt in einer Schnittstelle beschreibt einen einzelnen Datenstrom mit Eingabe oder Ausgabe für das Gerät. Ein Gerät, das Datenströme für verschiedene Arten von Funktionen unterstützt, verfügt über mehrere Schnittstellen. Ein Gerät, das mehrere Datenströme unterstützt, die sich auf eine Funktion beziehen, kann mehrere Endpunkte auf einer einzelnen Schnittstelle unterstützen.

Alle Arten von Endpunkten (mit Ausnahme des Standardendpunkts) müssen Endpunktdeskriptoren bereitstellen, damit der Host Informationen zum Endpunkt abrufen kann. Ein Endpunktdeskriptor enthält Informationen, z. B. adresse, typ, richtung und die Datenmenge, die der Endpunkt verarbeiten kann. Die Datenübertragungen an den Endpunkt basieren auf diesen Informationen.

Die folgende Tabelle zeigt einen Endpunktdeskriptor für das Webcamgerät:

Feld Wert
bEndpointAddress 0x82 IN
bmAttributes 0x01
wMaxPacketSize 0x0080 (128)
bInterval 0x01

Das Feld bEndpointAddress gibt die eindeutige Endpunktadresse an, die die Endpunktnummer (Bits 3..0) und die Richtung des Endpunkts (Bit 7) enthält. Durch Das Lesen dieser Werte im vorherigen Beispiel können wir feststellen, dass der Deskriptor einen IN-Endpunkt beschreibt, dessen Endpunktnummer 2 ist. Das bmAttributes-Attribut gibt an, dass der Endpunkttyp isochron ist. Das wMaxPacketSizefield gibt die maximale Anzahl von Bytes an, die der Endpunkt in einer einzelnen Transaktion senden oder empfangen kann. Bits 12..11 gibt die Gesamtzahl der Transaktionen an, die pro Microframe gesendet werden können. Der bInterval gibt an, wie oft der Endpunkt Daten senden oder empfangen kann.

Wenn Sie einen... Aufrufen...
UWP-App, die Windows.Devices.Usb verwendet UsbEndpointDescriptor
Win32-Desktop-App, die WinUSB-Funktionen verwendet WinUsb_GetDescriptor
UMDF-basierter Clienttreiber WDFUsbTargetPipe::GetInformation
KMDF-basierter Clienttreiber WdfUsbTargetPipeGetInformation
WDM-basierter Clienttreiber UsbBuildGetDescriptorRequest
_URB_CONTROL_GET_CONFIGURATION_REQUEST und analysieren Sie dann die einzelnen Endpunktdeskriptoren. Weitere Informationen finden Sie unter Auswählen einer Konfiguration für ein USB-Gerät.