|
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 клавиатуру я не пробовал, хотя и не вырезал.
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
 |
Ответов
(30 - 44)
|
Jan 10 2016, 15:28
|

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

|
Цитата(Огурцов @ Jan 10 2016, 17:34)  старый куб был на spl, не ? Я не знаю, я кубом почти не пользуюсь. Цитата(Огурцов @ Jan 10 2016, 17:34)  в любом случае, примеры по списку куба и выглядят как обертки над обертками почему бы для разнообразия не сделать cdc host ? а нет, у st потому что нет Угу. Не говорите .. В кубе CDC Host есть. Но на простые либы переделывать геморно. Кстати, в новых (не кубовых) либах CDC хост появился. Так что, наверное, и у немца скоро появится  . Я не проверял, пока неактуально.
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Jan 10 2016, 17:06
|

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

|
В 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-ненавистников. Попадались мне такие  . Разные дисплеи, использующиеся в callback-ах я не рассматривал, т.к. эти вещи сильно от проекта зависят. Я, например, все PID/VID/... записываю в переменные, а потом использую, где надо (вывожу на дисплей в другом месте). PS. Я имею в виду только хосты. Девайсы я практически не делал, не могу сказать что там да как. Хотя, я думаю, что в этом отношении девайс от хоста не отличается.
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
Jan 21 2016, 13:57
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(hd44780 @ Jan 20 2016, 11:26)  Не, пока не хаб. Просто так или то или то. Хабовый протокол я ещё даже не читал пока  . Понятно - это просто, а вот с хабом... че-то пока не работает все разом ЗЫ. Пользуясь случаем, не встречалось такого эффекта, например, читаю блоками флешку, а потом надо на нее-же несколько блоков записать, потом читать дальше, причем без пауз. Так вот после записи флеха наглухо уходит в аут(помогает только откл. ее питания), сам контроллер усб не отключаю, только сброс шины. Это бывает на 2х флешках из 10 разных производителей... Причем запись происходит корректно. Кто, что знает - расскажите, если не секрет?
Сообщение отредактировал mantech - Jan 21 2016, 14:01
|
|
|
|
|
Jan 28 2016, 09:33
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(mantech @ Jan 21 2016, 16:57)  Пользуясь случаем, не встречалось такого эффекта, например, читаю блоками флешку, а потом надо на нее-же несколько блоков записать, потом читать дальше, причем без пауз. Так вот после записи флеха наглухо уходит в аут Вопрос решил, оказывается для особо тормозных флешек нужно было увеличить таймаут ошибки, если нет ответа для DATA IN и CSW принимаемых блоков. Цитата(mantech @ Jan 21 2016, 16:57)  Пользуясь случаем, не встречалось такого эффекта, например, читаю блоками флешку, а потом надо на нее-же несколько блоков записать, потом читать дальше, причем без пауз. Так вот после записи флеха наглухо уходит в аут Вопрос решил, оказывается для особо тормозных флешек нужно было увеличить таймаут ошибки, если нет ответа для DATA IN и CSW принимаемых блоков.
|
|
|
|
|
Nov 27 2016, 16:12
|

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

|
Апну древнюю тему. Сейчас осталась только одна проблема - мышь спустя какое-то время перестаёт отдавать координаты. Копание в коде вывело на уже упоминавшееся мною выше условие в файле 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. Дальнейшее я пока не расколдовал  ... Поэтому вопрос по сути тот же - работает ли USB мышь у кого-нибудь?
--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса. (с) Мария Эдуарда
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|