Отладка USB HID Boot Protocol и Report Protocol: BIOS-режим клавиатуры, SetProtocol, report IDs и потерянные клавиши
Как отлаживать переключение USB HID Boot Protocol и Report Protocol, запросы SetProtocol, BIOS-режим клавиатуры, report IDs, потерянные клавиши и совместимость HID-прошивок.
USB HID-клавиатуры и мыши могут использовать Boot Protocol или Report Protocol. Пользователи ищут «HID Boot Protocol», «HID Report Protocol», «USB keyboard BIOS mode», «SetProtocol HID», «keyboard works in BIOS but not OS», «HID report ID missing keys», когда ввод работает в одной среде и ломается в другой.
Bus Scope полезен, потому что хост может слать HID-класс-запросы, которые меняют формат репортов устройства. Если прошивка игнорирует SetProtocol или шлёт неправильный формат репорта, клавиши могут пропадать, даже если устройство перечислилось корректно.
Boot Protocol
Boot Protocol — упрощённый HID-формат, используемый BIOS, UEFI, pre-boot-средами и простыми стеками. Он позволяет базовым клавиатурам и мышам работать до того, как доступен полный HID-парсер.
Симптомы с участием Boot Protocol:
- Клавиатура работает в BIOS, но ломается в ОС.
- Клавиатура работает в ОС, но не в boot-меню.
- Спецклавиши пропадают в pre-boot-режиме.
- Мышь работает только после загрузки ОС.
- Прошивка шлёт report IDs, когда boot-репорт их не ожидает.
Диагностический вопрос — какой протокол выбрал хост.
Report Protocol
Report Protocol использует HID report descriptor. Он поддерживает более богатые раскладки, report IDs, вендорные репорты, медиа-клавиши, датчики и составное поведение.
Если хост переключается на Report Protocol, а устройство продолжает слать Boot-репорты, ОС может неверно парсить ввод. Если хост запрашивает Boot Protocol, а устройство шлёт Report Protocol, BIOS может игнорировать репорты.
Запрос SetProtocol
HID-класс-запрос SetProtocol может переключать между Boot Protocol и Report Protocol для поддерживаемых устройств.
Что собрать:
- HID interface descriptor.
- Значения Boot subclass и protocol.
- Report descriptor.
- Запрос
SetProtocol. - Значение протокола, выбранное хостом.
- Байты interrupt IN-репорта до и после переключения.
Bus Scope может сделать эту последовательность видимой.
Report IDs и потерянные клавиши
Report Protocol может использовать report IDs. Boot Protocol часто ожидает фиксированный размер репорта без report ID-префикса.
Частые баги прошивки:
- Устройство включает report ID в Boot Protocol.
- Устройство опускает report ID в Report Protocol.
- Устройство меняет размер репорта, а дескриптор не совпадает.
- Медиа-клавиши только во вторичном репорте.
- NKRO-репорт отправляется до того, как хост его включил.
- Клавиатура шлёт вендорный репорт на endpoint клавиатуры.
Эти баги порождают запросы вроде «USB keyboard missing keys» и «HID report ID wrong».
Поведение BIOS и ОС
BIOS и UEFI обычно строже и проще, чем полные ОС. Клавиатура может отлично работать на Windows или Linux, но ломаться до загрузки.
Полезное сравнение:
- Захват во время pre-boot, если возможно с внешним анализатором.
- Захват после загрузки ОС.
- Сравнение поведения SetProtocol.
- Сравнение формата payload репорта.
- Проверка, сбрасывается ли устройство между средами.
Даже если pre-boot-захват сложен, OS-сторонние данные SetProtocol могут вскрыть предположения прошивки.
Чек-лист отладки
Используйте такой процесс:
- Захватите перечисление.
- Изучите HID interface subclass и protocol.
- Изучите HID report descriptor.
- Найдите запросы SetProtocol.
- Декодируйте выбранный протокол.
- Сравните interrupt IN-репорты до и после.
- Проверьте использование report ID.
- Проверьте обычные и медиа-клавиши.
- Сравните поведение в BIOS, bootloader, Windows и Linux.
- Сохраните дескриптор и байты репорта вместе.
Итоговый диагноз
Сбои HID Boot Protocol и Report Protocol — это проблемы negotiation формата репорта. Устройство может перечислиться корректно, но слать репорты в неверном протокольном формате.
Bus Scope помогает доказать, идут ли потерянные клавиши, проблемы ввода в BIOS или несовместимость HID от обработки SetProtocol, report IDs, несовпадения дескрипторов или форматирования репорта прошивкой.