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

Migrating from Keil to SES - Error with DFU INIT service

Hello Guys,,

I am trying to migrate my project form keil to segger embedded studio. My product is based on sdk 12.2.0, using softdevice s130 on nrf51822.
I searched for all the posts that helped in migrating to SES and able to successfully build my application project. But when flashing the build to my board
it is getting stuck at nrf_dfu_flash_erase function in dfu_init

I tried debugging and it is giving the error FS_ERR_INVALID_CFG in check_config(p_config) function. searched for the solution in the forum posts but nothing helped so far.
please help us to resolve as we are nearing production.


I am attaching my flash placement file for your reference

<!DOCTYPE Linker_Placement_File>
<Root name="Flash Section Placement">
  <MemorySegment name="$(FLASH_NAME:FLASH)">
    <ProgramSection alignment="0x100" load="Yes" name=".vectors" start="$(FLASH_START:)" />
    <ProgramSection alignment="4" load="Yes" name=".fs_data" />
    <ProgramSection alignment="4" load="Yes" name=".init" />
    <ProgramSection alignment="4" load="Yes" name=".init_rodata" />
    <ProgramSection alignment="4" load="Yes" name=".text" />
    <ProgramSection alignment="4" load="Yes" name=".dtors" />
    <ProgramSection alignment="4" load="Yes" name=".ctors" />
    <ProgramSection alignment="4" load="Yes" name=".rodata" />
    <ProgramSection alignment="4" load="Yes" name=".ARM.exidx" address_symbol="__exidx_start" end_symbol="__exidx_end" />
    <ProgramSection alignment="4" load="Yes" runin=".fast_run" name=".fast" />
    <ProgramSection alignment="4" load="Yes" runin=".data_run" name=".data" />
    <ProgramSection alignment="4" load="Yes" name=".bootloaderSettings" />
    <ProgramSection alignment="4" load="Yes" runin=".tdata_run" name=".tdata" />
    <ProgramSection alignment="4" keep="Yes" load="Yes" runin=".fs_data_run" name=".fs_data" />
  </MemorySegment>
  <MemorySegment name="$(RAM_NAME:RAM);SRAM">
    <ProgramSection alignment="0x100" load="No" name=".vectors_ram" start="$(RAM_START:$(SRAM_START:))" />
    <ProgramSection alignment="4" load="No" name=".fast_run" />
    <ProgramSection alignment="4" load="No" name=".data_run" />
    <ProgramSection alignment="4" load="No" name=".bss" />
    <ProgramSection alignment="4" load="No" name=".tbss" />
    <ProgramSection alignment="4" load="No" name=".tdata_run" />
    <ProgramSection alignment="4" load="No" name=".non_init" />
    <ProgramSection alignment="4" size="__HEAPSIZE__" load="No" name=".heap" />
    <ProgramSection alignment="8" size="__STACKSIZE__" load="No" place_from_segment_end="Yes" name=".stack" />
    <ProgramSection alignment="8" size="__STACKSIZE_PROCESS__" load="No" name=".stack_process" />
    <ProgramSection alignment="4" size="__STACKSIZE__" load="No" name=".fs_data_run" address_symbol="__start_fs_data"  end_symbol="__stop_fs_data" />
    <ProgramSection alignment="4" keep="Yes" load="No" name=".fs_data_run" address_symbol="__start_fs_data"  end_symbol="__stop_fs_data" />
  </MemorySegment>
  <MemorySegment name="$(FLASH2_NAME:FLASH2)">
    <ProgramSection alignment="4" load="Yes" name=".text2" />
    <ProgramSection alignment="4" load="Yes" name=".rodata2" />
    <ProgramSection alignment="4" load="Yes" runin=".data2_run" name=".data2" />
  </MemorySegment>
  <MemorySegment name="$(RAM2_NAME:RAM2)">
    <ProgramSection alignment="4" load="No" name=".data2_run" />
    <ProgramSection alignment="4" load="No" name=".bss2" />
  </MemorySegment>
</Root>

Parents
  • Yes, looking at the .map file you sent I see that the bootloader settings are place at 0x3ef84

    .bootloaderSettings
                    0x000000000003ef84      0x400
                    0x000000000003ef84                __bootloaderSettings_start__ = .
     *(.bootloaderSettings .bootloaderSettings.*)
     .bootloaderSettings
                    0x000000000003ef84      0x400 Output/SpineFit Strack Internal/Obj/nrf_dfu_settings.o
                    0x000000000003ef84                m_dfu_settings_buffer
                    0x000000000003f384                __bootloaderSettings_end__ = (__bootloaderSettings_start__ + SIZEOF (.bootloaderSettings))
                    0x0000000000000400                __bootloaderSettings_size__ = SIZEOF (.bootloaderSettings)
                    0x000000000003f384                __bootloaderSettings_load_end__ = __bootloaderSettings_end__
                    0x0000000000000001                . = ASSERT (((__bootloaderSettings_start__ == __bootloaderSettings_end__) || ((__bootloaderSettings_end__ - __FLASH_segment_start__) <= __FLASH_segment_size__)), error: .bootloaderSettings is too large to fit in FLASH memory segment)
                    0x000000000003f384                __data_load_start__ = ALIGN (__bootloaderSettings_end__, 0x4)

    The m_dfu_settings_buffer is placed in a section called .bootloaderSettings. 

    uint8_t m_dfu_settings_buffer[CODE_PAGE_SIZE] __attribute__ ((section(".bootloaderSettings")))
                                                  __attribute__((used));

    I cant see any bootloaderSettings in your flash_placement.xml file you attached to your question, so need to add this snippet to your projects flash_placement.xml file   

    <MemorySegment name="bootloaderSettings" start="0x0003FC00" size="0x400">
        <ProgramSection alignment="4" keep="Yes" load="No" name=".bootloaderSettings" address_symbol="__start_bootloader_settings" end_symbol="__stop_bootloader_settings" start = "0x0003FC00" size="0x400" />
    </MemorySegment>

Reply
  • Yes, looking at the .map file you sent I see that the bootloader settings are place at 0x3ef84

    .bootloaderSettings
                    0x000000000003ef84      0x400
                    0x000000000003ef84                __bootloaderSettings_start__ = .
     *(.bootloaderSettings .bootloaderSettings.*)
     .bootloaderSettings
                    0x000000000003ef84      0x400 Output/SpineFit Strack Internal/Obj/nrf_dfu_settings.o
                    0x000000000003ef84                m_dfu_settings_buffer
                    0x000000000003f384                __bootloaderSettings_end__ = (__bootloaderSettings_start__ + SIZEOF (.bootloaderSettings))
                    0x0000000000000400                __bootloaderSettings_size__ = SIZEOF (.bootloaderSettings)
                    0x000000000003f384                __bootloaderSettings_load_end__ = __bootloaderSettings_end__
                    0x0000000000000001                . = ASSERT (((__bootloaderSettings_start__ == __bootloaderSettings_end__) || ((__bootloaderSettings_end__ - __FLASH_segment_start__) <= __FLASH_segment_size__)), error: .bootloaderSettings is too large to fit in FLASH memory segment)
                    0x000000000003f384                __data_load_start__ = ALIGN (__bootloaderSettings_end__, 0x4)

    The m_dfu_settings_buffer is placed in a section called .bootloaderSettings. 

    uint8_t m_dfu_settings_buffer[CODE_PAGE_SIZE] __attribute__ ((section(".bootloaderSettings")))
                                                  __attribute__((used));

    I cant see any bootloaderSettings in your flash_placement.xml file you attached to your question, so need to add this snippet to your projects flash_placement.xml file   

    <MemorySegment name="bootloaderSettings" start="0x0003FC00" size="0x400">
        <ProgramSection alignment="4" keep="Yes" load="No" name=".bootloaderSettings" address_symbol="__start_bootloader_settings" end_symbol="__stop_bootloader_settings" start = "0x0003FC00" size="0x400" />
    </MemorySegment>

Children
No Data
Related