This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

I meet a problem during programming combo hid(keyboard+multi touch)on nrf52.

Hi
I met a problem during programming a combo of HID on nrf52.
I have set combo HID that have keyboard and multi touch.
after pairing my smartphone(galaxy note 8), keyboard data doesn't sent to my phone but multi touch os ok.

after some debugging, i found that a certain sentence of multich touch HID bring up a problem.

HID sentence of problem is contact identifier. refer to below.

0x09, 0x51,        //     Usage (0x51 - Contact identifier)
0x26, 0xFF, 0x00,  //     Logical Maximum (255)
0x75, 0x08,        //     Report Size (8)
0x95, 0x01,        //     Report Count (1)
0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)


I have no idea for soving this problem.

please guide me any way .

thanks

My entire HID report map is .
static uint8_t report_map_data[] =
    {
        0x05, 0x01,                 // Usage Page (Generic Desktop)
        0x09, 0x06,                 // Usage (Keyboard)
        0xA1, 0x01,                 // Collection (Application)
      0x85, 0x01,                 //     Report Id (1)
        0x05, 0x07,                 //     Usage Page (Key Codes)
        0x19, 0xe0,                 //     Usage Minimum (224)
        0x29, 0xe7,                 //     Usage Maximum (231)
        0x15, 0x00,                 //     Logical Minimum (0)
        0x25, 0x01,                 //     Logical Maximum (1)
        0x75, 0x01,                 //     Report Size (1)
        0x95, 0x08,                 //     Report Count (8)
        0x81, 0x02,                 //     Input (Data, Variable, Absolute)
        0x95, 0x01,                 //     Report Count (1)
        0x75, 0x08,                 //     Report Size (8)
        0x81, 0x01,                 //     Input (Constant) reserved byte(1)
#if 0
        0x95, 0x05,                 //     Report Count (5)
        0x75, 0x01,                 //     Report Size (1)
        0x05, 0x08,                 //     Usage Page (Page# for LEDs)
        0x19, 0x01,                 //     Usage Minimum (1)
        0x29, 0x05,                 //     Usage Maximum (5)
        0x91, 0x02,                 //     Output (Data, Variable, Absolute), Led report
        0x95, 0x01,                 //     Report Count (1)
        0x75, 0x03,                 //     Report Size (3)
        0x91, 0x01,                 //     Output (Data, Variable, Absolute), Led report padding
#endif
        0x95, 0x06,                 //     Report Count (6)
        //0x95, 0x01,
        0x75, 0x08,                 //     Report Size (8)
        0x15, 0x00,                 //     Logical Minimum (0)
        //0x25, 0x65,                 //     Logical Maximum (101)
        0x25, 0x82,
        0x05, 0x07,                 //     Usage Page (Key codes)
        0x19, 0x00,                 //     Usage Minimum (0)
        //0x29, 0x65,                 //     Usage Maximum (101)
        0x29, 0x82,
        0x81, 0x00,                 //     Input (Data, Array) Key array(6 bytes)
        0x09, 0x05,                 //     Usage (Vendor Defined)
        0x15, 0x00,                 //     Logical Minimum (0)
        0x26, 0xFF, 0x00,           //     Logical Maximum (255)
        0x75, 0x08,                 //     Report Count (2)
        0x95, 0x02,                 //     Report Size (8 bit)
        0xB1, 0x02,                 //     Feature (Data, Variable, Absolute)
        0xC0,                       // End Collection (Application)
#ifdef _DUALTOUCH_   
        0x05, 0x0D,        // Usage Page (Digitizer)
        0x09, 0x04,        // Usage (Touch Screen)
        0xA1, 0x01,        // Collection (Application)
        0x85, 0x02,        //   Report Id 2
        0x09, 0x22,        //   Usage (Finger)
        0xA1, 0x02,        //   Collection (Logical)
        0x09, 0x42,        //     Usage (Tip Switch)
        0x15, 0x00,        //     Logical Minimum (0)
        0x25, 0x01,        //     Logical Maximum (1)
        0x75, 0x01,        //     Report Size (1)
        0x95, 0x01,        //     Report Count (1)
        0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
        0x09, 0x30,        //     Usage (Tip Pressure)
        0x25, 0x7F,        //     Logical Maximum (127)
        0x75, 0x07,        //     Report Size (7)
        0x95, 0x01,        //     Report Count (1)
        0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
        0x09, 0x51,        //     Usage (0x51 - Contact identifier)
        0x26, 0xFF, 0x00,  //     Logical Maximum (255)
        0x75, 0x08,        //     Report Size (8)
        0x95, 0x01,        //     Report Count (1)
        0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
        0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
        0x09, 0x30,        //     Usage (X)
        0x09, 0x31,        //     Usage (Y)
        0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
        0x65, 0x00,        //     Unit (None)
        0x75, 0x10,        //     Report Size (16)
        0x95, 0x02,        //     Report Count (2)
        0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
       
        0x35, 0x00,                    //     PHYSICAL_MINIMUM (0)
    0x05, 0x0d,                    //     USAGE_PAGE (Digitizers)
    0x26, 0xff, 0x00,              //     LOGICAL_MAXIMUM (255)
    0x46, 0xff, 0x00,              //     PHYSICAL_MAXIMUM (255)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x02,                    //     REPORT_COUNT (2)
    0x09, 0x48,                    //     USAGE (Width)            //width of contact (0 ~ 255)
    0x09, 0x49,                    //     USAGE (Height)           //Height of contact  (0 ~ 255)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
       
        0xC0,              //   End Collection
        0x05, 0x0D,        //   Usage Page (Digitizer)
        0x27, 0xFF, 0xFF, 0x00, 0x00,  //   Logical Maximum (65534)
        0x09, 0x56,        //   Usage (0x56 - Scan Time)
        0x75, 0x10,        //   Report Size (16)
        0x95, 0x01,        //   Report Count (1)
        0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
        0x09, 0x54,        //   Usage (0x54 - Contact count)
        0x25, 0x05,        //   Logical Maximum (5)
        0x75, 0x08,        //   Report Size (8)
        0x95, 0x01,        //   Report Count (1)
        0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
        0x05, 0x0D,        //   Usage Page (Digitizer)
        0x09, 0x55,        //   Usage (0x55 - Contact point maximum)
        0x25, 0x0A,        //   Logical Maximum (10)
        0x75, 0x08,        //   Report Size (8)
        0x95, 0x01,        //   Report Count (1)
        0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
        0xC0,              // End Collection
#endif     

Parents
  • Hi 

    I tested on winwows10(notebook).

    keyboard data is sending to notebook correctly. 

    I haved another test. 

    I committed out Contact identifier sentence only as below.  

    //0x09, 0x51,        //     Usage (0x51 - Contact identifier)
    0x26, 0xFF, 0x00,  //     Logical Maximum (255)
    0x75, 0x08,        //     Report Size (8)
    0x95, 0x01,        //     Report Count (1)
    0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)

    then keyboard data is sending correctly but about touch, it operate as single touch.

    I wonder whether this problem is by my firmware or by android itself.

    thanks

  • Hi,

     

    Could you share a bit more regarding how you send data? It sounds like each descriptor itself works individually, but when concatenated; it seems to have issues.

            0x05, 0x0D,        //   Usage Page (Digitizer)
            0x27, 0xFF, 0xFF, 0x00, 0x00,  //   Logical Maximum (65534)
            0x09, 0x56,        //   Usage (0x56 - Scan Time)
            0x75, 0x10,        //   Report Size (16)
            0x95, 0x01,        //   Report Count (1)
            0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
            0x09, 0x54,        //   Usage (0x54 - Contact count)
            0x25, 0x05,        //   Logical Maximum (5)
            0x75, 0x08,        //   Report Size (8)
            0x95, 0x01,        //   Report Count (1)
            0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
            0x05, 0x0D,        //   Usage Page (Digitizer)
            0x09, 0x55,        //   Usage (0x55 - Contact point maximum)
            0x25, 0x0A,        //   Logical Maximum (10)
            0x75, 0x08,        //   Report Size (8)
            0x95, 0x01,        //   Report Count (1)
            0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)

     This part of your descriptor is a part of your main collection, meaning you have to send these for every report being sent (even for keyboard). I do not have much knowledge about multi-touch descriptors, but it looks like you want this to be a part of the report id 2 collection?

    As it it set up now, all these usages are on the top-level collection (meaning; they are required to be set by all report IDs): "scan time", "contact count", and "contact point maximum" 

    That might be how you want the application to be, but it does sound a bit unusual.

     

    Kind regards,

    Håkon

Reply Children
No Data
Related