hd44780 0 29 ноября, 2015 Опубликовано 29 ноября, 2015 · Жалоба Привет всем. Вот уже пару недель (непостоянно конечно :rolleyes: ) пытаюсь завести USB мышку на USB хосте STM32F439. Использовал СТ-шные либы и частично переделанные библиотеки немца - http://mikrocontroller.bplaced.net/wordpress/?page_id=2991 Результаты весьма плачевные - проверял на 3-х мышах: 1. (какой-то Logitch) не опознаётся, обламывается где-то на этапе энумерации. Там я не копался, забил пока на неё. 2. Logitech RX250 (PS2+USB) и Terratech mouse опознаются с полпинка, но ведут себя как пьяный заяц на дороге - даже если мыша просто лежит на столе без движения, координаты как-то странно скачут, в подавляющем большинстве случаев в сторону увеличения, довольно быстро упираются в заданные мною максимумы, на чём всё и замирает. Кнопки вроде нормально отрабатывают, но с задержкой в несколько секунд - от одной до 10 (на глаз). Ну и ещё один общий вопрос. В HID ядре прописана некая частота опроса мыши (HID устройства): if ( HID_Machine.poll < HID_MIN_POLL) { HID_Machine.poll = HID_MIN_POLL; } // if .................... case HID_POLL: t= HCD_GetCurrentFrame ( pdev ) - HID_Machine.timer; if ( t >= HID_Machine.poll ) { // прошло больше HID_Machine.poll SOF-ов HID_Machine.state = HID_GET_DATA; } else if ( HCD_GetURB_State ( pdev, HID_Machine.hc_num_in ) == URB_DONE ) { // handle data once if ( start_toggle == 1 ) { start_toggle = 0; HID_Machine.cb->Decode ( HID_Machine.buff ); } // if } // if else if ( HCD_GetURB_State(pdev, HID_Machine.hc_num_in) == URB_STALL ) /* IN Endpoint Stalled */ { /* Issue Clear Feature on interrupt IN endpoint */ if ( USBH_ClrFeature ( pdev, pphost, HID_Machine.ep_addr, HID_Machine.hc_num_in ) == USBH_OK ) { /* Change state to issue next IN token */ HID_Machine.state = HID_GET_DATA; } } // if break; Зачем это сделано - понятно, но по факту это выполнимо только если проц выполняет один только USBH_Process(&USB_OTG_Core_dev, &USB_Host);в главном цикле. А если надо делать ещё что-то? Та же немецкая либа в чистом виде у меня не пошла именно из-за условия if ( t >= HID_Machine.poll ) Можно вызывать USBH_Process в каком-нибудь таймере, но я не знаю, насколько безопасно вызывать эту функцию в прерывании. У кого-то USB-мышки работают? Может кто-то помочь? Приложил свой проект, посмотрите кто может пожалуйста. На кокосе. Спасибо. PS. USB клавиатуру я не пробовал, хотя и не вырезал. STM32F4x9_HID.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 50 29 ноября, 2015 Опубликовано 29 ноября, 2015 · Жалоба У кого-то USB-мышки работают? Может кто-то помочь? Мышки работают, правда на контроллерах от фрискейла, стек несколько другой. Не увидел ничего похожего на парсер хид-репорта, или плохо смотрел? По скорости опроса - ставил асинхронный лист усб контроллера на 8 элементов, в каждый четный - QH - mouse, нечетный - QH - keyb. В результате частота опроса мышки и клавиатуры - 2мсек, вполне достаточно. По поводу опроса процедуры USBH_Process. Если память не изменяет с тех времен, когда работал с стм - чем чаще - тем лучше, но вполне сносно работает при 100 раз в сек.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 6 29 ноября, 2015 Опубликовано 29 ноября, 2015 · Жалоба Не увидел ничего похожего на парсер хид-репорта, или плохо смотрел? Угу, парсинг там, ИМХО, самое сложное и нетривиальное. Что для мыши, что для клавиатуры. Все остальное можно сделать и самому. Интересно, в используемых автором темы библиотеках (или в чем-то там еще готовом) реализован парсинг, или там просто голый хост ? Голый хост я делал на ARM9 без всяких библиотек. Лично сам каждому битику на шине кланялся. Но парсинг - это капец. Его я не делал. Благо, от меня этого не требовалось ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 29 ноября, 2015 Опубликовано 29 ноября, 2015 · Жалоба Не увидел ничего похожего на парсер хид-репорта, или плохо смотрел? Правильно не увидели: там используется boot interface, который специально введен для того, чтобы избежать разборок с дескрипторами в облегченном софте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 50 29 ноября, 2015 Опубликовано 29 ноября, 2015 (изменено) · Жалоба Правильно не увидели: там используется boot interface, который специально введен для того, чтобы избежать разборок с дескрипторами в облегченном софте. Только вот в большинстве радио и некоторых проводных мышах он не работает или работает некорректно, плюс колеса скроллинга и доп кнопки не работают вообще. Угу, парсинг там, ИМХО, самое сложное и нетривиальное. Что для мыши, что для клавиатуры. Ну, есть там есколько моментов с глобальными и локальными параметрами и вложенными коллекциями. Делал для клавы и мыши примерно 2 дня, чтоб работали основные параметры по кнопкам и 3м координатам с различной шириной от 8 до 12 бит на координату, остальное- за борт, так что процедура оказалась небольшой :laughing: ЗЫ. За основу взял функцию парсинга из усб либы от NXP. Изменено 29 ноября, 2015 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 29 ноября, 2015 Опубликовано 29 ноября, 2015 · Жалоба Только вот в большинстве радио и некоторых проводных мышах он не работает или работает некорректно, плюс колеса скроллинга и доп кнопки не работают вообще. Увы, он вообще не является обязательным к реализации :( Первая мышь у ТС явно из этой серии, раз обламывается на энумерации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 50 29 ноября, 2015 Опубликовано 29 ноября, 2015 · Жалоба Увы, он вообще не является обязательным к реализации :( Первая мышь у ТС явно из этой серии, раз обламывается на энумерации. Я так и понял, особенно прочитав что современные БИОСы уже работают в нативном режиме, вот и решил, что самому нужно тоже его использовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба Спасибо за ответы. С энумерацией понятно вроде. Где-то можно подсмотреть правильную реализацию? Ненормальные координаты выдаёт тоже из-за неверного парсинга репортов мыши? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 50 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба Спасибо за ответы. С энумерацией понятно вроде. Где-то можно подсмотреть правильную реализацию? Ненормальные координаты выдаёт тоже из-за неверного парсинга репортов мыши? Я уже упоминал - библиотека USB Lib от NXP. Про координаты, скорей всего так и есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба Ок. Буду смотреть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 1 декабря, 2015 Опубликовано 1 декабря, 2015 · Жалоба Скачал отсюда - https://www.lpcware.com/content/project/nxpusblib версию 0.98, там куча примеров, ткните плиз в нужный. MouseHost я там не заметил. Я в них запутался... Ещё и в контроллерах тех не ориентируюсь. И очень часто лезут ошибки типа: Fatal Error[Li001]: could not open file "B:\STM32\MyBoard\nxpUSB\nxpUSBlib v0.98b\libraries\BSP\LPC4357_MCB4300\Exe\ BSP_LPC4357_MCB4300.a" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 50 1 декабря, 2015 Опубликовано 1 декабря, 2015 · Жалоба Скачал отсюда - https://www.lpcware.com/content/project/nxpusblib версию 0.98, там куча примеров, ткните плиз в нужный. Я в них запутался... Ещё и в контроллерах тех не ориентируюсь. C:\nxpUSBlib v0.98b.zip\libraries\LPCUSBLib\Drivers\USB\Class\Common\HIDParser.c(.h) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 1 декабря, 2015 Опубликовано 1 декабря, 2015 · Жалоба ага. нашёл. спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 23 декабря, 2015 Опубликовано 23 декабря, 2015 · Жалоба Накурился я этой хрени ... голова кругом Report descriptor в ст-шных либах я нашёл, он у них там нормально вычитывается, но полностью игнорится. Также нашёл, где они включают мыше boot протокол. Я скинул этот дескриптор (мышь Logitech RX250) в комп через UART, руками расшифровал его: 05 01 - 05 01 - Usage page (Generic Desktop) 09 02 - 09 02 - Usage ID (Mouse) A1 01 - A1 01 - Collection (Application) 09 01 - 09 01 - Usage Page (Pointer) -- описатель - указатель a1 00 - A1 00 - Collection (Physical) 05 09 - 05 09 - Usage Page (Buttons) -- описатель - кнопка 19 01 - 19 01 - Usage Minimum (01) -- мин номер кнопки 29 08 - 29 08 - Usage Maximum (08) -- макс номер кнопки 15 00 - 15 00 - Logical Minimum (00) -- мин значение кнопки 25 01 - 25 01 - Logical Maximum (01) -- макс значение кнопки 95 08 - 95 08 - Report Count (08) -- кол-во полей в репорте = 8 75 01 - 75 01 - Report Size (01) -- размер поля в битах = 1 81 02 - 81 02 - Input (Constant) -- тип - ввод данных в хост 95 00 - 95 00 - Report Count (00) -- кол-во полей в репорте = 0 81 03 - 81 03 - Input (Constant) -- тип - ввод данных в хост 05 01 - 05 01 - Usage page (Generic Desktop) 09 30 - 09 30 - Usage (X) -- x координата 09 31 - 09 31 - Usage (Y) -- Y координата 09 38 - 09 38 - Usage ID (38) - wheel -- Описатель - колесо 15 81 - 15 81 - Logical Minimum (-127) -- мин значение 25 7F - 25 7F - Logical Maximum (127) -- макс значение 75 08 - 75 08 - Report Size (08) -- размер поля в битах = 8 95 03 - 95 03 - Report Count (03) -- кол-во полей в репорте = 3 81 06 - 81 02 - Input (Constant) -- Feature тип - ввод данных в хост 05 0C - 05 0C - Usage ??? 0a 38 02 - 0a 38 02 - Usage ???? data = 0x0238 95 01 - 95 01 - Report Count (01) -- кол-во полей в репорте = 1 81 06 - 81 06 - Input (Constant) -- Feature тип - ввод данных в хост c0 - C0 - End Collection c0 - C0 - End Collection Декодер дескриптора я честно слизал из NXP, подключил, но результаты пока нигде не использую. Я переключил мышь в Report режим (такая возможность там заложена, но там задаётся boot режим) А вот пример самого репорта: 00 01 ff 00 00 Размер 5 байт задан в дескрипторе конечной точки. Как правильно его расшифровать, используя дескриптор? Как я понимаю: 1-й байт - кнопки (почему-то 8 штук, хотя их там 3 ). Потом 3 байта координаты и колесо. Что такое 5-й байт, я не понял :( . В то же время есть какой-то непонятные usage: 05 0C - 05 0C - Usage ??? 0a 38 02 - 0a 38 02 - Usage ???? data = 0x0238 95 01 - 95 01 - Report Count (01) -- кол-во полей в репорте = 1 81 06 - 81 06 - Input (Constant) -- Feature тип - ввод данных в хост судя по всему оно одно другому соответствует. Вторую мышь завтра покажу. Там дескриптор совсем не такой. Второй вопрос. Скорее 2-я пачка вопросов: Репорты валят из мыши постоянно, практически непрерывным потоком. При этом там идут полные дубли, если мышь не двигается. На фига? Это какой-то ST-шный косяк или же это делается специально и я должен сам проверять, получил ли я дубль или что-то изменилось? И вдогонку: Судя по дескриптору, в вышеприведенном репорте байты 01 FF 00 - это X, Y, колесо. Т.е. по X там +1, по Y - -1, колесо - 0 (т.е. не двигалось). Но эти числа меняются как-то странно - такое ощущение, что слишком быстро. Но я даже в этом не уверен. Можно ли как-то управлять скоростью? В PS2 мышах есть команда задания скорости к каких-то там DPI. Здесь я такого не нашёл. Хотя в той же винде такая регулировка есть. Или это некая программная имитация? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 50 23 декабря, 2015 Опубликовано 23 декабря, 2015 (изменено) · Жалоба Накурился я этой хрени ... голова кругом wacko.gif За-то какой опыт будет! Я тоже отведал вдоволь этого нектара 19 01 - 19 01 - Usage Minimum (01) -- мин номер кнопки 29 08 - 29 08 - Usage Maximum (08) -- макс номер кнопки Да это 8 кнопок, т.е. отводится 1 байт в репорте. Это зарезервировано и не означает, что в мыши именно 8 кнопок. Отсчет с 0. Т.е. нажата кн 1 = 01 и т.д. 09 30 - 09 30 - Usage (X) -- x координата 09 31 - 09 31 - Usage (Y) -- Y координата 09 38 - 09 38 - Usage ID (38) - wheel -- Описатель - колесо 15 81 - 15 81 - Logical Minimum (-127) -- мин значение 25 7F - 25 7F - Logical Maximum (127) -- макс значение Тоже должно быть все понятно. След за кнопками идут 3 байта, относительный Х, Y, колесо. При перемещении вверх отн. Х будет отрицательный, вних положительный, причем абс. величина равна DPI мыши, поделенному на частоту передачи репорта. С колесом тоже самое. Что такое 5-й байт, я не понял sad.gif . В то же время есть какой-то непонятные usage: Это manufacturer definit репорт - не для использования. Вы еще радиомышки репортов не видели - там полное веселье Репорты валят из мыши постоянно, практически непрерывным потоком. При этом там идут полные дубли, если мышь не двигается. На фига? Че-то такого не встречал. Смотрите правильность реализации режима interrupt. При слишком низкой частоте опроса мыши контроллером данные буферизируются и потом выдаются хосту с задержкой. Время опроса лучше поставить 2мсек. В PS2 мышах есть команда задания скорости к каких-то там DPI. Здесь я такого не нашёл. Хотя в той же винде такая регулировка есть. Или это некая программная имитация? Выше об этом и написал. В простых мышах репорты только на выдачу, поэтому задавать скорость нельзя, только программно, драйвером. Это какой-то ST-шный косяк или же это делается специально и я должен сам проверять, получил ли я дубль или что-то изменилось? Скорей ваша ошибка драйвера. И на будущее, обязательно сделайте парсинг интерфейс-дескриптора, т.к. у радиомышей может быть по 2 или 3 интерфейса, причем первый - почти всегда клава, а мышь 2й или очень редко 3й, простой драйвер, как сейчас ваш, с ними работать не будет. Изменено 23 декабря, 2015 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться