Compartir tecnología

Desarrollo de controladores de dispositivos USB de Windows: ancho de banda USB

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Este artículo ofrece orientación sobre cómo administrar cuidadosamente el ancho de banda USB. Cada controlador de cliente USB es responsable de minimizar el ancho de banda USB que utiliza y devolver el ancho de banda no utilizado al conjunto de ancho de banda disponible lo más rápido posible.

Aquí, pensamos que la velocidad de USB 2.0 es 480 Mbps, 12 Mbps y 1,5 Mbps, que corresponden a alta velocidad, velocidad máxima y baja velocidad, respectivamente. Pero, de hecho, el ancho de banda de USB 2.0 también es muy reducido. Según las premisas de este artículo, USB 3.0 parece aliviar el problema del ancho de banda, pero el problema del ancho de banda no es un límite superior insuficiente sino un problema de hibisco de programación.

¿Por qué aparece un error de ancho de banda insuficiente con mi controlador USB?

La competencia por el ancho de banda en el bus USB proviene de múltiples fuentes, incluidos hardware y software. Es difícil predecir con precisión la cantidad de ancho de banda disponible para un controlador de cliente USB. Los controladores de host USB requieren una cierta cantidad de ancho de banda para funcionar. La cantidad requerida depende de si el controlador es de alta velocidad. Varía de un sistema a otro. Los concentradores USB que funcionan a alta velocidad a veces deben traducir transacciones entre puertos ascendentes de alta velocidad y dispositivos de baja velocidad, y este proceso de traducción consume ancho de banda. Sin embargo, si la conversión de transacciones requiere ancho de banda depende del tipo de dispositivo conectado y de la topología del árbol de dispositivos.

La presión más grave sobre los recursos de ancho de banda generalmente proviene de los controladores de clientes USB que monopolizan el ancho de banda. El sistema asigna ancho de banda por orden de llegada. Si el primer controlador USB cargado solicita todo el ancho de banda disponible, los controladores USB subsiguientes cargados no permitirán ningún ancho de banda a sus dispositivos. El sistema no puede configurar ni enumerar el dispositivo. Debido a que el motivo del error de enumeración no es obvio, la experiencia del usuario es deficiente.

A veces, los controladores de los clientes agotan el ancho de banda disponible mediante transferencias interrumpidas de alta velocidad. Pero, con diferencia, el escenario más común es que el controlador del cliente asigna demasiado ancho de banda para una transferencia constante y no logra liberarlo de manera oportuna. El sistema retiene el ancho de banda asignado hasta que el controlador que lo solicitó cierra su punto final abriendo otro punto final, o se elimina el dispositivo al que se le asignó el ancho de banda. El sistema no asigna ancho de banda garantizado para transferencias masivas, por lo que las transferencias masivas nunca son la causa de errores de enumeración. Sin embargo, el rendimiento de un dispositivo de transferencia masiva depende de la cantidad de ancho de banda asignado al dispositivo para transferencias regulares (esperas e interrupciones constantes).

La especificación USB 2.0 requiere que los dispositivos constantes tengan puntos finales de ancho de banda cero en su configuración de interfaz predeterminada. Esto garantiza que no se reserve ningún ancho de banda para el dispositivo hasta que el controlador de función abra una interfaz no predeterminada, lo que ayuda a evitar errores de enumeración debido a solicitudes excesivas de ancho de banda durante la configuración del dispositivo. No impide que los controladores del cliente asignen ancho de banda excesivo después de configurar sus dispositivos, impidiendo así que otros dispositivos funcionen correctamente.

La clave para una administración adecuada del ancho de banda es que cada dispositivo USB en el sistema que realiza transferencias constantes debe proporcionar múltiples configuraciones alternativas (Alt) para cada interfaz que contenga puntos finales constantes, y el controlador del cliente debe usar estas configuraciones Alt con prudencia. Los controladores del cliente deben solicitar primero la configuración de la interfaz con el ancho de banda más alto. Si la solicitud falla, el controlador del cliente debe solicitar la configuración de la interfaz con anchos de banda cada vez más pequeños hasta que la solicitud se realice correctamente.

Por ejemplo, supongamos que un dispositivo de cámara web tiene la siguiente interfaz:

Interfaz 0 (configuración de interfaz predeterminada: no hay puntos finales con ancho de banda constante distinto de cero en la configuración predeterminada)

Punto final constante 1: tamaño máximo de paquete = 0 bytes

Punto final constante 2: tamaño máximo de paquete = 0 bytes

Interfaz 0 Configuración alternativa 1

Punto final constante 1: tamaño máximo de paquete = 256 bytes

Punto final constante 2: tamaño máximo de paquete = 256 bytes

Interfaz 0 Configuración alternativa 2

Punto final constante 1: tamaño máximo de paquete = 512 bytes

Punto final constante 2: tamaño máximo de paquete = 512 bytes

El controlador de la cámara web configura la cámara web para utilizar la configuración de interfaz predeterminada durante la inicialización. La configuración predeterminada no tiene ancho de banda constante, por lo que usar la configuración predeterminada durante la inicialización evita el peligro de que la cámara web no pueda realizar la enumeración debido a una solicitud fallida de ancho de banda constante.

Cuando el controlador del cliente esté listo para realizar transferencias isócronas constantes, debería intentar utilizar la configuración Alt 2 porque la configuración Alt 2 tiene el tamaño de paquete más grande. Si la solicitud falla, el conductor puede intentarlo una segunda vez usando la configuración Alt 1. Debido a que la configuración Alt 1 requiere menos ancho de banda, esta solicitud puede tener éxito incluso si la primera solicitud falla. Múltiples configuraciones Alt permiten al conductor realizar múltiples intentos antes de darse por vencido.

Una vez que la cámara web queda inactiva, el ancho de banda asignado se puede devolver al grupo de ancho de banda disponible seleccionando nuevamente la configuración predeterminada.

Los usuarios pueden ver cuánto ancho de banda ha asignado un controlador USB verificando las propiedades del controlador en el Administrador de dispositivos de Windows. Seleccione las propiedades del controlador y busque en la pestaña Avanzado. Esta lectura no indica cuánto ancho de banda asigna el concentrador USB para la traducción de transacciones.

La función Administrador de dispositivos que informa el uso de ancho de banda del controlador USB no funciona correctamente en Windows XP.

Transferencia USB y tamaño de paquete
Tamaño máximo de transferencia

El tamaño máximo de transferencia especifica un límite codificado en la pila del controlador USB. Los tamaños de transferencia por debajo de estos límites pueden fallar debido a limitaciones de recursos del sistema. Para evitar este tipo de fallas y garantizar la compatibilidad con todas las versiones de Windows, evite utilizar tamaños de transferencia grandes para transferencias USB.

El miembro MaximumTransferSize de la estructura USBD_PIPE_INFORMATION está obsoleto. La pila del controlador USB ignora el valor de MaximumTransferSize para dispositivos compuestos y no compuestos.

En Windows 2000, la pila del controlador USB inicializa MaximumTransferSize en USBD_DEFAULT_MAXIMUM_TRANSFER_SIZE. Los controladores del cliente pueden establecer un valor menor al configurar el dispositivo. Para dispositivos compuestos, los controladores de cliente por función solo pueden cambiar el MaximumTransferSize de la tubería en configuraciones de interfaz no predeterminadas.

El tamaño de la transferencia USB está limitado por:

Limitar el tamaño de la transferencia usando MaximumTransferSize no afecta directamente el ancho de banda consumido por el dispositivo. El controlador del cliente debe cambiar la configuración de la interfaz o limitar el tamaño máximo de paquete establecido en el miembro MaximumPacketSize de USBD_PIPE_INFORMATION.

Tamaño máximo de paquete

El tamaño máximo de paquete está definido por el campo wMaxPacketSize del descriptor del punto final. Los controladores del cliente pueden ajustar el tamaño del paquete USB en solicitudes de interfaz seleccionadas para el dispositivo. Cambiar este valor no cambia wMaxPacketSize en el dispositivo.

Dentro de la URB solicitada se encuentra la estructura USBD_PIPE_INFORMATION de la tubería. En esta estructura,

  • Modifique el miembro MaximumPacketSize de la estructura USBD_PIPE_INFORMATION. Configúrelo en un valor menor o igual que wMaxPacketSize definido en el firmware del dispositivo para la configuración de interfaz actual.
  • Establezca el indicador USBD_PF_CHANGE_MAX_PACKET en la estructura USBD_PIPE_INFORMATION del miembro PipeFlags.
Leer el límite máximo de tamaño de paquete del búfer de transmisión

Cuando un controlador de cliente emite una solicitud de lectura, el búfer de transmisión debe ser un múltiplo del tamaño máximo de paquete. Incluso si el controlador requiere menos datos que el tamaño máximo de paquete, aún debe solicitar el paquete completo. La transferencia se completa cuando el dispositivo envía un paquete más pequeño que el tamaño máximo (paquete corto).

En controladores más antiguos, los controladores de cliente pueden anular este comportamiento. En el miembro TransferFlags de la URB de transferencia de datos, el controlador del cliente debe configurar el indicador USBD_SHORT_TRANSFER_OK. Este indicador permite que el dispositivo envíe paquetes más pequeños que wMaxPacketSize.

En los controladores de host xHCI, USBD_SHORT_TRANSFER_OK ignora los puntos finales masivos y los puntos finales de interrupción. La transmisión de paquetes cortos en el controlador EHCI no provoca una condición de error.

En los controladores de host EHCI, USBD_SHORT_TRANSFER_OK se ignora para los puntos finales masivos y de interrupción.

En los controladores de host UHCI y OHCI, si USBD_SHORT_TRANSFER_OK no está configurado para transferencias masivas o de interrupción, las transferencias de paquetes cortos detendrán el punto final y devolverán el código de error de la transferencia.

Utilice paquetes cortos para delimitar transferencias de escritura

El controlador de pila del controlador USB impone límites diferentes al tamaño del paquete cuando se escribe en un dispositivo que cuando se lee desde el dispositivo. Algunos controladores de clientes deben transmitir con frecuencia pequeñas cantidades de datos de control para administrar sus dispositivos. En este caso, no resulta práctico limitar la transferencia de datos a paquetes de tamaño uniforme. Por lo tanto, durante la escritura de datos, la pila del controlador no asigna ningún significado especial a los paquetes que son más pequeños que el tamaño máximo del punto final. Esto permite que el controlador del cliente divida transferencias grandes al dispositivo en múltiples URB de tamaño menor o igual al máximo.

El conductor debe finalizar la transferencia con un paquete menor que el tamaño máximo, o utilizar un paquete de longitud cero para delimitar el final de la transferencia. La transferencia no se completa hasta que el controlador envía un paquete más pequeño que wMaxPacketSize. Si el tamaño de la transferencia es exactamente un múltiplo del valor máximo, el controlador debe enviar un paquete delimitado de longitud cero para finalizar explícitamente la transferencia.

Como lo requiere la especificación USB, el controlador del cliente es responsable de delimitar las transferencias de datos utilizando paquetes de longitud cero. La pila del controlador USB no genera automáticamente estos paquetes.

Separe las transferencias de datos USB utilizando paquetes más pequeños que wMaxPacketSize

Los controladores USB 2.0 y USB 1.1 compatibles deben transmitir un paquete de tamaño máximo (wMaxPacketSize) y luego finalizar la transmisión con un paquete menor que el tamaño máximo, o usar un paquete de longitud cero para delimitar el final de la transmisión. La transferencia no se completa hasta que el controlador envía un paquete más pequeño que wMaxPacketSize. Si el tamaño de la transferencia es exactamente un múltiplo del valor máximo, el controlador debe enviar un paquete delimitado de longitud cero para finalizar explícitamente la transferencia.

El controlador del dispositivo es responsable de delimitar las transferencias de datos utilizando paquetes de longitud cero según lo exige la especificación USB. La pila USB del sistema no genera automáticamente estos paquetes.