Перейти к содержанию
    

Привет всем.

 

Вот уже пару недель (непостоянно конечно :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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У кого-то USB-мышки работают? Может кто-то помочь?

 

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

Не увидел ничего похожего на парсер хид-репорта, или плохо смотрел?

 

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

 

По поводу опроса процедуры USBH_Process. Если память не изменяет с тех времен, когда работал с стм - чем чаще - тем лучше, но вполне сносно работает при 100 раз в сек..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не увидел ничего похожего на парсер хид-репорта, или плохо смотрел?

Угу, парсинг там, ИМХО, самое сложное и нетривиальное. Что для мыши, что для клавиатуры. Все остальное можно сделать и самому. Интересно, в используемых автором темы библиотеках (или в чем-то там еще готовом) реализован парсинг, или там просто голый хост ? Голый хост я делал на ARM9 без всяких библиотек. Лично сам каждому битику на шине кланялся. Но парсинг - это капец. Его я не делал. Благо, от меня этого не требовалось ...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не увидел ничего похожего на парсер хид-репорта, или плохо смотрел?

Правильно не увидели: там используется boot interface, который специально введен для того, чтобы избежать разборок с дескрипторами в облегченном софте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильно не увидели: там используется boot interface, который специально введен для того, чтобы избежать разборок с дескрипторами в облегченном софте.

 

Только вот в большинстве радио и некоторых проводных мышах он не работает или работает некорректно, плюс колеса скроллинга и доп кнопки не работают вообще.

 

Угу, парсинг там, ИМХО, самое сложное и нетривиальное. Что для мыши, что для клавиатуры.

 

Ну, есть там есколько моментов с глобальными и локальными параметрами и вложенными коллекциями. Делал для клавы и мыши примерно 2 дня, чтоб работали основные параметры по кнопкам и 3м координатам с различной шириной от 8 до 12 бит на координату, остальное- за борт, так что процедура оказалась небольшой :laughing:

 

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

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только вот в большинстве радио и некоторых проводных мышах он не работает или работает некорректно, плюс колеса скроллинга и доп кнопки не работают вообще.

Увы, он вообще не является обязательным к реализации :( Первая мышь у ТС явно из этой серии, раз обламывается на энумерации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Увы, он вообще не является обязательным к реализации :( Первая мышь у ТС явно из этой серии, раз обламывается на энумерации.

 

Я так и понял, особенно прочитав что современные БИОСы уже работают в нативном режиме, вот и решил, что самому нужно тоже его использовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы.

С энумерацией понятно вроде. Где-то можно подсмотреть правильную реализацию?

Ненормальные координаты выдаёт тоже из-за неверного парсинга репортов мыши?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы.

С энумерацией понятно вроде. Где-то можно подсмотреть правильную реализацию?

Ненормальные координаты выдаёт тоже из-за неверного парсинга репортов мыши?

 

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

 

Про координаты, скорей всего так и есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скачал отсюда - 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"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скачал отсюда - https://www.lpcware.com/content/project/nxpusblib версию 0.98, там куча примеров, ткните плиз в нужный.

Я в них запутался... Ещё и в контроллерах тех не ориентируюсь.

 

C:\nxpUSBlib v0.98b.zip\libraries\LPCUSBLib\Drivers\USB\Class\Common\HIDParser.c(.h)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Накурился я этой хрени ... голова кругом :wacko:

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: ).

Потом 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. Здесь я такого не нашёл. Хотя в той же винде такая регулировка есть.

Или это некая программная имитация?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Накурился я этой хрени ... голова кругом wacko.gif

 

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

 

Я тоже отведал вдоволь этого нектара :wacko:

 

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

 

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

 

Репорты валят из мыши постоянно, практически непрерывным потоком. При этом там идут полные дубли, если мышь не двигается. На фига?

 

Че-то такого не встречал. Смотрите правильность реализации режима interrupt. При слишком низкой частоте опроса мыши контроллером данные буферизируются и потом выдаются хосту с задержкой. Время опроса лучше поставить 2мсек.

 

В PS2 мышах есть команда задания скорости к каких-то там DPI. Здесь я такого не нашёл. Хотя в той же винде такая регулировка есть.

Или это некая программная имитация?

 

Выше об этом и написал. В простых мышах репорты только на выдачу, поэтому задавать скорость нельзя, только программно, драйвером.

 

Это какой-то ST-шный косяк или же это делается специально и я должен сам проверять, получил ли я дубль или что-то изменилось?

Скорей ваша ошибка драйвера.

 

И на будущее, обязательно сделайте парсинг интерфейс-дескриптора, т.к. у радиомышей может быть по 2 или 3 интерфейса, причем первый - почти всегда клава, а мышь 2й или очень редко 3й, простой драйвер, как сейчас ваш, с ними работать не будет.

Изменено пользователем mantech

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...