Программирую устройство - кастомную видеокамеру USB 2.0.
Поток - некомпрессированный
разрешение 1280*480
цветовое пространство YUYV ( 16 бит на пиксель)
Написал тест, который работает с максимальной частотой
отвечаю на каждый изохронный маркер
Получается максимальная частота кадров - 6.5 кадров в секунду
на 1 кадр приходится 1228800 байт ~ 1.17 мегабайтт
соответственно, достигаемая полоса 8 мегабайт в секунду (64 мегабита).
При этом, полоса пропускания USB HS - 480 мегабит в секунду.
Есть запас.
Видео передаётся по изохронному протоколу.
Тактирование один пакет каждые 125 микросекунд
получается 8 тыс килобайтных пакетов в секунду, что соответствует измерениям
Однако. В документации нарыл, что есть поле в дескрипторе,
которое говорит хосту отправлять дополнительные изохронные маркеры.
wMaxPacketSize биты 11..12
То есть, в один кадр USB протокола можно передать до 3-х изохронных пакетов
Флаг выставил.
lsusb -v показывает размер кадра 3x 1024
А фактически скорость передачи не изменилась.
Кто сталкивался с таким эффектом?
Может есть ещё какие-то биты, которые я не учитываю?
Я пробовал из контроллера отправлять в ендпоинт буферы размера 3072 байта
это не помогло. Видео вообще не пошло.
Когда просниффил - оказалось, что контроллер отрезает всё, что больше 1024 байт
Я чего-то концептуального недопонял?
Я работаю на STM32F407/Может быть у него, просто, USB контроллер с ошибкой?
yslav, ткну пальцем в небо- размер стека и кучи как то влияют на изохронную передачу?
Логи пробовали снимать по самому протоколу (снифать пакеты usb) - там можно как то проследить переключение с usb 1 на usb 2 и с usb half на usb full ?
У вас задействовано что-то кроме usb шины? данные для отправки берете с какого источника(камеры)? Возможно что часть кода ответственная за снятие изображение с видеодатчика отъедает пропускную спососбность usb?
Олег, Спасибо за наводку. Почитал документацию повнимательнее.
Раньше не придавал этому значение.
Есть 4 типа пакетов данных DATA0, DATA1, DATA2 и DATAM
Как раз в этом случае они и используется
Хост присылает маркер DATAIN
В ответ устройство отправляет либо DATA0 либо последовательность:
DATA1, DATA0 - при настройке 2 пакета на микрофрейм
DATA2, DATA1, DATA0 - при настройке 3 пакета на микрофрейм
Осталось только понять как заставить STM32F407 посылать такие последовательности
вместо простых DATA0.
И вообще, умеет ли такое делать USB контроллер в STM32