Чтобы говорить конкретнее, вот один из примеров. Этот дескриптор работает:
Код
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH (57) /* total length of report descriptor */
#define USB_HID_REPORT_SIZE 7
static uchar reportBuffer[USB_HID_REPORT_SIZE]; /* buffer for HID reports */
const char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] PROGMEM =
{
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x09, 0x04, // USAGE (Joystick)
0xa1, 0x01, // COLLECTION (Application)
0x85, 0x01, // REPORT_ID (1)
0x09, 0x01, // USAGE (Pointer)
0xa1, 0x00, // COLLECTION (Physical)
0x09, 0x30, // USAGE (X)
0x09, 0x31, // USAGE (Y)
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x02, // REPORT_COUNT (2)
0x81, 0x02, // INPUT (Data,Var,Abs)
0x05, 0x02, // USAGE_PAGE (Simulation Controls)
0x09, 0xba, // USAGE (Rudder)
0x09, 0xbb, // USAGE (Throttle)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0, // END_COLLECTION
0x16, 0x01, 0xfe, // LOGICAL_MINIMUM (-511) <------------
0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x09, 0x36, // USAGE (Slider)
0x09, 0x37, // USAGE (Dial)
0x15, 0x81, // LOGICAL_MINIMUM (-127)
0x25, 0x7f, // LOGICAL_MAXIMUM (127)
0x75, 0x08, // REPORT_SIZE (8)
0x95, 0x02, // REPORT_COUNT (2)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
};
Достаточно убрать ненужный совершенно
Код
0x16, 0x01, 0xfe, // LOGICAL_MINIMUM (-511) <------------
и соответственно подправить длину дескриптора с
Код
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH (57) /* total length of report descriptor */
на
Код
#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH (54) /* total length of report descriptor */
и всё.
Может, кто видит в этом криминал, типа там, выравнивание на границу слова или т.п.? Если да, то какой именно? У меня уже идей нет, двое суток непрерывно долбаюсь с таким моментом, которого вообще, по идее, и быть не должно.