hi ,
im try to add some consumer keys and system keys to the project:
nRF5_SDK_16.0.0_98a08e2\examples\ble_peripheral\ble_app_hids_keyboard
and my code of hids_init() like this:
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; ble_hids_feature_rep_init_t * p_feature_report; uint8_t hid_info_flags; static ble_hids_inp_rep_init_t input_report_array[3]; static ble_hids_outp_rep_init_t output_report_array[1]; static ble_hids_feature_rep_init_t feature_report_array[1]; 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) 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 Size (8 bit) 0x95, 0x02, // Report Count (2) 0xB1, 0x02, // Feature (Data, Variable, Absolute) 0xC0, // End Collection (Application) 0x05, 0x0C, /* USAGE_PAGE (CONSUMER CTL) */ 0x09, 0x01, /* USAGE (CONSUMER CTL) */ 0xa1, 0x01, /* COLLECTION (Application) */ 0X85, 0x02, /* REPORT ID(2) */ 0x19, 0x01, /* USAGE_MINIMUM (CONSUMER CTL) */ 0x2A, 0xFF,0x02, /* USAGE_MAXIMUM () */ 0x15, 0x00, /* LOGICAL_MINIMUM (1) */ 0x26, 0x9C,0x02, /* LOGICAL_MAXIMUM (668) */ 0x75, 0x10, /* REPORT_SIZE (16) */ 0x95, 0x02, /* REPORT_COUNT (2) */ 0x81, 0x00, /* INPUT (Data,Var,Abs) */ 0xc0, /* END_COLLECTION */ 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ 0x09, 0x80, /* USAGE (SYSTEM CTL) */ 0xa1, 0x01, /* COLLECTION (Application) */ 0X85, 0x03, /* REPORT ID(2) */ 0x19, 0x81, /* USAGE_MINIMUM (system power down) */ 0x29, 0xb8, /* USAGE_MAXIMUM (system weekup) */ 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ 0x75, 0x1, /* REPORT_SIZE (1) */ 0x95, 0x38, /* REPORT_COUNT (56) */ 0x81, 0x02, /* INPUT () */ 0xc0 /* END_COLLECTION */ }; 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)); memset((void *)feature_report_array, 0, sizeof(ble_hids_feature_rep_init_t)); // Initialize HID Service p_input_report = &input_report_array[0]; p_input_report->max_len = INPUT_REPORT_KEYS_MAX_LEN; p_input_report->rep_ref.report_id = 1;//INPUT_REP_REF_ID; p_input_report->rep_ref.report_type = BLE_HIDS_REP_TYPE_INPUT; p_input_report->sec.cccd_wr = SEC_JUST_WORKS; p_input_report->sec.wr = SEC_JUST_WORKS; p_input_report->sec.rd = SEC_JUST_WORKS; p_input_report = &input_report_array[1]; p_input_report->max_len = 4; p_input_report->rep_ref.report_id = 2; p_input_report->rep_ref.report_type = BLE_HIDS_REP_TYPE_INPUT; p_input_report->sec.cccd_wr = SEC_JUST_WORKS; p_input_report->sec.wr = SEC_JUST_WORKS; p_input_report->sec.rd = SEC_JUST_WORKS; p_input_report = &input_report_array[2]; p_input_report->max_len = 7; p_input_report->rep_ref.report_id = 3; p_input_report->rep_ref.report_type = BLE_HIDS_REP_TYPE_INPUT; p_input_report->sec.cccd_wr = SEC_JUST_WORKS; p_input_report->sec.wr = SEC_JUST_WORKS; p_input_report->sec.rd = SEC_JUST_WORKS; 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; p_output_report->sec.wr = SEC_JUST_WORKS; p_output_report->sec.rd = SEC_JUST_WORKS; p_feature_report = &feature_report_array[FEATURE_REPORT_INDEX]; p_feature_report->max_len = FEATURE_REPORT_MAX_LEN; p_feature_report->rep_ref.report_id = FEATURE_REP_REF_ID; p_feature_report->rep_ref.report_type = BLE_HIDS_REP_TYPE_FEATURE; p_feature_report->sec.rd = SEC_JUST_WORKS; p_feature_report->sec.wr = SEC_JUST_WORKS; 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 = false; hids_init_obj.is_mouse = false; hids_init_obj.inp_rep_count = 3; 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 = 1; hids_init_obj.p_feature_rep_array = feature_report_array; 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; hids_init_obj.rep_map.rd_sec = SEC_JUST_WORKS; hids_init_obj.hid_information.rd_sec = SEC_JUST_WORKS; hids_init_obj.boot_kb_inp_rep_sec.cccd_wr = SEC_JUST_WORKS; hids_init_obj.boot_kb_inp_rep_sec.rd = SEC_JUST_WORKS; hids_init_obj.boot_kb_outp_rep_sec.rd = SEC_JUST_WORKS; hids_init_obj.boot_kb_outp_rep_sec.wr = SEC_JUST_WORKS; hids_init_obj.protocol_mode_rd_sec = SEC_JUST_WORKS; hids_init_obj.protocol_mode_wr_sec = SEC_JUST_WORKS; hids_init_obj.ctrl_point_wr_sec = SEC_JUST_WORKS; err_code = ble_hids_init(&m_hids, &hids_init_obj); APP_ERROR_CHECK(err_code); }
send key code :
void send_keys(uint8_t report_index, uint16_t len, uint8_t *p_data) { ret_code_t err_code; NRF_LOG_INFO("m_hids.inp_rep_count =%d",m_hids.inp_rep_count); err_code = ble_hids_inp_rep_send(&m_hids, report_index, len, p_data, m_conn_handle); if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_RESOURCES) && (err_code != NRF_ERROR_BUSY) && (err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING) && (err_code != NRF_ERROR_FORBIDDEN)) { APP_ERROR_HANDLER(err_code); } }
static void bsp_event_handler(bsp_event_t event) { uint32_t err_code; static uint8_t * p_key = m_sample_key_press_scan_str; static uint8_t size = 0; switch (event) { case BSP_EVENT_SLEEP: sleep_mode_enter(); break; case BSP_EVENT_DISCONNECT: err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION); if (err_code != NRF_ERROR_INVALID_STATE) { APP_ERROR_CHECK(err_code); } break; case BSP_EVENT_WHITELIST_OFF: if (m_conn_handle == BLE_CONN_HANDLE_INVALID) { err_code = ble_advertising_restart_without_whitelist(&m_advertising); if (err_code != NRF_ERROR_INVALID_STATE) { APP_ERROR_CHECK(err_code); } } break; case BSP_EVENT_KEY_0: NRF_LOG_INFO("BSP_EVENT_KEY_0"); data[2]=0x04; send_keys(1,8,data); /* if (m_conn_handle != BLE_CONN_HANDLE_INVALID) { keys_send(1, p_key); p_key++; size++; if (size == MAX_KEYS_IN_ONE_REPORT) { p_key = m_sample_key_press_scan_str; size = 0; } } */ break; default: break; } }
in the pca10056,i press the button1,and the jlink report err:
00> <info> app: BSP_EVENT_KEY_0 00> 00> <info> app: m_hids.inp_rep_count =3 00> 00> <error> app: ERROR 12 [NRF_ERROR_DATA_SIZE] at ..\..\..\main.c:1786 00> 00> PC at: 0x0002AB01 00> 00> <error> app: End of error report 00>
i have see some custom project,the most change is hids_init(),t try to moddify it ,and there is no effection.so i want to konw how can i add custom desc to ble hid?