Compartir a través de


Descriptor de asociación de interfaz USB

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

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