реклама на сайте
подробности

 
 
> STM32F439 + USB мышь, Не работает
hd44780
сообщение Nov 29 2015, 16:14
Сообщение #1


Профессионал
*****

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



Привет всем.

Вот уже пару недель (непостоянно конечно rolleyes.gif ) пытаюсь завести 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 клавиатуру я не пробовал, хотя и не вырезал.
Прикрепленные файлы
Прикрепленный файл  STM32F4x9_HID.zip ( 347.22 килобайт ) Кол-во скачиваний: 14
 


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 14)
mantech
сообщение Nov 29 2015, 17:00
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(hd44780 @ Nov 29 2015, 19:14) *
У кого-то USB-мышки работают? Может кто-то помочь?


Мышки работают, правда на контроллерах от фрискейла, стек несколько другой.
Не увидел ничего похожего на парсер хид-репорта, или плохо смотрел?

По скорости опроса - ставил асинхронный лист усб контроллера на 8 элементов, в каждый четный - QH - mouse, нечетный - QH - keyb. В результате частота опроса мышки и клавиатуры - 2мсек, вполне достаточно.

По поводу опроса процедуры USBH_Process. Если память не изменяет с тех времен, когда работал с стм - чем чаще - тем лучше, но вполне сносно работает при 100 раз в сек..
Go to the top of the page
 
+Quote Post
kovigor
сообщение Nov 29 2015, 17:24
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(mantech @ Nov 29 2015, 21:00) *
Не увидел ничего похожего на парсер хид-репорта, или плохо смотрел?

Угу, парсинг там, ИМХО, самое сложное и нетривиальное. Что для мыши, что для клавиатуры. Все остальное можно сделать и самому. Интересно, в используемых автором темы библиотеках (или в чем-то там еще готовом) реализован парсинг, или там просто голый хост ? Голый хост я делал на ARM9 без всяких библиотек. Лично сам каждому битику на шине кланялся. Но парсинг - это капец. Его я не делал. Благо, от меня этого не требовалось ...
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 29 2015, 17:52
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(mantech @ Nov 29 2015, 20:00) *
Не увидел ничего похожего на парсер хид-репорта, или плохо смотрел?

Правильно не увидели: там используется boot interface, который специально введен для того, чтобы избежать разборок с дескрипторами в облегченном софте.
Go to the top of the page
 
+Quote Post
mantech
сообщение Nov 29 2015, 18:11
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 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 бит на координату, остальное- за борт, так что процедура оказалась небольшой laughing.gif

ЗЫ. За основу взял функцию парсинга из усб либы от NXP.

Сообщение отредактировал mantech - Nov 29 2015, 18:13
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 29 2015, 18:13
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(mantech @ Nov 29 2015, 21:08) *
Только вот в большинстве радио и некоторых проводных мышах он не работает или работает некорректно, плюс колеса скроллинга и доп кнопки не работают вообще.

Увы, он вообще не является обязательным к реализации sad.gif Первая мышь у ТС явно из этой серии, раз обламывается на энумерации.
Go to the top of the page
 
+Quote Post
mantech
сообщение Nov 29 2015, 18:15
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(aaarrr @ Nov 29 2015, 21:13) *
Увы, он вообще не является обязательным к реализации sad.gif Первая мышь у ТС явно из этой серии, раз обламывается на энумерации.


Я так и понял, особенно прочитав что современные БИОСы уже работают в нативном режиме, вот и решил, что самому нужно тоже его использовать.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 30 2015, 12:54
Сообщение #8


Профессионал
*****

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



Спасибо за ответы.
С энумерацией понятно вроде. Где-то можно подсмотреть правильную реализацию?
Ненормальные координаты выдаёт тоже из-за неверного парсинга репортов мыши?


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
mantech
сообщение Nov 30 2015, 14:22
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(hd44780 @ Nov 30 2015, 15:54) *
Спасибо за ответы.
С энумерацией понятно вроде. Где-то можно подсмотреть правильную реализацию?
Ненормальные координаты выдаёт тоже из-за неверного парсинга репортов мыши?


Я уже упоминал - библиотека USB Lib от NXP.

Про координаты, скорей всего так и есть.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Nov 30 2015, 14:54
Сообщение #10


Профессионал
*****

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



Ок. Буду смотреть.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
hd44780
сообщение Dec 1 2015, 17:36
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 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"


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
mantech
сообщение Dec 1 2015, 17:45
Сообщение #12


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(hd44780 @ Dec 1 2015, 20:36) *
Скачал отсюда - https://www.lpcware.com/content/project/nxpusblib версию 0.98, там куча примеров, ткните плиз в нужный.
Я в них запутался... Ещё и в контроллерах тех не ориентируюсь.


C:\nxpUSBlib v0.98b.zip\libraries\LPCUSBLib\Drivers\USB\Class\Common\HIDParser.c(.h)
Go to the top of the page
 
+Quote Post
hd44780
сообщение Dec 1 2015, 17:48
Сообщение #13


Профессионал
*****

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



ага. нашёл. спасибо.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
hd44780
сообщение Dec 23 2015, 19:09
Сообщение #14


Профессионал
*****

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



Накурился я этой хрени ... голова кругом wacko.gif
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 biggrin.gif ).
Потом 3 байта координаты и колесо.
Что такое 5-й байт, я не понял sad.gif . В то же время есть какой-то непонятные 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. Здесь я такого не нашёл. Хотя в той же винде такая регулировка есть.
Или это некая программная имитация?


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
mantech
сообщение Dec 23 2015, 20:24
Сообщение #15


Гуру
******

Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143



Цитата(hd44780 @ Dec 23 2015, 22:09) *
Накурился я этой хрени ... голова кругом wacko.gif


За-то какой опыт будет! biggrin.gif

Я тоже отведал вдоволь этого нектара 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 репорт - не для использования.

Вы еще радиомышки репортов не видели - там полное веселье biggrin.gif

Цитата(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
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.01498 секунд с 7
ELECTRONIX ©2004-2016