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

Nrf52832 resets after implementing Advanced buttons as HID device

     I added the corresponding function in ble_app_hids_mouse in the ble_app_template project, and added the function to send Advanced buttons, as shown in the following program, but each time I press the button to call the function mouse_media_key_send(MM_KEY_VOL_UP); Immediately after the function is reset, the DEBUG function has been turned on and no error message has been entered

    // This enum is mapped to "rep_map_data[]", Report ID 3.
// Please see the USB descriptor for detailed information.
typedef enum
{
MM_KEY_RELEASE = 0x00,
MM_KEY_PLAY_PAUSE = 0x01,
MM_KEY_AL_CCC = 0x02,
MM_KEY_SCAN_NEXT_TRACK = 0x04,
MM_KEY_SCAN_PREV_TRACK = 0x08,
MM_KEY_VOL_DOWN = 0x10,
MM_KEY_VOL_UP = 0x20,
MM_KEY_AC_FORWARD = 0x40,
MM_KEY_AC_BACK = 0x80,
} multimedia_keys_t;

void mouse_media_key_send(multimedia_keys_t mm_key)
{
uint32_t err_code;

if (m_in_boot_mode)
return;

err_code = ble_hids_inp_rep_send(&m_hids,
INPUT_REP_MPLAYER_INDEX,
INPUT_REP_MEDIA_PLAYER_LEN,
(uint8_t*)&mm_key);

if( (err_code != NRF_SUCCESS)
&&(err_code != NRF_ERROR_INVALID_STATE)
&&(err_code != NRF_ERROR_INVALID_STATE)
&&(err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING )
)
{
APP_ERROR_CHECK(err_code);
}

multimedia_keys_t mm_key_release = MM_KEY_RELEASE;
err_code = ble_hids_inp_rep_send(&m_hids,
INPUT_REP_MPLAYER_INDEX,
INPUT_REP_MEDIA_PLAYER_LEN,
(uint8_t*)&mm_key_release);

if( (err_code != NRF_SUCCESS)
&&(err_code != NRF_ERROR_INVALID_STATE)
&&(err_code != NRF_ERROR_INVALID_STATE)
&&(err_code != BLE_ERROR_GATTS_SYS_ATTR_MISSING )
)
{
APP_ERROR_CHECK(err_code);
}

}

  • Hi Jim,

     

    What is the value of the index'es and REPORT_IDs?

    USB REPORT_IDs (set in main.c::hids_init()) cannot be explicitly set to '0', and need to start at 1 and upwards.

    However, in BLE-context, you should start at 0, so you need to separate these:

    #define INPUT_REP_BUTTONS_INDEX         0                                           /**< Index of Mouse Input Report containing button data. */
    #define INPUT_REP_MOVEMENT_INDEX        1                                           /**< Index of Mouse Input Report containing movement data. */
    #define INPUT_REP_MPLAYER_INDEX         2                                           /**< Index of Mouse Input Report containing media player data. */
    #define INPUT_REP_REF_BUTTONS_ID        1                                           /**< Id of reference to Mouse Input Report containing button data. */
    #define INPUT_REP_REF_MOVEMENT_ID       2                                           /**< Id of reference to Mouse Input Report containing movement data. */
    #define INPUT_REP_REF_MPLAYER_ID        3                                           /**< Id of reference to Mouse Input Report containing media player data. */
    

     

    Kind regards,

    Håkon

  • I still don't quite understand what you mean. The following are the settings in my program. How do I modify it? Thank you very much.

    #define INPUT_REP_BUTTONS_INDEX 0 /**< Index of Mouse Input Report containing button data. */
    #define INPUT_REP_MOVEMENT_INDEX 1 /**< Index of Mouse Input Report containing movement data. */
    #define INPUT_REP_MPLAYER_INDEX 2 /**< Index of Mouse Input Report containing media player data. */
    #define INPUT_REP_REF_BUTTONS_ID 1 /**< Id of reference to Mouse Input Report containing button data. */
    #define INPUT_REP_REF_MOVEMENT_ID 2 /**< Id of reference to Mouse Input Report containing movement data. */
    #define INPUT_REP_REF_MPLAYER_ID 3 /**< Id of reference to Mouse Input Report containing media player data. */

    static void hids_init(void)
    {
    ret_code_t err_code;
    ble_hids_init_t hids_init_obj;
    ble_hids_inp_rep_init_t inp_rep_array[INPUT_REPORT_COUNT];
    ble_hids_inp_rep_init_t * p_input_report;
    uint8_t hid_info_flags;

    static uint8_t rep_map_data[] =
    {

    0x05, 0x01, // Usage Page (Generic Desktop)

    0x09, 0x02, // Usage (Mouse)

    0xA1, 0x01, // Collection (Application)

    // Report ID 1: Mouse buttons + scroll/pan
    0x85, 0x01, // Report Id 1
    0x09, 0x01, // Usage (Pointer)
    0xA1, 0x00, // Collection (Physical)
    0x95, 0x05, // Report Count (3)
    0x75, 0x01, // Report Size (1)
    0x05, 0x09, // Usage Page (Buttons)
    0x19, 0x01, // Usage Minimum (01)
    0x29, 0x05, // Usage Maximum (05)
    0x15, 0x00, // Logical Minimum (0)
    0x25, 0x01, // Logical Maximum (1)
    0x81, 0x02, // Input (Data, Variable, Absolute)
    0x95, 0x01, // Report Count (1)
    0x75, 0x03, // Report Size (3)
    0x81, 0x01, // Input (Constant) for padding
    0x75, 0x08, // Report Size (8)
    0x95, 0x01, // Report Count (1)
    0x05, 0x01, // Usage Page (Generic Desktop)
    0x09, 0x38, // Usage (Wheel)
    0x15, 0x81, // Logical Minimum (-127)
    0x25, 0x7F, // Logical Maximum (127)
    0x81, 0x06, // Input (Data, Variable, Relative)
    0x05, 0x0C, // Usage Page (Consumer)
    0x0A, 0x38, 0x02, // Usage (AC Pan)
    0x95, 0x01, // Report Count (1)
    0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
    0xC0, // End Collection (Physical)

    // Report ID 2: Mouse motion
    0x85, 0x02, // Report Id 2
    0x09, 0x01, // Usage (Pointer)
    0xA1, 0x00, // Collection (Physical)
    0x75, 0x0C, // Report Size (12)
    0x95, 0x02, // Report Count (2)
    0x05, 0x01, // Usage Page (Generic Desktop)
    0x09, 0x30, // Usage (X)
    0x09, 0x31, // Usage (Y)
    0x16, 0x01, 0xF8, // Logical maximum (2047)
    0x26, 0xFF, 0x07, // Logical minimum (-2047)
    0x81, 0x06, // Input (Data, Variable, Relative)
    0xC0, // End Collection (Physical)
    0xC0, // End Collection (Application)

    // Report ID 3: Advanced buttons
    0x05, 0x0C, // Usage Page (Consumer)
    0x09, 0x01, // Usage (Consumer Control)
    0xA1, 0x01, // Collection (Application)
    0x85, 0x03, // Report Id (3)
    0x15, 0x00, // Logical minimum (0)
    0x25, 0x01, // Logical maximum (1)
    0x75, 0x01, // Report Size (1)
    0x95, 0x01, // Report Count (1)

    0x09, 0xCD, // Usage (Play/Pause)
    0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
    0x0A, 0x83, 0x01, // Usage (AL Consumer Control Configuration)
    0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
    0x09, 0xB5, // Usage (Scan Next Track)
    0x81, 0x06, // Input (Data,Value,Relative,Bit Field)
    0x09, 0xB6, // Usage (Scan Previous Track)
    0x81, 0x06, // Input (Data,Value,Relative,Bit Field)

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

    memset(inp_rep_array, 0, sizeof(inp_rep_array));
    // Initialize HID Service.
    p_input_report = &inp_rep_array[INPUT_REP_BUTTONS_INDEX];
    p_input_report->max_len = INPUT_REP_BUTTONS_LEN;
    p_input_report->rep_ref.report_id = INPUT_REP_REF_BUTTONS_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);

    //鼠标上的滑轮
    p_input_report = &inp_rep_array[INPUT_REP_MOVEMENT_INDEX];
    p_input_report->max_len = INPUT_REP_MOVEMENT_LEN;
    p_input_report->rep_ref.report_id = INPUT_REP_REF_MOVEMENT_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);


    p_input_report = &inp_rep_array[INPUT_REP_MPLAYER_INDEX];
    p_input_report->max_len = INPUT_REP_MEDIA_PLAYER_LEN;
    p_input_report->rep_ref.report_id = INPUT_REP_REF_MPLAYER_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);

    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 = true;
    hids_init_obj.inp_rep_count = INPUT_REPORT_COUNT;
    hids_init_obj.p_inp_rep_array = inp_rep_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(rep_map_data);
    hids_init_obj.rep_map.p_data = rep_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_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);
    }

  • Hi,

     

    All your indexes and IDs look good.

    Could you check the err_code return and see where it fails? This can be done by adding "DEBUG" to your preprocessor defines, and then you should end up in the app_error_handler (and file/err_code/line_number can be read out in m_error variable).

     

    Best regards,

    Håkon

     

  • I have added DEBUG, but without any errors, i treset directly

  • Hi,

     

    Sorry for the late reply. Have you set the optimization level to '0'? Debugging code with high optimization isn't always straight-forward.

    Could you try setting a breakpoint at any instance of NVIC_SystemReset in your code?

     

    Best regards,

    Håkon

Related