Linux에서 장치가 할당할 수 있는 USB 대역폭을 제한하는 방법

Linux에서 장치가 할당할 수 있는 USB 대역폭을 제한하는 방법

Linux에서 USB 장치가 할당할 수 있는 대역폭의 양을 어떻게 제한합니까?

나는 동시에 실행하려고 하는 저렴한 USB 웹캠 두 개를 가지고 있습니다. 실행 결과 v4l2-ctl --list-formats-ext --device=/dev/videoN둘 다 30FPS와 15FPS 모두에서 여러 가지 비압축 해상도를 지원하는 것으로 나타났습니다.

그러나 160x120 해상도에서 15FPS로 캡처하도록 구성하더라도 여전히 480Mbps의 대역폭을 할당하므로 일반적으로 두 번째 웹캠은 물론 다른 USB 장치를 사용할 수 없습니다. 동일한 FPS/해상도에서 두 번째 웹캠에서 캡처를 시도하면 오류가 발생합니다.

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

이 오류를 인터넷에 검색하면 일반적으로 "당신은 SOL이군요. MJPG를 지원하는 카메라를 구입하시겠습니까?"와 같은 답변이 나옵니다.

그러나 이것은 전혀 말이 되지 않습니다.

비압축 160x120 RGB 캡처는 프레임당 160*120*3 = 57600바이트와 같습니다. 15FPS에서는 초당 최소 864000바이트의 대역폭이 필요합니다.0.864Mbps또는6.912메가비트)! 지원하는 USB2 허브가 있습니다.480메가비트/초. 한 번에 수십 개의 웹캠을 실행할 수 있을 만큼 충분한 대역폭이 있어야 하지만, 하나를 실행하면 USB 허브의 거의 480Mbit가 소모됩니다!

카메라는 160x120을 스트리밍하는 데 480Mbps가 필요하지 않지만 드라이버에게 그만큼을 할당하라고 지시하므로 OS 수준에서 드라이버가 특정 양을 할당하도록 강제할 수 있는 방법이 있습니까?

답변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;

관련 정보