Подключаю свой самодельный Full Speed HID к Linux. У него имеются 3 вида репортов SetFeature, GetFeature и Input. SetFeature и GetFeature через шлются контрольный канал (адрес EP = 0) и работают без проблем. Даже лучше чем под Win т.к. позволяют задавать таймаут, а под Win таймаут =5 секундам и изменить невозможно. Input Report шлётся от устройства в комп через EP, работающую в режиме Interrupt In с интервалом опроса 2 милисекунды (так у меня в дескрипторе EP). И с ним проблемма.
В Win всё корректно - после подключения моего устройства хост как и положено шлёт запросы 1 раз за 2 кадра (2 милисекунды). Причём даже если никто это устройство не использует. И буферизирует посланные мной Input репорты. Причём кол-во буферов можно задавать.
Linux по своей инициативе вообще не шлёт никаких запросов. Если подключиться к устройству, то можно слать запросы (ReadFile). Но ни о каких 2 милисекундах и речи нет. Выполняешь ReadFile - запрос посылается. И буферизации никакой нет. Из-за этого Input репорты теряются. Особенно почему-то при выводе на экран. Т.е. какое-то время не опрашивали Interrupt In EP (переключились на другую задачу) - буфер в устройстве переполняется - данные теряются.
Выходов из этой ситуации 2.
Первый (лучший): сказать Linux чтоб он опрашивал Interrupt In EP (как и написано в её дескрипторе) и буферизировал прочитанные данные (как Win). Но как это сделать я не знаю (невозможно?).
Второй (вынужденный): повесить на таймер программку, которая будет запускаться 1 раз в 2 милисекунды (реал тайм!). И будет читать Interrupt In EP (ReadFile) и буферизировать прочитанное. Как это сделать я тоже не знаю, но наверное смогу разобраться.
А может ещё какие способы имеются?