Trabajar con canalizaciones USB

El marco representa cada canalización de una interfaz USB como un objeto de canalización USB de marco. Cuando un controlador configura un dispositivo USB, el marco crea un objeto de canalización USB de marco para cada canalización de cada interfaz seleccionada. Los métodos de objeto de canalización permiten a un controlador realizar las siguientes operaciones:

Obtener información de canalización

Después de llamar a WdfUsbInterfaceGetConfiguredPipe para obtener un identificador a un objeto de canalización USB de marco, el controlador puede llamar a los métodos siguientes que el objeto de canalización USB define para obtener información sobre la canalización USB:

WdfUsbTargetPipeGetIoTarget
Devuelve un identificador al objeto de destino de E/S asociado a una canalización USB. El controlador puede pasar este identificador a WdfRequestSend.

WdfUsbTargetPipeGetInformation
Recupera información sobre una canalización USB y su punto de conexión.

WdfUsbTargetPipeGetType
Devuelve el tipo de una canalización USB.

WdfUsbTargetPipeIsInEndpoint
Determina si una canalización USB está conectada a un punto de conexión de entrada.

WdfUsbTargetPipeIsOutEndpoint
Determina si una canalización USB está conectada a un punto de conexión de salida.

WDF_USB_PIPE_DIRECTION_IN
Determina si un punto de conexión USB es un punto de conexión de entrada.

WDF_USB_PIPE_DIRECTION_OUT
Determina si un punto de conexión USB es un punto de conexión de salida.

Para obtener información relacionada, consulte Cómo enumerar canalizaciones USB.

Lectura desde una canalización

Para leer datos de una canalización de entrada USB, el controlador puede usar cualquiera (o todos) de las tres técnicas siguientes:

  • Leer datos de forma sincrónica

    Para leer datos de forma sincrónica desde una canalización de entrada USB, el controlador puede llamar al método WdfUsbTargetPipeReadSynchronously . Este método compila y envía una solicitud de lectura y devuelve una vez completada la operación de E/S.

  • Leer datos de forma asincrónica

    Para leer datos de forma asincrónica desde una canalización de entrada USB, el controlador puede llamar al método WdfUsbTargetPipeFormatRequestForRead para crear una solicitud de lectura. A continuación, el controlador puede llamar a WdfRequestSend para enviar la solicitud de forma asincrónica (o sincrónica).

  • Leer datos de forma asincrónica y continua

    Un lector continuo es un mecanismo proporcionado por el marco para garantizar que una solicitud de lectura esté siempre disponible para una canalización USB. Este mecanismo garantiza que el controlador siempre estará listo para recibir datos de un dispositivo que proporciona un flujo de entrada asincrónico y no solicitado. Por ejemplo, un controlador para una tarjeta de interfaz de red (NIC) podría usar un lector continuo para recibir datos de entrada.

    Para configurar un lector continuo para una canalización de entrada, la función de devolución de llamada EvtDevicePrepareHardware del controlador debe llamar al método WdfUsbTargetPipeConfigContinuousReader . Este método pone en cola un conjunto de solicitudes de lectura al destino de E/S del dispositivo.

    Además, la función de devolución de llamada EvtDeviceD0Entry del controlador debe llamar a WdfIoTargetStart para iniciar el lector continuo y la función de devolución de llamada EvtDeviceD0Exit del controlador debe llamar a WdfIoTargetStop para detener el lector continuo.

    Cada vez que los datos estén disponibles en el dispositivo, el destino de E/S completará una solicitud de lectura y el marco llamará a una de las dos funciones de devolución de llamada: EvtUsbTargetPipeReadComplete, si el destino de E/S leyó correctamente los datos o EvtUsbTargetPipeReadersFailed, si el destino de E/S notifica un error.

    Si no proporciona la devolución de llamada opcional EvtUsbTargetPipeReadersFailed , el marco responde a un intento de lectura erróneo enviando otra solicitud de lectura. Por lo tanto, si el bus está en un estado en el que no acepta lecturas, el marco envía continuamente nuevas solicitudes para recuperarse de una lectura errónea.

    Una vez que un controlador ha llamado a WdfUsbTargetPipeConfigContinuousReader, el controlador no puede usar WdfUsbTargetPipeReadSynchronously o WdfRequestSend para enviar solicitudes de E/S a la canalización a menos que se llame a la función de devolución de llamada EvtUsbTargetPipeReadersFailed del controlador y devuelva FALSE.

De forma predeterminada, el marco notifica un error si el controlador especifica un búfer de lectura que no es un múltiplo del tamaño máximo de paquete de la canalización. El controlador puede llamar a WdfUsbTargetPipeSetNoMaximumPacketSizeCheck para deshabilitar esta prueba de tamaños de búfer de lectura.

Para obtener información relacionada, consulte:

Escribir en una canalización

Para escribir datos en una canalización de salida USB, el controlador puede usar una (o ambas) de las técnicas siguientes:

  • Escribir datos de forma sincrónica

    Para escribir datos de forma sincrónica en una canalización de salida USB, el controlador puede llamar al método WdfUsbTargetPipeWriteSynchronously . Este método compila y envía una solicitud de escritura y devuelve una vez completada la operación de E/S.

  • Escribir datos de forma asincrónica

    Para escribir datos de forma asincrónica en una canalización de entrada USB, el controlador puede llamar al método WdfUsbTargetPipeFormatRequestForWrite para crear una solicitud de escritura. A continuación, el controlador puede llamar a WdfRequestSend para enviar la solicitud de forma asincrónica.

Para obtener información relacionada, consulte Envío de solicitudes de transferencia masiva usb.

Detener y restablecer una canalización

El controlador puede llamar a los métodos siguientes para detener o restablecer una canalización USB:

WdfUsbTargetPipeAbortSynchronously
Envía una solicitud de forma sincrónica para detener una canalización USB.

WdfUsbTargetPipeFormatRequestForAbort
Da formato a una solicitud para detener una canalización USB. El controlador puede llamar a WdfRequestSend para enviar la solicitud de forma sincrónica o asincrónica.

WdfUsbTargetPipeResetSynchronously
Envía una solicitud de forma sincrónica para restablecer una canalización USB.

WdfUsbTargetPipeFormatRequestForReset
Da formato a una solicitud para restablecer una canalización USB. El controlador debe llamar a WdfRequestSend para enviar la solicitud de forma sincrónica o asincrónica.

Si el destino USB del controlador completa una solicitud de E/S con un valor de estado de error, el controlador debe hacer lo siguiente:

  1. Detenga la canalización y cancele las solicitudes de E/S adicionales que el controlador ha enviado al destino USB, si el destino no ha completado las solicitudes.

    Llame a WdfIoTargetStop con la marca WdfIoTargetCancelSentIo establecida.

  2. Enviar de forma sincrónica una solicitud de anulación a la canalización.

    Llame a WdfUsbTargetPipeAbortSynchronously o llame a WdfUsbTargetPipeFormatRequestForAbort seguido de WdfRequestSend con la marca WDF_REQUEST_SEND_OPTION_SYNCHRONOUS establecida.

  3. Enviar de forma sincrónica una solicitud de restablecimiento a la canalización.

    Llame a WdfUsbTargetPipeResetSynchronously o llame a WdfUsbTargetPipeFormatRequestForReset seguido de WdfRequestSend con la marca WDF_REQUEST_SEND_OPTION_SYNCHRONOUS establecida.

  4. Reinicie la canalización.

    Llame a WdfIoTargetStart.

  5. Vuelva a enviar la solicitud de E/S que produjo un error y todas las solicitudes de E/S que siguieron a la solicitud con errores.

Después de un número significativo de varios errores, el controlador debe intentar restablecer el puerto USB haciendo lo siguiente:

  1. Detenga todas las canalizaciones activas y cancele las solicitudes de E/S adicionales que el controlador haya enviado al destino USB de cada canalización, si el destino no los ha completado.

    Para cada canalización activa, llame a WdfIoTargetStop con la marca WdfIoTargetCancelSentIo establecida.

  2. Enviar de forma sincrónica una solicitud para restablecer el puerto USB.

    Llame a WdfUsbTargetDeviceResetPortSynchronously.

  3. Reinicie las canalizaciones.

    Llame a WdfIoTargetStart para cada canalización que el controlador detuvo.

  4. Vuelva a enviar la última solicitud de E/S que produjo un error y todas las solicitudes de E/S que siguieron a la solicitud con errores.

Para obtener información relacionada, consulte Recuperación de errores de canalización USB.

Envío de un URB a una canalización

Si el controlador KMDF se comunica con una canalización USB mediante el envío de solicitudes de E/S que contienen direcciones URL, el controlador puede llamar a los métodos siguientes:

WdfUsbTargetPipeSendUrbSynchronously (solo KMDF)
Envía de forma sincrónica una solicitud de E/S que contiene un URB.

WdfUsbTargetPipeFormatRequestForUrb (solo KMDF)
Da formato a una solicitud de E/S que contiene un URB. El controlador puede llamar a WdfRequestSend para enviar la solicitud de forma sincrónica o asincrónica.

WdfUsbTargetPipeWdmGetPipeHandle (solo KMDF)
Devuelve el controlador de canalización USBD de un dispositivo. Algunas direcciones URL requieren este identificador.