Карма: 25
Рейтинг сообщений: 641
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2641 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Kellya, Вам пришли данные для для 1ой точки типа OUT и Вы их дешифровали как запрос дескриптора или для конечно точки 1 типа IN приходят фреймы с запросом данных? Что-то я боюсь вопрос не совсем корректно сформулировал.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Все дескрипторы через 0-ю точку отправляются. Тут очень важно правильно HIDReportDescriptor составить. Без этого ничего работать дальше не будет.
Весь обмен HID состоит из SetReport и GetReport. Первый передаёт данные от хоста к устройству и может приходить как в 0-ю точку, так и в 1-ю. Второй только через 1-ю interrupt точку работает. Отправлять репорты устройство может когда захочет. Обычно это происходит, если изменяется состояние устройства. Естественно, чаще чем хост опрашивает отправлять смысла не имеет.
Сама отправка репортов ни чем не отличается от отправки дескрипторов при энумерации, только производится в 1-ю точку. Для этого должна быть правильно заполнена таблица описания буферов приёма/передачи и писать правильно в буфер.
Одно из "заподлянских" мест в USB от STM (тот что не OTG) это правильно выставлять статусы с регистре конфигурации точки. Там непривычные для новичков toggle-биты есть.
Добавлено after 16 minutes 21 second: Ещё насчёт дескрипторов. Я на прошлой странице выкладывал дескрипторы, которые правильно работают с STM-овской утилитой для тестирования HID. Там установка и считывание светодиодов реализовано. Для отладки за глаза.
"Kellya, Вам пришли данные для для 1ой точки типа OUT и Вы их дешифровали как запрос дескриптора" Сначала эти данные пришли для 0ой точки, я их дешифровал как запрос дескриптора, обработал и отправил. Потом проделал тоже самое для остальных дескрипторов (конфигурации, интерфейса, строк, отчета и к.т.1). Все это через нулевую точку. На этом этапе у меня проблем не возникает. Устройство определилось в системе. После всего этого, как только я передал дескриптор репорта мне начинают сыпаться фреймы с запросом данных для конечно точки 1 типа IN, на которые у меня не получается ответить, после парты попыток от хоста получить ответ, он начинает сыпать различными запросами на ресет пайпов (это успешно выполняется контроллером самостоятельно), а потом снова начинает сыпать запросы данных для конечно точки 1 типа IN
Добавлено after 5 minutes 40 seconds: "Все дескрипторы через 0-ю точку отправляются. Тут очень важно правильно HIDReportDescriptor составить. Без этого ничего работать дальше не будет." Все верно, хост съедает все дескрипторы, которые я ему шлю. "Весь обмен HID состоит из SetReport и GetReport". Когда хост хочет получить репорт он отправляет GetReport? Хм, у меня такого вроде бы нет. Я думал, что он отправляет URB_INTERRUPT in, когда хочет получить данные из точки
Я думал, что он отправляет URB_INTERRUPT in, когда хочет получить данные из точки
Всё верно. Только не когда хочет получить данные, а когда придёт время опроса. И если вы к этому моменту положили данные, то они их сам заберёт. Устройству не надо реагировать на эти запросы, как вы не поймёте. Просто положите репорт в ep-1 и хост сам их заберёт.
Добавлено after 14 minutes 6 seconds: Если дескрипторы составлены правильно, то там реально всё примитивно.
Вот кусочек реализации HID. Тут ClassSpecificSetup это Setup-запросы в EP0, характерные только для HID. И обработка SetReport через EP0 и EP1.
А вот кусочек отправки репорта, я его уже приводил.
Это весь код HID, не считая дескрипторов (их я тоже чуть выше выкладывал), где тут можно запутаться?
Любая разработка начинается с чтения документации и изучения доступных средств разработки. Данный материал целиком посвящен средствам разработки, включая детальные инструкции по запуску вашего первого приложения на BlueNRG-LP. Описана работа с отладкой STEVAL-IDB011V1, набором инструментов и пакетом ПО позволяющим разработчику быстро войти в курс дела.
Весь обмен HID состоит из SetReport и GetReport. Первый передаёт данные от хоста к устройству и может приходить как в 0-ю точку, так и в 1-ю. Второй только через 1-ю interrupt точку работает. Отправлять репорты устройство может когда захочет. Обычно это происходит, если изменяется состояние устройства. Естественно, чаще чем хост опрашивает отправлять смысла не имеет.
Что у вас за HID такой, который с interrupt работает? Я сколько ни ловил их - пусто... И wireshark не показывал, чтобы что-то в них происходило. Единственное, когда в interrupt были какие-то данные - когда я подумывал ch340 сэмулировать. Но там оказалось, что по сути вообще никакой не CDC, даже обмен данными не так происходит, как у CDC. Поэтому забил (плюс к тому же, в ядре поддержка ch340 сделана реверсом и очень многие вещи не учитываются, ХЗ, как оно себя поведет в той же мастдайке).
Что привлекает в SiC по сравнению с кремнием, и какие особенности делают компоненты SiC часто используемыми, несмотря на более высокую стоимость в сравнении с кремниевыми высоковольтными устройствами? – Объясняет специалист ведущего разработчика силовых приборов из карбида кремния, компании Infineon.
Весь обмен HID состоит из SetReport и GetReport. Первый передаёт данные от хоста к устройству и может приходить как в 0-ю точку, так и в 1-ю. Второй только через 1-ю interrupt точку работает.
SetReport и GetReport нормально работают через 0-ю.
VladislavS писал(а):
Отправлять репорты устройство может когда захочет.
Не совсем так. Инициатором обмена всегда выступает хост, а значит отправлять можно только если в конечной точке нет данных которые еще не запросил хост. То есть перед копированием в USB буфер нужно проверить состояние точки.
SetReport и GetReport нормально работают через 0-ю.
Ну это же легко проверятеся. Вот приведённый выше код меняет состояние отображения кнопки
А если отправлять через 0-ю точку
Код:
usb.WriteEP<0>(report,sizeof(report));
То уже ничего не приходит.
Добавлено after 17 minutes 17 seconds: Я тут сам ещё раз спецификацию почитал. Пожалуй, через нулевую точку тоже будет работать. Надо просто Get_Report с хоста слать и на него отвечать. STM-овская USB HID Demonstrator просто так не умеет. Но в код обработку GET_REPORT, конечно, обязательно добавить.
В общем удалось собрать рабочий проект для мышки в CubeMX, значит железо работает нормально. Но с их дескрипторами свой код мне все равно так и не удалось запустить. Видимо неправильно пытаюсь инициализировать первую точку. Можно ли как-то вообще её не инициализировать, и, например, чтобы она на каждый опрос от хоста просто отвечала STALLом? Или для обмена пакетами в любом случае необходимо инициализировать буферы приема/передачи?
В общем ошибка была только в том, что я не указал для первой точки её адрес . Для нулевой точки там все автоматически стояло, поэтому этот момент как-то вылетел из головы. Всем большое спасибо за помощь
Столкнулся с ещё одной проблемой. После того как отправляю репорт, который описывает нажатие клавиши на клавиатуре, почему-то эта клавиша печатается не один раз, а много (не ждал пока остановятся), будто клавишу зажали и держат. Причем, как вызов функции отправки, так и прерывание о корректной передаче происходят только один раз. Wireshark тоже фиксирует только один ответ от устройства. Но клавиша почему-то остается нажатой. Не встречалась ни у кого такая проблема? Репорт состоит из 8 байт - [bModifier, bReserved, bKey1, bKey2, bKey3, bKey4, bKey5, bKey6]
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения