Condividi tramite


Descrittore di 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 dispositivi USB che consentono funzioni con più interfacce. Il forum dell'implementatore USB ha emesso una notifica di modifica tecnica (ECN) che definisce un meccanismo per le interfacce di raggruppamento.

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 dispositivi che sono più propense a usare gli IAD 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 gli IAD

Nelle sottosezioni seguenti vengono descritte le informazioni sull'uso degli IADs.

Dispositivi compositi che avvisano Windows degli ID nel firmware

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

Il team principale USB-IF ha progettato uno speciale insieme di codici di classe e di protocollo che informa il sistema operativo che uno o più IAD sono presenti nel firmware del dispositivo. Un descrittore di dispositivo deve avere i valori visualizzati nella tabella seguente oppure il sistema operativo non rileva correttamente gli ID del dispositivo o raggruppa correttamente le interfacce del dispositivo.

Campo descrittore del dispositivo Valore obbligatorio
bDeviceClass 0xEF
bDeviceSubClass 0x02
bDeviceProtocol 0x01

I valori di codice avvisano le versioni di Windows che non supportano IADs di installare un driver bus speciale per enumerare 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 descritto dall'IAD.

I campi della classe funzione (bFunctionClass), della sottoclasse (bFunctionSubclassClass) e del protocollo (bFunctionProtocol) dell'IAD devono contenere i valori specificati dalla classe del dispositivo USB che descrive le interfacce nella funzione.

I campi della classe e della sottoclasse dell'IAD non devono corrispondere ai campi della classe e della sottoclasse delle interfacce nella raccolta di interfacce descritta dall'IAD. Microsoft consiglia che la prima interfaccia della raccolta includa campi di classe e sottoclasse che corrispondono ai campi della classe e della 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 nella raccolta di interfacce. Le interfacce in una raccolta di interfacce IAD devono essere contigue (non possono esistere lacune nell'elenco dei numeri di interfaccia) e pertanto 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 delle modifiche di progettazione IAD (ECN) specifica che gli IAD devono essere inclusi nelle informazioni di configurazione che i dispositivi restituiscono quando ricevono una richiesta dal software host per il descrittore di configurazione (GetDescriptor configuration). Il software host non può recuperare gli IAD direttamente con una richiesta GetDescriptor.

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

Esempio di descrittore di associazione dell'interfaccia USB

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

Funzione della lezione video

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

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

Funzione Dispositivo di Input Umano (HID)

Questa funzione contiene solo l'interfaccia 2 (2).

Il sistema genera ID hardware e compatibili per la funzione, come descritto in Enumerazione delle raccolte di interfacce su dispositivi compositi USB. Dopo che il sistema operativo trova il file INF appropriato, il sistema carica il driver della 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 di 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 del 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 di 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 di endpoint HID

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