Compartir a través de


Asignación de ancho de banda USB

En este artículo se proporcionan instrucciones sobre la administración cuidadosa del ancho de banda USB. Es responsabilidad de cada controlador de cliente USB minimizar el ancho de banda USB que usa y devolver el ancho de banda sin usar al grupo de ancho de banda libre lo más rápido posible.

¿Por qué mi controlador USB se queda sin errores de ancho de banda?

La competencia por el ancho de banda en el bus USB procede de varios orígenes, tanto de hardware como de software. Es difícil predecir exactamente cuánto ancho de banda está disponible para un controlador de cliente USB. El controlador de host USB requiere una cierta cantidad de ancho de banda para sus operaciones. La cantidad necesaria depende de si el controlador es de alta velocidad o no. Varía de sistema a sistema. Los concentradores USB que funcionan a alta velocidad a veces deben traducir transacciones entre puertos ascendentes de alta velocidad y dispositivos de baja velocidad de baja velocidad, y este proceso de traducción consume ancho de banda. Pero si se requiere ancho de banda para la traducción de transacciones depende del tipo de dispositivos conectados y de la topología del árbol de dispositivos.

La tensión más grave en el recurso de ancho de banda suele provener de controladores de cliente USB que monopolion el ancho de banda. El sistema asigna ancho de banda por primera vez. Si el primer controlador USB cargado solicita todo el ancho de banda disponible, un controlador USB que se carga más adelante no permite ningún ancho de banda para su dispositivo. El sistema no puede configurar el dispositivo y no puede enumerarlo. Puesto que no es evidente por qué se produjo un error en la enumeración, el usuario tiene mala experiencia.

En ocasiones, un controlador cliente agota el ancho de banda disponible con una transferencia de interrupción de alta velocidad. Pero el caso más común, hasta ahora, es el de un controlador de cliente que asigna demasiado ancho de banda para una transferencia isócrónica y, a continuación, no puede liberar el ancho de banda de forma oportuna. El sistema reserva ancho de banda asignado hasta que el controlador que lo solicitó cierra su punto de conexión (abriendo otro punto de conexión) o el dispositivo para el que se asignó el ancho de banda se quita. 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 los dispositivos de transferencia masiva depende de la cantidad de ancho de banda asignado a los dispositivos que realizan transferencias periódicas (isócrónicas e interrumpidas).

La especificación USB 2.0 requiere que un dispositivo isócrono tenga puntos de conexión 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 un controlador de función abra una interfaz no predeterminada, lo que ayuda a evitar errores de enumeración causados por solicitudes de ancho de banda excesivas durante la configuración del dispositivo. No impide que un controlador cliente asigne demasiado ancho de banda después de configurar su dispositivo, lo que impide que otros dispositivos funcionen correctamente.

La clave para la administración adecuada del ancho de banda es que todos los dispositivos USB del sistema que realiza transferencias isócrónicas deben ofrecer varias opciones alternativas (Alt) para cada interfaz que contenga puntos de conexión isócronos y los controladores de cliente deben hacer un uso sensato de estas opciones alt. Los controladores de cliente deben comenzar solicitando la configuración de interfaz con el ancho de banda más alto. Si se produce un error en la solicitud, el controlador cliente debe solicitar la configuración de la interfaz con anchos de banda más pequeños y pequeños hasta que una solicitud se realice correctamente.

Por ejemplo, supongamos que un dispositivo webcam tiene las siguientes interfaces:

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

Punto de conexión isócrono 1: tamaño máximo de paquete = 0 bytes

Punto de conexión isócrono 2: tamaño máximo de paquete = 0 bytes

Configuración 1 de la interfaz 0 alt

Punto de conexión isócrono 1: tamaño máximo de paquete = 256 bytes

Punto de conexión isócrono 2: tamaño máximo de paquete = 256 bytes

Configuración 2 de la interfaz 0 Alt

Punto de conexión isócrono 1: tamaño máximo de paquete = 512 bytes

Punto de conexión isócrono 2: tamaño máximo de paquete = 512 bytes

El controlador de la cámara web configura la cámara web para usar la configuración de interfaz predeterminada cuando se inicializa. La configuración predeterminada no tiene ancho de banda isócrono, por lo que el uso de la configuración predeterminada durante la inicialización evita el peligro de que la cámara web no pueda enumerar, debido a una solicitud errónea para el ancho de banda isócrono.

Cuando el controlador cliente está listo para realizar una transferencia isócrónica, debe intentar usar la configuración Alt 2, ya que el valor alt 2 tiene el tamaño de paquete más grande. Si se produce un error en la solicitud, el controlador puede realizar un segundo intento con la opción Alt 1. Dado que la configuración alt 1 requiere menos ancho de banda, esta solicitud puede realizarse correctamente, aunque se produzca un error en la primera solicitud. Varias opciones alt permiten al controlador realizar varios intentos antes de renunciar.

Una vez inactiva la cámara web, puede devolver el ancho de banda asignado al grupo de ancho de banda libre seleccionando la configuración predeterminada una vez más.

Los usuarios pueden ver cuánto ancho de banda ha asignado un controlador USB comprobando las propiedades del controlador en Windows Administrador de dispositivos. Seleccione las propiedades del controlador y, a continuación, busque en la pestaña Opciones avanzadas. Esta lectura no indica cuánto ancho de banda han asignado los concentradores USB para la traducción de transacciones.

La característica Administrador de dispositivos que informa del uso de ancho de banda de un controlador USB no funciona correctamente en Windows XP.

Tamaños de paquete y transferencia USB

En este artículo se describen los tamaños de transferencia USB permitidos en varias versiones del sistema operativo Windows.

Tamaño máximo de transferencia

El tamaño máximo de transferencia especifica límites codificados de forma rígida en la pila del controlador USB. Es posible que los tamaños de transferencia por debajo de estos límites produzcan un error debido a las limitaciones de los recursos del sistema. Para evitar estos tipos de errores y garantizar la compatibilidad en todas las versiones de Windows, evite el uso de tamaños de transferencia grandes para transferencias USB.

Nota:

El miembro MaximumTransferSize de la estructura USBD_PIPE_INFORMATION está obsoleto. La pila del controlador USB omite 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. Un controlador de cliente puede establecer un valor más pequeño al configurar el dispositivo. En el caso de un dispositivo compuesto, el controlador de cliente para cada función solo puede cambiar MaximumTransferSize para canalizaciones en la configuración de interfaz no predeterminada.

Los tamaños de transferencia USB están sujetos a los siguientes límites:

Transferencia de canalización Windows 8.1, Windows 8 Windows 7, Windows Vista Windows XP, Windows Server 2003 Windows 2000
Control 64K para SuperSpeed y alta velocidad (xHCI)

4K para velocidad completa y baja (xHCI, EHCI, UHCI, OHCI)

Para UHCI, 4K en el punto de conexión predeterminado; 64K en canalizaciones de control no predeterminadas
64K para alta velocidad (EHCI)

4K para velocidad completa y baja (EHCI, UHCI, OHCI)

Para UHCI, 4K en el punto de conexión predeterminado; 64K en canalizaciones de control no predeterminadas (UHCI)
64K para alta velocidad (EHCI)

4K para velocidad completa y baja (EHCI, UHCI, OHCI)

Para UHCI, 4K en el punto de conexión predeterminado; 64K en canalizaciones de control no predeterminadas (UHCI)
4K en el punto de conexión predeterminado; 64K en canalizaciones de control no predeterminadas (OHCI)
Interrupción 4 MB para SuperSpeed, alta, completa y baja velocidad (xHCI, EHCI, UHCI, OHCI) 4 MB para alta, completa y baja velocidad (EHCI, UHCI, OHCI) Sin límite Undetermined(OHCI)
En bloque 32 MB para SuperSpeed (xHCI)

4 MB para alta y velocidad completa (xHCI)

4 MB para alta y completa velocidad (EHCI y UHCI)

Velocidad completa de 256K (OHCI)
4 MB para alta y completa velocidad (EHCI, UHCI)

256K para velocidad completa (OHCI)
3 MB para alta y velocidad completa (EHCI)

Sin determinar (UHCI)

256K para velocidad completa (OHCI)
Undetermined(OHCI)
Isócrono 1024 * wBytesPerInterval para SuperSpeed (xHCI)
(consulte USB_SUPERSPEED_ENDPOINT_COMPANION_DESCRIPTOR)

1024 * MaximumPacketSize para alta velocidad (xHCI, EHCI)

256 * MaximumPacketSize para velocidad completa (xHCI, EHCI)

64K para velocidad completa (UHCI, OHCI)
1024 * MaximumPacketSize para alta velocidad (EHCI)

256 * MaximumPacketSize para velocidad completa (EHCI)

64K para velocidad completa (UHCI, OHCI)
1024 * MaximumPacketSize para alta velocidad (EHCI)

256 * MaximumPacketSize para velocidad completa (EHCI)

64K para velocidad completa (UHCI, OHCI)
64K para velocidad completa (OHCI)

Restringir el tamaño de transferencia con MaximumTransferSize no afecta directamente a la cantidad de ancho de banda que consume un dispositivo. El controlador cliente debe cambiar la configuración de la interfaz o restringir 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 del paquete se define mediante el campo wMaxPacketSize del descriptor de punto de conexión. Un controlador cliente puede regular el tamaño del paquete USB en una solicitud de interfaz de selección al dispositivo. Cambiar este valor no cambia wMaxPacketSize en el dispositivo.

En el URB de la solicitud es una estructura USBD_PIPE_INFORMATION para la canalización. En esa estructura,

  • Modifique el miembro MaximumPacketSize de la estructura USBD_PIPE_INFORMATION . Establézcalo en un valor menor o igual que el valor de wMaxPacketSize definido en el firmware del dispositivo para la configuración de la interfaz actual.
  • Establezca la marca USBD_PF_CHANGE_MAX_PACKET en la estructura de USBD_PIPE_INFORMATION miembro PipeFlags.

Para obtener información sobre cómo seleccionar una configuración de interfaz, vea Cómo seleccionar una configuración para un dispositivo USB.

Restricción de tamaño máximo de paquete en búferes de transferencia de lectura

Cuando un controlador cliente realiza una solicitud de lectura, el búfer de transferencia debe ser un múltiplo del tamaño máximo del paquete. Incluso cuando el controlador espera datos inferiores al tamaño máximo del paquete, debe solicitar el paquete completo. Cuando el dispositivo envía un paquete menor que el tamaño máximo (un paquete corto), es una indicación de que la transferencia está completa.

En controladores anteriores, el controlador cliente puede invalidar el comportamiento. En el miembro TransferFlags de la URB de transferencia de datos, el controlador cliente debe establecer la marca USBD_SHORT_TRANSFER_OK. Esa marca permite que el dispositivo envíe paquetes más pequeños que wMaxPacketSize.

En los controladores de host xHCI, USBD_SHORT_TRANSFER_OK omite para los puntos de conexión masivos e interrupciones. La transferencia de paquetes cortos en los controladores EHCI no produce una condición de error.

En los controladores de host de EHCI, USBD_SHORT_TRANSFER_OK se omite para los puntos de conexión masivos e interrupciones.

En los controladores de host UHCI y OHCI, si no se establece USBD_SHORT_TRANSFER_OK para una transferencia masiva o de interrupción, una transferencia de paquetes corta detiene el punto de conexión y se devuelve un código de error para la transferencia.

Delimitación de transferencias de escritura con paquetes cortos

El controlador de pila de controladores USB no impone las mismas restricciones en el tamaño del paquete, al escribir en el dispositivo, que impone al leer desde el dispositivo. Algunos controladores de cliente deben realizar transmisiones frecuentes de pequeñas cantidades de datos de control para administrar sus dispositivos. No es práctico restringir las transmisiones de datos a paquetes de tamaño uniforme en tales casos. Por lo tanto, la pila del controlador no asigna ninguna importancia especial a los paquetes de tamaño inferior al tamaño máximo del punto de conexión durante las escrituras de datos. Esto permite que un controlador de cliente interrumpa una transferencia grande al dispositivo en varias direcciones URL de cualquier tamaño menor o igual que el máximo.

El controlador debe finalizar la transmisión con un paquete de menos de tamaño máximo o delimitar el final de la transmisión con un paquete de longitud cero. La transmisión no se completa hasta que el controlador envía un paquete menor que wMaxPacketSize. Si el tamaño de transferencia es un múltiplo exacto del máximo, el controlador debe enviar un paquete delimitador de longitud cero para finalizar explícitamente la transferencia.

El controlador cliente es responsable de delimitar la transmisión de datos con paquetes de longitud cero, según lo requiera la especificación USB. La pila de controladores USB no genera estos paquetes automáticamente.

Delimitación de transferencias de datos USB con paquetes menores que wMaxPacketSize

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

El controlador de dispositivo es responsable de delimitar la transmisión de datos con paquetes de longitud cero, según lo requiera la especificación USB. La pila USB del sistema no genera estos paquetes automáticamente.