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
. . . .
. . . .
. . . .