Trabajar con dispositivos USB
En este tema se describen las operaciones que puede realizar un controlador de Kernel-Mode Driver Framework (KMDF) o User-Mode Driver Framework (UMDF) a partir de la versión 2 mediante los métodos de objeto de dispositivo USB proporcionados por Windows Driver Frameworks (WDF).
Contiene las secciones siguientes:
- Creación de un objeto de dispositivo USB
- Configuración de un dispositivo USB
- Obtención de información del dispositivo
- Obtención de descriptores USB
- Envío de una transferencia de control
- Restablecer y Power-Cycling el puerto de un dispositivo
- Envío de un URB a un dispositivo
Para obtener instrucciones paso a paso sobre cómo escribir un controlador de cliente USB simple basado en KMDF, consulte Cómo escribir su primer controlador de cliente USB (KMDF).
Creación de un objeto de dispositivo USB
Para usar los objetos de destino de E/S USB del marco (WDFUSBDEVICE, WDFUSBINTERFACE y WDFUSBPIPE), el controlador de cliente primero debe llamar a WdfUsbTargetDeviceCreateWithParameters para crear un objeto de dispositivo USB. Normalmente, un controlador llama a WdfUsbTargetDeviceCreateWithParameters desde su función de devolución de llamada EvtDevicePrepareHardware .
Cuando el controlador llama a WdfUsbTargetDeviceCreateWithParameters, el marco crea un objeto WDFUSBDEVICE y lo asocia al FDO que representa el dispositivo USB. El método devuelve un identificador al nuevo objeto de dispositivo USB del marco que el controlador de cliente USB puede usar para comunicarse con el dispositivo físico.
Después de llamar a WdfUsbTargetDeviceCreateWithParameters, el controlador puede llamar a WdfUsbTargetDeviceGetDeviceDescriptor y WdfUsbTargetDeviceRetrieveConfigDescriptor para obtener descriptores USB del dispositivo. Estos descriptores contienen información sobre la primera configuración del dispositivo, sus valores de interfaz y sus puntos de conexión definidos. (Los descriptores USB se definen en la especificación USB oficial).
Configuración de un dispositivo USB
El método WdfUsbTargetDeviceCreateWithParameters también crea un objeto de interfaz USB de marco para cada interfaz USB que contiene la primera configuración del dispositivo.
Después de llamar a WdfUsbTargetDeviceCreateWithParameters, el controlador cliente debe llamar a WdfUsbTargetDeviceSelectConfig para seleccionar una configuración. Este método crea objetos de interfaz de marco para cada configuración alternativa de la interfaz en la configuración seleccionada.
El método también crea objetos de canalización que representan los puntos de conexión definidos en cada configuración alternativa de cada interfaz de la configuración seleccionada.
Después de seleccionar una configuración, puede cambiar la configuración alternativa para las interfaces de la configuración, si es necesario.
También puede llamar a WdfUsbTargetDeviceSelectConfig para desconfigurar un dispositivo.
Para obtener información relacionada, consulte:
- Cómo seleccionar una configuración para un dispositivo USB
- Cómo seleccionar una configuración alternativa en una interfaz USB
Obtención de información del dispositivo
Después de configurar un dispositivo, el controlador cliente puede llamar a los métodos siguientes para obtener información sobre un dispositivo USB:
WdfUsbTargetDeviceQueryUsbCapability
Determina si el controlador de host y la pila de controladores USB admiten una funcionalidad específica. Antes de llamar a WdfUsbTargetDeviceQueryUsbCapability, un controlador debe llamar a WdfUsbTargetDeviceCreateWithParameters.
WdfUsbTargetDeviceGetIoTarget
Devuelve un identificador al objeto de destino de E/S asociado a un dispositivo USB. El controlador puede pasar este identificador a WdfRequestSend o WdfIoTargetStop.
WdfUsbTargetDeviceRetrieveInformation
Recupera la información de versión y funcionalidad asociada a un dispositivo USB.
WdfUsbTargetDeviceIsConnectedSynchronous (solo KMDF)
Determina si el dispositivo está conectado.
WdfUsbTargetDeviceRetrieveCurrentFrameNumber (solo KMDF)
Recupera el número de marco USB actual.
Obtención de descriptores USB
Para obtener las cadenas Unicode contenidas en los descriptores de un dispositivo USB, el controlador puede llamar a cualquiera de los métodos siguientes:
WdfUsbTargetDeviceGetDeviceDeviceDescriptor
Obtiene el descriptor de dispositivo USB de un dispositivo.
WdfUsbTargetDeviceRetrieveConfigDescriptor
Obtiene el descriptor de configuración USB de un dispositivo, los descriptores de interfaz y los descriptores de punto de conexión.
WdfUsbTargetDeviceQueryString
Copia una cadena Unicode en un búfer proporcionado por el controlador.
WdfUsbTargetDeviceAllocAndQueryString
Copia una cadena Unicode en un búfer proporcionado por el marco.
WdfUsbTargetDeviceFormatRequestForString
Da formato a una solicitud de una cadena Unicode. El controlador puede llamar a WdfRequestSend para enviar la solicitud de forma sincrónica o asincrónica.
Envío de una transferencia de control
El controlador puede llamar a los métodos siguientes para enviar una solicitud de E/S que describa una transferencia de control USB estándar, específica de la clase de dispositivo o específica del proveedor.
WdfUsbTargetDeviceSendControlTransferSynchronously
Envía de forma sincrónica una solicitud de transferencia de control USB.
WdfUsbTargetDeviceFormatRequestForControlTransfer
Da formato a una solicitud para una transferencia de control USB. El controlador puede llamar a WdfRequestSend para enviar la solicitud de forma sincrónica o asincrónica.
Para obtener información relacionada, consulte Envío de una transferencia de control USB.
Restablecer y Power-Cycling el puerto de un dispositivo
El controlador puede llamar a los métodos siguientes para restablecer o encender el puerto USB al que está conectado un dispositivo:
WdfUsbTargetDeviceResetPortSynchronously
Envía de forma sincrónica una solicitud para restablecer el puerto USB de un dispositivo.
WdfUsbTargetDeviceCyclePortSynchronously (solo KMDF)
Envía sincrónicamente una solicitud al ciclo de alimentación del puerto USB de un dispositivo.
WdfUsbTargetDeviceFormatRequestForCyclePort (solo KMDF)
Da formato a una solicitud de ciclo de alimentación del puerto USB de un dispositivo. El controlador debe llamar a WdfRequestSend para enviar la solicitud de forma sincrónica o asincrónica.
Para obtener información relacionada, consulte Recuperación de errores de canalización USB.
Envío de un URB a un dispositivo
Si el controlador KMDF se comunica con su dispositivo USB mediante el envío de solicitudes de E/S que contienen direcciones URL, el controlador puede llamar a los métodos siguientes:
WdfUsbTargetDeviceCreateUrb (solo KMDF)
Asigna un bloque de solicitud USB (URB). Antes de llamar a WdfUsbTargetDeviceCreateUrb, un controlador debe llamar a WdfUsbTargetDeviceCreateWithParameters.
WdfUsbTargetDeviceCreateIsochUrb (solo KMDF)
Asigna un bloque de solicitud USB isócrono (URB). Antes de llamar a WdfUsbTargetDeviceCreateIsochUrb, un controlador debe llamar a WdfUsbTargetDeviceCreateWithParameters.
WdfUsbTargetDeviceSendUrbSynchronously (solo KMDF)
Envía de forma sincrónica una solicitud de E/S que contiene un URB.
WdfUsbTargetDeviceFormatRequestForUrb (solo KMDF)
Da formato a una solicitud de E/S que contiene un URB. El controlador debe llamar a WdfRequestSend para enviar la solicitud de forma sincrónica o asincrónica.
WdfUsbTargetDeviceWdmGetConfigurationHandle (solo KMDF)
Devuelve el identificador de configuración USBD de un dispositivo. Algunas direcciones URL requieren este identificador.
Para obtener información general conceptual sobre las direcciones URL, consulte Asignación y creación de direcciones URL.