Спасибо за подсказку.
Действительно, господа из ST в кубовском примере CustomHID потеряли report descriptor.
Подсунул следующее:
_
Код
#define USBD_CUSTOM_HID_REPORT_DESC_SIZE 34
_ALIGN_BEGIN static const uint8_t Custom_HID_ReportDesc[USBD_CUSTOM_HID_REPORT_DESC_SIZE] __ALIGN_END =
{
0x06, 0x00, 0xff, // USAGE_PAGE (Vendor Defined Page 1)
0x09, 0x01, // USAGE (Vendor Usage 1)
0xa1, 0x01, // COLLECTION (Application)
0x09, 0x01, // USAGE (Vendor Usage 1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x95, 0x40, // REPORT_COUNT (64)
0x75, 0x08, // REPORT_SIZE (8)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x09, 0x01, // USAGE (Vendor Usage 1)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (255)
0x95, 0x40, // REPORT_COUNT (64)
0x75, 0x08, // REPORT_SIZE (8)
0x91, 0x02, // OUTPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
}
Также в USBD_HID_Setup() надо подправить запрос этого дескриптора:
Код
case USB_REQ_GET_DESCRIPTOR:
if( req->wValue >> 8 == HID_REPORT_DESC)
{
len = MIN(sizeof(Custom_HID_ReportDesc) , req->wLength);
pbuf = Custom_HID_ReportDesc;
}
else if( req->wValue >> 8 == HID_DESCRIPTOR_TYPE)
{
pbuf = USBD_HID_Desc;
len = MIN(sizeof(USBD_HID_Desc), req->wLength);
}
У меня, правда, и после всего этого он по-прежнему определялся мышкой - что-то где-то виндовс закэшировал. Не стал заморачиваться, просто увеличил PID (define USBD_PID_FS) на единичку.
Update.
Ещё надо увеличить
Код
#define USBD_CUSTOMHID_OUTREPORT_BUF_SIZE 64
и в USBD_HID_Setup() (или, скорее, USBD_CUSTOM_HID_Setup() ) дописать обработчик GET_REPORT. Простейший (эхо):
Код
case HID_REQ_SET_REPORT:
hhid->IsReportAvailable = 1;
USBD_CtlPrepareRx (pdev, hhid->Report_buf, req->wLength);
break;
case HID_REQ_GET_REPORT:
USBD_CtlSendData (pdev, hhid->Report_buf, req->wLength);
break;