|
|
  |
STM32F439 + USB мышь, Не работает |
|
|
|
Nov 29 2015, 16:14
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Привет всем. Вот уже пару недель (непостоянно конечно  ) пытаюсь завести USB мышку на USB хосте STM32F439. Использовал СТ-шные либы и частично переделанные библиотеки немца - http://mikrocontroller.bplaced.net/wordpress/?page_id=2991Результаты весьма плачевные - проверял на 3-х мышах: 1. (какой-то Logitch) не опознаётся, обламывается где-то на этапе энумерации. Там я не копался, забил пока на неё. 2. Logitech RX250 (PS2+USB) и Terratech mouse опознаются с полпинка, но ведут себя как пьяный заяц на дороге - даже если мыша просто лежит на столе без движения, координаты как-то странно скачут, в подавляющем большинстве случаев в сторону увеличения, довольно быстро упираются в заданные мною максимумы, на чём всё и замирает. Кнопки вроде нормально отрабатывают, но с задержкой в несколько секунд - от одной до 10 (на глаз). Ну и ещё один общий вопрос. В HID ядре прописана некая частота опроса мыши (HID устройства): CODE 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 клавиатуру я не пробовал, хотя и не вырезал.
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Nov 29 2015, 17:00
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(hd44780 @ Nov 29 2015, 19:14)  У кого-то USB-мышки работают? Может кто-то помочь? Мышки работают, правда на контроллерах от фрискейла, стек несколько другой. Не увидел ничего похожего на парсер хид-репорта, или плохо смотрел? По скорости опроса - ставил асинхронный лист усб контроллера на 8 элементов, в каждый четный - QH - mouse, нечетный - QH - keyb. В результате частота опроса мышки и клавиатуры - 2мсек, вполне достаточно. По поводу опроса процедуры USBH_Process. Если память не изменяет с тех времен, когда работал с стм - чем чаще - тем лучше, но вполне сносно работает при 100 раз в сек..
|
|
|
|
|
Nov 29 2015, 17:24
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(mantech @ Nov 29 2015, 21:00)  Не увидел ничего похожего на парсер хид-репорта, или плохо смотрел? Угу, парсинг там, ИМХО, самое сложное и нетривиальное. Что для мыши, что для клавиатуры. Все остальное можно сделать и самому. Интересно, в используемых автором темы библиотеках (или в чем-то там еще готовом) реализован парсинг, или там просто голый хост ? Голый хост я делал на ARM9 без всяких библиотек. Лично сам каждому битику на шине кланялся. Но парсинг - это капец. Его я не делал. Благо, от меня этого не требовалось ...
|
|
|
|
|
Nov 29 2015, 18:11
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(aaarrr @ Nov 29 2015, 20:52)  Правильно не увидели: там используется boot interface, который специально введен для того, чтобы избежать разборок с дескрипторами в облегченном софте. Только вот в большинстве радио и некоторых проводных мышах он не работает или работает некорректно, плюс колеса скроллинга и доп кнопки не работают вообще. Цитата(kovigor @ Nov 29 2015, 20:24)  Угу, парсинг там, ИМХО, самое сложное и нетривиальное. Что для мыши, что для клавиатуры. Ну, есть там есколько моментов с глобальными и локальными параметрами и вложенными коллекциями. Делал для клавы и мыши примерно 2 дня, чтоб работали основные параметры по кнопкам и 3м координатам с различной шириной от 8 до 12 бит на координату, остальное- за борт, так что процедура оказалась небольшой  ЗЫ. За основу взял функцию парсинга из усб либы от NXP.
Сообщение отредактировал mantech - Nov 29 2015, 18:13
|
|
|
|
|
Dec 1 2015, 17:36
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Скачал отсюда - 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"
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Dec 23 2015, 19:09
|

Профессионал
    
Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980

|
Накурился я этой хрени ... голова кругом 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. Здесь я такого не нашёл. Хотя в той же винде такая регулировка есть. Или это некая программная имитация?
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Dec 23 2015, 20:24
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(hd44780 @ Dec 23 2015, 22:09)  Накурился я этой хрени ... голова кругом wacko.gif За-то какой опыт будет! Я тоже отведал вдоволь этого нектара  Цитата(hd44780 @ Dec 23 2015, 22:09)  19 01 - 19 01 - Usage Minimum (01) -- мин номер кнопки 29 08 - 29 08 - Usage Maximum (08) -- макс номер кнопки Да это 8 кнопок, т.е. отводится 1 байт в репорте. Это зарезервировано и не означает, что в мыши именно 8 кнопок. Отсчет с 0. Т.е. нажата кн 1 = 01 и т.д. Цитата(hd44780 @ Dec 23 2015, 22:09)  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 мыши, поделенному на частоту передачи репорта. С колесом тоже самое. Цитата(hd44780 @ Dec 23 2015, 22:09)  Что такое 5-й байт, я не понял sad.gif . В то же время есть какой-то непонятные usage: Это manufacturer definit репорт - не для использования. Вы еще радиомышки репортов не видели - там полное веселье  Цитата(hd44780 @ Dec 23 2015, 22:09)  Репорты валят из мыши постоянно, практически непрерывным потоком. При этом там идут полные дубли, если мышь не двигается. На фига? Че-то такого не встречал. Смотрите правильность реализации режима interrupt. При слишком низкой частоте опроса мыши контроллером данные буферизируются и потом выдаются хосту с задержкой. Время опроса лучше поставить 2мсек. Цитата(hd44780 @ Dec 23 2015, 22:09)  В PS2 мышах есть команда задания скорости к каких-то там DPI. Здесь я такого не нашёл. Хотя в той же винде такая регулировка есть. Или это некая программная имитация? Выше об этом и написал. В простых мышах репорты только на выдачу, поэтому задавать скорость нельзя, только программно, драйвером. Цитата(hd44780 @ Dec 23 2015, 22:09)  Это какой-то ST-шный косяк или же это делается специально и я должен сам проверять, получил ли я дубль или что-то изменилось? Скорей ваша ошибка драйвера. И на будущее, обязательно сделайте парсинг интерфейс-дескриптора, т.к. у радиомышей может быть по 2 или 3 интерфейса, причем первый - почти всегда клава, а мышь 2й или очень редко 3й, простой драйвер, как сейчас ваш, с ними работать не будет.
Сообщение отредактировал mantech - Dec 23 2015, 20:26
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|