Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

USB HID keyboard stm32

Непрочитано 25.12.2016, 15:07  
dimdidim
Частый гость
 
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
dimdidim на пути к лучшему
По умолчанию USB HID keyboard stm32

Всем привет!
Вопрос по USB HID. Формирую проект через cube, задаю custom hid, добавляю CUSTOM_HID_ReportDesc_FS для клавиатуры, задаю размер буфера, обозначаю протокол как клавиатура.
Далее в main отправляю
USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, code, ;
первый байт модификатор, второй в резерве, остальные шесть байтов коды клавиш

Суть вопроса в том как правильно заполнять этот буфер и как правильно его отправлять?
например
// 'a' report: [0, 0, 4, 0, 0, 0, 0, 0]
// 'A' report: [2, 0, 4, 0, 0, 0, 0, 0]
Вроде понятно, но если прописать таким образом, то символ будет отправляться постоянно как нажатая клавиша, для этого в байт2 после кода символа записываем ноль и отправляем. Или нужно отправить последовательность символов, то:
Нажмите, чтобы открыть спойлер
Код:
			code[2] = 0X0B;
			USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, code, 8);
			code[2] = 0X08;
			USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, code, 8);
			code[2] = 0X0F;
			USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, code, 8);
			code[2] = 0X0F;
			USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, code, 8);
			code[2] = 0X12;
			USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, code, 8);
			code[2] = 0X1E; code[0] = 0xE1;
			USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, code, 8);
			code[2] = 0X00; code[0] = 0X00;
			USBD_CUSTOM_HID_SendReport(&hUsbDeviceFS, code, 8);

... то получается какая-то ерунда, символы теряются, мешаются, "зажимаются" - каша одним словом

как все же правильно отправлять единичные нажатия клавиш, последовательность символов с модификаторами и т.п.
Реклама:
dimdidim вне форума  
Непрочитано 25.12.2016, 20:29  
tsb
Прописка
 
Аватар для tsb
 
Регистрация: 25.11.2006
Адрес: Харьков
Сообщений: 295
Сказал спасибо: 25
Сказали Спасибо 71 раз(а) в 60 сообщении(ях)
tsb на пути к лучшему
По умолчанию Re: USB HID keyboard stm32

Сообщение от dimdidim Посмотреть сообщение
первый байт модификатор, второй в резерве, остальные шесть байтов коды клавиш

Суть вопроса в том как правильно заполнять этот буфер и как правильно его отправлять?
например
// 'a' report: [0, 0, 4, 0, 0, 0, 0, 0]
// 'A' report: [2, 0, 4, 0, 0, 0, 0, 0]
Вроде понятно, но если прописать таким образом, то символ будет отправляться постоянно как нажатая клавиша, для этого в байт2 после кода символа записываем ноль и отправляем.
В этом пакете 6 байт для кодов клавиш - имеется ввиду их одновременное "нажатие". Поэтому нули после кода "нажатой" клавиши в этом пакете не означают её отпускание, а означают, что других клавиш одновременно с этой "не нажато". Чтобы хост увидел "отпускание" клавиши - нужно в следующем пакете из 8 байт передать все нули (если не нужно передать последовательность нажатых клавиш) или код другой "нажатой" клавиши. Тогда первая посчитается "отпущенной". Но вопрос еще может быть в том, с какой задержкой отправлять эти пакеты. Все таки реальная клавиатура - довольно медленное устройство, поэтому в её обработчике (на стороне хоста) могут быть некоторые ограничения по времени. В случае реализации HID-клавиатуры как низкоскоростного устройства (LS), периодичность отправки пакетов получается порядка 8 мс. При этом хост успевает обрабатывать "нажатие" и "отпускание" клавиши в идущих подряд пакетах. Если же реализовывать устройство как Full Speed (FS), то пакеты будут отправляться чаще и не факт, что без дополнительных задержек между пакетами всё будет устойчиво работать.
tsb вне форума  
Сказали "Спасибо" tsb
dimdidim (25.12.2016)
Непрочитано 25.12.2016, 21:49  
dimdidim
Частый гость
 
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
dimdidim на пути к лучшему
По умолчанию Re: USB HID keyboard stm32

USB FS, мк stm32f103c8t6, я тоже думал про задержки между отправками, но какие они должны быть, попробовал ставить 1 мс, 20 мс - такая же ерунда.
С единичными нажатиями (редкими, типа тактовая кнопка и по ее нажатию отправляется код клавиши) впринципе еще куда не шло, хотя кажется, что время нажатия при котором этот код повторяется больше, чем у реальной клавиатуры (может и кажется), а вот чтобы отправить из мк какое-то слово или набор символов, то подряд отправляя коды в половине случаев они или теряются частично, могут переставиться местами (это наверно все из-за потерь), или могут появляться длинные нажатия каких-то кодов.
Пробовал отправлять коды как выше под спойлером - ерунда, пробовал после каждого символа отправлять нули, тоже как-то не так
Кстати в моей реальной клавиатуре максимально можно 4 клавиши одновременно нажать, чтобы была какая-то реакция.
dimdidim вне форума  
Непрочитано 25.12.2016, 23:07  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: USB HID keyboard stm32

Вот рабочая заготовка клавоэмулятора. С ней успешно работают матричная клавиатура и хронометр для велосоревнований.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 26.12.2016, 12:08  
dimdidim
Частый гость
 
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
dimdidim на пути к лучшему
По умолчанию Re: USB HID keyboard stm32

да, но хотелось бы постичь дзен и понять почему так происходит
dimdidim вне форума  
Непрочитано 26.12.2016, 12:35  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: USB HID keyboard stm32

Поясню, как я делал. Все, что нужно отослать, запихивал в буфер. В прерывании же systick (1 раз в миллисекунду) я ставил в очередь данные на отсылку: сначала отсылается код нужной клавиши, а в следующем прерывании — код отпускания. Фактически я ограничиваю скорость 500 символами в секунду. Примерно такую и наблюдаю. Более шустро делать не пробовал, возможно, будет работать и шустрей — можно функцию process_usbkbrd() из обработчика systick воткнуть в основной цикл main().
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Сказали "Спасибо" eddy
dimdidim (26.12.2016)
Непрочитано 26.12.2016, 12:58  
dimdidim
Частый гость
 
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
dimdidim на пути к лучшему
По умолчанию Re: USB HID keyboard stm32

Значит все же дело в скорости (частоте посылок в ед. времени) передачи? Тогда, наверно, действительно лучший вариант передавать символы по прерыванию таймера
спасибо
dimdidim вне форума  
Непрочитано 26.12.2016, 14:20  
eddy
Почётный гражданин KAZUS.RUN
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: USB HID keyboard stm32

Нет, я же говорю: с бóльшей скоростью передавать я просто не пробовал. Но какой-то минимальный интервал должен быть, потому как две посылки подряд (нажал, отпустил) не всегда срабатывают.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
eddy вне форума  
Непрочитано 02.01.2017, 23:49  
Serg3301
Вид на жительство
 
Регистрация: 03.10.2011
Сообщений: 484
Сказал спасибо: 35
Сказали Спасибо 234 раз(а) в 138 сообщении(ях)
Serg3301 на пути к лучшему
По умолчанию Re: USB HID keyboard stm32

Привет всем!

Тоже столкнулся с подобной проблемой.
HID Device. Требуется отправлять данные на хост, 6 репортов поочерёдно с периодичностью "как можно чаще". Если просто звать подряд USBD_CUSTOM_HID_SendReport(), то обнаруживается, что на Host передаётся только первый пакет, а все остальные не передаются т.к. state имеет значение CUSTOM_HID_BUSY и не меняется, а в функции USBD_CUSTOM_HID_SendReport() есть вот такой код:
Код:
    if(hhid-›state == CUSTOM_HID_IDLE)
    {
      hhid-›state = CUSTOM_HID_BUSY;
      USBD_LL_Transmit (pdev, 
                        CUSTOM_HID_EPIN_ADDR,                                      
                        report,
                        len);
    }
Как я понимаю кто-то должен поменять CUSTOM_HID_BUSY на CUSTOM_HID_IDLE по окончании реальной передачи пакета на хост.
Собственно вопрос: Кто и где должен поменять этот статус? Если это надо делать руками, то как мне узнать, что реальная передача завершилась и статус можно менять. И какой функцией?..
В принципе я нашёл подходящую USBD_CUSTOM_HID_DataIn() (pdev-›pClass-›DataIn())...

P.S. Решение нужно для библиотеки HAL. Пока не готов так глубоко погружаться в исходники HAL...
Serg3301 вне форума  
Непрочитано 05.05.2019, 04:29  
Забаньте!
Заблокирован
 
Регистрация: 19.11.2009
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Забаньте! на пути к лучшему
По умолчанию Re: USB HID keyboard stm32

Сообщение от Serg3301 Посмотреть сообщение
Привет всем!

Тоже столкнулся с подобной проблемой.
HID Device. Требуется отправлять данные на хост, 6 репортов поочерёдно с периодичностью "как можно чаще". Если просто звать подряд USBD_CUSTOM_HID_SendReport(), то обнаруживается, что на Host передаётся только первый пакет, а все остальные не передаются т.к. state имеет значение CUSTOM_HID_BUSY и не меняется, а в функции USBD_CUSTOM_HID_SendReport() есть вот такой код:
Код:
    if(hhid-›state == CUSTOM_HID_IDLE)
    {
      hhid-›state = CUSTOM_HID_BUSY;
      USBD_LL_Transmit (pdev, 
                        CUSTOM_HID_EPIN_ADDR,                                      
                        report,
                        len);
    }
Как я понимаю кто-то должен поменять CUSTOM_HID_BUSY на CUSTOM_HID_IDLE по окончании реальной передачи пакета на хост.
Собственно вопрос: Кто и где должен поменять этот статус? Если это надо делать руками, то как мне узнать, что реальная передача завершилась и статус можно менять. И какой функцией?..
В принципе я нашёл подходящую USBD_CUSTOM_HID_DataIn() (pdev-›pClass-›DataIn())...

P.S. Решение нужно для библиотеки HAL. Пока не готов так глубоко погружаться в исходники HAL...
Та же проблема!
Забаньте! вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"Поднять" USB на stm32f4-discovery с помощью Keil kaf-0 ARM 35 14.07.2014 12:38
STM32 USB Bulk omskcity_net ARM 0 03.10.2013 09:40
usb и stm32 liba(отработка подключение и откл) andrey9806 ARM 4 03.06.2013 00:08
USB HID на mega8 svd71 Микроконтроллеры, АЦП, память и т.д 0 10.11.2011 23:37
USB HID report descriptor Easyrider83 Микроконтроллеры, АЦП, память и т.д 23 07.12.2010 20:51


Часовой пояс GMT +4, время: 02:17.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.