[Как сделать USB HS пригодным для RT коммуникации] Набор идей. 1. USB хост, к счастью, реализует только спецификации USB достаточно низкого уровня. Вся остальная кривизна USB - программная. Но она не обязательна - можно взять USB как физический интерфейс и построить свой стек.
2. Современный USB хост программируется через дескрипторы, которые описывают что в каждом фрейме и микрофрейме ему надо сделать. Прерывания он генерит кратно длительности микрофрейма - 125 мкс.
3. Соответственно, нет проблем запрограммировать все жестко на HS, адреса устройств задать статично, и гнать Bulk пакеты с запросами на передачу в Endpoint и на прием из Endpoint.
4. Протокол сделать на датаграммах фиксированной длины, 128-512 байт.
5. В микрофрейме оставить часть полосы для повторных Bulk пакетов - если что-то передалось с ошибкой.
6. Очереди в памяти со стороны хоста и со стороны device. DMA таскает данные для пакетов. И есть таблица, куда складываются результаты передачи. Потом драйвер проверяет результат и помечает успешно переданные пакеты как пустые, и непереданные включает в список на передачу в следующий раз.
7. USB HS PHY ULPI имеет простой интерфейс - 60 МГц 8 бит данных + клок + 3 управляющих сигнала. Стоит от $1 ind.
8. Контроллеры USB device на несколько endpoint синтезируются в FPGA на 1.5...2.5k LE. Но нам нужен толко один тип пакетов, никаких прерываний, управления и прочего, и если сразу складывать принятое и отдавать передаваемое из двухпортовой памяти в FPGA, то контроллер можно ужать до 1к LE - моя наглая оценка.
9. Значит, даже взяв самый дешевый Cyclone 10 LP 10CL006YE144I7G 30 блоков по 9 кбит 88 IO $9 я могу построить "SPI коммутатор" для периферийных процов. Для управления - внешний MCU с быстрой и "малолапой" параллельной шиной. типа EPMP. SPI - 4 пина. ULPI - 13. EPMP пусть 20 в мультиплексированном режиме 16 бит. Получится что-то типа 12 "SPI сопроцессоров", а они нынче мощные и дешевые. 10CL010YE144I7G $12 - это уже 46 блоков памяти. И те же 88IO, дальше IO падает.
11. Можно использовать USB HUB 7 портов USB2517I - $5. Но программного геморроя будет чуть поболее.
12. Описанную идею можно перенести и на ПК Linux. Берем стандартный драйвер для EHCI USB Host, и переписываем его под предложенную идеологию (для системы он исчезает). Берем Xenomai
http://caxapa.ru/787424.html и получаем низколатентную обработку в user space.
13. USB есть на всех ПК, и в очень и очень многих микроконтроллерах.
14. USB - это всего 2 пина! Что очень критично, если мы берем мощный MCU типа STM32H7 в TQFP144.
15. в очень и очень многих iMX, SAM5D2 и прочем по 2 USB Host, так что взяв FPGA помощнее, можно и дублирование устроить - для парирования USB глюков.
Критика?