Как ограничить пропускную способность USB-соединения, которую может выделить устройство в Linux

Как ограничить пропускную способность USB-соединения, которую может выделить устройство в Linux

Как ограничить пропускную способность, которую может выделить USB-устройство в Linux?

У меня есть пара дешевых USB-веб-камер, которые я пытаюсь запустить одновременно. Запуск v4l2-ctl --list-formats-ext --device=/dev/videoNпоказывает, что они обе поддерживают несколько несжатых разрешений как на 30, так и на 15 FPS.

Однако даже если я настрою одну на захват 15 FPS при разрешении 160x120, она все равно выделяет 480 Мбит/с полосы пропускания, что обычно не позволяет мне использовать какие-либо другие USB-устройства, не говоря уже о второй веб-камере. Попытка захвата со второй веб-камеры с тем же FPS/разрешением приводит к ошибке:

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

Поиск этой ошибки в Google обычно приводит к ответам вроде: «Вы SOL, может быть, купить камеру, которая поддерживает MJPG?».

Но это совершенно бессмысленно.

Захват несжатого 160x120 RGB равен 160*120*3 = 57600 байт на кадр. При 15 FPS это требует не менее 864000 байт в секунду пропускной способности (т.е. колоссальный0,864 Мбит/сили6.912 Мбит)! У меня есть USB2-концентратор, который поддерживает480 Мбит/с. У меня должно быть достаточно пропускной способности для одновременной работы десятков таких веб-камер, однако работа одной из них потребляет почти все 480 Мбит моего USB-концентратора!

Поскольку камере не требуется 480 Мбит/с для потоковой передачи 160x120, но она сообщает драйверу о необходимости выделения именно такого объема, есть ли способ на уровне ОС заставить драйвер выделить определенный объем?

решение1

Этот парень обеспечиваетрешениеЭто, кажется, работает для некоторых людей. В моем случае я попробовал это, и это ничего не изменило, но это очень зависит от оборудования.

Модуль ядра uvcvideo можно настроить так, чтобы он игнорировал запрошенную полосу пропускания и рассчитывал правильную полосу пропускания. Попробуйте:

sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128

Это будет сбрасываться при каждой перезагрузке. Если это работает, создайте следующий файл:

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

содержащий строку:

options uvcvideo quirks=128

Действительно, вэта страницаони говорят, что это не всегда может работать, и даже дают возможность изменить код в функции uvc_init_video() драйвера:

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

Связанный контент