This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

HID Keyboard + Consumer control settings no working

I am working in sdk14.1 nrf52832 ble_app_hids_keyboard_pca10040_s132.

I have successfully implemented a keyboard + Consumer control command in the HID service.

It works great on IOS and Android but no work on PC (Win10).

PC and BLE Disconnected after connecting.

here is some of the important code :

static void hids_init(void)
{
ret_code_t                 err_code;
ble_hids_init_t            hids_init_obj;
ble_hids_inp_rep_init_t    input_report_array[1];
ble_hids_inp_rep_init_t  * p_input_report;
ble_hids_outp_rep_init_t   output_report_array[1];
ble_hids_outp_rep_init_t * p_output_report;
uint8_t                    hid_info_flags;

memset((void *)input_report_array, 0, sizeof(ble_hids_inp_rep_init_t));
memset((void *)output_report_array, 0, sizeof(ble_hids_outp_rep_init_t));

static uint8_t report_map_data[] =
{
										// Report ID 1
    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  (224)
    0x29, 0xe7,       // Usage Maximum (231)
    0x15, 0x00,       // Logical MinMinimumimum (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)

    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

    0x95, 0x06,       // Report Count (6)
    0x75, 0x08,       // Report Size (8)
    0x15, 0x00,       // Logical Minimum (0)
    0x25, 0x65,       // Logical Maximum (101)
    0x05, 0x07,       // Usage Page (Key codes)
    0x19, 0x00,       // Usage Minimum (0)
    0x29, 0x65,       // Usage Maximum (101)
    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,
			
			
			        // Report ID 2: Advanced buttons
    0x05, 0x0C,                     // Usage Page (Consumer)
    0x09, 0x01,                     // Usage (Consumer Control)
    0xA1, 0x01,                     // Collection (Application)
  0x85, 0x02,                     //     Report Id (2)
    0x15, 0x00,                     //     Logical minimum (0)
    0x25, 0x01,                     //     Logical maximum (1)
    0x75, 0x01,                     //     Report Size (1)
    0x95, 0x01,                     //     Report Count (1)

    0x09, 0xB8,                     //     B8=>eject
    0x81, 0x02,                     //     Input (Data,Value,Relative,Bit Field)
    0x0A, 0xCC,//0x83, 0x01,               //     Usage (AL Consumer Control Configuration)
    0x81, 0x02,                     //     Input (Data,Value,Relative,Bit Field)
    0x09, 0xB5,                     //     Usage (Scan Next Track)
    0x81, 0x02,                     //     Input (Data,Value,Relative,Bit Field)
    0x09, 0xB6,                     //     Usage (Scan Previous Track)
    0x81, 0x02,                     //     Input (Data,Value,Relative,Bit Field)

    0x09, 0xEA,                     //     Usage (Volume Down)
    0x81, 0x02,                     //     Input (Data,Value,Relative,Bit Field)
    0x09, 0xE9,                     //     Usage (Volume Up)
    0x81, 0x02,                     //     Input (Data,Value,Relative,Bit Field)
    0x0A, 0x25, 0x02,               //     Usage (AC Forward)
    0x81, 0x02,                     //     Input (Data,Value,Relative,Bit Field)
    0x0A, 0x24, 0x02,               //     Usage (AC Back)
    0x81, 0x02,                     //     Input (Data,Value,Relative,Bit Field)


    0xC0              // End Collection (Application)*/
};

// Initialize HID Service
p_input_report                      = &input_report_array[INPUT_REPORT_KEYS_INDEX];//0
p_input_report->max_len             = INPUT_REPORT_KEYS_MAX_LEN; //9
p_input_report->rep_ref.report_id   = INPUT_REP_REF_ID;//0
p_input_report->rep_ref.report_type = BLE_HIDS_REP_TYPE_INPUT;//1

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);

p_output_report                      = &output_report_array[OUTPUT_REPORT_INDEX];//0
p_output_report->max_len             = OUTPUT_REPORT_MAX_LEN;//1
p_output_report->rep_ref.report_id   = OUTPUT_REP_REF_ID;//0
p_output_report->rep_ref.report_type = BLE_HIDS_REP_TYPE_OUTPUT;//2

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);

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                       = false;
hids_init_obj.inp_rep_count                  = 1;
hids_init_obj.p_inp_rep_array                = input_report_array;
hids_init_obj.outp_rep_count                 = 1;
hids_init_obj.p_outp_rep_array               = output_report_array;
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_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);
}
Related