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

OTA-DFU sometimes erases the application data unexpectedly

Hi,

We are facing an issue where the application data stored using FDS is erased one in a while after OTA-DFU multiple times.

This issue does not occur all the time, but it appears as often as 5% of the times.

We are developing the customized application based on the ble_peripheral/ble_app_uart example with the following environment:

  • Target Chip: nRF52832
  • SDK: v16.0.0
  • Soft Device: s132
  • Compiler: IAR

For the DFU, I used secure_bootloader exmaple and combined these 2 application to crated 1 .zip file by nrfutil to upload via nRF Tools app (either iOS or Android).

I have made sure that the following parameters are matched:

// In nrf_dfu_types.h
DFU_APP_DATA_RESERVED CODE_PAGE_SIZE * 3

// In sdk_config.h
FDS_VIRTUAL_PAGES 3

This problem occurs regardless of the application size to be uploaded, i.e. it doesn't matter if it's single-bank or dual-bank update.

Is there any possible factor this issue to happen only sometimes?

If anyone can suggest the way to resolve or to reproduce the issue with 100% frequency, it would be so helpful!

Thank you.

  • Hi,

    We now have a patch for the newly found issue that may lead to no swap pages in FDS:

    One file need to be changed, and the required change is as follows:

    In <sdk folder>/components/libraries/fds/fds.c, in the function init_execute(), in the switch case FDS_OP_INIT_PROMOTE_SWAP, remove the lines:

                // When promoting the swap, keep the write_offset set by pages_init().
                ret = page_tag_write_data(m_swap_page.p_addr);
    

    In the same switch case, add the following lines right before the break:

                // Promote the old swap page to data, but do this at the end
                // because we can re-enter this function; we must update have
                // updated the page in RAM before that.
                ret = page_tag_write_data(p_old_swap);

    So that the full case FDS_OP_INIT_PROMOTE_SWAP now looks like this:

            case FDS_OP_INIT_PROMOTE_SWAP:
            {
                p_op->init.step       = FDS_OP_INIT_TAG_SWAP;
    
                uint16_t const         gc         = m_gc.cur_page;
                uint32_t const * const p_old_swap = m_swap_page.p_addr;
    
                // Execute the swap.
                m_swap_page.p_addr = m_pages[gc].p_addr;
                m_pages[gc].p_addr = p_old_swap;
    
                // Copy the offset from the swap to the new page.
                m_pages[gc].write_offset = m_swap_page.write_offset;
                m_swap_page.write_offset = FDS_PAGE_TAG_SIZE;
    
                m_pages[gc].page_type = FDS_PAGE_DATA;
    
                // Promote the old swap page to data, but do this at the end
                // because we can re-enter this function; we must update have
                // updated the page in RAM before that.
                ret = page_tag_write_data(p_old_swap);
            } break;

    This fix is verified to work with nRF5 SDK v17.

Related