Cómo limitar el ancho de banda USB que un dispositivo puede asignar en Linux

Cómo limitar el ancho de banda USB que un dispositivo puede asignar en Linux

¿Cómo se pone un límite a la cantidad de ancho de banda que un dispositivo USB puede asignar en Linux?

Tengo un par de cámaras web USB baratas que intento ejecutar simultáneamente. En ejecución v4l2-ctl --list-formats-ext --device=/dev/videoNse muestra que ambos admiten varias resoluciones sin comprimir a 30 y 15 FPS.

Sin embargo, incluso si configuro uno para capturar a 15 FPS con una resolución de 160x120, todavía asigna 480 Mbps de ancho de banda, lo que generalmente me impide usar otros dispositivos USB, y mucho menos la segunda cámara web. Intentar capturar desde la segunda cámara web con el mismo FPS/resolución produce el error:

libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device

Buscar este error en Google generalmente da como resultado respuestas como "eres SOL, ¿quizás compres una cámara que admita MJPG?".

Pero esto no tiene ningún sentido.

La captura de 160x120 RGB sin comprimir equivale a 160*120*3 = 57600 bytes por cuadro. A 15 FPS, eso requiere al menos 864.000 bytes por segundo de ancho de banda (es decir, la friolera de 864.000 bytes por segundo).0,864Mbpso6.912Mbps)! Tengo un concentrador USB2, que admite480Mbps. Debería tener suficiente ancho de banda para ejecutar docenas de estas cámaras web a la vez, pero ejecutar una sola consume casi los 480 Mbits de mi concentrador USB.

Dado que la cámara no necesita 480 Mbps para transmitir 160x120, pero le dice al controlador que asigne esa cantidad, ¿hay alguna forma, a nivel del sistema operativo, de obligar al controlador a asignar una cierta cantidad?

Respuesta1

Este chico proporcionauna solucióneso parece funcionar para algunas personas. En mi caso, lo probé y no cambió nada, pero depende mucho del hardware.

El módulo del kernel uvcvideo se puede configurar para ignorar el ancho de banda solicitado y calcular el ancho de banda correcto. Intentar:

sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128

Esto se restablecerá cada reinicio. Si esto funciona, cree el siguiente archivo:

sudo vi /etc/modprobe.d/uvcvideo.conf 

que contiene la línea:

options uvcvideo quirks=128

De hecho, enesta páginadicen que esto puede no funcionar siempre e incluso dan la opción de cambiar el código en la función uvc_init_video() del driver:

/* Isochronous endpoint, select the alternate setting. */
bandwidth = stream->ctrl.dwMaxPayloadTransferSize;

información relacionada