Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
El descriptor de asociación de interfaz USB (IAD) permite al dispositivo agrupar interfaces que pertenecen a una función. En este artículo se describe cómo un controlador cliente puede determinar si el dispositivo contiene un IAD para una función.
La especificación universal de bus serie, revisión 2.0, no admite la agrupación de más de una interfaz de un dispositivo compuesto dentro de una sola función. Sin embargo, el grupo de trabajo del dispositivo USB (DWG) creó clases de dispositivo USB que permiten funciones con varias interfaces. El foro del implementador USB emitió una notificación de cambio de ingeniería (ECN) que define un mecanismo para agrupar interfaces.
El ECN especifica un descriptor USB, denominado descriptor de asociación de interfaz (IAD), que permite a los fabricantes de hardware definir agrupaciones de interfaces. Las clases de dispositivo que es más probable que usen IAD incluyen:
- Especificación de clase de vídeo USB (código de clase - 0x0E)
- Especificación de clase de audio USB (código de clase : 0x01)
- Especificación de clase Bluetooth USB (código de clase - 0xE0)
Cómo usar IAD
En las subsecciones siguientes se describe información sobre cómo usar IAD.
Dispositivos compuestos que alertan a Windows de los IAD en el firmware
Los fabricantes de dispositivos compuestos normalmente asignan un valor de cero a la clase de dispositivo (bDeviceClass), subclase (bDeviceSubClass) y campos de protocolo (bDeviceProtocol) en el descriptor de dispositivo, tal como se especifica en la Especificación del bus serie universal. El fabricante puede asociar cada interfaz individual con una clase y un protocolo de dispositivo diferentes.
El equipo principal de USB-IF ha diseñado un conjunto de código de protocolo y clase especial que notifica al sistema operativo que uno o varios IAD están presentes en el firmware del dispositivo. Un descriptor de dispositivo debe tener los valores que aparecen en la tabla siguiente o el sistema operativo no detecta los IAD del dispositivo ni agrupa correctamente las interfaces del dispositivo.
| Campo descriptor de dispositivo | Valor obligatorio |
|---|---|
| bDeviceClass | 0xEF |
| bDeviceSubClass | 0x02 |
| bDeviceProtocol | 0x01 |
Los valores de código alertan a las versiones de Windows que no admiten IAD para la instalación de un controlador de bus de propósito especial que enumera correctamente el dispositivo. Sin estos códigos en el descriptor de dispositivo, es posible que el sistema no pueda enumerar el dispositivo o que el dispositivo no funcione correctamente.
Un dispositivo puede tener más de un IAD. Cada IAD debe ubicarse inmediatamente antes de las interfaces del grupo de interfaces que describe el IAD.
Los campos de clase de función (bFunctionClass), subclase (bFunctionSubclassClass) y protocolo (bFunctionProtocol) del IAD deben contener los valores especificados por la clase de dispositivo USB que describe las interfaces de la función.
Los campos de clase y subclase del IAD no son necesarios para que coincidan con los campos de clase y subclase de las interfaces de la colección de interfaces que describe el IAD. Microsoft recomienda que la primera interfaz de la colección tenga campos de clase y subclase que coincidan con los campos de clase y subclase del IAD. En la tabla siguiente se indica qué campos deben coincidir.
| Campo IAD | Campo de interfaz correspondiente |
|---|---|
| bFunctionClass | bInterfaceClass |
| bFunctionSubclassClass | bInterfaceSubClass |
El campo bFirstInterface del IAD indica el número de la primera interfaz de la función. El campo bInterfaceCount del IAD indica cuántas interfaces están en la colección de interfaces. Las interfaces de una colección de interfaces de IAD deben ser contiguas (no puede haber huecos en la lista de números de interfaz), por lo que un recuento con un primer número de interfaz es suficiente para especificar todas las interfaces de la colección.
Acceso al contenido de un IAD
Los controladores de cliente no pueden acceder directamente a los descriptores de IAD. La notificación de cambio de ingeniería de IAD (ECN) especifica que los IAD deben incluirse en la información de configuración que los dispositivos proporcionan cuando reciben una solicitud del software host para el descriptor de configuración (GetDescriptor configuration). El software host no puede recuperar los IAD directamente con una solicitud GetDescriptor.
Sin embargo, los controladores de cliente pueden consultar el controlador primario de un dispositivo USB para los identificadores de hardware (ID) del dispositivo y los identificadores de hardware del dispositivo contienen información insertada sobre los campos del IAD.
Ejemplo del descriptor de asociación de interfaz USB
En esta sección se muestra un diseño de descriptor para un dispositivo USB compuesto. El dispositivo de ejemplo tiene dos funciones:
Función de clase de vídeo
Un descriptor de asociación de interfaz (IAD) define esta función. La función contiene dos interfaces: interfaz cero (0) e interfaz uno (1).
El sistema genera identificadores de hardware e identificadores compatibles (IDs) para la función, según se describe en Soporte para la clase de dispositivos de comunicación móvil inalámbrica. Después de que el sistema operativo coincida con el archivo INF adecuado, se carga el conjunto de controladores de clase de vídeo.
Función de dispositivo de entrada humana (HID)
Esta función solo contiene la interfaz dos (2).
El sistema genera identificadores de hardware y compatibles para la función, como se describe en Enumeración de colecciones de interfaces en dispositivos compuestos USB. Después de que el sistema operativo coincida con el archivo INF adecuado, el sistema carga el controlador de clase del dispositivo de entrada humano (HID).
El descriptor es el siguiente:
Descriptor de 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
Descriptor de configuración
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)
Descriptor de asociación de interfaz
BYTE bLength 0x08
BYTE bDescriptorType 0x0B
BYTE bFirstInterface 0x00
BYTE bInterfaceCount 0x02
BYTE bFunctionClass 0x0E
BYTE bFunctionSubClass 0x03
BYTE bFunctionProtocol 0x00
BYTE iFunction 0x04
Descriptor de interfaz de control de vídeo
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
Descriptor específico de clase de control de vídeo
. . . .
. . . .
. . . .
Descriptor de extremo de control de vídeo
. . . .
. . . .
. . . .
Descriptor de interfaz de streaming de vídeo
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
Descriptor específico de clase de streaming de vídeo
. . . .
. . . .
. . . .
Descriptor de punto de conexión de streaming de vídeo
. . . .
. . . .
. . . .
Descriptor de interfaz de dispositivos de entrada humana (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
Descriptor específico de clase HID
. . . .
. . . .
. . . .
Descriptor de punto de conexión HID
. . . .
. . . .
. . . .