Compartilhar via


Descritores de dispositivo USB

O descritor de dispositivo contém informações sobre um dispositivo USB como um todo. This article describes the USB_DEVICE_DESCRIPTOR structure and includes information about how a client driver can send a get-descriptor request to obtain the device descriptor.

Cada dispositivo USB (Universal Serial Bus) deve ser capaz de fornecer um único descritor de dispositivo que contenha informações relevantes sobre o dispositivo. The USB_DEVICE_DESCRIPTOR structure describes a device descriptor. O Windows usa essas informações para derivar vários conjuntos de informações. For example, the idVendor and idProduct fields specify vendor and product identifiers, respectively. Windows uses those field values to construct a hardware ID for the device. Para visualizar a ID de hardware de um dispositivo específico:

  1. Open Device Manager.
  2. Right-click on the USB device and select Properties.
  3. Select the Details tab in the properties dialog box.
  4. Drop down the Property list.
  5. Select the Hardware Ids property

The values indicate the hardware IDs ("USB\XXX") that Windows generates.

The bcdUSB field of the USB_DEVICE_DESCRIPTOR structure indicates the version of the USB specification to which the device conforms. Por exemplo, 0x0200 indica que o dispositivo foi projetado de acordo com a especificação USB 2.0. The bcdDevice value indicates the device-defined revision number.

The USB driver stack uses bcdDevice, along with idVendor and idProduct, to generate hardware and compatible IDs for the device. You can view those identifiers in Device Manager. 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.

A Kernel-Mode Driver Framework (KMDF) driver must obtain a WDFUSBDEVICE handle to the USB target device object by calling WdfUsbTargetDeviceCreate. Typically, a client driver calls WdfUsbTargetDeviceCreate in the driver's EvtDevicePrepareHardware callback implementation. After that, the client driver must call the WdfUsbTargetDeviceGetDeviceDescriptor method. After the call completes, the device descriptor is received in the caller-allocated USB_DEVICE_DESCRIPTOR structure.

A User-Mode Driver Framework (UMDF) driver must query the framework device object for an IWDFUsbTargetDevice pointer and then call the IWDFUsbTargetDevice::RetrieveDescriptor method and specify USB_DEVICE_DESCRIPTOR_TYPE as the descriptor type.

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). Such a driver must allocate an URB structure and then call the UsbBuildGetDescriptorRequest macro to specify format the URB for the request. 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. Note the bDeviceClass, bDeviceSubClass, and bDeviceProtocol values. 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.

Next, see the value of 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. To determine the number of configurations that the device supports, inspect the bNumConfigurations member of the returned structure. Este dispositivo suporta uma configuração. Para obter informações sobre uma configuração USB, o driver deve obter Descritores de Configuração USB.