USB-Schnittstellenzuordnungsdeskriptor

Mit dem USB-Schnittstellenzuordnungsdeskriptor (IAD) kann das Gerät Schnittstellen gruppieren, die zu einer Funktion gehören. In diesem Artikel wird beschrieben, wie ein Clienttreiber bestimmen kann, ob das Gerät einen IAD für eine Funktion enthält.

Die Universal Serial Bus Specification, Revision 2.0, unterstützt nicht das Gruppieren mehrerer Schnittstellen eines zusammengesetzten Geräts innerhalb einer einzelnen Funktion. Die USB-Gerätearbeitsgruppe (DWG) hat jedoch USB-Geräteklassen erstellt, die Funktionen mit mehreren Schnittstellen ermöglichen. Das USB Implementor's Forum hat eine Änderungsbenachrichtigung (Engineering Change Notification, ECN) ausgegeben, die einen Mechanismus zum Gruppieren von Schnittstellen definiert.

Das ECN gibt einen USB-Deskriptor an, der als Schnittstellenzuordnungsdeskriptor (Interface Association Descriptor, IAD) bezeichnet wird, mit dem Hardwarehersteller Gruppierungen von Schnittstellen definieren können. Zu den Geräteklassen, die IADs am ehesten verwenden, gehören:

  • USB-Videoklassenspezifikation (Klassencode – 0x0E)
  • Spezifikation der USB-Audioklasse (Klassencode – 0x01)
  • USB-Bluetooth-Klassenspezifikation (Klassencode – 0xE0)

Verwenden von IADs

In den folgenden Unterabschnitten werden Informationen zur Verwendung von IADs beschrieben.

Zusammengesetzte Geräte, die Windows vor IADs in der Firmware warnen

Hersteller zusammengesetzter Geräte weisen in der Regel den Feldern Geräteklasse (bDeviceClass), Unterklasse (bDeviceSubClass) und Protokoll (bDeviceProtocol) im Gerätedeskriptor den Wert 0 zu, wie in der Universal Serial Bus Specification angegeben. Der Hersteller kann jede einzelne Schnittstelle einer anderen Geräteklasse und einem anderen Protokoll zuordnen.

Das USB-IF-Kernteam hat einen speziellen Klassen- und Protokollcodesatz entwickelt, der das Betriebssystem benachrichtigt, dass eine oder mehrere IADs in der Gerätefirmware vorhanden sind. Ein Gerätedeskriptor muss über die Werte verfügen, die in der folgenden Tabelle angezeigt werden, andernfalls erkennt das Betriebssystem die IADs des Geräts nicht oder gruppiert die Geräteschnittstellen nicht ordnungsgemäß.

Gerätedeskriptorfeld Erforderlicher Wert
bDeviceClass 0xEF
bDeviceSubClass 0x02
bDeviceProtocol 0x01

Die Codewerte warnen Versionen von Windows, die keine IADs unterstützen, um einen speziellen Bustreiber zu installieren, der das Gerät ordnungsgemäß aufzählt. Ohne diese Codes im Gerätedeskriptor kann das System das Gerät möglicherweise nicht aufzählen, oder das Gerät funktioniert möglicherweise nicht ordnungsgemäß.

Ein Gerät kann über mehrere IAD verfügen. Jeder IAD muss sich unmittelbar vor den Schnittstellen in der Vom IAD beschriebenen Schnittstellengruppe befinden.

Die Felder Funktionsklasse (bFunctionClass), Unterklasse (bFunctionSubclass) und Protokoll (bFunctionProtocol) des IAD müssen die Werte enthalten, die von der USB-Geräteklasse angegeben werden, die die Schnittstellen in der Funktion beschreibt.

Die Klassen- und Unterklassenfelder des IAD müssen nicht mit den Klassen- und Unterklassenfeldern der Schnittstellen in der Schnittstellenauflistung übereinstimmen, die vom IAD beschrieben wird. Microsoft empfiehlt, dass die erste Schnittstelle der Auflistung über Klassen- und Unterklassenfelder verfügt, die den Klassen- und Unterklassenfeldern des IAD entsprechen. In der folgenden Tabelle ist angegeben, welche Felder übereinstimmen sollen.

IAD-Feld Entsprechendes Schnittstellenfeld
bFunctionClass bInterfaceClass
bFunctionSubclassClass bInterfaceSubClass

Das Feld bFirstInterface des IAD gibt die Nummer der ersten Schnittstelle in der Funktion an. Das Feld bInterfaceCount des IAD gibt an, wie viele Schnittstellen sich in der Schnittstellensammlung befinden. Schnittstellen in einer IAD-Schnittstellenauflistung müssen zusammenhängend sein (es darf keine Lücken in der Liste der Schnittstellennummern geben), daher reicht eine Anzahl mit einer ersten Schnittstellennummer aus, um alle Schnittstellen in der Auflistung anzugeben.

Zugreifen auf den Inhalt eines IAD

Clienttreiber können nicht direkt auf IAD-Deskriptoren zugreifen. Die IAD Engineering Change Notification (ECN) gibt an, dass IADs in den Konfigurationsinformationen enthalten sein müssen, die Geräte zurückgeben, wenn sie eine Anforderung von Hostsoftware für den Konfigurationsdeskriptor (GetDescriptor-Konfiguration) empfangen. Hostsoftware kann IADs nicht direkt mit einer GetDescriptor-Anforderung abrufen.

Clienttreiber können jedoch den übergeordneten Treiber eines USB-Geräts nach den Hardware-IDs (IDs) des Geräts abfragen, und die Hardware-IDs des Geräts enthalten eingebettete Informationen zu den Feldern des IAD.

Beispiel für USB-Schnittstellenzuordnungsdeskriptor

In diesem Abschnitt wird ein Deskriptorlayout für ein zusammengesetztes USB-Gerät veranschaulicht. Das Beispielgerät verfügt über zwei Funktionen:

Videoklassenfunktion

Ein Schnittstellenzuordnungsdeskriptor (Interface Association Descriptor, IAD) definiert diese Funktion. Die Funktion enthält zwei Schnittstellen: Schnittstelle 0 (0) und Schnittstelle 1 (1).

Das System generiert Hardware und kompatible IDs (IDs) für die Funktion, wie unter Unterstützung für die Wireless Mobile Communication Device Class beschrieben. Nachdem das Betriebssystem mit der entsprechenden INF-Datei übereinstimmt, lädt das System den Videoklassentreiberstapel.

HiD-Funktion (Human Input Device)

Diese Funktion enthält nur Schnittstelle 2 (2).

Das System generiert Hardware und kompatible IDs für die Funktion, wie unter Enumeration of Interface Collections on USB Composite Devices beschrieben. Nachdem das Betriebssystem mit der entsprechenden INF-Datei übereinstimmt, lädt das System den HID-Klassentreiber (Human Input Device).

Der Deskriptor lautet wie folgt:

Gerätedeskriptor

    BYTE  bLength            0x12
    BYTE  bDescriptorType    0x01
    WORD  bcdUSB             0x0200
    BYTE  bDeviceClass       0xEF
    BYTE  bDeviceSubClass    0x02
    BYTE  bDeviceProtocol    0x01
    BYTE  bMaxPacketSize0    0x40
    WORD  idVendor           0x045E
    WORD  idProduct          0xFFFF
    WORD  bcdDevice          0x0100
    BYTE  iManufacturer      0x01
    WORD  iProduct           0x02
    WORD  iSerialNumber      0x02
    BYTE  bNumConfigurations 0x01

Konfigurationsdeskriptor

    BYTE  bLength             0x09
    BYTE  bDescriptorType     0x02
    WORD  wTotalLength        0x...
    BYTE  bNumInterfaces      0x03
    BYTE  bConfigurationValue 0x01
    BYTE  iConfiguration      0x01
    BYTE  bmAttributes        0x80    // (BUS Powered)
    BYTE  bMaxPower           0x19    // (50 mA)

Schnittstellenzuordnungsdeskriptor

    BYTE  bLength           0x08
    BYTE  bDescriptorType   0x0B
    BYTE  bFirstInterface   0x00
    BYTE  bInterfaceCount   0x02
    BYTE  bFunctionClass    0x0E
    BYTE  bFunctionSubClass 0x03
    BYTE  bFunctionProtocol 0x00
    BYTE  iFunction         0x04

Deskriptor der Videosteuerungsschnittstelle

    BYTE  bLength            0x09
    BYTE  bDescriptorType    0x04
    BYTE  bInterfaceNumber   0x00
    BYTE  bAlternateSetting  0x00
    BYTE  bNumEndpoints      0x01
    BYTE  bInterfaceClass    0x0E
    BYTE  bInterfaceSubClass 0x01
    BYTE  bInterfaceProtocol 0x00
    BYTE  iInterface         0x05

Klassenspezifischer Deskriptor für Videosteuerelemente

    . . . .
    . . . .
    . . . .

Videosteuerungsendpunktdeskriptor

    . . . .
    . . . .
    . . . .

Videostreaming-Schnittstellendeskriptor

    BYTE  bLength            0x09
    BYTE  bDescriptorType    0x04
    BYTE  bInterfaceNumber   0x01
    BYTE  bAlternateSetting  0x00
    BYTE  bNumEndpoints      0x01
    BYTE  bInterfaceClass    0x0E
    BYTE  bInterfaceSubClass 0x02
    BYTE  bInterfaceProtocol 0x00
    BYTE  iInterface         0x06

Klassenspezifischer Deskriptor für Videostreaming

    . . . .
    . . . .
    . . . .

Deskriptor des Videostreamingendpunkts

    . . . .
    . . . .
    . . . .

HiD-Schnittstellendeskriptor (Human Input Devices)

    BYTE  bLength            0x09
    BYTE  bDescriptorType    0x04
    BYTE  bInterfaceNumber   0x02
    BYTE  bAlternateSetting  0x00
    BYTE  bNumEndpoints      0x01
    BYTE  bInterfaceClass    0x03
    BYTE  bInterfaceSubClass 0x01
    BYTE  bInterfaceProtocol 0x01
    BYTE  iInterface         0x07

HID-klassenspezifischer Deskriptor

    . . . .
    . . . .
    . . . .

HID-Endpunktdeskriptor

    . . . .
    . . . .
    . . . .