Condividi tramite


Descrittore dell'associazione dell'interfaccia USB

Il descrittore di associazione dell'interfaccia USB (IAD) consente al dispositivo di raggruppare le interfacce che appartengono a una funzione. Questo articolo descrive come un driver client può determinare se il dispositivo contiene un IAD per una funzione.

La specifica del bus seriale universale, revisione 2.0, non supporta il raggruppamento di più interfacce di un dispositivo composito all'interno di una singola funzione. Tuttavia, il gruppo di lavoro del dispositivo USB (DWG) ha creato classi di dispositivo USB che consentono funzioni con più interfacce. Il forum dell'implementore USB ha rilasciato una notifica di modifica di progettazione che definisce un meccanismo per raggruppare le interfacce.

L'ECN specifica un descrittore USB, denominato descrittore di associazione dell'interfaccia (IAD), che consente ai produttori hardware di definire raggruppamenti di interfacce. Le classi di dispositivo che sono più probabile usare gli ID includono:

  • Specifica della classe video USB (codice di classe - 0x0E)
  • Specifica della classe audio USB (codice di classe - 0x01)
  • Specifica della classe Bluetooth USB (codice di classe - 0xE0)

Come usare IAD

Le sottosezioni seguenti descrivono le informazioni su come usare gli ID.

Dispositivi compositi che avvisano Windows di ID nel firmware

I produttori di dispositivi compositi in genere assegnano un valore pari a zero alla classe di dispositivo (bDeviceClass), sottoclasse (bDeviceSubClass) e i campi protocollo (bDeviceProtocol) nel descrittore del dispositivo, come specificato dalla specifica del bus seriale universale. Il produttore può associare ogni singola interfaccia a una classe e un protocollo di dispositivo diversi.

Il team di base USB-IF ha progettato un set di codice di classe e protocollo speciale che notifica al sistema operativo che uno o più ID sono presenti nel firmware del dispositivo. Un descrittore del dispositivo deve avere i valori visualizzati nella tabella seguente o il sistema operativo non rileva correttamente gli ID del dispositivo o raggruppa le interfacce del dispositivo.

Campo descrittore dispositivo Valore richiesto
bDeviceClass 0xEF
bDeviceSubClass 0x02
bDeviceProtocol 0x01

I valori di codice avvisano le versioni di Windows che non supportano gli ID per installare un driver del bus speciale che enumera correttamente il dispositivo. Senza questi codici nel descrittore del dispositivo, il sistema potrebbe non riuscire ad enumerare il dispositivo o il dispositivo potrebbe non funzionare correttamente.

Un dispositivo può avere più di un IAD. Ogni IAD deve trovarsi immediatamente prima delle interfacce nel gruppo di interfacce descritte dall'IAD.

La classe di funzione (bFunctionClass), la sottoclasse (bFunctionSubclassClass) e i campi protocol (bFunctionProtocol) dell'IAD devono contenere i valori specificati dalla classe di dispositivo USB che descrive le interfacce nella funzione.

I campi di classe e sottoclasse dell'IAD non sono necessari per corrispondere ai campi della classe e della sottoclasse delle interfacce nell'insieme di interfacce descritto dall'IAD. Microsoft consiglia che la prima interfaccia dell'insieme includa campi classe e sottoclasse corrispondenti ai campi classe e sottoclasse dell'IAD. La tabella seguente indica quali campi devono corrispondere.

Campo IAD Campo dell'interfaccia corrispondente
bFunctionClass bInterfaceClass
bFunctionSubclassClass bInterfaceSubClass

Il campo bFirstInterface dell'IAD indica il numero della prima interfaccia nella funzione. Il campo bInterfaceCount dell'IAD indica il numero di interfacce presenti nell'insieme di interfacce. Le interfacce in una raccolta di interfacce IAD devono essere contigue (non possono esserci lacune nell'elenco dei numeri di interfaccia) e quindi un conteggio con un primo numero di interfaccia è sufficiente per specificare tutte le interfacce nella raccolta.

Accesso al contenuto di un IAD

I driver client non possono accedere direttamente ai descrittori IAD. La notifica di modifica della progettazione IAD (ECN) specifica che gli ID devono essere inclusi nelle informazioni di configurazione restituite dai dispositivi quando ricevono una richiesta dal software host per il descrittore di configurazione (configurazione GetDescriptor). Il software host non può recuperare gli ID direttamente con una richiesta getDescriptor.

Tuttavia, i driver client possono eseguire query sul driver padre di un dispositivo USB per gli identificatori hardware del dispositivo e gli ID hardware del dispositivo contengono informazioni incorporate sui campi dell'IAD.

Esempio di descrittore dell'associazione dell'interfaccia USB

Questa sezione illustra un layout descrittore per un dispositivo USB composito. Il dispositivo di esempio ha due funzioni:

Funzione classe video

Un descrittore di associazione dell'interfaccia (IAD) definisce questa funzione. La funzione contiene due interfacce: interfaccia zero (0) e interfaccia 1 (1).

Il sistema genera identificatori hardware e compatibili (ID) per la funzione, come descritto in Supporto per la classe dispositivo di comunicazione mobile wireless. Dopo che il sistema operativo corrisponde al file INF appropriato, il sistema carica lo stack di driver della classe video.

Funzione HID (Human Input Device)

Questa funzione contiene solo due interfacce (2).

Il sistema genera ID hardware e compatibili per la funzione, come descritto nell'enumerazione delle raccolte di interfacce in dispositivi compositi USB. Dopo che il sistema operativo corrisponde al file INF appropriato, il sistema carica il driver di classe HID (Human Input Device).

Il descrittore è il seguente:

Descrittore del dispositivo

    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

Descrittore di configurazione

    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)

Descrittore dell'associazione dell'interfaccia

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

Descrittore dell'interfaccia di controllo video

    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

Descrittore specifico della classe di controllo video

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

Descrittore dell'endpoint di controllo video

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

Descrittore dell'interfaccia di streaming video

    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

Descrittore specifico della classe di streaming video

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

Descrittore dell'endpoint di streaming video

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

Descrittore dell'interfaccia HID (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

Descrittore specifico della classe HID

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

Descrittore dell'endpoint HID

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