Отладка USB Device Qualifier и Other Speed Configuration: проблемы дескрипторов High-Speed vs Full-Speed
Как отлаживать дескриптор USB Device Qualifier, Other Speed Configuration, отличия перечисления между High-Speed и Full-Speed и сбои из-за несовпадения дескрипторов.
USB-устройства, которые поддерживают и full-speed, и high-speed, должны описывать, как они ведут себя на другой скорости. Пользователи ищут «USB Device Qualifier descriptor», «Other Speed Configuration descriptor», «high speed device enumerates as full speed», «USB descriptor mismatch», «device works on USB 2.0 but fails on hub», когда один и тот же продукт ведёт себя по-разному в зависимости от порта, кабеля, концентратора или хост-контроллера.
Bus Scope полезен тем, что диагностика требует сравнения запросов дескрипторов, реальной скорости, размеров пакетов конечной точки, configuration descriptors и решений хоста во время перечисления.
Что такое Device Qualifier
Device Qualifier descriptor описывает, как high-speed-устройство работало бы на другой скорости. Если устройство сейчас в high-speed, qualifier рассказывает хосту о full-speed-поведении. Если сейчас в full-speed, он может описать high-speed-возможности.
Важные поля:
- Версия USB.
- Device class.
- Subclass.
- Protocol.
- Max packet size для endpoint 0.
- Число конфигураций.
Если этот дескриптор отсутствует, искажён или несогласован, перечисление может пройти на одном хосте и упасть на другом.
Other Speed Configuration
Other Speed Configuration descriptor описывает детали конфигурации на другой скорости. Размеры пакетов конечных точек, интервалы поллинга и предположения о полосе могут отличаться.
Типичные паттерны сбоев:
- Full-speed-конфигурация заявляет размеры конечных точек, осмысленные только в high-speed.
- High-speed-конфигурация забывает интерфейс.
- Число other-speed-дескрипторов не совпадает с реальной конфигурацией.
- Прошивка ставит STALL, когда хост ждёт дескриптор.
- Хост принимает устройство, но привязывает не тот драйвер.
- Устройство работает через один концентратор и не работает через другой.
Эти проблемы трудно увидеть по логам приложения.
High-speed-устройство перечисляется как full-speed
Частый кейс поддержки — «USB high-speed device detected as full-speed». Причины: качество кабеля, топология концентратора, целостность сигнала, chirp-поведение прошивки, электрический дизайн или проблемы дескрипторов.
Пакетные данные помогают разделить слои:
- Произошли ли high-speed-переговоры?
- Запросил ли хост Device Qualifier?
- Вернуло ли устройство валидные байты дескриптора?
- Совпали ли endpoint descriptors с выбранной скоростью?
- Сбросил и повторил ли хост?
- Пере-нумеровалось ли устройство позже на другой скорости?
Если трасса показывает, что устройство не достигло high-speed, фикс дескрипторов может быть недостаточен. Если трасса показывает high-speed-перечисление, но невалидные other-speed-дескрипторы — прошивка под бо́льшим подозрением.
Несовпадение размера пакета конечной точки между скоростями
Endpoint descriptors могут отличаться между full-speed и high-speed-конфигурациями. Bulk-конечная точка может быть 64 байта на full-speed и 512 байт на high-speed.
Симптомы сбоя:
- Передачи падают только на high-speed-портах.
- Передачи падают только через старый full-speed-концентратор.
- Размер буфера прошивки подходит одной скорости, а дескриптор заявляет другую.
- Хост-драйвер шлёт бо́льшие передачи, чем ожидала прошивка.
- Устройство возвращает короткие пакеты на неожиданных границах.
Это напрямую смыкается с отладкой wMaxPacketSize.
Составные устройства
Составные устройства делают other-speed-дескрипторы ещё хрупче. Устройство может выставить HID, CDC, вендорные, mass storage и интерфейсы обновления прошивки. Other-speed-дерево должно оставаться согласованным.
Баги:
- Отсутствует Interface Association Descriptor на одной скорости.
- Разные номера интерфейсов между скоростями.
- Адреса конечных точек меняются неожиданно.
- У одного интерфейса валидный other-speed-дескриптор, у другого нет.
- Windows привязывает другой драйвер после пере-нумерации.
Для продуктов с кастомной прошивкой это частый copy-paste-сбой.
STALL может быть корректным или подозрительным
Некоторые запросы дескрипторов могут законно ставить stall на устройствах, которые не поддерживают запрашиваемую возможность. Но для high-speed-устройств повторяющиеся сбои вокруг Device Qualifier или Other Speed Configuration заслуживают внимания.
В отчёте сохраните:
- Request type.
- Descriptor type.
wValue.wIndex.wLength.- Возвращённые данные.
- STALL или тайм-аут.
Bus Scope должен делать эти управляющие передачи читабельными, а не заставлять инженера декодировать сырые байты вручную.
Чек-лист отладки
Используйте такой сценарий:
- Захватите с момента физического подключения.
- Зафиксируйте реальную согласованную скорость.
- Изучите Device Descriptor.
- Изучите Device Qualifier descriptor.
- Изучите Other Speed Configuration descriptor.
- Сравните размеры пакетов конечных точек между скоростями.
- Проверьте номера интерфейсов и адреса конечных точек.
- Проверьте прямой порт, концентратор и путь через USB-C-док.
- Сравните поведение перечисления в Windows и Linux.
- Сохраните сбои запросов дескрипторов и повторы.
Итоговый диагноз
Баги USB Device Qualifier и Other Speed Configuration — это проблемы согласованности дескрипторов. Они объясняют, почему устройство может работать на одной скорости и падать на другой или вести себя по-разному за концентраторами и доками.
Bus Scope помогает захватить точные доказательства перечисления: запросы дескрипторов, байты other-speed, размеры конечных точек, stall, reset и последствия для привязки драйверов.