Descritores USB padrão
Um dispositivo USB fornece informações sobre si mesmo em estruturas de dados chamadas descritores USB. Esta seção fornece informações sobre descritores de dispositivo, configuração, interface e ponto de extremidade e maneiras de recuperá-los de um dispositivo USB.
Descritores USB mapeados para o layout do dispositivo
O software host obtém descritores de um dispositivo anexado enviando várias solicitações de controle padrão para o ponto de extremidade padrão (Obter solicitações do Descritor, consulte a seção especificação USB 9.4.3). Essas solicitações especificam o tipo de descritor a ser recuperado. Em resposta a essas solicitações, o dispositivo envia descritores que incluem informações sobre o dispositivo, suas configurações, interfaces e pontos de extremidade relacionados. Os descritores de dispositivo contêm informações sobre todo o dispositivo. Os descritores de configuração contêm informações sobre cada configuração de dispositivo. Os descritores de cadeia de caracteres contêm cadeias de caracteres de texto Unicode.
Cada dispositivo USB expõe um descritor de dispositivo que indica as informações de classe, os identificadores de fornecedor e de produto do dispositivo e o número de configurações. Cada configuração expõe seu descritor de configuração que indica o número de interfaces e características de energia. Cada interface expõe um descritor de interface para cada uma de suas configurações alternativas que contém informações sobre a classe e o número de pontos de extremidade. Cada ponto de extremidade dentro de cada interface expõe descritores de ponto de extremidade que indicam o tipo de ponto de extremidade e o tamanho máximo do pacote.
Por exemplo, vamos considerar o layout do dispositivo de placa OSR FX2 (consulte Layout do dispositivo USB). No nível do dispositivo, o dispositivo expõe um descritor de dispositivo e um descritor de ponto de extremidade para o ponto de extremidade padrão. No nível de configuração, o dispositivo expõe um descritor de configuração para a Configuração 0. No nível da interface, ele expõe um descritor de interface para a Configuração Alternativa 0. No nível do ponto de extremidade, ele expõe três descritores de ponto de extremidade.
Descritor de dispositivo USB
Cada dispositivo USB (Barramento Serial Universal) deve ser capaz de fornecer um único descritor de dispositivo que contenha informações relevantes sobre o dispositivo. O Windows usa essas informações para derivar vários conjuntos de informações. Por exemplo, os campos idVendor e idProduct especificam identificadores de fornecedor e produto, respectivamente. O Windows usa esses valores de campo para construir uma ID de hardware para o dispositivo. Para exibir a ID de hardware de um dispositivo específico, abra Gerenciador de Dispositivos e exiba as propriedades do dispositivo. Na guia Detalhes , o valor da propriedade IDs de hardware indica a ID de hardware ("USB\XXX") gerada pelo Windows. O campo bcdUSB indica a versão da especificação USB à qual o dispositivo está em conformidade. Por exemplo, 0x0200 indica que o dispositivo foi projetado de acordo com a especificação USB 2.0. O valor bcdDevice indica o número de revisão definido pelo dispositivo. A pilha de driver USB usa bcdDevice, juntamente com idVendor e idProduct, para gerar hardware e IDs compatíveis para o dispositivo. Você pode exibir esses identificadores no Gerenciador de Dispositivos. O descritor do dispositivo também indica o número total de configurações compatíveis com o dispositivo.
O host obtém o descritor do dispositivo por meio de uma transferência de controle. A Microsoft fornece interfaces de programação para obter o descritor.
Se você estiver escrevendo um... | Chamar... |
---|---|
Aplicativo UWP que usa Windows.Devices.Usb | UsbDevice.DeviceDescriptor |
Aplicativo da área de trabalho Win32 que usa funções WinUSB | WinUsb_GetDescriptor |
Driver de cliente baseado em UMDF | IWDFUsbTargetDevice::RetrieveDescriptor |
Driver de cliente baseado em KMDF | WdfUsbTargetDeviceGetDeviceDescriptor |
Driver de cliente baseado em WDM | UsbBuildGetDescriptorRequest _URB_CONTROL_DESCRIPTOR_REQUEST |
Descritor de configuração USB
Uma configuração USB contém uma série de interfaces. Cada interface consiste em uma ou mais configurações alternativas e cada configuração alternativa é composta por um conjunto de pontos de extremidade (consulte Layout do dispositivo USB). Um descritor de configuração descreve que toda a configuração inclui suas interfaces, configurações alternativas e seus pontos de extremidade. Cada uma dessas entidades também é descrita em seu formato de descritor. Um descritor de configuração também pode incluir descritores personalizados definidos pelo fabricante do dispositivo.
Portanto, somente a parte inicial de um descritor de configuração é fixa, 9 bytes. O restante é variável dependendo do número de interfaces e suas configurações alternativas e pontos de extremidade compatíveis com o dispositivo. Neste conjunto de documentação, os 9 bytes iniciais são chamados de descritores de configuração. Os dois primeiros bytes do descritor indicam o comprimento total.
A tabela a seguir mostra o descritor de configuração para o dispositivo de webcam USB:
Campo | Valor |
---|---|
wTotalLength | 0x02CA |
bNumInterfaces | 0x02 |
bConfigurationValue | 0x01 |
iConfiguration | 0x00 |
bmAttributes | 0x80 (barramento ligado ) |
MaxPower | 0xFA (500 mA) |
O campo bConfigurationValue indica o número da configuração definida no firmware do dispositivo. Uma configuração USB também indica determinadas características de energia. O bmAttributes contém uma máscara de bits que indica se a configuração dá suporte ao recurso de ativação remota e se o dispositivo é movido a barramento ou auto-alimentado. O campo MaxPower especifica a potência máxima (em unidades milliamp) que o dispositivo pode extrair do host, quando o dispositivo é alimentado por barramento. O descritor de configuração também indica o número total de interfaces (bNumInterfaces) compatíveis com o dispositivo.
Se você estiver escrevendo um... | Chamar... |
---|---|
Aplicativo UWP que usa Windows.Devices.Usb | UsbDevice.ConfigurationDescriptor para obter a parte de comprimento fixo. UsbConfiguration.Descriptors para obter todo o conjunto de configurações. |
Aplicativo da área de trabalho Win32 que usa funções WinUSB | WinUsb_GetDescriptor |
Driver de cliente baseado em UMDF | IWDFUsbTargetDevice::RetrieveDescriptor |
Driver de cliente baseado em KMDF | WdfUsbTargetDeviceRetrieveConfigDescriptor |
Driver de cliente baseado em WDM | UsbBuildGetDescriptorRequest _URB_CONTROL_GET_CONFIGURATION_REQUEST |
Descritor de interface USB
Um descritor de interface contém informações sobre uma configuração alternativa de uma interface USB.
A tabela a seguir mostra o descritor de interface para a Configuração Alternativa 0 da Interface 0 para o dispositivo webcam:
Campo | Valor |
---|---|
bInterfaceNumber | 0x00 |
bAlternateSetting | 0x00 |
bNumEndpoints | 0x01 |
bInterfaceClass | 0x0E |
bInterfaceSubClass | 0x02 |
bInterfaceProtocol | 0x00 |
iInterface | 0x02 |
0x0409 | "Microsoft LifeCam VX-5000" |
0x0409 | "Microsoft LifeCam VX-5000" |
No exemplo anterior, observe os valores de campo bInterfaceNumber e bAlternateSetting . Esses campos contêm valores de índice que o host usa para ativar a interface e uma de suas configurações alternativas. Para ativação, um aplicativo ou um driver especifica o valor do índice na chamada de função. Com base nessas informações, a pilha de driver USB cria uma solicitação de controle padrão (SET INTERFACE) e a envia para o dispositivo. Observe o campo bInterfaceClass . O descritor de interface ou o descritor de qualquer uma de suas configurações alternativas especifica um código de classe, uma subclasse e um protocolo. O valor de 0x0E indica que a interface é para a classe de dispositivo de vídeo. Além disso, observe o campo iInterface . Esse valor indica que há dois descritores de cadeia de caracteres acrescentados ao descritor de interface. Os descritores de cadeia de caracteres contêm descrições Unicode que são usadas durante a enumeração do dispositivo para identificar a funcionalidade.
Se você estiver escrevendo um... | Chamar... |
---|---|
Aplicativo UWP que usa Windows.Devices.Usb | UsbInterfaceSetting.Descriptors para obter um descritor específico para uma configuração alternativa específica. UsbInterface.Descriptors para obter descritores para todas as configurações de uma interface. |
Aplicativo da área de trabalho Win32 que usa funções WinUSB | WinUsb_GetDescriptor |
Driver de cliente baseado em UMDF | IWDFUsbInterface::GetInterfaceDescriptor |
Driver de cliente baseado em KMDF | WdfUsbInterfaceGetDescriptor |
Driver de cliente baseado em WDM | UsbBuildGetDescriptorRequest _URB_CONTROL_GET_CONFIGURATION_REQUEST e, em seguida, analise cada descritor de interface. Para obter mais informações, consulte Como selecionar uma configuração para um dispositivo USB. |
Descritor de ponto de extremidade USB
Cada ponto de extremidade, em uma interface, descreve um único fluxo de entrada ou saída para o dispositivo. Um dispositivo que dá suporte a fluxos para diferentes tipos de funções tem várias interfaces. Um dispositivo que dá suporte a vários fluxos pertencentes a uma função pode dar suporte a vários pontos de extremidade em uma única interface.
Todos os tipos de pontos de extremidade (exceto o ponto de extremidade padrão) devem fornecer descritores de ponto de extremidade para que o host possa obter informações sobre o ponto de extremidade. Um descritor de ponto de extremidade inclui informações, como seu endereço, tipo, direção e a quantidade de dados que o ponto de extremidade pode manipular. As transferências de dados para o ponto de extremidade são baseadas nessas informações.
A tabela a seguir mostra um descritor de ponto de extremidade para o dispositivo webcam:
Campo | Valor |
---|---|
bEndpointAddress | 0x82 IN |
bmAttributes | 0x01 |
wMaxPacketSize | 0x0080 (128) |
bInterval | 0x01 |
O campo bEndpointAddress especifica o endereço exclusivo do ponto de extremidade que contém o número do ponto de extremidade (Bits 3..0) e a direção do ponto de extremidade (Bit 7). Ao ler esses valores no exemplo anterior, podemos determinar que o descritor descreve um ponto de extremidade IN cujo número de ponto de extremidade é 2. O atributo bmAttributes indica que o tipo de ponto de extremidade é isócrono. O wMaxPacketSizefield indica o número máximo de bytes que o ponto de extremidade pode enviar ou receber em uma única transação. Os bits 12..11 indicam o número total de transações que podem ser enviadas por microframe. O bInterval indica com que frequência o ponto de extremidade pode enviar ou receber dados.
Se você estiver escrevendo um... | Chamar... |
---|---|
Aplicativo UWP que usa Windows.Devices.Usb | UsbEndpointDescriptor |
Aplicativo da área de trabalho Win32 que usa funções WinUSB | WinUsb_GetDescriptor |
Driver de cliente baseado em UMDF | WDFUsbTargetPipe::GetInformation |
Driver de cliente baseado em KMDF | WdfUsbTargetPipeGetInformation |
Driver de cliente baseado em WDM | UsbBuildGetDescriptorRequest _URB_CONTROL_GET_CONFIGURATION_REQUEST e, em seguida, analise cada descritor de ponto de extremidade. Para obter mais informações, consulte Como selecionar uma configuração para um dispositivo USB. |