Я разрабатываю стек устройств USB для микроконтроллера."Зачем?"ты можешь спросить?Ну, во-первых, драйвер производителя, который был моей отправной точкой, является полным мусором.Он не реагирует на перезагрузку USB надлежащим образом (все конечные точки должны были быть повторно инициализированы), он не реагирует на установочные пакеты надлежащим образом (когда пакет установки получен, конечная точка 0 должна быть повторно инициализирована), ион не учитывает различные дескрипторы в зависимости от того, работает ли устройство в режиме HighSpeed или FullSpeed.Кроме того, было не так уж и много, потому что контроллер довольно умен: конечные точки в основном управляются контроллером, а контроллер работает со связанными списками буферов DMA для связи с приложением.Вся логика ACK / NACK / NYET находится в самом контроллере, и он автоматически отправляет NACK / NYETs, если у него заканчиваются буферы DMA.
Но я все больше и больше расстраиваюсь.Устройство работает для меня (TM), но друзья сообщают, что оно не работает для них.Я медленно обнаруживаю все, что не так с драйвером производителя.Все, что нужно, это плохой порт USB или кабель, некоторые недостающие ACK от хоста, а драйвер / контроллер USB находится в плохом состоянии, и мое устройство больше не отвечает.Я могу вспомнить множество угловых случаев, о которых нужно позаботиться, но у меня нет никаких средств для их проверки.Похоже, проблема заключается в отсутствии пропущенных ACK для пакетов DATA, отправленных моим устройством.
Давайте рассмотрим два сценария:
Мое устройство получает пакет SETUP в конечной точке 0. Iответить пакетом данных.Хост не отправляет ACK.Вместо этого хост отправляет другой пакет SETUP (такой же, как и раньше).
Насколько я знаю, я должен отменить все ожидающие передачи в конечной точке 0 (пакет DATA не был подтвержден, поэтому онвсе еще в очереди буферов DMA).Затем я должен отправить новые пакеты данных.
Мое устройство отправляет данные на любую конечную точку (конечная точка 0, общая конечная точка и т. Д.).Хост не отправляет ACK.Вместо этого обнаружен сброс устройства USB.
Я должен отменить все ожидающие передачи на всех конечных точках (некоторые пакеты могут все еще находиться в очереди буферов DMA).Затем я жду обычного материала в конечной точке 0 (пакеты SETUP и т. Д.)
Я уже провел тесты главы 9 инструмента USB3CV в главе 9.Работает только на Windows.Он загружает специальный тестовый драйвер xHCI для моих контроллеров USB 3, а затем начинает тестирование моего USB-устройства.Мое устройство проходит все тесты.Тесты в основном загружают все дескрипторы, а затем проверяют их на согласованность.Мои дескрипторы исправлены.Все огни зеленые.Но это не то, что я ищу.
Как вы можете видеть выше, тщательное тестирование стека USB-устройств может быть выполнено только в том случае, если можно контролировать отдельные пакеты, отправляемые хост-контроллером.Возможно, стандартные контроллеры EHCI или xHCI даже не способны подавлять ACK, например.
Какой самый дешевый способ тщательного тестирования стека USB-устройств?Существуют ли специальные хост-контроллеры USB 2.0?Может быть, какое-нибудь решение на основе ПЛИС?Конечно, для управления хост-контроллером также потребуется специальное программное обеспечение.