Озаботился тут созданием USB HID устройства на данном проце.
Находил с интернете массу примеров HID устройств, эмулирующих джойстики, мыши, клавиатуры, пульты ДУ и прочую дребедень... Но мне не нужны все эти клавиатуры, джойстики и пульты ....
Нужно Generic устройство - принять от компа 64 байта, отправить в комп 64 байта. И всё.
Такой пример я нашёл только один - http://we.easyelectr...4-discovey.html , как пишет автор, на основе примера от более младших STM32. Этот пример включает/выключает светодиодики платы по команде с компа и шлёт в комп данные, когда нажимают кнопку. Это работает.
Но у него размер и входящего и исходящего блока данных - 2 байта вместо доступных 64 (видимо автор память экономит, ему почти 200 кил RAM этого камня мало

Решил я его пример переделать. Поменял VID, PID, чтобы моя прога его увидела, нашёл дескриптор конфигурации, исправил 2 макроса, описывающих размеры конечных точек, прошил. Работоспособность лампочек и кнопки не нарушилась, моя прога ими исправно управляет, на кнопку реагирует, но чтение свойств устройства показывает InputReportByteLength=OutputReportByteLength=2, т.е. размер репортов не изменился.
Нашёл я HID дескриптор, изменил его. Убрал описания кнопок, лампочек, оставил только описания входного и выходного репортов.
Получилось следующее:
CODE
#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 лет не врублюсь, что там к чему. То ли я идиот, то ли писали её идиоты . К тому же вылетает она с какими-то сбоями типа "Can't read memory at address 0x00000000" ....
Можно, конечно, сделать CDC, проэмулировать COM-порт (кстати делал, работает
