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
. . . .
. . . .
. . . .