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

How to enter DFU mode with SR3v1.2

Hi, 

I'm tring to enter DFU mode by combo keys by KEY_COMBO_TWO_KEY_REGISTER().

In v1.1, I used m_pwr_mgmt_shutdown(M_PWR_MGMT_SHUTDOWN_TYPE_DFU) to enter DFU mode directly. 

Now it is not work anymore, and I  find that there is a function called  static void m_coms_ble_dfu_fs_evt_handler(nrf_fstorage_evt_t *p_evt) in M_coms_ble_dfu.c  references  nrf_pwm_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_DFU), and has some works before nrf_pwm_mgmt_shutdown(), I guess it is for buttonless dfu mode .

I want to ask 2 questions :

1. What is fstorage event handler: m_coms_ble_dfu_fs_evt_handler?  how can I use it properly? 

2. Can I use simpler way as before in sr3v1.1 to activate DFU instead of using m_coms_ble_dfu_fs_evt ? 

Thanks.

Ralph

Parents
  • Hi Ralph, 

    the Smart Remote v1.2 firmware supports peer data sharing,i.e. it stores the peer address and encryption keys in to flash settings page so that the bootloader can use it to re-connect to the central after the reset to enter DFU mode. Writing to flash is asynchronous so the m_coms_ble_dfu_fs_evt_handler is there to ensure that the peer data is correctly written to flash, i.e. NRF_FSTORAGE_EVT_WRITE_RESULT event is received  prior to initiating the shutdown procedure. 

    You I think you should still be able to use the nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_DFU) to put the remote in DFU mode. However, the bootloader will then perform undirected advertisement if the peer data is not written to flash. 

     

    ret_code_t status = sd_power_gpregret_clr(0, 0xFF);
    if (status == NRF_SUCCESS)
    {
        status = sd_power_gpregret_set(0, BOOTLOADER_DFU_START);
    }
    
    if (status == NRF_SUCCESS)
    {
    
        nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_DFU);
    }

     

  • Hi ,Bjorn 

    I used these 3 lines yesterday, but not work and I didnt check the status is NRF_SUCCESS or others,I will check again. 

    I also want to check whether it enters the boot loader, so I enable the  NRF_LOG_ENABLED && NRF_LOG_BACKEND_RTT_ENABLED in sdk_config.h in boot loader projec to seek some info from the log.

    But  comes out these Errors: L6406E: No space in execution regions with .ANY selector matching nrf_log_backend_rtt.o(i.nrf_log_backend_rtt_flush).Guess the space is not enough to fit the feature of log.

  • Hi, Bjorn 

    I borrow another Android smart phone from my colleague,and it works to upload my zip file.

    My Android smart phone's specification:

    Redmi 5 , Android 7.1.2  BT 4.2

    My colleague's specification:

    LG V10 , Android 5.1.1 BT 4.1 

    nRF CONNECT versions I guess are the same, I downloaded it last week, 

    he downloaded it today. 

  • OK, so the issue is only present on your phone i.e. Redmi 5, Android 7.1.2 supporting BT 4.2 and not your colleague's LG V10 , Android 5.1.1 supporting BT 4.1. 

    Could you print the m_conn_handle variable when you get the BLE_GAP_EVT_CONNECTED in ble_evt_handler() in nrf_ble_dfu.c after connecting with the Redmi phone and then print it again in service_changed_send() prior to calling sd_ble_gatts_service_changed? 

    I would like to see it the connection handle is changed in between these two calls. 

    Best regards

    Bjørn 

     

  • Hi, Bjorn 

    I will check it next week.

    BTW, I also use the third smart phone to try it,and this one can't even show all the GATT services but only the first two services GENERIC Access & Generic Attribute. 

    Its spec is sony XA  Android 7.0 BT 4.1 

    If you want to know .  

    Thanks.

    Ralph

  • Yes, please to do that. 

    That is interesting as the SR3 FW uses the S132 v5.1.0 SofDevice and we've not had a lot of compatibility issues with Android devices. Are you able to capture a sniffer trace of the communication between the phones and the SR3?

    Bjørn

  • 0> <info> sr3_bootloader: In the bootloader=================
    0> <debug> app: In nrf_bootloader_init
    0> <debug> app: in weak nrf_dfu_init_user
    0> <debug> app: In real nrf_dfu_init
    0> <debug> nrf_dfu_settings: Enter nrf_dfu_settings_init
    0> <debug> nrf_dfu_flash: Calling nrf_dfu_flash_init(false)...
    0> <debug> nrf_dfu_flash: Initializing nrf_fstorage_nvmc backend.
    0> <debug> dfu_utils: Enter nrf_dfu_continue
    0> <debug> dfu_utils: Valid App
    0> <debug> app: Application sent bootloader request
    0> <debug> dfu_utils: App is valid
    0> <debug> app: Running Service Changed config
    0> <debug> app: Finished running Service Changed config
    0> <debug> app: Enabling SoftDevice.
    0> <debug> app: SoftDevice enabled.
    0> <debug> app: Device address set
    0> <debug> app: Regular adv name
    0> <debug> app: ##### Setting adv with peer data ####
    0> <debug> app: ##### IRK Found. Setting whitelist ####
    0> <debug> app: Finished initializing BLE DFU transport
    0> <debug> app: After nrf_dfu_transports_init
    0> <debug> nrf_dfu_flash: Calling nrf_dfu_flash_init(true)...
    0> <debug> nrf_dfu_flash: dfu_fstorage_evt_handler calls 0x00077025.
    0> <info> app: ble_evt_handler m_conn_handle:0----------------------------------------------
    0> <debug> app: == conn sec update request
    0> <debug> app: Sending Service Changed indication
    0> <info> app: service_changed_send M_CONN_HANDLE:0-------------------------------
    0> <warning> app: Client did not have the Service Changed indication set to enabled. Error: 0x00000008
    0> <debug> app: == We are finished handling conn sec update

    These two values of m_conn_handle only show while establishing connection after entering DFU mode.

    And then the error : 0x00000008, not upload the zip file yet.

    About the sniffer, I can check that later.

Reply
  • 0> <info> sr3_bootloader: In the bootloader=================
    0> <debug> app: In nrf_bootloader_init
    0> <debug> app: in weak nrf_dfu_init_user
    0> <debug> app: In real nrf_dfu_init
    0> <debug> nrf_dfu_settings: Enter nrf_dfu_settings_init
    0> <debug> nrf_dfu_flash: Calling nrf_dfu_flash_init(false)...
    0> <debug> nrf_dfu_flash: Initializing nrf_fstorage_nvmc backend.
    0> <debug> dfu_utils: Enter nrf_dfu_continue
    0> <debug> dfu_utils: Valid App
    0> <debug> app: Application sent bootloader request
    0> <debug> dfu_utils: App is valid
    0> <debug> app: Running Service Changed config
    0> <debug> app: Finished running Service Changed config
    0> <debug> app: Enabling SoftDevice.
    0> <debug> app: SoftDevice enabled.
    0> <debug> app: Device address set
    0> <debug> app: Regular adv name
    0> <debug> app: ##### Setting adv with peer data ####
    0> <debug> app: ##### IRK Found. Setting whitelist ####
    0> <debug> app: Finished initializing BLE DFU transport
    0> <debug> app: After nrf_dfu_transports_init
    0> <debug> nrf_dfu_flash: Calling nrf_dfu_flash_init(true)...
    0> <debug> nrf_dfu_flash: dfu_fstorage_evt_handler calls 0x00077025.
    0> <info> app: ble_evt_handler m_conn_handle:0----------------------------------------------
    0> <debug> app: == conn sec update request
    0> <debug> app: Sending Service Changed indication
    0> <info> app: service_changed_send M_CONN_HANDLE:0-------------------------------
    0> <warning> app: Client did not have the Service Changed indication set to enabled. Error: 0x00000008
    0> <debug> app: == We are finished handling conn sec update

    These two values of m_conn_handle only show while establishing connection after entering DFU mode.

    And then the error : 0x00000008, not upload the zip file yet.

    About the sniffer, I can check that later.

Children
No Data
Related