I have problem when i use nRF52840 to make a touchpad

Hello,

I have made a PCB has 4 buttons and touchpad, now I want to drive all of them.


1. one button for left button of mouse.
2. one button for right button of mouse.
3. one button for copy compose key(CTRL + C) of keyboard.
4. the last button for paste compose key (CTRL + V) of keyboard.
5. touchpad

So I make a report descriptor to mix all of them, this report descriptor is total 615 bytes. I show it in the end. 
However, it couldn't run. I tracked that it returned an error code [12] after executing ble_hids_init();
So is it the report descriptor is too bit to cause the above problems? And what should I do to solve this problems?

Thanks!

#define APP_USBD_HID_DEVICE_REPORT_DSC() { \
/** TOUCH PAD input TLC  +8 */ \
    0x05, 0x0d,                         /** USAGE_PAGE (Digitizers) */ \
    0x09, 0x05,                         /** USAGE (Touch Pad) */ \
    0xa1, 0x01,                         /** COLLECTION (Application) */ \
    0x85, REPORT_ID_PTP,               /**   REPORT_ID (Touch pad) */ \
 \
	/** 1st finger  73 */  \
	0x05, 0x0d, 						/** USAGE_PAGE (Digitizers) */  \
    0x09, 0x22,                         /**   USAGE (Finger) */  \
    0xa1, 0x02,                         /**   COLLECTION (Logical)  */  \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */  \
    0x25, 0x01,                         /**       LOGICAL_MAXIMUM (1) */  \
    0x09, 0x47,                         /**       USAGE (Confidence) */  \
    0x09, 0x42,                         /**       USAGE (Tip switch) */  \
    0x95, 0x02,                         /**       REPORT_COUNT (2) */  \
    0x75, 0x01,                         /**       REPORT_SIZE (1) */  \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x95, 0x01,                         /**       REPORT_COUNT (1) */ \
    0x75, 0x02,                         /**       REPORT_SIZE (3) */ \
    0x25, 0x02,                         /**       LOGICAL_MAXIMUM (2) */ \
    0x09, 0x51,                         /**       USAGE (Contact Identifier) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x75, 0x01,                         /**       REPORT_SIZE (1) */ \
    0x95, 0x04,                         /**       REPORT_COUNT (3) */ \
    0x81, 0x03,                         /**       INPUT (Cnst,Var,Abs) */ \
    0x05, 0x01,                         /**       USAGE_PAGE (Generic Desk.. */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x26, 0x13, 0x0f,                   /**       LOGICAL_MAXIMUM (4095)  //3859 */ \
    0x75, 0x10,                         /**       REPORT_SIZE (16) */ \
    0x55, 0x0e,                         /**       UNIT_EXPONENT (-2) */ \
    0x65, 0x13,                         /**       UNIT(Inch,EngLinear) */ \
    0x09, 0x30,                         /**       USAGE (X) */ \
    0x35, 0x00,                         /**       PHYSICAL_MINIMUM (0) */ \
    0x46, 0xad, 0x01,                   /**       PHYSICAL_MAXIMUM (429,4.29inch)   800=0x0320 */ \
    0x95, 0x01,                         /**       REPORT_COUNT (1) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x46, 0xD8, 0x00,                   /**       PHYSICAL_MAXIMUM (216,2.16inch)  0x0226 */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x26, 0xe3, 0x07,                   /**       LOGICAL_MAXIMUM (2019) */ \
    0x09, 0x31,                         /**       USAGE (Y) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0xc0,                               /**    END_COLLECTION */ \
     \
   /** 2nd   73 */ \
	0x05, 0x0d, 						/** USAGE_PAGE (Digitizers) */ \
    0x09, 0x22,                         /**   USAGE (Finger) */ \
    0xa1, 0x02,                         /**   COLLECTION (Logical)  */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x25, 0x01,                         /**       LOGICAL_MAXIMUM (1) */ \
    0x09, 0x47,                         /**       USAGE (Confidence) */ \
    0x09, 0x42,                         /**       USAGE (Tip switch) */ \
    0x95, 0x02,                         /**       REPORT_COUNT (2) */ \
    0x75, 0x01,                         /**       REPORT_SIZE (1) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x95, 0x01,                         /**       REPORT_COUNT (1) */ \
    0x75, 0x02,                         /**       REPORT_SIZE (3) */ \
    0x25, 0x02,                         /**       LOGICAL_MAXIMUM (2) */ \
    0x09, 0x51,                         /**       USAGE (Contact Identifier) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x75, 0x01,                         /**       REPORT_SIZE (1) */ \
    0x95, 0x04,                         /**       REPORT_COUNT (3) */ \
    0x81, 0x03,                         /**       INPUT (Cnst,Var,Abs) */ \
    0x05, 0x01,                         /**       USAGE_PAGE (Generic Desk.. */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x26, 0x13, 0x0f,                   /**       LOGICAL_MAXIMUM (4095) */ \
    0x75, 0x10,                         /**       REPORT_SIZE (16) */ \
    0x55, 0x0e,                         /**       UNIT_EXPONENT (-2) */ \
    0x65, 0x13,                         /**       UNIT(Inch,EngLinear) */ \
    0x09, 0x30,                         /**       USAGE (X) */ \
    0x35, 0x00,                         /**       PHYSICAL_MINIMUM (0) */ \
    0x46, 0xad, 0x01,                   /**       PHYSICAL_MAXIMUM (429,4.29inch)   800=0x0320 */ \
    0x95, 0x01,                         /**       REPORT_COUNT (1) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x46, 0xD8, 0x00,                   /**       PHYSICAL_MAXIMUM (216,2.16inch)  0x0226 */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x26, 0xa0, 0x07,                   /**       LOGICAL_MAXIMUM (1952) */ \
    0x09, 0x31,                         /**       USAGE (Y) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
	0xc0,								/**       END_COLLECTION */ \
 \
    /** 3   73  */ \
	0x05, 0x0d, 						/** USAGE_PAGE (Digitizers) */ \
    0x09, 0x22,                         /**   USAGE (Finger) */ \
    0xa1, 0x02,                         /**   COLLECTION (Logical)  */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x25, 0x01,                         /**       LOGICAL_MAXIMUM (1) */ \
    0x09, 0x47,                         /**       USAGE (Confidence) */ \
    0x09, 0x42,                         /**       USAGE (Tip switch) */ \
    0x95, 0x02,                         /**       REPORT_COUNT (2) */ \
    0x75, 0x01,                         /**       REPORT_SIZE (1) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x95, 0x01,                         /**       REPORT_COUNT (1) */ \
    0x75, 0x02,                         /**       REPORT_SIZE (3) */ \
    0x25, 0x02,                         /**       LOGICAL_MAXIMUM (2) */ \
    0x09, 0x51,                         /**       USAGE (Contact Identifier) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x75, 0x01,                         /**       REPORT_SIZE (1) */ \
    0x95, 0x04,                         /**       REPORT_COUNT (3) */ \
    0x81, 0x03,                         /**       INPUT (Cnst,Var,Abs) */ \
    0x05, 0x01,                         /**       USAGE_PAGE (Generic Desk.. */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x26, 0x13, 0x0f,                   /**       LOGICAL_MAXIMUM (4095) */ \
    0x75, 0x10,                         /**       REPORT_SIZE (16) */ \
    0x55, 0x0e,                         /**       UNIT_EXPONENT (-2) */ \
    0x65, 0x13,                         /**       UNIT(Inch,EngLinear) */ \
    0x09, 0x30,                         /**       USAGE (X) */ \
    0x35, 0x00,                         /**       PHYSICAL_MINIMUM (0) */ \
    0x46, 0xad, 0x01,                   /**       PHYSICAL_MAXIMUM (429,4.29inch)   800=0x0320 */ \
    0x95, 0x01,                         /**       REPORT_COUNT (1) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x46, 0xD8, 0x00,                   /**       PHYSICAL_MAXIMUM (216,2.16inch)  0x0226 */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x26, 0xa0, 0x07,                   /**       LOGICAL_MAXIMUM (1952) */ \
    0x09, 0x31,                         /**       USAGE (Y) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0xc0,								/**       END_COLLECTION */ \
     \
    /** 4    73 */ \
	0x05, 0x0d, 						/** USAGE_PAGE (Digitizers) */ \
    0x09, 0x22,                         /**   USAGE (Finger) */ \
    0xa1, 0x02,                         /**   COLLECTION (Logical)      */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x25, 0x01,                         /**       LOGICAL_MAXIMUM (1) */ \
    0x09, 0x47,                         /**       USAGE (Confidence) */ \
    0x09, 0x42,                         /**       USAGE (Tip switch) */ \
    0x95, 0x02,                         /**       REPORT_COUNT (2) */ \
    0x75, 0x01,                         /**       REPORT_SIZE (1) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x95, 0x01,                         /**       REPORT_COUNT (1) */ \
    0x75, 0x02,                         /**       REPORT_SIZE (3) */ \
    0x25, 0x02,                         /**       LOGICAL_MAXIMUM (2) */ \
    0x09, 0x51,                         /**       USAGE (Contact Identifier) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x75, 0x01,                         /**       REPORT_SIZE (1) */ \
    0x95, 0x04,                         /**       REPORT_COUNT (3) */ \
    0x81, 0x03,                         /**       INPUT (Cnst,Var,Abs) */ \
    0x05, 0x01,                         /**       USAGE_PAGE (Generic Desk.. */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x26, 0x13, 0x0f,                   /**       LOGICAL_MAXIMUM (4095) */ \
    0x75, 0x10,                         /**       REPORT_SIZE (16) */ \
    0x55, 0x0e,                         /**       UNIT_EXPONENT (-2) */ \
    0x65, 0x13,                         /**       UNIT(Inch,EngLinear) */ \
    0x09, 0x30,                         /**       USAGE (X) */ \
    0x35, 0x00,                         /**       PHYSICAL_MINIMUM (0) */ \
    0x46, 0xad, 0x01,                   /**       PHYSICAL_MAXIMUM (429,4.29inch)   800=0x0320 */ \
    0x95, 0x01,                         /**       REPORT_COUNT (1) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x46, 0xD8, 0x00,                   /**       PHYSICAL_MAXIMUM (216,2.16inch)  0x0226 */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x26, 0xa0, 0x07,                   /**       LOGICAL_MAXIMUM (1952) */ \
    0x09, 0x31,                         /**       USAGE (Y) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0xc0,								/**    END_COLLECTION */ \
     \
    /** 5  73 */ \
	0x05, 0x0d, 						/** USAGE_PAGE (Digitizers) */ \
    0x09, 0x22,                         /**   USAGE (Finger) */ \
    0xa1, 0x02,                         /**   COLLECTION (Logical)     */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x25, 0x01,                         /**       LOGICAL_MAXIMUM (1) */ \
    0x09, 0x47,                         /**       USAGE (Confidence) */ \
    0x09, 0x42,                         /**       USAGE (Tip switch) */ \
    0x95, 0x02,                         /**       REPORT_COUNT (2) */ \
    0x75, 0x01,                         /**       REPORT_SIZE (1) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x95, 0x01,                         /**       REPORT_COUNT (1) */ \
    0x75, 0x02,                         /**       REPORT_SIZE (3) */ \
    0x25, 0x02,                         /**       LOGICAL_MAXIMUM (2) */ \
    0x09, 0x51,                         /**       USAGE (Contact Identifier) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x75, 0x01,                         /**       REPORT_SIZE (1) */ \
    0x95, 0x04,                         /**       REPORT_COUNT (3) */ \
    0x81, 0x03,                         /**       INPUT (Cnst,Var,Abs) */ \
    0x05, 0x01,                         /**       USAGE_PAGE (Generic Desk.. */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x26, 0x13, 0x0f,                   /**       LOGICAL_MAXIMUM (4095) */ \
    0x75, 0x10,                         /**       REPORT_SIZE (16) */ \
    0x55, 0x0e,                         /**       UNIT_EXPONENT (-2) */ \
    0x65, 0x13,                         /**       UNIT(Inch,EngLinear) */ \
    0x09, 0x30,                         /**       USAGE (X) */ \
    0x35, 0x00,                         /**       PHYSICAL_MINIMUM (0) */ \
    0x46, 0xad, 0x01,                   /**       PHYSICAL_MAXIMUM (429,4.29inch)   800=0x0320 */ \
    0x95, 0x01,                         /**       REPORT_COUNT (1) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
    0x46, 0xD8, 0x00,                   /**       PHYSICAL_MAXIMUM (216,2.16inch)  0x0226 */ \
    0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ \
    0x26, 0xa0, 0x07,                   /**       LOGICAL_MAXIMUM (1952) */ \
    0x09, 0x31,                         /**       USAGE (Y) */ \
    0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ \
	0xc0,								/**    END_COLLECTION */ \
 \
/**  scan time& buttons. end input. +57 */ \
    0x05, 0x0d, 						/** USAGE_PAGE (Digitizers) */ \
    0x55, 0x0C,                         /**    UNIT_EXPONENT (-4) */ \
    0x66, 0x01, 0x10,                   /**    UNIT (Seconds) */ \
    0x47, 0xff, 0xff, 0x00, 0x00,      /**     PHYSICAL_MAXIMUM (65535) */ \
    0x27, 0xff, 0xff, 0x00, 0x00,         /**  LOGICAL_MAXIMUM (65535) */ \
    0x75, 0x10,                           /**  REPORT_SIZE (16) */ \
    0x95, 0x01,                           /**  REPORT_COUNT (1) */ \
    0x05, 0x0d,                         /**    USAGE_PAGE (Digitizers) */ \
    0x09, 0x56,                         /**    USAGE (Scan Time) */ \
    0x81, 0x02,                           /**  INPUT (Data,Var,Abs) */ \
    0x09, 0x54,                         /**    USAGE (Contact count) */ \
    0x25, 0x7f,                           /**  LOGICAL_MAXIMUM (127) */ \
    0x95, 0x01,                         /**    REPORT_COUNT (1) */ \
    0x75, 0x08,                         /**    REPORT_SIZE (8) */ \
    0x81, 0x02,                         /**    INPUT (Data,Var,Abs) */ \
    0x05, 0x09,                         /**    USAGE_PAGE (Button) */ \
    0x09, 0x01,                         /**    USAGE_(Button 1) */ \
    0x09, 0x02,                         /**    USAGE_(Button 2) */ \
    0x09, 0x03,                         /**    USAGE_(Button 3) */ \
    0x25, 0x01,                         /**    LOGICAL_MAXIMUM (1) */ \
    0x75, 0x01,                         /**    REPORT_SIZE (1) */ \
    0x95, 0x03,                         /**    REPORT_COUNT (3) */ \
    0x81, 0x02,                         /**    INPUT (Data,Var,Abs) */ \
    0x95, 0x05,                          /**   REPORT_COUNT (5) */ \
    0x81, 0x03,                         /**    INPUT (Cnst,Var,Abs) */ \
 \
/**  PTPHQA.  Feature reprot. +36 */ \
    0x05, 0x0d,                         /**    USAGE_PAGE (Digitizer) */ \
    0x85, REPORT_ID_CONTACT_NUM,            /**   REPORT_ID (Feature) */ \
    0x09, 0x55,                         /**    USAGE (Contact Count Maximum) */ \
    0x09, 0x59,                         /**    USAGE (Pad TYpe) */ \
    0x75, 0x04,                         /**    REPORT_SIZE (4) */ \
    0x95, 0x02,                         /**    REPORT_COUNT (2) */ \
    0x25, 0x0f,                         /**    LOGICAL_MAXIMUM (15) */ \
    0xb1, 0x02,                         /**    FEATURE (Data,Var,Abs) */ \
    0x06, 0x00, 0xff,                   /**    USAGE_PAGE (Vendor Defined) */ \
    0x85, REPORT_ID_PTPHQA,               /**    REPORT_ID (PTPHQA) */ \
    0x09, 0xC5,                         /**    USAGE (Vendor Usage 0xC5) */ \
    0x15, 0x00,                         /**    LOGICAL_MINIMUM (0) */ \
    0x26, 0xff, 0x00,                   /**    LOGICAL_MAXIMUM (0xff) */ \
    0x75, 0x08,                         /**    REPORT_SIZE (8) */ \
    0x96, 0x00, 0x01,                   /**    REPORT_COUNT (0x100 (256)) */ \
    0xb1, 0x02,                         /**    FEATURE (Data,Var,Abs) */ \
    0xc0,                               /** END_COLLECTION */ \
 \
    /** CONFIG TLC  +49 */ \
    0x05, 0x0d,                         /**    USAGE_PAGE (Digitizer) */ \
    0x09, 0x0E,                         /**    USAGE (Configuration) */ \
    0xa1, 0x01,                         /**   COLLECTION (Application) */ \
    0x85, REPORT_ID_CONFIG,             /**   REPORT_ID (Feature) from host to device.  3:touchpad.  0:mouse.  */ \
    0x09, 0x22,                         /**   USAGE (Finger) */ \
    0xa1, 0x02,                         /**   COLLECTION (logical) */ \
    0x09, 0x52,                         /**    USAGE (Input Mode) */ \
    0x15, 0x00,                         /**    LOGICAL_MINIMUM (0) */ \
    0x25, 0x0a,                         /**    LOGICAL_MAXIMUM (10) */ \
    0x75, 0x08,                         /**    REPORT_SIZE (8) */ \
    0x95, 0x01,                         /**    REPORT_COUNT (1) */ \
    0xb1, 0x02,                         /**    FEATURE (Data,Var,Abs */ \
    0xc0,                               /**   END_COLLECTION */ \
    0x09, 0x22,                         /**   USAGE (Finger) */ \
    0xa1, 0x00,                         /**   COLLECTION (physical) */ \
    0x85, REPORT_ID_SWITCH,     /**     REPORT_ID (Feature) */ \
    0x09, 0x57,                         /**     USAGE(Surface switch) */ \
    0x09, 0x58,                         /**     USAGE(Button switch) */ \
    0x75, 0x01,                         /**     REPORT_SIZE (1) */ \
    0x95, 0x02,                         /**     REPORT_COUNT (2) */ \
    0x25, 0x01,                         /**     LOGICAL_MAXIMUM (1) */ \
    0xb1, 0x02,                         /**     FEATURE (Data,Var,Abs) */ \
    0x95, 0x06,                         /**     REPORT_COUNT (6) */ \
    0xb1, 0x03,                         /**     FEATURE (Cnst,Var,Abs) */ \
    0xc0,                               /**   END_COLLECTION */ \
    0xc0,                               /** END_COLLECTION */ \
 \
    /** MOUSE TLC-------------48. */ \
    0x05, 0x01,                         /** USAGE_PAGE (Generic Desktop) */ \
    0x09, 0x02,                         /** USAGE (Mouse) */ \
    0xa1, 0x01,                         /** COLLECTION (Application) */ \
    0x85, REPORT_ID_MOUSE,               /**   REPORT_ID (Mouse) */ \
    0x09, 0x01,                         /**   USAGE (Pointer) */ \
    0xa1, 0x00,                         /**   COLLECTION (Physical) */ \
    0x05, 0x09,                         /**     USAGE_PAGE (Button) */ \
    0x19, 0x01,                         /**     USAGE_MINIMUM (Button 1) */ \
    0x29, 0x05,                         /**     USAGE_MAXIMUM (Button 2)  */ \
    0x25, 0x01,                         /**     LOGICAL_MAXIMUM (1) */ \
    0x75, 0x01,                         /**     REPORT_SIZE (1) */ \
    0x95, 0x05,                         /**     REPORT_COUNT (5) */ \
    0x81, 0x02,                         /**     INPUT (Data,Var,Abs) */ \
    0x75, 0x01,                         /**     REPORT_SIZE (1) */ \
    0x95, 0x03,                         /**     REPORT_COUNT (3) */ \
    0x81, 0x03,                         /**     INPUT (Data,Var,Abs)   */ \
    0x05, 0x01,                         /**     USAGE_PAGE (Generic Desktop) */ \
    0x09, 0x30,                         /**     USAGE (X) */ \
    0x09, 0x31,                         /**     USAGE (Y) */ \
    0x75, 0x10,                         /**     REPORT_SIZE (16) */ \
    0x95, 0x02,                         /**     REPORT_COUNT (2) */ \
    0x25, 0x0a,                          /**    LOGICAL_MAXIMUM (10) */ \
    0x81, 0x06,                         /**     INPUT (Data,Var,Rel) */ \
    0xc0,                               /**   END_COLLECTION */ \
    0xc0,                                /** END_COLLECTION */ \
 \
/** ---------FOR KEYBOARD----52 */ \
/* USAGE_PAGE                              */ 0x05u, 0x01u,  \
/* USAGE                                   */ 0x09u, 0x06u,  \
/* COLLECTION                              */ 0xA1u, 0x01u,  \
/* REPORT_ID                               */ 0x85u, REPORT_ID_KEYBOARD,  \
/* USAGE_PAGE                              */ 0x05u, 0x07u,  \
/* USAGE_MINIMUM                           */ 0x19u, 0xE0u,  \
/* USAGE_MAXIMUM                           */ 0x29u, 0xE7u,  \
/* LOGICAL_MINIMUM                         */ 0x15u, 0x00u,  \
/* LOGICAL_MAXIMUM                         */ 0x25u, 0x01u,  \
/* REPORT_SIZE                             */ 0x75u, 0x01u,  \
/* REPORT_COUNT                            */ 0x95u, 0x08u,  \
/* INPUT                                   */ 0x81u, 0x02u,  \
/* USAGE_PAGE                              */ 0x06u, 0x00u, 0xFFu,  \
/* USAGE                                   */ 0x09u, 0x02u,  \
/* REPORT_SIZE                             */ 0x75u, 0x08u,  \
/* REPORT_COUNT                            */ 0x95u, 0x01u,  \
/* INPUT                                   */ 0x81u, 0x02u,  \
/* USAGE_PAGE                              */ 0x05u, 0x07u,  \
/* USAGE_MINIMUM                           */ 0x19u, 0x00u,  \
/* USAGE_MAXIMUM                           */ 0x29u, 0x7Fu,  \
/* LOGICAL_MINIMUM                         */ 0x15u, 0x00u,  \
/* LOGICAL_MAXIMUM                         */ 0x25u, 0x7Fu,  \
/* REPORT_SIZE                             */ 0x75u, 0x08u,  \
/* REPORT_COUNT                            */ 0x95u, 0x05u,  \
/* INPUT                                   */ 0x81u, 0x00u,  \
/* END_COLLECTION                          */ 0xC0u \
}

Parents
  • Hello Harvey.Zhang,

    615 bytes is longer than 512, which is the maximum length of a HID Service. In this case, you need to split your record into two half, and support two HIDS instances. Refer to section 2.5 of the HID over GATT Profile Specification.

    However, I experimented with it a little bit 2 years ago and found that Android devices don't handle two HIDS instances very well. It might be safer to see if you can minimize the descriptor further.

    I am not familiar with a touchpad report descriptor, but I know for sure there have been mouse and keyboard report descriptor done successfully. Does a touchpad require far more reports than a mouse?

    Hieu

  • Oh! thank you very much.

    Do you mean to use an endpoint using touchpad ID and another endpoint for rest?

    It looks can reduce the size of a single endpoint.

    This is the descriptor of one finger.

    	/** 1st finger  73 */  
    	0x05, 0x0d, 						/** USAGE_PAGE (Digitizers) */  
        0x09, 0x22,                         /**   USAGE (Finger) */  
        0xa1, 0x02,                         /**   COLLECTION (Logical)  */  
        0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */  
        0x25, 0x01,                         /**       LOGICAL_MAXIMUM (1) */  
        0x09, 0x47,                         /**       USAGE (Confidence) */  
        0x09, 0x42,                         /**       USAGE (Tip switch) */  
        0x95, 0x02,                         /**       REPORT_COUNT (2) */  
        0x75, 0x01,                         /**       REPORT_SIZE (1) */  
        0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ 
        0x95, 0x01,                         /**       REPORT_COUNT (1) */ 
        0x75, 0x02,                         /**       REPORT_SIZE (3) */ 
        0x25, 0x02,                         /**       LOGICAL_MAXIMUM (2) */ 
        0x09, 0x51,                         /**       USAGE (Contact Identifier) */ 
        0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ 
        0x75, 0x01,                         /**       REPORT_SIZE (1) */ 
        0x95, 0x04,                         /**       REPORT_COUNT (3) */ 
        0x81, 0x03,                         /**       INPUT (Cnst,Var,Abs) */ 
        0x05, 0x01,                         /**       USAGE_PAGE (Generic Desk.. */ 
        0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ 
        0x26, 0x13, 0x0f,                   /**       LOGICAL_MAXIMUM (4095)  //3859 */ 
        0x75, 0x10,                         /**       REPORT_SIZE (16) */ 
        0x55, 0x0e,                         /**       UNIT_EXPONENT (-2) */ 
        0x65, 0x13,                         /**       UNIT(Inch,EngLinear) */ 
        0x09, 0x30,                         /**       USAGE (X) */ 
        0x35, 0x00,                         /**       PHYSICAL_MINIMUM (0) */ 
        0x46, 0xad, 0x01,                   /**       PHYSICAL_MAXIMUM (429,4.29inch)   800=0x0320 */ 
        0x95, 0x01,                         /**       REPORT_COUNT (1) */ 
        0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ 
        0x46, 0xD8, 0x00,                   /**       PHYSICAL_MAXIMUM (216,2.16inch)  0x0226 */ 
        0x15, 0x00,                         /**       LOGICAL_MINIMUM (0) */ 
        0x26, 0xe3, 0x07,                   /**       LOGICAL_MAXIMUM (2019) */ 
        0x09, 0x31,                         /**       USAGE (Y) */ 
        0x81, 0x02,                         /**       INPUT (Data,Var,Abs) */ 
        0xc0,                               /**    END_COLLECTION */ 

    We have five finger and touchpad report id, this is total 373 bytes.

    And that need to be added for the scanning time, keys and the number of contacts, as follow,

    /**  scan time& buttons. end input. +57 */ 
        0x05, 0x0d, 						/** USAGE_PAGE (Digitizers) */ 
        0x55, 0x0C,                         /**    UNIT_EXPONENT (-4) */ 
        0x66, 0x01, 0x10,                   /**    UNIT (Seconds) */ 
        0x47, 0xff, 0xff, 0x00, 0x00,      /**     PHYSICAL_MAXIMUM (65535) */ 
        0x27, 0xff, 0xff, 0x00, 0x00,         /**  LOGICAL_MAXIMUM (65535) */ 
        0x75, 0x10,                           /**  REPORT_SIZE (16) */ 
        0x95, 0x01,                           /**  REPORT_COUNT (1) */ 
        0x05, 0x0d,                         /**    USAGE_PAGE (Digitizers) */ 
        0x09, 0x56,                         /**    USAGE (Scan Time) */ 
        0x81, 0x02,                           /**  INPUT (Data,Var,Abs) */ 
        0x09, 0x54,                         /**    USAGE (Contact count) */ 
        0x25, 0x7f,                           /**  LOGICAL_MAXIMUM (127) */ 
        0x95, 0x01,                         /**    REPORT_COUNT (1) */ 
        0x75, 0x08,                         /**    REPORT_SIZE (8) */ 
        0x81, 0x02,                         /**    INPUT (Data,Var,Abs) */ 
        0x05, 0x09,                         /**    USAGE_PAGE (Button) */ 
        0x09, 0x01,                         /**    USAGE_(Button 1) */ 
        0x09, 0x02,                         /**    USAGE_(Button 2) */ 
        0x09, 0x03,                         /**    USAGE_(Button 3) */ 
        0x25, 0x01,                         /**    LOGICAL_MAXIMUM (1) */ 
        0x75, 0x01,                         /**    REPORT_SIZE (1) */ 
        0x95, 0x03,                         /**    REPORT_COUNT (3) */ 
        0x81, 0x02,                         /**    INPUT (Data,Var,Abs) */ 
        0x95, 0x05,                          /**   REPORT_COUNT (5) */ 
        0x81, 0x03,                         /**    INPUT (Cnst,Var,Abs) */ 

    This is total 53 bytes.

    So we need 426 bytes for whole touchpad report descriptor.

    It seems need to simplify the report descriptor.

  • Harvey.Zhang said:
    Do you mean to use an endpoint using touchpad ID and another endpoint for rest?

    We are working with HID Service over GATT, a BLE feature, and not USB HID, right? Unlike USB with endpoints, in BLE GATT, we are working with HID Service. What I mean is creating two HID Service instances, in a way that if you would perform service discovery on the device, you will see two HID Services.

    Harvey.Zhang said:

    So we need 426 bytes for whole touchpad report descriptor.

    It seems need to simplify the report descriptor.

    If you can optimize the descriptor size to under 512, that would be the best solution.

Reply
  • Harvey.Zhang said:
    Do you mean to use an endpoint using touchpad ID and another endpoint for rest?

    We are working with HID Service over GATT, a BLE feature, and not USB HID, right? Unlike USB with endpoints, in BLE GATT, we are working with HID Service. What I mean is creating two HID Service instances, in a way that if you would perform service discovery on the device, you will see two HID Services.

    Harvey.Zhang said:

    So we need 426 bytes for whole touchpad report descriptor.

    It seems need to simplify the report descriptor.

    If you can optimize the descriptor size to under 512, that would be the best solution.

Children
No Data
Related