Dela via


USB-gränssnittsassocieringsbeskrivning

Med IAD (USB Interface Association Descriptor) kan enheten gruppera gränssnitt som tillhör en funktion. Den här artikeln beskriver hur en klientdrivrutin kan avgöra om enheten innehåller en IAD för en funktion.

Universal Serial Bus Specification, revision 2.0, stöder inte gruppering av fler än ett gränssnitt för en sammansatt enhet i en enda funktion. USB-enhetens arbetsgrupp (DWG) skapade dock USB-enhetsklasser som tillåter funktioner med flera gränssnitt. USB-implementorns forum utfärdade ett meddelande om teknisk ändring (ECN) som definierar en mekanism för att gruppera gränssnitt.

ECN anger en USB-deskriptor, som kallas gränssnittsassociationskriptor (IAD), som gör det möjligt för maskinvarutillverkare att definiera grupper av gränssnitt. De enhetsklasser som mest sannolikt använder IAD:n är:

  • Specifikation för USB-videoklass (klasskod – 0x0E)
  • Specifikation för USB-ljudklass (klasskod – 0x01)
  • Specifikation för USB Bluetooth-klass (klasskod – 0xE0)

Så här använder du IAD:erna

Följande underavsnitt beskriver information om hur du använder IAD:er.

Sammansatta enheter som varnar Windows om IAD i inbyggd programvara

Tillverkare av sammansatta enheter tilldelar vanligtvis ett värde på noll till enhetsklassfälten (bDeviceClass), underklassen (bDeviceSubClass) och protokollfälten (bDeviceProtocol) i enhetsbeskrivningen, enligt beskrivningen i specifikationen för universell seriebuss. Tillverkaren kan associera varje enskilt gränssnitt med olika enhetsklasser och protokoll.

USB-IF-kärnteamet har utarbetat en särskild koduppsättning för klass och protokoll som meddelar operativsystemet att en eller flera IAD:n finns i enhetens inbyggda programvara. En enhetsbeskrivning måste ha de värden som visas i följande tabell eller så identifierar operativsystemet inte enhetens IAD:n eller grupperar enhetens gränssnitt korrekt.

Enhetssignaturfältet Obligatoriskt värde
bDeviceClass 0xEF
bDeviceSubClass 0x02
bDeviceProtocol 0x01

Kodvärdena varnar versioner av Windows som saknar stöd för IAD:er att installera en bussdrivrutin med speciellt ändamål som identifierar enheten korrekt. Utan dessa koder i enhetsbeskrivningen kan systemet misslyckas med att räkna upp enheten, eller så kanske enheten inte fungerar korrekt.

En enhet kan ha mer än en IAD. Varje IAD måste finnas omedelbart före gränssnitten i den gränssnittsgrupp som IAD beskriver.

Fälten funktionsklass (bFunctionClass), underklass (bFunctionSubclassClass) och protokollfält (bFunctionProtocol) i IAD måste innehålla de värden som anges av USB-enhetsklassen som beskriver gränssnitten i funktionen.

Klass- och underklassfälten i IAD krävs inte för att matcha klass- och underklassfälten i gränssnittssamlingen som beskrivs i IAD. Microsoft rekommenderar att det första gränssnittet i samlingen har klass- och underklassfält som matchar klass- och underklassfälten i IAD. Följande tabell anger vilka fält som ska matcha.

IAD-fält Motsvarande gränssnittsfält
bFunctionClass bInterfaceClass
bFunctionSubclassClass bInterfaceSubClass

Fältet bFirstInterface i IAD anger antalet för det första gränssnittet i funktionen. Fältet bInterfaceCount i IAD anger hur många gränssnitt som finns i gränssnittssamlingen. Gränssnitt i en IAD-gränssnittssamling måste vara sammanhängande (det kan inte finnas några luckor i listan över gränssnittsnummer), och därför räcker det med ett antal med ett första gränssnittsnummer för att ange alla gränssnitt i samlingen.

Komma åt innehållet i en IAD

Klientdrivrutiner kan inte komma åt IAD-beskrivningar direkt. ECN (IAD Engineering Change Notification) anger att IAD:er måste ingå i konfigurationsinformationen som enheterna returnerar när de får en begäran från värdprogramvaran för konfigurationsbeskrivningen (GetDescriptor-konfiguration). Värdprogramvara kan inte hämta IAD:er direkt med en GetDescriptor-begäran.

Klientdrivrutiner kan dock fråga en USB-enhets överordnade drivrutin om enhetens maskinvaruidentifierare (ID:n) och enhetens maskinvaru-ID innehåller inbäddad information om fälten i IAD.

Exempel på USB-gränssnittsassociationsbeskrivare

Det här avsnittet visar en beskrivningslayout för en sammansatt USB-enhet. Exempelenheten har två funktioner:

Videoklassfunktion

En IAD (Interface Association Descriptor) definierar den här funktionen. Funktionen innehåller två gränssnitt: gränssnitt noll (0) och gränssnitt ett (1).

Systemet genererar maskinvara och kompatibla identifierare (ID:n) för funktionen, enligt beskrivningen i Stöd för enhetens klass för trådlös mobil kommunikation. När operativsystemet matchar lämplig INF-fil läser systemet in drivrutinsstacken för videoklassen.

Human Input Device-funktion (HID)

Den här funktionen innehåller bara gränssnitt två (2).

Systemet genererar maskinvara och kompatibla ID:er för funktionen enligt beskrivningen i Uppräkning av gränssnittssamlingar på USB-sammansatta enheter. När operativsystemet matchar den lämpliga INF-filen laddar systemet drivrutinen för mänsklig inmatningsenhet (HID-klassen).

Beskrivningen är följande:

Enhetsbeskrivning

    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

Konfigurationsbeskrivning

    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)

Gränssnittsassociationsbeskrivning

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

Videokontrollgränssnittsbeskrivning

    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

Klassspecifik beskrivning av videokontroll

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

Videokontrollslutpunktsbeskrivning

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

Videouppspelningsgränssnittsbeskrivning

    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

Klassspecifik beskrivning för videouppspelning

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

Slutpunktsbeskrivning för videouppspelning

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

Gränssnittsbeskrivning för mänskliga inmatningsenheter (HID)

    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-klassspecifik beskrivning

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

HID-slutpunktsbeskrivning

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