Перейти к содержанию

Generic Usb Hid Device На Stm32F4Discovery


hd44780

Рекомендуемые сообщения

Привет всем :)

Озаботился тут созданием USB HID устройства на данном проце.

Находил с интернете массу примеров HID устройств, эмулирующих джойстики, мыши, клавиатуры, пульты ДУ и прочую дребедень... Но мне не нужны все эти клавиатуры, джойстики и пульты ....

Нужно Generic устройство - принять от компа 64 байта, отправить в комп 64 байта. И всё.

Такой пример я нашёл только один - http://we.easyelectr...4-discovey.html , как пишет автор, на основе примера от более младших STM32. Этот пример включает/выключает светодиодики платы по команде с компа и шлёт в комп данные, когда нажимают кнопку. Это работает.

Но у него размер и входящего и исходящего блока данных - 2 байта вместо доступных 64 (видимо автор память экономит, ему почти 200 кил RAM этого камня мало :) ) - форменное издевательство короче :crazy: .

Решил я его пример переделать. Поменял VID, PID, чтобы моя прога его увидела, нашёл дескриптор конфигурации, исправил 2 макроса, описывающих размеры конечных точек, прошил. Работоспособность лампочек и кнопки не нарушилась, всё исправно управляется, на кнопку реагирует, но чтение свойств устройства показывает InputReportByteLength=OutputReportByteLength=2, т.е. размер репортов не изменился.

Нашёл я HID дескриптор, изменил его. Убрал описания кнопок, лампочек, оставил только описания входного и выходного репортов.

Получилось следующее:

#define CUSTOMHID_SIZ_REPORT_DESC 32

........................

__ALIGN_BEGIN static uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] __ALIGN_END =
{
// Global Usage Page - Vendor-defined
0x06, 0xFF, 0x00,		 // USAGE_PAGE (0xFF00)

// Collection: Application
0x09, 0xFF,				 // USAGE (vendor defined)
0xA1, 0x01,				 // COLLECTION (Application)

// Input report: Vendor-defined
0x09, 0xFF,				 // USAGE (vendor defined)
0x95, HID_IN_PACKET,	 // REPORT_COUNT = 64 - Размер конечной точки
0x75, 8,				 // REPORT_SIZE = 8
0x15, (unsigned char) -128, // 0x15,
0x25, (unsigned char) 127, // 0x25,
0x81, 0,
// Output report: vendor-defined
0x09, 0xFF,				 // USAGE (vendor defined)
0x95, HID_OUT_PACKET,	 // REPORT_COUNT = 64 - Размер конечной точки
0x75, 8,				 // REPORT_SIZE = 8
0x15, (unsigned char) -128, // 0x15
0x25, (unsigned char) 127, // 0x25
0x91, 0,				 //

0xC0					 // End collection
}; // CustomHID_ReportDescriptor

Устройство опознаётся, винда не ругается, но чтение свойств даёт InputReportByteLength=OutputReportByteLength=65 (!) и все попытки что либо послать в железяку даёт ошибку 87 - Invalid Parameter. Хоть и шлю я ему 2 байта ...

На чтении тупо виснет без каких-либо ошибок. Прогу приходится диспетчером задач вырубать.

Сильно подозреваю, что западло заключено в этих 65 байтах и сидит оно в HID дескрипторе, но не пойму что именно там не так.

Сам по себе HID дескриптор вроде правильный, на древнейшем AT91SAM7S256 2006 года выпуска работает с песнями :) .

Помогите пожалуйста, кто может.

Спасибо.

ЗЫ.

Утилиту HID Descriptor Tool 13-летней давности видел, знаю, но вот никак за эти 13 лет не врублюсь, что там к чему. То ли я идиот, то ли писали её идиоты :crazy: . К тому же вылетает она с какими-то сбоями типа "Can't read memory at address 0x00000000" :( ....

Можно, конечно, сделать CDC, проэмулировать COM-порт (кстати делал, работает :) ), это может и лучше с т.з. быстродействия (всё-таки bulk-передачи, а не Control), но не хочется, чтобы железка торчала в списке портов.

Изменено пользователем hd44780
Ссылка на комментарий
Поделиться на другие сайты

  • 6 месяцев спустя...

А что за эти 2 байта которые вы пытаетесь отослать в железку? Их содержимое? Проблема может быть в том что отсутствует первый(нулевой) бит, который определяет тип репорта.

Из за этого и InputReportByteLength=OutputReportByteLength=65 -> 1(идентификатор)+64(данные)

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...