Compartir a través de


Descriptores de dispositivos USB

El descriptor del dispositivo contiene información sobre un dispositivo USB en su conjunto. En este tema se describe la estructura USB_DEVICE_DESCRIPTOR e incluye información sobre cómo un controlador cliente puede enviar una solicitud get-descriptor para obtener el descriptor de dispositivo.

Cada dispositivo de bus serie universal (USB) debe ser capaz de proporcionar un único descriptor de dispositivo que contenga información relevante sobre el dispositivo. La estructura USB_DEVICE_DESCRIPTOR describe un descriptor de dispositivo. Windows usa esa información para derivar varios conjuntos de información. Por ejemplo, los campos idVendor e idProduct especifican identificadores de proveedor y producto, respectivamente. Windows usa esos valores de campo para construir un identificador de hardware para el dispositivo. Para ver el identificador de hardware de un dispositivo determinado, abra Administrador de dispositivos y vea las propiedades del dispositivo. En la pestaña Detalles , el valor de la propiedad Ids de hardware indica el identificador de hardware ("USB\XXX") generado por Windows. El campo bcdUSB indica la versión de la especificación USB a la que se ajusta el dispositivo. Por ejemplo, 0x0200 indica que el dispositivo está diseñado según la especificación USB 2.0. El valor bcdDevice indica el número de revisión definido por el dispositivo. La pila de controladores USB usa bcdDevice, junto con idVendor e idProduct, para generar identificadores de hardware y compatibles para el dispositivo. Puede ver esos identificadores en Administrador de dispositivos. El descriptor de dispositivo también indica el número total de configuraciones que admite el dispositivo.

Un dispositivo puede notificar información diferente en su descriptor de dispositivo cuando el dispositivo está conectado al equipo host en una capacidad de alta velocidad que cuando está conectado en una capacidad de velocidad completa. Un dispositivo no debe cambiar la información contenida en el descriptor del dispositivo durante la duración de una conexión, incluso durante los cambios de estado de energía.

El host obtiene el descriptor de dispositivo a través de una transferencia de control. En la transferencia, el tipo de solicitud es GET DESCRIPTOR y el destinatario es el dispositivo. El controlador cliente puede iniciar esa transferencia de dos maneras: mediante el uso del objeto de dispositivo de destino USB de la plataforma o mediante el envío de un URB con la información de solicitud.

Obtención del descriptor de dispositivo

Un controlador cliente de Windows Driver Frameworks (WDF) solo puede obtener el descriptor de dispositivo después de crear el objeto de dispositivo de destino USB de la plataforma.

Un controlador KMDF debe obtener un identificador WDFUSBDEVICE para el objeto de dispositivo de destino USB llamando a WdfUsbTargetDeviceCreate. Normalmente, un controlador cliente llama a WdfUsbTargetDeviceCreate en la implementación de devolución de llamada evtDevicePrepareHardware del controlador. Después, el controlador cliente debe llamar al método WdfUsbTargetDeviceGetDeviceDeviceDescriptor . Una vez completada la llamada, el descriptor de dispositivo se recibe en la estructura de USB_DEVICE_DESCRIPTOR asignada por el autor de la llamada.

Un controlador UMDF debe consultar el objeto de dispositivo de marco para un puntero IWDFUsbTargetDevice y, a continuación, llamar al método IWDFUsbTargetDevice::RetrieveDescriptor y especificar USB_DEVICE_DESCRIPTOR_TYPE como el tipo de descriptor.

El host también puede obtener el descriptor del dispositivo mediante el envío de un URB. Este método solo se aplica a los controladores en modo kernel. Sin embargo, un controlador cliente nunca debe tener que enviar un URB para este tipo de solicitud a menos que el controlador se base en el modelo de controladores de Windows (WDM). Este controlador debe asignar una estructura URB y, a continuación, llamar a la macro UsbBuildGetDescriptorRequest para especificar el formato del URB para la solicitud. Después, el controlador puede enviar la solicitud enviando el URB a la pila del controlador USB. Para obtener más información, vea Cómo enviar un URB.

En este ejemplo de código se muestra una llamada UsbBuildGetDescriptorRequest que da formato al búfer al que apunta pURB con el URB adecuado:

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
);

Descriptor de dispositivo de ejemplo

En este ejemplo se muestra el descriptor del dispositivo para un dispositivo web USB (consulte Diseño del dispositivo USB), obtenido mediante la aplicación 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

En el ejemplo anterior, verá que el dispositivo se ha desarrollado según la especificación USB, versión 2.0. Tenga en cuenta los valores bDeviceClass, bDeviceSubClass y bDeviceProtocol . Estos valores indican que el dispositivo contiene uno o varios descriptores de asociación de interfaz USB que se pueden usar para agrupar varias interfaces por función. Para obtener más información, vea USB Interface Association Descriptor.

A continuación, vea el valor de bMaxPacketSize0. Este valor indica el tamaño máximo del paquete del punto de conexión predeterminado. Este dispositivo de ejemplo puede transferir hasta 64 bytes de datos a través de su punto de conexión predeterminado.

Normalmente, para configurar el dispositivo, el controlador cliente obtiene información sobre las configuraciones admitidas en el dispositivo después de obtener el descriptor del dispositivo. Para determinar el número de configuraciones que admite el dispositivo, inspeccione el miembro bNumConfigurations de la estructura devuelta. Este dispositivo admite una configuración. Para obtener información sobre una configuración USB, el controlador debe obtener descriptores de configuración USB.