Привет всем!
Возникло желание сделать HID-совместимое устройство на AVR с программно реализованным USB стеком. Тем более, что появилась отличная открытая и бесплатная реализация стека, написанная на C (кроме критического по времени куска - тот на асме) и документированная на предмет возможностей и ограничений. Буквально 5 дней назад вышла версия с поддержкой HID девайсов, сэкономив мне кучу времени.
В общем, примеры все работают. И свое устройство, в целом, тоже работает. Проблема лишь с написанием HID Report Descriptor для этой штуки. Это просто какое-то шаманство. Скажем, есть работающий report. В начале стоит левый LOGICAL MINIMUM (0), который не нужен, ибо перед первым же INPUT определены свои minimum и maximum. Стоит его убрать - всё, винды видят устройство с ошибкой.
Пример два: стоит в работающем дескрипторе REPORT ID (1). Всё работает. Убираю REPORT ID, уменьшаю на 1 количество байтов в возвращаемых данных (поскольку первый байт исчез), правлю длину дескриптора (так как два байта на REPORT ID тоже ушло). Компилирую, прошиваю, включаю - не работает.
Перерыл весь инет. Все ссылаются на HID Descriptor Tools с usb.org. Интерфейс там еще тот, но ладно. Проверка ошибок там бестолковая, конечно. Винды более критичны к этому. Но другого-то инструмента нет. Перечитал все доки, нигде нет конкретных указаний. В материалах с usb.org сплошные should или may.
Похоже, все изготовители софтверных USB-решений на Atmel (на другие решения я просто не смотрел) страдают точно также с этими дескрипторами, так как сплошь и рядом встречаются в коде dummy logical minimum и т.п. навороты.
Собственно, вопросы к уважаемой публике:
1) можно ли где-то посмотреть диагностику виндовского HID parser'а: что конкретно его не устраивает в предлагаемых ему дескрипторах?
2) есть ли какие-либо решения для создания дескрипторов наподобие HID Descriptor Tools, но дающие более-менее работоспособные под Windows варианты?
Не верится, что проблема кроется где-то в софтверной реализации. Ибо, сначала не мог поднять количество байтов выше 2-х в interrupt transfer. Думал, что бага в библиотеке. Но потом из рабочего кода взял другой дескриптор с 7-ю байтами - и тоже всё работает до первой правки.
В общем, мистика! Help!