Partilhar via


Descritor de associação de interface USB

O descritor de associação de interface USB (IAD) permite que o dispositivo agrupe interfaces que pertencem a uma função. Este artigo descreve como um driver de cliente pode determinar se o dispositivo contém um IAD para uma função.

A especificação Universal Serial Bus, revisão 2.0, não suporta o agrupamento de mais de uma interface de um dispositivo composto dentro de uma única função. No entanto, o grupo de trabalho de dispositivos USB (DWG) criou classes de dispositivos USB que permitem funções com várias interfaces. O Fórum do Implementador USB emitiu uma notificação de alteração de engenharia (ECN) que define um mecanismo para agrupar interfaces.

A ECN especifica um descritor USB, chamado descritor de associação de interface (IAD), que permite aos fabricantes de hardware definir agrupamentos de interfaces. As classes de dispositivo com maior probabilidade de usar IADs incluem:

  • Especificação da classe de vídeo USB (código de classe - 0x0E)
  • Especificação de classe de áudio USB (código de classe - 0x01)
  • Especificação da classe Bluetooth USB (código de classe - 0xE0)

Como usar IADs

As subseções a seguir descrevem informações sobre como usar IADs.

Dispositivos compostos alertando o Windows sobre IADs no firmware

Os fabricantes de dispositivos compostos normalmente atribuem um valor zero aos campos de classe de dispositivo (bDeviceClass), subclasse (bDeviceSubClass) e protocolo (bDeviceProtocol) no descritor de dispositivo, conforme especificado pela Universal Serial Bus Specification. O fabricante pode associar cada interface individual a uma classe de dispositivo e protocolo diferentes.

A equipe principal do USB-IF desenvolveu uma classe especial e um conjunto de códigos de protocolo que notifica o sistema operacional de que um ou mais IADs estão presentes no firmware do dispositivo. Um descritor de dispositivo deve ter os valores que aparecem na tabela a seguir ou o sistema operacional não deteta os IADs do dispositivo ou agrupa as interfaces do dispositivo corretamente.

Campo descritor do dispositivo Valor obrigatório
bDeviceClass 0xEF
bDeviceSubClass 0x02
bDeviceProtocol 0x01

Os valores de código alertam versões do Windows que não suportam IADs a instalar um driver de barramento de uso específico que enumera corretamente o dispositivo. Sem esses códigos no descritor do dispositivo, o sistema pode falhar ao enumerar o dispositivo ou o dispositivo pode não funcionar corretamente.

Um dispositivo pode ter mais de um IAD. Cada IAD deve estar localizado imediatamente antes das interfaces no grupo de interfaces que o IAD descreve.

Os campos de classe de função (bFunctionClass), subclasse (bFunctionSubclassClass) e protocolo (bFunctionProtocol) do IAD devem conter os valores especificados pela classe de dispositivo USB que descreve as interfaces na função.

Os campos de classe e subclasse do IAD não são necessários para corresponder aos campos de classe e subclasse das interfaces na coleção de interfaces que o IAD descreve. A Microsoft recomenda que a primeira interface da coleção tenha campos de classe e subclasse que correspondam aos campos de classe e subclasse do IAD. A tabela a seguir indica quais campos devem corresponder.

Campo IAD Campo de interface correspondente
bClasse de função bInterfaceClass
bFunctionSubclassClass bInterfaceSubClass

O campo bFirstInterface do IAD indica o número da primeira interface na função. O campo bInterfaceCount do IAD indica quantas interfaces estão na coleção de interfaces. As interfaces em uma coleção de interfaces IAD devem ser contíguas (não pode haver lacunas na lista de números de interface) e, portanto, uma contagem com um primeiro número de interface é suficiente para especificar todas as interfaces na coleção.

Acesso ao conteúdo de um IAD

Os drivers de cliente não podem acessar descritores IAD diretamente. A ECN (notificação de alteração de engenharia) do IAD especifica que os IADs devem ser incluídos nas informações de configuração que os dispositivos retornam quando recebem uma solicitação do software host para o descritor de configuração (configuração GetDescriptor). O software host não pode recuperar IADs diretamente com uma solicitação GetDescriptor.

No entanto, os drivers de clientes podem consultar o controlador principal de um dispositivo USB para obter os identificadores de hardware (IDs) do dispositivo, e esses identificadores contêm informações incorporadas sobre os campos do IAD.

Exemplo de descritor de associação de interface USB

Esta seção ilustra um layout descritor para um dispositivo USB composto. O dispositivo de exemplo tem duas funções:

Função de videoaula

Um descritor de associação de interface (IAD) define essa função. A função contém duas interfaces: interface zero (0) e interface um (1).

O sistema gera hardware e identificadores (IDs) compatíveis para a função, conforme descrito em Suporte para a classe de dispositivo de comunicação móvel sem fio. Depois que o sistema operacional encontra o ficheiro INF apropriado, o sistema carrega o driver da classe de vídeo.

Função de dispositivo de entrada humana (HID)

Esta função contém apenas a interface 2.

O sistema gera hardware e IDs compatíveis para a função, conforme descrito em Enumeração de coleções de interface em dispositivos compostos USB. Depois que o sistema operacional corresponde ao arquivo INF apropriado, o sistema carrega o driver da classe de dispositivo de interface humano (HID).

O descritor é o seguinte:

Descritor do 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

Descritor de configuração

    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)

Descritor de associação de 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

Descritor de interface de controle 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

Descritor específico da classe de controle de vídeo

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

Descritor de ponto final de controle de vídeo

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

Descritor de interface 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

Descritor específico da classe de streaming de vídeo

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

Descritor de ponto final de streaming de vídeo

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

Descritor de interface 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

Descritor específico da classe HID

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

Descritor de ponto de extremidade HID

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