Delen via


USB-interfacekoppeling descriptor

Met de USB interface association descriptor (IAD) kan het apparaat interfaces groeperen die deel uitmaken van een functie. In dit artikel wordt beschreven hoe een clientstuurprogramma kan bepalen of het apparaat een IAD voor een functie bevat.

De Universal Serial Bus Specification, revisie 2.0, biedt geen ondersteuning voor het groeperen van meer dan één interface van een samengesteld apparaat binnen één functie. De WERKGROEP voor USB-apparaten (DWG) heeft echter USB-apparaatklassen gemaakt die functies met meerdere interfaces mogelijk maken. Het FORUM van de USB-implementor heeft een ECN (Engineering Change Notification) uitgegeven waarmee een mechanisme voor groeperingsinterfaces wordt gedefinieerd.

De ECN specificeert een USB-descriptor, de interface association descriptor (IAD) genoemd, waarmee hardwarefabrikanten groeperingen van interfaces kunnen definiëren. De apparaatklassen die waarschijnlijk gebruikmaken van IAD's zijn onder andere:

  • Specificatie van USB-videoklasse (klassecode - 0x0E)
  • Specificatie van USB-audioklasse (klassecode - 0x01)
  • Usb Bluetooth-klassespecificatie (klassecode - 0xE0)

Hoe IADs te gebruiken

In de volgende subsecties wordt informatie beschreven over het gebruik van IAD's.

Samengestelde apparaten die Windows in de firmware waarschuwen voor IAD's

Fabrikanten van samengestelde apparaten wijzen doorgaans een waarde van nul toe aan de apparaatklasse (bDeviceClass), subklasse (bDeviceSubClass) en protocolvelden (bDeviceProtocol) in de apparaatdescriptor, zoals opgegeven door de Universal Serial Bus Specification. De fabrikant kan elke afzonderlijke interface koppelen aan een andere apparaatklasse en -protocol.

Het USB-IF kernteam heeft een speciale klasse en protocollen code set ontworpen dat het besturingssysteem informeert dat er een of meer IAD's aanwezig zijn in de apparaatfirmware. Een apparaatdescriptor moet de waarden bevatten die worden weergegeven in de volgende tabel of het besturingssysteem detecteert de IAD's van het apparaat niet of groepeert de interfaces van het apparaat correct.

Apparaatdescriptorveld Vereiste waarde
bDeviceClass 0xEF
bDeviceSubClass 0x02
bDeviceProtocol 0x01

De codewaarden instrueren versies van Windows die geen ondersteuning bieden voor IAD's om een speciaal busstuurprogramma te installeren dat het apparaat correct opsomt. Zonder deze codes in de apparaatdescriptor kan het systeem het apparaat niet inventariseren of werkt het apparaat mogelijk niet goed.

Een apparaat kan meer dan één IAD hebben. Elke IAD moet zich direct vóór de interfaces in de interfacegroep bevinden die door de IAD wordt beschreven.

De functieklasse (bFunctionClass), subklasse (bFunctionSubclassClass) en protocolvelden (bFunctionProtocol) van de IAD moeten de waarden bevatten die zijn opgegeven door de USB-apparaatklasse die de interfaces in de functie beschrijft.

De klasse- en subklassevelden van de IAD hoeven niet overeen te komen met de klasse- en subklassevelden van de interfaces in de interfaceverzameling die door de IAD wordt beschreven. Microsoft raadt aan dat de eerste interface van de verzameling klasse- en subklassevelden bevat die overeenkomen met de klasse- en subklassevelden van de IAD. De volgende tabel geeft aan welke velden moeten overeenkomen.

IAD-veld Corresponderend interfaceveld
bFunctionClass bInterfaceClass
bFunctionSubclassClass bInterfaceSubClass

Het veld bFirstInterface van de IAD geeft het aantal van de eerste interface in de functie aan. Het veld bInterfaceCount van de IAD geeft aan hoeveel interfaces zich in de interfaceverzameling bevinden. Interfaces in een IAD-interfaceverzameling moeten aaneengesloten zijn (er kunnen geen hiaten in de lijst met interfacenummers zijn) en dus is een telling met een eerste interfacenummer voldoende om alle interfaces in de verzameling op te geven.

Toegang tot de inhoud van een IAD

Clientstuurprogramma's hebben geen rechtstreeks toegang tot IAD-descriptors. De ECN (IAD Engineering Change Notification) geeft aan dat IAD's moeten worden opgenomen in de configuratiegegevens die apparaten retourneren wanneer ze een aanvraag ontvangen van hostsoftware voor de configuratiedescriptor (GetDescriptor-configuratie). Hostsoftware kan geen IAD's rechtstreeks ophalen met een GetDescriptor-aanvraag.

Clientdrivers kunnen echter het bovenliggende stuurprogramma van een USB-apparaat raadplegen om informatie te verkrijgen over de hardware-id's (ID's) van het apparaat, en de hardware-id's van het apparaat bevatten ingesloten informatie over de velden van de IAD.

Voorbeeld van usb-interfacekoppelingsdescriptor

In deze sectie ziet u een descriptorindeling voor een samengesteld USB-apparaat. Het voorbeeldapparaat heeft twee functies:

Video klasse functie

Een interface association descriptor (IAD) definieert deze functie. De functie bevat twee interfaces: interface nul (0) en interface één (1).

Het systeem genereert hardware- en compatibele id's (ID's) voor de functie, zoals beschreven in Ondersteuning voor de klasse Draadloze mobiele communicatieapparaten. Nadat het besturingssysteem het juiste INF-bestand vindt, wordt de stuurprogrammastack van de videoklasse geladen.

Human Input Device (HID)-functie

Deze functie bevat alleen interface twee (2).

Het systeem genereert hardware en compatibele id's voor de functie, zoals beschreven in Opsomming van interfaceverzamelingen op USB-samengestelde apparaten. Nadat het besturingssysteem overeenkomt met het juiste INF-bestand, laadt het systeem het stuurprogramma van de klasse HUMAN Input Device (HID).

De descriptor is als volgt:

Apparaatdescriptor

    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

Configuratiedescriptor

    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)

Interfacekoppelingsdescriptor

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

Descriptor van de videobesturingsinterface

    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

Klassespecifieke descriptor voor videobesturingselementen

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

Eindpuntdescriptor voor videobeheer

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

Descriptor van de videostreaming-interface

    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

Video-streamingklasse-specifieke descriptor

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

Descriptor voor videostreaming-eindpunt

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

Hid-interfacedescriptor (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-klassespecifieke descriptor

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

HID-eindpuntdescriptor

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