Descritores de dispositivo USB

O descritor do dispositivo contém informações sobre um dispositivo USB como um todo. Este tópico 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 (Barramento Serial Universal) 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 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.

Um dispositivo pode relatar informações diferentes em seu descritor de dispositivo quando o dispositivo estiver conectado ao computador host em uma capacidade de alta velocidade do que quando ele estiver conectado 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 as 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 de cliente do WDF (Windows Driver Frameworks) pode obter o descritor do dispositivo somente depois que o objeto de dispositivo de destino USB da estrutura tiver sido criado.

Um driver KMDF deve obter um identificador WDFUSBDEVICE para o objeto de dispositivo de destino USB chamando WdfUsbTargetDeviceCreate. Normalmente, um driver cliente chama WdfUsbTargetDeviceCriar 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 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 URB para a solicitação. Em seguida, o driver pode enviar a solicitação enviando o URB para a pilha do driver USB. Para obter mais informações, confira 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 do dispositivo para um dispositivo de webcam USB (consulte Layout do 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, você verá que 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 ponto de extremidade padrão. Este 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 do 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 dá suporte a uma configuração. Para obter informações sobre uma configuração USB, o driver deve obter descritores de configuração USB.