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 Ralph, 

    I apologize for the late reply. I've been out of office on vacation.  

    So setting NRF_DFU_BLE_REQUIRES_BONDS to 0 resolved the 

    Client did not have the Service Changed indication set to enabled. Error: 0x00000008

    error in the bootloader? 

    Setting NRF_DFU_BLE_REQUIRES_BONDS to 0 means that unbonded devices are able to connect to the bootloade, however, as long as they do not have a signed DFU image to upload they will not be able to perform a DFU of the remote. 

    Best regards

    Bjørn

  • Hi, Bjorn, 

    Sorry for my very late response,too. The notification didn't show up and I also forgot to review this.

     Yes, setting NRF_DFU_BLE_REQUIRES_BONDS to 0 resolved the 

    Client did not have the Service Changed indication set to enabled. Error: 0x00000008

    error in the bootloader.

    1.So if I set  NRF_DFU_BLE_REQUIRES_BONDS to 1, the device have to bond with bootloader(DFU_Target)first, so the whole process of DFU can go down?

    2.We recently change our chip from 52832 to 52810, and I find out even changing the HW_VERSION in 52810's config from 0x20031 to 0x20023, Log in secure DFU Service still tells me the hw verson is wrong.

    Seems it has to be 0x20031 instead of other values? Isn't hw version relating to the PCB of RCU likes pca63519 and pca20023 with same chip 52832? 

  • The bonds must be created in the main application, see this answer. The FW have CONFIG_DFU_HW_VERSION set to 0x20031 for nRF52810. Where did you set the HW_VERSION, and how did it tell you that the HW version is wrong?

  • I set CONFIG_DFU_HW_VERSION to 0x20023 in sr3_config_nrf52810_pca20031.h and packaged the dfu zip file with parameter --hw_version 0x20023,too.

     It said the HW version wrong by secure DFU service's DFU Control Point in nRF connect .

    I think the code is at dfu_handle_prevalidate() in dfu_req_handling.c where checkc of init command HW version 

  • Are you sure that sr3_config_nrf52810_pca20031.h is the config file included in your build? If you get this error, the HW_VERSION of bootloader and init packet does not match.

Reply Children
Related