Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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
. . . .
. . . .
. . . .