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