Compartilhar via


Descritor de associação de interface USB

O IAD (descritor de associação de interface USB) 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 do Barramento Serial Universal, revisão 2.0, não dá suporte ao agrupamento de mais de uma interface de um dispositivo composto em uma única função. No entanto, o DWG (grupo de trabalho do dispositivo USB) criou classes de dispositivo 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 interfaces de agrupamento.

O ECN especifica um descritor USB, chamado IAD (descritor de associação de interface), que permite que os fabricantes de hardware definam agrupamentos de interfaces. As classes de dispositivo mais propensas a usar IADs incluem:

  • Especificação da classe de vídeo USB (código de classe – 0x0E)
  • Especificação da 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 de IADs no firmware

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

A equipe principal do USB-IF criou um conjunto especial de código de classe e protocolo que notifica o sistema operacional de que uma 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 detecta as IADs do dispositivo ou agrupa as interfaces do dispositivo corretamente.

Campo descritor de dispositivo Valor necessário
bDeviceClass 0xEF
bDeviceSubClass 0x02
bDeviceProtocol 0x01

Os valores de código alertam versões do Windows que não dão suporte a IADs para instalar um driver de barramento de finalidade especial 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
bFunctionClass 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 interface do 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.

Acessando o conteúdo de um IAD

Os drivers cliente não podem acessar os descritores do IAD diretamente. A ECN (notificação de alteração de engenharia) do IAD especifica que as IADs devem ser incluídas 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 cliente podem consultar o driver pai de um dispositivo USB para os IDs (identificadores de hardware) do dispositivo, e as IDs de hardware do dispositivo contêm informações inseridas sobre os campos do IAD.

Exemplo de descritor de associação de interface USB

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

Função de classe de vídeo

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

O sistema gera hardware e IDs (identificadores 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 corresponder ao arquivo INF apropriado, o sistema carregará a pilha de driver de classe de vídeo.

Função HID (dispositivo de entrada humana)

Essa função contém apenas a interface dois (2).

O sistema gera hardware e IDs compatíveis para a função, conforme descrito em Enumeração de coleções de interfaces em dispositivos compostos USB. Depois que o sistema operacional corresponder ao arquivo INF apropriado, o sistema carregará o driver de classe HID (dispositivo de entrada humana).

O descritor é o seguinte:

Descritor 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

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 de extremidade 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 de extremidade de streaming de vídeo

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

Descritor de interface hid (dispositivos de entrada humana)

    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

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