| 楼上的正解。 我本想把圈圈的源码发上来,但怕侵犯圈圈的权利。
 我把我修改的部分发上来吧。用的是“多Collection的方式,用Report ID区分”这种。
 在custom hid例子上修改的。
 
 
 const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
 {
 0x05, 0x8c,            /* USAGE_PAGE (ST Page)           */
 0x09, 0x01,            /* USAGE (Demo Kit)               */
 0xa1, 0x01,            /* COLLECTION (Application)       */
 /* 6 */
 
 /* Led 1 */
 0x85, 0x01,            /*     REPORT_ID (1)                     */
 0x09, 0x01,            /*     USAGE (LED 1)                     */
 0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */
 0x25, 0x01,            /*     LOGICAL_MAXIMUM (1)        */
 0x75, 0x08,            /*     REPORT_SIZE (8)            */
 0x95, 0x01,            /*     REPORT_COUNT (1)           */    //一个 字节
 0xB1, 0x82,             /*    FEATURE (Data,Var,Abs,Vol) */
 
 0x85, 0x01,            /*     REPORT_ID (1)              */    //上面是定义,下面使用?
 0x09, 0x01,            /*     USAGE (LED 1)              */
 0x91, 0x82,            /*     OUTPUT (Data,Var,Abs,Vol)  */   //PC->dev
 /* 26 */
 
 /* Led 2 */
 0x85, 0x02,            /*     REPORT_ID 2                     */
 0x09, 0x02,            /*     USAGE (LED 2)                     */
 0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */
 0x25, 0x01,            /*     LOGICAL_MAXIMUM (1)        */
 0x75, 0x08,            /*     REPORT_SIZE (8)            */
 0x95, 0x01,            /*     REPORT_COUNT (1)           */
 0xB1, 0x82,             /*    FEATURE (Data,Var,Abs,Vol) */
 
 0x85, 0x02,            /*     REPORT_ID (2)              */
 0x09, 0x02,            /*     USAGE (LED 2)              */
 0x91, 0x82,            /*     OUTPUT (Data,Var,Abs,Vol)  */
 /* 46 */
 
 /* Led 3 */
 0x85, 0x03,            /*     REPORT_ID (3)                     */
 0x09, 0x03,            /*     USAGE (LED 3)                     */
 0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */
 0x25, 0x01,            /*     LOGICAL_MAXIMUM (1)        */
 0x75, 0x08,            /*     REPORT_SIZE (8)            */
 0x95, 0x01,            /*     REPORT_COUNT (1)           */
 0xB1, 0x82,             /*    FEATURE (Data,Var,Abs,Vol) */
 
 0x85, 0x03,            /*     REPORT_ID (3)              */
 0x09, 0x03,            /*     USAGE (LED 3)              */
 0x91, 0x82,            /*     OUTPUT (Data,Var,Abs,Vol)  */
 /* 66 */
 
 /* Led 4 */
 0x85, 0x04,            /*     REPORT_ID 4)                     */
 0x09, 0x04,            /*     USAGE (LED 4)                     */
 0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */
 0x25, 0x01,            /*     LOGICAL_MAXIMUM (1)        */
 0x75, 0x08,            /*     REPORT_SIZE (8)            */
 0x95, 0x01,            /*     REPORT_COUNT (1)           */
 0xB1, 0x82,            /*     FEATURE (Data,Var,Abs,Vol) */
 
 0x85, 0x04,            /*     REPORT_ID (4)              */
 0x09, 0x04,            /*     USAGE (LED 4)              */
 0x91, 0x82,            /*     OUTPUT (Data,Var,Abs,Vol)  */
 /* 86 */
 
 /* key Push Button */
 0x85, 0x05,            /*     REPORT_ID (5)              */
 0x09, 0x05,            /*     USAGE (Push Button)        */
 0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */
 0x25, 0x01,            /*     LOGICAL_MAXIMUM (1)        */
 0x75, 0x01,            /*     REPORT_SIZE (1)            */
 0x81, 0x82,            /*     INPUT (Data,Var,Abs,Vol)   */   //输出1位按键信号
 
 0x09, 0x05,            /*     USAGE (Push Button)        */
 0x75, 0x01,            /*     REPORT_SIZE (1)            */
 0xb1, 0x82,            /*     FEATURE (Data,Var,Abs,Vol) */  //上面定义,下面使用,输出到pc1位有效信号
 
 0x75, 0x07,            /*     REPORT_SIZE (7)            */
 0x81, 0x83,            /*     INPUT (Cnst,Var,Abs,Vol)   */    //输出7位无效信号,凑满1字节
 0x85, 0x05,            /*     REPORT_ID (5)              */
 
 0x75, 0x07,            /*     REPORT_SIZE (7)            */
 0xb1, 0x83,            /*     FEATURE (Cnst,Var,Abs,Vol) */
 /* 114 */
 
 /* Tamper Push Button */
 0x85, 0x06,            /*     REPORT_ID (6)              */
 0x09, 0x06,            /*     USAGE (Tamper Push Button) */
 0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */
 0x25, 0x01,            /*     LOGICAL_MAXIMUM (1)        */
 0x75, 0x01,            /*     REPORT_SIZE (1)            */
 0x81, 0x82,            /*     INPUT (Data,Var,Abs,Vol)   */
 
 0x09, 0x06,            /*     USAGE (Tamper Push Button) */
 0x75, 0x01,            /*     REPORT_SIZE (1)            */
 0xb1, 0x82,            /*     FEATURE (Data,Var,Abs,Vol) */
 
 0x75, 0x07,            /*     REPORT_SIZE (7)            */
 0x81, 0x83,            /*     INPUT (Cnst,Var,Abs,Vol)   */
 0x85, 0x06,            /*     REPORT_ID (6)              */
 
 0x75, 0x07,            /*     REPORT_SIZE (7)            */
 0xb1, 0x83,            /*     FEATURE (Cnst,Var,Abs,Vol) */
 /* 142 */
 
 /* ADC IN */
 0x85, 0x07,            /*     REPORT_ID (7)              */
 0x09, 0x07,            /*     USAGE (ADC IN)             */
 0x15, 0x00,            /*     LOGICAL_MINIMUM (0)        */
 0x26, 0xff, 0x00,      /*     LOGICAL_MAXIMUM (255)      */
 0x75, 0x08,            /*     REPORT_SIZE (8)            */
 0x81, 0x82,            /*     INPUT (Data,Var,Abs,Vol)   */
 0x85, 0x07,            /*     REPORT_ID (7)              */
 0x09, 0x07,            /*     USAGE (ADC in)             */
 0xb1, 0x82,            /*     FEATURE (Data,Var,Abs,Vol) */
 /* 161 */
 
 0xc0,                   /*     END_COLLECTION                     */
 //--------按键部分---------------------------------------------------------
 /* offset 162  */
 0x05, 0x01, // USAGE_PAGE (Generic Desktop)
 0x09, 0x06, // USAGE (Keyboard)
 0xa1, 0x01, // COLLECTION (Application)
 0x85, 0x08,            /*     REPORT_ID (8)              */
 
 /* offset 170  */
 0x05, 0x07, //     USAGE_PAGE (Keyboard/Keypad)
 
 0x19, 0xe0, //     USAGE_MINIMUM (Keyboard LeftControl) LCtrl,LShift,LAlt,LGUI,RCtrl,RShift,RAlt,RGUI
 0x29, 0xe7, //     USAGE_MAXIMUM (Keyboard Right GUI)//总共是8个按键0xe0~0xe7
 0x15, 0x00, //     LOGICAL_MINIMUM (0)
 0x25, 0x01, //     LOGICAL_MAXIMUM (1)
 /* offset 180  */
 0x95, 0x08, //     REPORT_COUNT (8)
 0x75, 0x01, //     REPORT_SIZE (1)     //单位为bit
 0x81, 0x02, //     INPUT (Data,Var,Abs)    //to PC 一个字节(1st)控制键部分
 
 0x95, 0x01, //     REPORT_COUNT (1)
 0x75, 0x08, //     REPORT_SIZE (8)
 /* offset 190  */
 
 0x81, 0x03, //     INPUT (Cnst,Var,Abs)    //to pc 一个字节(2nd)
 
 0x95, 0x06, //   REPORT_COUNT (6)         //to pc 6个字节(3rd~8th)
 0x75, 0x08, //   REPORT_SIZE (8)
 0x25, 0xFF, //   LOGICAL_MAXIMUM (255)
 0x19, 0x00, //   USAGE_MINIMUM (Reserved (no event indicated))
 /* offset 200  */
 0x29, 0x65, //   USAGE_MAXIMUM (Keyboard Application)
 0x81, 0x00, //     INPUT (Data,Ary,Abs)
 
 0x25, 0x01, //   LOGICAL_MAXIMUM (1)//大小写等led部分,需要
 0x95, 0x02, //   REPORT_COUNT (2)
 0x75, 0x01, //   REPORT_SIZE (1)
 /* offset 210  */
 0x05, 0x08, //   USAGE_PAGE (LEDs)
 
 0x19, 0x01, //   USAGE_MINIMUM (Num Lock)
 0x29, 0x02, //   USAGE_MAXIMUM (Caps Lock)
 0x91, 0x02, //   OUTPUT (Data,Var,Abs) //2位有效信号led
 0x95, 0x01, //   REPORT_COUNT (1)
 /* offset 220  */
 0x75, 0x06, //   REPORT_SIZE (6)
 0x91, 0x03, //   OUTPUT (Cnst,Var,Abs)  //剩下的6位,补足1字节
 
 0xc0        // END_COLLECTION
 /* offset 225  */
 
 }; /* CustomHID_ReportDescriptor */
 |