Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F439 + USB мышь
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
hd44780
Привет всем.

Вот уже пару недель (непостоянно конечно 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 клавиатуру я не пробовал, хотя и не вырезал.
mantech
Цитата(hd44780 @ Nov 29 2015, 19:14) *
У кого-то USB-мышки работают? Может кто-то помочь?


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

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

По поводу опроса процедуры USBH_Process. Если память не изменяет с тех времен, когда работал с стм - чем чаще - тем лучше, но вполне сносно работает при 100 раз в сек..
kovigor
Цитата(mantech @ Nov 29 2015, 21:00) *
Не увидел ничего похожего на парсер хид-репорта, или плохо смотрел?

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

Правильно не увидели: там используется boot interface, который специально введен для того, чтобы избежать разборок с дескрипторами в облегченном софте.
mantech
Цитата(aaarrr @ Nov 29 2015, 20:52) *
Правильно не увидели: там используется boot interface, который специально введен для того, чтобы избежать разборок с дескрипторами в облегченном софте.


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

Цитата(kovigor @ Nov 29 2015, 20:24) *
Угу, парсинг там, ИМХО, самое сложное и нетривиальное. Что для мыши, что для клавиатуры.


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

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

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


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


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

Про координаты, скорей всего так и есть.
hd44780
Ок. Буду смотреть.
hd44780
Скачал отсюда - 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
Цитата(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)
hd44780
ага. нашёл. спасибо.
hd44780
Накурился я этой хрени ... голова кругом 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. Здесь я такого не нашёл. Хотя в той же винде такая регулировка есть.
Или это некая программная имитация?
mantech
Цитата(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й, простой драйвер, как сейчас ваш, с ними работать не будет.
hd44780
угу. спасибо.
Радиомышки я на потом оставлю. Сейчас хоть бы проводную завести по-нормальному...


mantech
Цитата(hd44780 @ Dec 24 2015, 11:36) *
угу. спасибо.
Радиомышки я на потом оставлю. Сейчас хоть бы проводную завести по-нормальному...


Проводная завелась с пол-оборота, правда, тормозила по началу, т.к. 16мсек опрос был по дефолту. Поставил 2мс и норм rolleyes.gif
hd44780
Пытаюсь понять феномен этого автоповтора ...
hd44780
Посмотрел куб - там тоже бут протокол, но автоповтора нету.
Придётся ещё и в ядро лезть ... бррр
mantech
Цитата(hd44780 @ Dec 24 2015, 19:36) *
Посмотрел куб - там тоже бут протокол, но автоповтора нету.
Придётся ещё и в ядро лезть ... бррр


Сочувствую, у меня хоть EHCI контроллер был, а тут... crying.gif
hd44780
Всех с наступающим!
Переделал проект с нуля на F429Discovery, вывожу координаты и состояния кнопок на дисплей - вроде всё норм пашет на тех 2-х мышах. Использовал Report режим.

3-я мышь энумерацию проходит нормально, определяется, что это мышь, но подыхает на чтении HID дескриптора уже в HID драйвере
До дескриптора репорта вообще не доходит crying.gif . Лезет ошибка - Host is busy. Почему - пока не понял sm.gif .
Огурцов
не хватает питания ?
hd44780
А хз. Питается от программаторского USB. Проверю.
hd44780
Всех с наступившими Новым годом и Рождеством.

Питалово оказалось ни при чём. СТ-шники выложили новые либы USB хоста, почистил их от разного хлама, проверил все 3 мыши на FS хосте на своей плате - пока всё норм.
HID драйвер там на 99% такой же, стало быть ядро подкрутили ... Со старым я его не сравнивал.

Сделаю на HS (FS режим) хосте - отпишусь, что получится...

На дискаверине пока не проверял, т.к. там распаян HS хост.
Rash
извиняюсь за офф топик, может кто знает где можно подписаться на уведомления об обновлениях версий ПО или даташитов? Очень неудобно периодически просматривать разные разделы. Новости с их сайта об новой продукции вообще приходят через 1.5 месяца от публикации на сайте.
hd44780
Rash, я не знаю.
Новую USB либу я увидел, когда сам туда зашёл и сравнил версию с той, что у меня была. И то оказалось, что она там лежит с конца ноября.
А я весь декабрь со старой промучился sm.gif.

Возможно стоит у них и спросить.

PS. Кстати, проверил USB HS хост (FS режим) на своей плате - мыши пашут. Вроде норм.
До 429 дискаверины руки пока не дошли.
Огурцов
когда говорите либа, что это означает ?
hd44780
СТ-шники выкладывают архив: USB ядро, драйвера флэшки/HID (клава+мышь), несколько примеров хоста и девайса.
Фактически это не либы, а некие готовые примеры, заточенные под ихние дорогущие отладочные платы ценой под полторы-две штуки баксов.
Поэтому сами либы оттуда надо выковыривать - очищать от кода, работающего с дисплеями на тех платах, переделывать инициализацию пинов (в части управления питанием девайса) и т.д и т.п.
Но для простоты я всё это называю либой. Те кто сталкивался, поймут, о чём я sm.gif .
mantech
Цитата(hd44780 @ Jan 9 2016, 15:42) *
Фактически это не либы, а некие готовые примеры, заточенные под ихние дорогущие отладочные платы ценой под полторы-две штуки баксов.


А что, сейчас уже примеры программ с либами в комплекте, например для плат типа дискавери, уже не делают??
hd44780
Цитата(mantech @ Jan 9 2016, 21:37) *
А что, сейчас уже примеры программ с либами в комплекте, например для плат типа дискавери, уже не делают??


Ну как сказать ...
Лично я видел только примеры работы с USB флэшкой. На F4Discovery это простенький WAV плеер, на F429 Discovery показывает с флэшки BMP на дисплее и даже видео какое-то.
Фирменных примеров работы с USB мышью/клавиатурой для дискавери я вообще не видел.
Я находил один пример работы с USB-мышью для Ф4дискавери на ихнем форуме. Но там человек сделал практически то же самое, что я описал выше. Пример очень старый, мои мыши с ним вообще не работают.
Но лично мне не нравятся архитектурные подходы, используемые СТ-шниками, да и я использую кокос, а под него по-любому приходится многое перепахивать хотя бы из-за отличий в компиляторе того же иара и GCC.

Из сторонних примеров - немец UBeiker - http://mikrocontroller.bplaced.net/wordpress/
Качественно и весьма недурно переработанные СТ-шные примеры. Всё ориентировано на обе Ф4 дискаверины, но вся USB часть вынесена "за скобки", поэтому очень легко переносится на другие платы с другой схемотехникой.
А те куски кода, которые жёстко завязаны на дискавери (например, дисплей), легко отделяются и выбрасываются, т.к. используются только в main, а не в недрах USB библиотек, как у СТ-шников.
У немца есть примеры и флэшки, и мышки, но т.к. у него старые либы, то у меня была ситуация, описанная мною в 1-м посте темы.

Новые либы я перепахал сам, все 3 мои мыши работают вроде нормально, сейчас я занялся флэшкой на этих новых либах. Т.к. меня интересует и флэшка и мышка одновременно, а не по очереди, как поголовно во всех примерах, которые я видел.
Огурцов
немец крут
но только поначалу
потом оказывается, что что-то не работает, что-то работает не так, что-то глючит
мне кажется, что он берет проекты из под старого? куба и причесывает их под кокос
hd44780
Не, куба я у него пока не видел. У него SPL и не кубовые USB либы.
Глюки да, бывают. Тот же его пример USB мыши на Ф429 дискавери он работает нормально, а на моей плате на том же хосте он не пошёл. хз почему. Я не разбирался. Решил лучше время потратить на новые либы.
Огурцов
старый куб был на spl, не ?
в любом случае, примеры по списку куба и выглядят как обертки над обертками
почему бы для разнообразия не сделать cdc host ? а нет, у st потому что нет
hd44780
Цитата(Огурцов @ Jan 10 2016, 17:34) *
старый куб был на spl, не ?

Я не знаю, я кубом почти не пользуюсь.

Цитата(Огурцов @ Jan 10 2016, 17:34) *
в любом случае, примеры по списку куба и выглядят как обертки над обертками
почему бы для разнообразия не сделать cdc host ? а нет, у st потому что нет

Угу. Не говорите .. В кубе CDC Host есть. Но на простые либы переделывать геморно.

Кстати, в новых (не кубовых) либах CDC хост появился. Так что, наверное, и у немца скоро появится biggrin.gif . Я не проверял, пока неактуально.
Огурцов
так либы на spl или это третья реинкарнация стшного софта ?
я куб пытался под кокос заточить - что- то там не срослось
пока
hd44780
В USB либах SPL есть только в 2-х местах:
1. Файл usb_bsp.c - инициализация портов, прерываний, включение питания девайса и пр.
2. Файл usbh_usr.c, функция USBH_USR_UserInput. Там опрашивается какая-то кнопка, которой можно запретить работу хоста. На фига оно надо и как именно оно работает - я не знаю, я всегда эту кнопку выкидывал и безусловно разрешал работу хоста.

В самом USB ядре никакого SPL нету, там всё на регистрах сделано, через макросы
Код
#define USB_OTG_READ_REG32(reg)  (*(__IO uint32_t *)(reg))
#define USB_OTG_WRITE_REG32(reg,value) (*(__IO uint32_t *)(reg) = (value))
#define USB_OTG_MODIFY_REG32(reg,clear_mask,set_mask) \
  USB_OTG_WRITE_REG32((reg), (((USB_OTG_READ_REG32(reg)) & ~(clear_mask)) | (set_mask)) )

И никогда я там SPL не видел, несмотря на вопли разных SPL-ненавистников. Попадались мне такие sm.gif .

Разные дисплеи, использующиеся в callback-ах я не рассматривал, т.к. эти вещи сильно от проекта зависят. Я, например, все PID/VID/... записываю в переменные, а потом использую, где надо (вывожу на дисплей в другом месте).

PS. Я имею в виду только хосты. Девайсы я практически не делал, не могу сказать что там да как. Хотя, я думаю, что в этом отношении девайс от хоста не отличается.
hd44780
Сделал флэшки на новой либе. На всех моих платах и процах пашет норм.
Теперь пошёл делать, чтобы хост понимал и мышку и флэшку одновременно. Т.е. без перекомпиляции и перепрошивки.
mantech
Цитата(hd44780 @ Jan 19 2016, 10:57) *
Теперь пошёл делать, чтобы хост понимал и мышку и флэшку одновременно.


В смысле, через хаб или просто либо то, либо другое? Если через хаб, тоже интересно, сейчас сам хочу сделать...
hd44780
Не, пока не хаб. Просто так или то или то.
Хабовый протокол я ещё даже не читал пока sad.gif .
mantech
Цитата(hd44780 @ Jan 20 2016, 11:26) *
Не, пока не хаб. Просто так или то или то.
Хабовый протокол я ещё даже не читал пока sad.gif .


Понятно - это просто, а вот с хабом... че-то пока не работает все разом crying.gif

ЗЫ. Пользуясь случаем, не встречалось такого эффекта, например, читаю блоками флешку, а потом надо на нее-же несколько блоков записать, потом читать дальше, причем без пауз. Так вот после записи флеха наглухо уходит в аут(помогает только откл. ее питания), сам контроллер усб не отключаю, только сброс шины.
Это бывает на 2х флешках из 10 разных производителей... Причем запись происходит корректно.

Кто, что знает - расскажите, если не секрет? laughing.gif
hd44780
Не, флэшки у меня нормально вроде пашут.
Знакомый, которому я дал свой драйвер, тоже не жаловался пока что ...

Драйвер от СТ. Практически без изменений. Слегка допиленный, чтобы не впадал в ступор при смене флэшки.
mantech
Цитата(hd44780 @ Jan 22 2016, 16:17) *
Не, флэшки у меня нормально вроде пашут.


Дак вот тоже нормально пашут, за исключением некоторых и в режиме "одновременной" записи и чтения. Когда только читаю или записываю - все норм laughing.gif
mantech
Цитата(mantech @ Jan 21 2016, 16:57) *
Пользуясь случаем, не встречалось такого эффекта, например, читаю блоками флешку, а потом надо на нее-же несколько блоков записать, потом читать дальше, причем без пауз. Так вот после записи флеха наглухо уходит в аут


Вопрос решил, оказывается для особо тормозных флешек нужно было увеличить таймаут ошибки, если нет ответа для DATA IN и CSW принимаемых блоков.

Цитата(mantech @ Jan 21 2016, 16:57) *
Пользуясь случаем, не встречалось такого эффекта, например, читаю блоками флешку, а потом надо на нее-же несколько блоков записать, потом читать дальше, причем без пауз. Так вот после записи флеха наглухо уходит в аут


Вопрос решил, оказывается для особо тормозных флешек нужно было увеличить таймаут ошибки, если нет ответа для DATA IN и CSW принимаемых блоков.
hd44780
Апну древнюю тему.
Сейчас осталась только одна проблема - мышь спустя какое-то время перестаёт отдавать координаты.
Копание в коде вывело на уже упоминавшееся мною выше условие в файле usbh_hid_core.c, функция USBH_HID_Handle:

Код
.............
  case HID_POLL:
    if(( HCD_GetCurrentFrame(pdev) - HID_Machine.timer) >= HID_Machine.poll)
    {
      HID_Machine.state = HID_GET_DATA;
    }
    else if( HCD_GetURB_State(pdev, HID_Machine.hc_num_in) == URB_DONE )
    {
      if(start_toggle == 1) /* handle data once */
      {
        start_toggle = 0;
        HID_Machine.cb->Decode(HID_Machine.buff);
      }
    } //if
..............


Ну что такое первое условие - понятно, там все проблемы удалось решить, но всё обламывается на втором условии.
Когда мышь дохнет, функция возвращает URB_IDLE. Всё, что я пока понял, что эти статусы выставляются в прерывании USB.
Дальнейшее я пока не расколдовал sad.gif ...

Поэтому вопрос по сути тот же - работает ли USB мышь у кого-нибудь?
mantech
Цитата(hd44780 @ Nov 27 2016, 19:12) *
Поэтому вопрос по сути тот же - работает ли USB мышь у кого-нибудь?


Работает больше года в 24\7 . Проблемы отваливания решил отслеживанием ошибки и повторной энумерацией, как это сделано в винде.
hd44780
Цитата(mantech @ Nov 29 2016, 20:28) *
Работает больше года в 24\7 . Проблемы отваливания решил отслеживанием ошибки и повторной энумерацией, как это сделано в винде.


Ну реенумерацию (реинит хоста) я запущу, эти механизмы у меня уже есть, запускается автоматически по спец флажку, но как отловить отваливание? Вставить в тот if какой-то флажок?
Кусок
Код
          if ( p_hid_data -> start_toggle == 1 ) /* handle data once */
          {
              p_hid_data -> start_toggle = 0;
              p_hid_data -> HID_Machine.cb->Decode ( p_hid_data -> HID_Machine.buff );
          }

вызывается только когда мышу двигают.

Я вроде не замечал, чтобы у меня про сдыхании мыши вызывался обработчик USBH_USR_DeviceDisconnected (устройство отключилось от хоста). Иначе бы хост реинитился бы.
Он вызывается только если я мышу вообще выдёргиваю.
mantech
Цитата(hd44780 @ Nov 29 2016, 21:38) *
вызывается только когда мышу двигают.


Конкретно здесь не подскажу, у меня контроллер EHCI, но по сути, мышь работает в режиме interrupt, скорость запроса репортов определяется хостом, у меня 5 мсек, причем не зависит от того, что я с мышью делаю, когда отваливается, контроллер дает ошибку обмена или запроса, ее отлавливаю и на обработчик...

ЗЫ. Можете проверить свою мышь usb luzerом, у меня, в зависимости от мыши, происходили отвалы раз в час, а может и чаще, и сравните с контроллером, если винда работает без отвалов, ищите ошибку у себя...
ЗЫЫ. На практике, проводные мыши у меня вообще не отваливались (правда, они были не совсем уж говно logitech и defender), а вот радио - почем зря, особенно rapoo и smartbay...
hd44780
угу. спасибо.
hd44780
Нашёл я, как это отловить, добавил туда свой флажок. В итоге курсор мыши при отвале лишь замирает менее чем на полсекунды (пока реинит хост не пройдёт), после чего нормальная работа возобновляется.

Самое интересное, что USB ядро такие случаи отрабатывает абсолютно корректно, а в USB HID драйвер просто забыли добавить обработку этого случая. Хотя может забыли вполне сознательно, т.к. у них даже при простом выдёргивании девайса хост тупо виснет и не перезапускается.

Пока проблема решена, понаблюдаю за стабильностью.

mantech , спасибо за наводку.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.