Descripteur d’association d’interface USB
Le descripteur d’association d’interface USB (IAD) permet à l’appareil de regrouper les interfaces qui appartiennent à une fonction. Cet article explique comment un pilote client peut déterminer si l’appareil contient un IAD pour une fonction.
La spécification du bus série universel, révision 2.0, ne prend pas en charge le regroupement de plusieurs interface d’un appareil composite au sein d’une seule fonction. Toutefois, le groupe de travail de périphérique USB (DWG) a créé des classes de périphériques USB qui autorisent les fonctions avec plusieurs interfaces. Le forum de l’implémenteur USB a émis une notification de modification d’ingénierie (ECN) qui définit un mécanisme de regroupement d’interfaces.
L’ECN spécifie un descripteur USB, appelé descripteur d’association d’interface (IAD), qui permet aux fabricants de matériel de définir des regroupements d’interfaces. Les classes d’appareil les plus susceptibles d’utiliser des IAD sont les suivantes :
- Spécification de classe vidéo USB (code de classe - 0x0E)
- Spécification de classe audio USB (code de classe - 0x01)
- Spécification de classe Bluetooth USB (code de classe - 0xE0)
Comment utiliser les IAD
Les sous-sections suivantes décrivent des informations sur l’utilisation des IAD.
Appareils composites alertant Windows des IAD dans le microprogramme
Les fabricants d’appareils composites attribuent généralement une valeur de zéro aux champs de la classe d’appareil (bDeviceClass), de la sous-classe (bDeviceSubClass) et du protocole (bDeviceProtocol) dans le descripteur d’appareil, comme spécifié par la spécification du bus série universel. Le fabricant peut associer chaque interface individuelle à une classe d’appareil et à un protocole différents.
L’équipe principale USB-IF a conçu un ensemble spécial de codes de classe et de protocole qui avertit le système d’exploitation qu’un ou plusieurs IAD sont présents dans le microprogramme de l’appareil. Un descripteur d’appareil doit avoir les valeurs qui apparaissent dans le tableau suivant, sinon le système d’exploitation ne détecte pas les IAD de l’appareil ou ne regroupe pas correctement les interfaces de l’appareil.
Champ de descripteur d’appareil | Valeur requise |
---|---|
bDeviceClass | 0xEF |
bDeviceSubClass | 0x02 |
bDeviceProtocol | 0x01 |
Les valeurs de code alertent les versions de Windows qui ne prennent pas en charge les IAD pour installer un pilote de bus à usage spécial qui énumère correctement l’appareil. Sans ces codes dans le descripteur d’appareil, le système risque de ne pas énumérer l’appareil ou de ne pas fonctionner correctement.
Un appareil peut avoir plusieurs IAD. Chaque IAD doit se trouver immédiatement avant les interfaces dans le groupe d’interfaces décrit par l’IAD.
Les champs de classe de fonction (bFunctionClass), de sous-classe (bFunctionSubclassClass) et de protocole (bFunctionProtocol) de l’IAD doivent contenir les valeurs spécifiées par la classe de périphérique USB qui décrit les interfaces dans la fonction.
Les champs de classe et de sous-classe de l’IAD ne sont pas nécessaires pour correspondre aux champs classe et sous-classe des interfaces de la collection d’interfaces décrite par l’IAD. Microsoft recommande que la première interface de la collection comporte des champs de classe et de sous-classe qui correspondent aux champs de classe et de sous-classe de l’IAD. Le tableau suivant indique les champs qui doivent correspondre.
Champ IAD | Champ d’interface correspondant |
---|---|
bFunctionClass | bInterfaceClass |
bFunctionSubclassClass | bInterfaceSubClass |
Le champ bFirstInterface de l’IAD indique le numéro de la première interface de la fonction. Le champ bInterfaceCount de l’IAD indique le nombre d’interfaces dans la collection d’interfaces. Les interfaces d’une collection d’interfaces IAD doivent être contiguës (il ne peut y avoir aucune lacune dans la liste des numéros d’interface), de sorte qu’un nombre avec un premier numéro d’interface est suffisant pour spécifier toutes les interfaces de la collection.
Accès au contenu d’un IAD
Les pilotes clients ne peuvent pas accéder directement aux descripteurs IAD. La notification de modification d’ingénierie IAD (ECN) spécifie que les IAD doivent être inclus dans les informations de configuration que les appareils retournent lorsqu’ils reçoivent une demande du logiciel hôte pour le descripteur de configuration (configuration GetDescriptor). Le logiciel hôte ne peut pas récupérer les IAD directement avec une requête GetDescriptor.
Toutefois, les pilotes clients peuvent interroger le pilote parent d’un périphérique USB pour obtenir les identificateurs matériels (ID) de l’appareil, et les ID matériels de l’appareil contiennent des informations incorporées sur les champs de l’IAD.
Exemple de descripteur d’association d’interface USB
Cette section illustre une disposition de descripteur pour un périphérique USB composite. L’exemple d’appareil a deux fonctions :
Fonction de classe vidéo
Un descripteur d’association d’interface (IAD) définit cette fonction. La fonction contient deux interfaces : l’interface zéro (0) et l’interface 1 (1).
Le système génère du matériel et des identificateurs compatibles (ID) pour la fonction, comme décrit dans Prise en charge de la classe d’appareil de communication mobile sans fil. Une fois que le système d’exploitation correspond au fichier INF approprié, le système charge la pile de pilotes de classe vidéo.
Fonction HID (Human Input Device)
Cette fonction contient uniquement l’interface 2 (2).
Le système génère du matériel et des ID compatibles pour la fonction, comme décrit dans Énumération des collections d’interface sur les périphériques composites USB. Une fois que le système d’exploitation correspond au fichier INF approprié, le système charge le pilote de classe hid (Human Input Device).
Le descripteur est le suivant :
Descripteur d’appareil
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
Descripteur de configuration
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)
Descripteur d’association d’interface
BYTE bLength 0x08
BYTE bDescriptorType 0x0B
BYTE bFirstInterface 0x00
BYTE bInterfaceCount 0x02
BYTE bFunctionClass 0x0E
BYTE bFunctionSubClass 0x03
BYTE bFunctionProtocol 0x00
BYTE iFunction 0x04
Descripteur d’interface de contrôle vidéo
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
Descripteur propre à la classe de contrôle vidéo
. . . .
. . . .
. . . .
Descripteur de point de terminaison de contrôle vidéo
. . . .
. . . .
. . . .
Descripteur d’interface de streaming vidéo
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
Descripteur propre à la classe de streaming vidéo
. . . .
. . . .
. . . .
Descripteur de point de terminaison de streaming vidéo
. . . .
. . . .
. . . .
Descripteur d’interface 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
Descripteur spécifique à la classe HID
. . . .
. . . .
. . . .
Descripteur de point de terminaison HID
. . . .
. . . .
. . . .