Share via


Descriptor de asociación de interfaz USB

El descriptor de asociación de interfaz USB (IAD) permite que el dispositivo agrupe interfaces que pertenecen a una función. En este artículo se describe cómo un controlador de cliente puede determinar si el dispositivo contiene un IAD para una función.

La especificación de bus serie universal, 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 de dispositivos 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 los IAD

En las siguientes subsecciones 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 suelen asignar un valor de cero a la clase de dispositivo (bDeviceClass), la subclase (bDeviceSubClass) y los campos de protocolo (bDeviceProtocol) en el descriptor de dispositivo, tal y como se especifica en la Especificación de 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 requerido
bDeviceClass 0xEF
bDeviceSubClass 0x02
bDeviceProtocol 0x01

Los valores de código alertan versiones de Windows que no admiten IAD para instalar un controlador de bus de propósito especial que enumera correctamente el dispositivo. Sin estos códigos en el descriptor del 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 interfaz que describe el IAD.

Los campos de clase de función (bFunctionClass), subclase (bFunctionSubclassClass) y protocol (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 hay en la colección de interfaces. Las interfaces de una colección de interfaz IAD deben ser contiguas (no puede haber espacios 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 devuelven cuando reciben una solicitud del software host para el descriptor de configuración (configuración getDescriptor). El software host no puede recuperar 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 (identificadores) del dispositivo y los identificadores de hardware del dispositivo contienen información insertada sobre los campos del IAD.

Ejemplo de 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: la interfaz cero (0) y la interfaz uno (1).

El sistema genera identificadores de hardware y compatibles (ID) para la función, tal y como se describe en Compatibilidad con la clase de dispositivo de comunicación móvil inalámbrica. Después de que el sistema operativo coincida con el archivo INF adecuado, el sistema carga la pila de controladores de clase de vídeo.

Función de dispositivo de entrada humano (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 interfaz 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 la 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 la clase de control de vídeo

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

Descriptor de punto de conexión 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 la 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 la clase HID

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

Descriptor de punto de conexión HID

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