USB HID keyboard stm32
25.12.2016, 15:07
|
|
|
Частый гость
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
|
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); |
... то получается какая-то ерунда, символы теряются, мешаются, "зажимаются" - каша одним словом
как все же правильно отправлять единичные нажатия клавиш, последовательность символов с модификаторами и т.п.
|
|
|
|
25.12.2016, 20:29
|
|
|
Прописка
Регистрация: 25.11.2006
Адрес: Харьков
Сообщений: 295
Сказал спасибо: 25
Сказали Спасибо 71 раз(а) в 60 сообщении(ях)
|
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), то пакеты будут отправляться чаще и не факт, что без дополнительных задержек между пакетами всё будет устойчиво работать.
|
|
|
|
25.12.2016, 21:49
|
|
|
Частый гость
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: USB HID keyboard stm32
USB FS, мк stm32f103c8t6, я тоже думал про задержки между отправками, но какие они должны быть, попробовал ставить 1 мс, 20 мс - такая же ерунда.
С единичными нажатиями (редкими, типа тактовая кнопка и по ее нажатию отправляется код клавиши) впринципе еще куда не шло, хотя кажется, что время нажатия при котором этот код повторяется больше, чем у реальной клавиатуры (может и кажется), а вот чтобы отправить из мк какое-то слово или набор символов, то подряд отправляя коды в половине случаев они или теряются частично, могут переставиться местами (это наверно все из-за потерь), или могут появляться длинные нажатия каких-то кодов.
Пробовал отправлять коды как выше под спойлером - ерунда, пробовал после каждого символа отправлять нули, тоже как-то не так
Кстати в моей реальной клавиатуре максимально можно 4 клавиши одновременно нажать, чтобы была какая-то реакция.
|
|
|
|
25.12.2016, 23:07
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Re: USB HID keyboard stm32
Вот рабочая заготовка клавоэмулятора. С ней успешно работают матричная клавиатура и хронометр для велосоревнований.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
26.12.2016, 12:08
|
|
|
Частый гость
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: USB HID keyboard stm32
да, но хотелось бы постичь дзен и понять почему так происходит
|
|
|
|
26.12.2016, 12:35
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Re: USB HID keyboard stm32
Поясню, как я делал. Все, что нужно отослать, запихивал в буфер. В прерывании же systick (1 раз в миллисекунду) я ставил в очередь данные на отсылку: сначала отсылается код нужной клавиши, а в следующем прерывании — код отпускания. Фактически я ограничиваю скорость 500 символами в секунду. Примерно такую и наблюдаю. Более шустро делать не пробовал, возможно, будет работать и шустрей — можно функцию process_usbkbrd() из обработчика systick воткнуть в основной цикл main().
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
26.12.2016, 12:58
|
|
|
Частый гость
Регистрация: 13.06.2016
Сообщений: 37
Сказал спасибо: 6
Сказали Спасибо 2 раз(а) в 1 сообщении
|
Re: USB HID keyboard stm32
Значит все же дело в скорости (частоте посылок в ед. времени) передачи? Тогда, наверно, действительно лучший вариант передавать символы по прерыванию таймера
спасибо
|
|
|
|
26.12.2016, 14:20
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Re: USB HID keyboard stm32
Нет, я же говорю: с бóльшей скоростью передавать я просто не пробовал. Но какой-то минимальный интервал должен быть, потому как две посылки подряд (нажал, отпустил) не всегда срабатывают.
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
02.01.2017, 23:49
|
|
|
Вид на жительство
Регистрация: 03.10.2011
Сообщений: 484
Сказал спасибо: 35
Сказали Спасибо 234 раз(а) в 138 сообщении(ях)
|
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...
|
|
|
|
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...
|
Та же проблема!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:17.
|
|