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
  • 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

Children
  • Hi 

    As you requested above, i had added three items and tested .

    The result is the same (keyboard data doesn't sent.

    i would like to show you related  functions for more understanding.

    #define INPUT_REPORT_COUNT                           2
    #define INPUT_REPORT_KEYS_MAX_LEN           8
    #define INPUT_REPORT_TOUCH_MAX_LEN        1       
    #define INPUT_REP_REF_ID                    1                                          /**< Id of reference to Keyboard Input Report. */
    #define INPUT_REP_TOUCH_ID              2
       
    BLE_HIDS_DEF(m_hids,                                                /**< Structure used to identify the HID service. */
                 NRF_SDH_BLE_TOTAL_LINK_COUNT,
                 INPUT_REPORT_KEYS_MAX_LEN,
                 INPUT_REPORT_TOUCH_MAX_LEN);
    void sendActionByKey(unsigned char key)                 //function for sending keyboard data
    {
      uint32_t err_code;
     uint8_t  data[INPUT_REPORT_KEYS_MAX_LEN];
                                              
     memset(data, 0, sizeof(data));
     data[2] = key;//0x28;

     err_code = ble_hids_inp_rep_send(&m_hids,
                                   INPUT_REPORT_KEYS_INDEX,
                                   INPUT_REPORT_KEYS_MAX_LEN,
                                   data,
                                   m_conn_handle); 
      data[2] = 0x00;
      err_code = ble_hids_inp_rep_send(&m_hids,
                                   INPUT_REPORT_KEYS_INDEX,
                                   INPUT_REPORT_KEYS_MAX_LEN,
                                   data,
                                   m_conn_handle); 
     
    }
                            
    static void hids_init(void)
    {
        ret_code_t                 err_code;
        ble_hids_init_t            hids_init_obj;
        ble_hids_inp_rep_init_t  * p_input_report;
        ble_hids_outp_rep_init_t * p_output_report;
        uint8_t                    hid_info_flags;
        static ble_hids_inp_rep_init_t  input_report_array[INPUT_REPORT_COUNT];

        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     
        

        };
        memset((void *)input_report_array, 0, sizeof(input_report_array));
        //memset((void *)output_report_array, 0, sizeof(ble_hids_outp_rep_init_t)*1);
        // Initialize HID Service
        p_input_report                      = &input_report_array[INPUT_REPORT_KEYS_INDEX];
        p_input_report->max_len             = INPUT_REPORT_KEYS_MAX_LEN;
        p_input_report->rep_ref.report_id   = INPUT_REP_REF_ID;
        p_input_report->rep_ref.report_type = BLE_HIDS_REP_TYPE_INPUT;
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&p_input_report->security_mode.cccd_write_perm);
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&p_input_report->security_mode.read_perm);
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&p_input_report->security_mode.write_perm);
    #if 0
        p_output_report                      = &output_report_array[OUTPUT_REPORT_INDEX];
        p_output_report->max_len             = OUTPUT_REPORT_MAX_LEN;
        p_output_report->rep_ref.report_id   = OUTPUT_REP_REF_ID;
        p_output_report->rep_ref.report_type = BLE_HIDS_REP_TYPE_OUTPUT;
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&p_output_report->security_mode.read_perm);
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&p_output_report->security_mode.write_perm);
    #endif   
    #if 1   
        //  Initialize HID Service - Touch axis 
        p_input_report                      = &input_report_array[INPUT_REPORT_TOUCH_INDEX];
        p_input_report->max_len             = INPUT_REPORT_TOUCH_MAX_LEN;
        p_input_report->rep_ref.report_id   = INPUT_REP_TOUCH_ID;
        p_input_report->rep_ref.report_type = BLE_HIDS_REP_TYPE_INPUT;
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&p_input_report->security_mode.cccd_write_perm);
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&p_input_report->security_mode.read_perm);
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&p_input_report->security_mode.write_perm); 
    #endif   
        
        hid_info_flags = HID_INFO_FLAG_REMOTE_WAKE_MSK | HID_INFO_FLAG_NORMALLY_CONNECTABLE_MSK;
        memset(&hids_init_obj, 0, sizeof(hids_init_obj));
        hids_init_obj.evt_handler                    = on_hids_evt;
        hids_init_obj.error_handler                  = service_error_handler;
        hids_init_obj.is_kb                          = true;
        hids_init_obj.is_mouse                       = true;
        hids_init_obj.inp_rep_count                  = INPUT_REPORT_COUNT;
        hids_init_obj.p_inp_rep_array                = input_report_array;
        hids_init_obj.outp_rep_count                 = 0;
        hids_init_obj.p_outp_rep_array               = NULL;
        hids_init_obj.feature_rep_count              = 0;
        hids_init_obj.p_feature_rep_array            = NULL;
        hids_init_obj.rep_map.data_len               = sizeof(report_map_data);
        hids_init_obj.rep_map.p_data                 = report_map_data;
        hids_init_obj.hid_information.bcd_hid        = BASE_USB_HID_SPEC_VERSION;
        hids_init_obj.hid_information.b_country_code = 0;
        hids_init_obj.hid_information.flags          = hid_info_flags;
        hids_init_obj.included_services_count        = 0;
        hids_init_obj.p_included_services_array      = NULL;
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&hids_init_obj.rep_map.security_mode.read_perm);
        BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&hids_init_obj.rep_map.security_mode.write_perm);
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&hids_init_obj.hid_information.security_mode.read_perm);
        BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&hids_init_obj.hid_information.security_mode.write_perm);
       
           
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(
            &hids_init_obj.security_mode_boot_mouse_inp_rep.cccd_write_perm);
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(
            &hids_init_obj.security_mode_boot_mouse_inp_rep.read_perm);
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(
            &hids_init_obj.security_mode_boot_mouse_inp_rep.write_perm);

        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(
            &hids_init_obj.security_mode_boot_kb_inp_rep.cccd_write_perm);
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&hids_init_obj.security_mode_boot_kb_inp_rep.read_perm);
        BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&hids_init_obj.security_mode_boot_kb_inp_rep.write_perm);
        //BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&hids_init_obj.security_mode_boot_kb_outp_rep.read_perm);
        //BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&hids_init_obj.security_mode_boot_kb_outp_rep.write_perm);
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&hids_init_obj.security_mode_protocol.read_perm);
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&hids_init_obj.security_mode_protocol.write_perm);
        BLE_GAP_CONN_SEC_MODE_SET_NO_ACCESS(&hids_init_obj.security_mode_ctrl_point.read_perm);
        BLE_GAP_CONN_SEC_MODE_SET_ENC_NO_MITM(&hids_init_obj.security_mode_ctrl_point.write_perm);
        err_code = ble_hids_init(&m_hids, &hids_init_obj);
        APP_ERROR_CHECK(err_code);
    }
    thanks
  • Hi,

     

     

    mycol said:
    #define INPUT_REPORT_KEYS_MAX_LEN           8

    This define must reflect the maximum number of bytes that you send using your descriptor, as it is fed into the BLE_HIDS_DEF() macro.

    As I read your descriptor, the amount of bytes you send is the keyboard descriptor + digitizer usage at the end of your descriptor.

     

    Have you tried isolating each descriptor to see if they work independent of each other?

    Have you tried capturing a sniffer trace (using the nrf sniffer) to see what goes over-the-air (if yes; please post the sniffer trace) ? 

     

    Kind regards,

    Håkon

Related