Usb 简单操纵杆hid报告描述符不';行不通

Usb 简单操纵杆hid报告描述符不';行不通,usb,report,hid,joystick,usb-descriptor,Usb,Report,Hid,Joystick,Usb Descriptor,使用atmega8芯片和V-USB库,我制作了一个小桥,将我的NES gamepad连接到USB。起初,我使用一个示例作为我的hid描述符,所以。。。 当我将我的设备设置为与此握手时,它在Windows中被正确识别 HID报告描述符 PROGMEM const char usbHidReportDescriptor[100] = { 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x15, 0x00,

使用atmega8芯片和V-USB库,我制作了一个小桥,将我的NES gamepad连接到USB。起初,我使用一个示例作为我的hid描述符,所以。。。 当我将我的设备设置为与此握手时,它在Windows中被正确识别 HID报告描述符

PROGMEM const char usbHidReportDescriptor[100] = {
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x15, 0x00,                    // LOGICAL_MINIMUM (0)
    0x09, 0x04,                    // USAGE (Joystick)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x05, 0x02,                    //   USAGE_PAGE (Simulation Controls)
    0x09, 0xbb,                    //   USAGE (Throttle)
    0x15, 0x81,                    //   LOGICAL_MINIMUM (-127)
    0x25, 0x7f,                    //   LOGICAL_MAXIMUM (127)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x05, 0x01,                    //   USAGE_PAGE (Generic Desktop)
    0x09, 0x01,                    //   USAGE (Pointer)
    0xa1, 0x00,                    //   COLLECTION (Physical)
    0x09, 0x30,                    //     USAGE (X)
    0x09, 0x31,                    //     USAGE (Y)
    0x95, 0x02,                    //     REPORT_COUNT (2)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
    0xc0,                          //   END_COLLECTION
    0x09, 0x39,                    //   USAGE (Hat switch)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x03,                    //   LOGICAL_MAXIMUM (3)
    0x35, 0x00,                    //   PHYSICAL_MINIMUM (0)
    0x46, 0x0e, 0x01,              //   PHYSICAL_MAXIMUM (270)
    0x65, 0x14,                    //   UNIT (Eng Rot:Angular Pos)
    0x75, 0x04,                    //   REPORT_SIZE (4)
    0x95, 0x01,                    //   REPORT_COUNT (1)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0x05, 0x09,                    //   USAGE_PAGE (Button)
    0x19, 0x01,                    //   USAGE_MINIMUM (Button 1)
    0x29, 0x04,                    //   USAGE_MAXIMUM (Button 4)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
0x95, 0x04,                    //   REPORT_COUNT (4)
0x55, 0x00,                    //   UNIT_EXPONENT (0)
0x65, 0x00,                    //   UNIT (None)
0x81, 0x02,                    //   INPUT (Data,Var,Abs)
0xc0                           // END_COLLECTION
};
和此报告类型

typedef struct{
    char    throttle;
    char    x;
    char    y;
    uchar    hatSwitchAndButtons;
}report_t;
但当我把它简化时:

PROGMEM const char usbHidReportDescriptor[48] =  {
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x04,                    // USAGE (Joystick)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x15, 0x81,                    //   LOGICAL_MINIMUM (-127)
    0x25, 0x7f,                    //   LOGICAL_MAXIMUM (127)
    0x05, 0x01,                    //   USAGE_PAGE (Generic Desktop)
    0x09, 0x01,                    //   USAGE (Pointer)
    0xa1, 0x00,                    //   COLLECTION (Physical)
    0x09, 0x30,                    //     USAGE (X)
    0x09, 0x31,                    //     USAGE (Y)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x02,                    //     REPORT_COUNT (2)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
    0xc0,                          //   END_COLLECTION
    0x05, 0x09,                    //   USAGE_PAGE (Button)
    0x19, 0x01,                    //   USAGE_MINIMUM (Button 1)
    0x29, 0x04,                    //   USAGE_MAXIMUM (Button 8)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x04,                    //   REPORT_COUNT (8)
    0x55, 0x00,                    //   UNIT_EXPONENT (0)
    0x65, 0x00,                    //   UNIT (None)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0xc0                           // END_COLLECTION
};

typedef struct{
    char    x;
    char    y;
    uchar    buttons;
}report_t;
Windows无法安装我的操纵杆。它仍能识别其名称,但无法完成安装

我很困惑,因为USB Hid工具验证了这个报告描述符

有什么想法吗

0x29, 0x04,                    //   USAGE_MAXIMUM (Button 8)
0x95, 0x04,                    //   REPORT_COUNT (8)
哦,看起来像是有人在用注释编程。:) 将0x04更改为0x08。并观察,以便每个报告大小可以被8(8、16、24、32等)分隔