Descritores de dispositivo USB
O descritor de dispositivo contém informações sobre um dispositivo USB como um todo. Este artigo descreve a estrutura USB_DEVICE_DESCRIPTOR e inclui informações sobre como um driver cliente pode enviar uma solicitação get-descriptor para obter o descritor do dispositivo.
Cada dispositivo USB (Universal Serial Bus) deve ser capaz de fornecer um único descritor de dispositivo que contenha informações relevantes sobre o dispositivo. A estrutura USB_DEVICE_DESCRIPTOR descreve um descritor de 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 visualizar a ID de hardware de um dispositivo específico:
- Abra o Gerenciador de Dispositivos.
- Clique com o botão direito do mouse no dispositivo USB e selecione Propriedades.
- Selecione a guia Detalhes na caixa de diálogo de propriedades.
- Localize a lista Propriedades .
- Selecione a propriedade IDs de Hardware
Os valores indicam as IDs de hardware ("USB\XXX") que o Windows gera.
O campo bcdUSB da estrutura USB_DEVICE_DESCRIPTOR 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 visualizar esses identificadores no Gerenciador de dispositivos. O descritor de dispositivo também indica o número total de configurações compatíveis com o dispositivo.
Um dispositivo pode relatar informações diferentes em seu descritor de dispositivo quando o dispositivo se conecta ao computador host em uma capacidade de alta velocidade do que quando ele se conecta em uma capacidade de velocidade total. Um dispositivo não deve alterar as informações contidas no descritor do dispositivo durante o tempo de vida de uma conexão, inclusive durante alterações de estado de energia.
O host obtém o descritor do dispositivo por meio de uma transferência de controle. Na transferência, o tipo de solicitação é GET DESCRIPTOR e o destinatário é o dispositivo. O driver cliente pode iniciar essa transferência de duas maneiras: usando o objeto de dispositivo de destino USB da estrutura ou enviando um URB com as informações de solicitação.
Obtendo o descritor do dispositivo
Um driver cliente WDF (Windows Driver Frameworks) pode obter o descritor de dispositivo somente depois que o objeto de dispositivo de destino USB da estrutura for criado.
Um driver KMDF (Kernel-Mode Driver Framework) deve obter um identificador WDFUSBDEVICE para o objeto de dispositivo de destino USB chamando WdfUsbTargetDeviceCreate. Normalmente, um driver cliente chama WdfUsbTargetDeviceCreate na implementação de retorno de chamada EvtDevicePrepareHardware do driver. Depois disso, o driver cliente deve chamar o método WdfUsbTargetDeviceGetDeviceDescriptor . Após a conclusão da chamada, o descritor do dispositivo é recebido na estrutura de USB_DEVICE_DESCRIPTOR alocada pelo chamador.
Um driver UMDF (User-Mode Driver Framework) deve consultar o objeto de dispositivo de estrutura para um ponteiro IWDFUsbTargetDevice e, em seguida, chamar o método IWDFUsbTargetDevice::RetrieveDescriptor e especificar USB_DEVICE_DESCRIPTOR_TYPE como o tipo de descritor.
O host também pode obter o descritor do dispositivo enviando um URB. Esse método só se aplica a drivers no modo kernel. No entanto, um driver cliente nunca deve ter que enviar um URB para esse tipo de solicitação, a menos que o driver seja baseado no WDM (Modelo de Driver do Windows). Esse driver deve alocar uma estrutura URB e, em seguida, chamar a macro UsbBuildGetDescriptorRequest para especificar o formato do URB para a solicitação. Em seguida, o driver pode enviar a solicitação enviando o URB para a pilha de driver USB. Para obter mais informações, consulte Como enviar um URB.
Este exemplo de código mostra uma chamada UsbBuildGetDescriptorRequest que formata o buffer apontado por pURB com o URB apropriado:
UsbBuildGetDescriptorRequest(
pURB, // Points to the URB to be formatted
sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
USB_DEVICE_DESCRIPTOR_TYPE,
0, // Not used for device descriptors
0, // Not used for device descriptors
pDescriptor, // Points to a USB_DEVICE_DESCRIPTOR structure
NULL,
sizeof(USB_DEVICE_DESCRIPTOR),
NULL
);
Descritor de dispositivo de exemplo
Este exemplo mostra o descritor de dispositivo para um dispositivo de webcam USB (consulte Layout de dispositivo USB), obtido usando o aplicativo USBView:
Device Descriptor:
bcdUSB: 0x0200
bDeviceClass: 0xEF
bDeviceSubClass: 0x02
bDeviceProtocol: 0x01
bMaxPacketSize0: 0x40 (64)
idVendor: 0x045E (Microsoft Corporation)
idProduct: 0x0728
bcdDevice: 0x0100
iManufacturer: 0x01
0x0409: "Microsoft"
iProduct: 0x02
0x0409: "Microsoft LifeCam VX-5000"
0x0409: "Microsoft LifeCam VX-5000"
iSerialNumber: 0x00
bNumConfigurations: 0x01
No exemplo anterior, o dispositivo foi desenvolvido de acordo com a especificação USB, versão 2.0. Observe os valores bDeviceClass, bDeviceSubClass e bDeviceProtocol . Esses valores indicam que o dispositivo contém um ou mais descritores de associação de interface USB que podem ser usados para agrupar várias interfaces por função. Para obter mais informações, consulte Descritor de associação de interface USB.
Em seguida, consulte o valor de bMaxPacketSize0. Esse valor indica o tamanho máximo do pacote do endpoint padrão. Esse dispositivo de exemplo pode transferir até 64 bytes de dados por meio de seu ponto de extremidade padrão.
Normalmente, para configurar o dispositivo, o driver cliente obtém informações sobre as configurações com suporte no dispositivo depois de obter o descritor do dispositivo. Para determinar o número de configurações compatíveis com o dispositivo, inspecione o membro bNumConfigurations da estrutura retornada. Este dispositivo suporta uma configuração. Para obter informações sobre uma configuração USB, o driver deve obter Descritores de Configuração USB.