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

DFU gcc linker setting

Hi,

I have a question regarding linker file in case of gcc make. I need to create a DFU package and program the it on a bootloader.

Here is my linker file:

/* Linker script to configure memory regions. */

SEARCH_DIR(.)
GROUP(-lgcc -lc -lnosys)

MEMORY
{
  FLASH (rx) : ORIGIN = 0x26000, LENGTH = 0x5a000
  RAM (rwx) :  ORIGIN = 0x20002bf0, LENGTH = 0xd410
}

SECTIONS
{
}

SECTIONS
{
  . = ALIGN(4);
  .mem_section_dummy_ram :
  {
  }
  .cli_sorted_cmd_ptrs :
  {
    PROVIDE(__start_cli_sorted_cmd_ptrs = .);
    KEEP(*(.cli_sorted_cmd_ptrs))
    PROVIDE(__stop_cli_sorted_cmd_ptrs = .);
  } > RAM
  .fs_data :
  {
    PROVIDE(__start_fs_data = .);
    KEEP(*(.fs_data))
    PROVIDE(__stop_fs_data = .);
  } > RAM
  .log_dynamic_data :
  {
    PROVIDE(__start_log_dynamic_data = .);
    KEEP(*(SORT(.log_dynamic_data*)))
    PROVIDE(__stop_log_dynamic_data = .);
  } > RAM
  .log_filter_data :
  {
    PROVIDE(__start_log_filter_data = .);
    KEEP(*(SORT(.log_filter_data*)))
    PROVIDE(__stop_log_filter_data = .);
  } > RAM

} INSERT AFTER .data;

SECTIONS
{
  .mem_section_dummy_rom :
  {
  }
  .sdh_soc_observers :
  {
    PROVIDE(__start_sdh_soc_observers = .);
    KEEP(*(SORT(.sdh_soc_observers*)))
    PROVIDE(__stop_sdh_soc_observers = .);
  } > FLASH
  .sdh_ble_observers :
  {
    PROVIDE(__start_sdh_ble_observers = .);
    KEEP(*(SORT(.sdh_ble_observers*)))
    PROVIDE(__stop_sdh_ble_observers = .);
  } > FLASH
  .pwr_mgmt_data :
  {
    PROVIDE(__start_pwr_mgmt_data = .);
    KEEP(*(SORT(.pwr_mgmt_data*)))
    PROVIDE(__stop_pwr_mgmt_data = .);
  } > FLASH
    .nrf_queue :
  {
    PROVIDE(__start_nrf_queue = .);
    KEEP(*(.nrf_queue))
    PROVIDE(__stop_nrf_queue = .);
  } > FLASH
  .sdh_req_observers :
  {
    PROVIDE(__start_sdh_req_observers = .);
    KEEP(*(SORT(.sdh_req_observers*)))
    PROVIDE(__stop_sdh_req_observers = .);
  } > FLASH
  .sdh_state_observers :
  {
    PROVIDE(__start_sdh_state_observers = .);
    KEEP(*(SORT(.sdh_state_observers*)))
    PROVIDE(__stop_sdh_state_observers = .);
  } > FLASH
  .sdh_stack_observers :
  {
    PROVIDE(__start_sdh_stack_observers = .);
    KEEP(*(SORT(.sdh_stack_observers*)))
    PROVIDE(__stop_sdh_stack_observers = .);
  } > FLASH
    .nrf_balloc :
  {
    PROVIDE(__start_nrf_balloc = .);
    KEEP(*(.nrf_balloc))
    PROVIDE(__stop_nrf_balloc = .);
  } > FLASH
    .cli_command :
  {
    PROVIDE(__start_cli_command = .);
    KEEP(*(.cli_command))
    PROVIDE(__stop_cli_command = .);
  } > FLASH
  .crypto_data :
  {
    PROVIDE(__start_crypto_data = .);
    KEEP(*(SORT(.crypto_data*)))
    PROVIDE(__stop_crypto_data = .);
  } > FLASH
  .log_const_data :
  {
    PROVIDE(__start_log_const_data = .);
    KEEP(*(SORT(.log_const_data*)))
    PROVIDE(__stop_log_const_data = .);
  } > FLASH
  .log_backends :
  {
    PROVIDE(__start_log_backends = .);
    KEEP(*(SORT(.log_backends*)))
    PROVIDE(__stop_log_backends = .);
  } > FLASH

} INSERT AFTER .text


INCLUDE "nrf_common.ld"

I know that I should define  the location where bootloader start address is stored in this file. But I have not found any example.

My second question is that how I can find this address in my bootloader file?

Thanks

  • Tai said:
    But when I tryed to program the package via DFU, the connection stoped and the package did not upload

     What SDK version are you using?

    Are you using the bootloader in examples\dfu\secure_bootloader\pca10040_s132_ble ?

    Can you post the command you used to create the DFU package?

  • It is 17.0.2 version.

    I am using hrs example and I added  ble_dfu_buttonless_async_svci_init() and other dfu codes to the example. When I use .hex created by keil it seems to be ok. But I can not use the package created by gcc.

    it is DFU package creator that I use:

    nrfutil pkg generate --hw-version 52 --application-version 0 --application ~\nRF5_SDK_17.0.2_d674dde\examples\ble_peripheral\ble_habil_up\pca10040\s132\armgcc\_build\nrf52832_xxaa.hex --sd-req 0x0101 --key-file keys/private.key app_%1.zip

  • Tai said:
    But I can not use the package created by gcc.

     Do you get any errors, warnings? Do you have any log output?

    You might need to add e.g. these C and Assembler flags to the makefile:

    NRF_DFU_TRANSPORT_BLE=1
    NRF_DFU_SVCI_ENABLED
    BL_SETTINGS_ACCESS_ONLY

  • I do not get any errors. The code compiled and the package is created without any waring or errors:

    make: Entering directory `.../nRF5_SDK_17.0.2_d674dde/examples/ble_peripheral/ble_hrs/pca10040/s132/armgcc'
    Linking target: _build/nrf52832_xxaa.out
       text    data     bss     dec     hex filename
      93004     188    4880   98072   17f18 _build/nrf52832_xxaa.out
    Preparing: _build/nrf52832_xxaa.hex
    Preparing: _build/nrf52832_xxaa.bin
    DONE nrf52832_xxaa
    make: Leaving directory `.../nRF5_SDK_17.0.2_d674dde/examples/ble_peripheral/ble_hrs/pca10040/s132/armgcc'
    
    C:\...>nrfutil pkg generate --hw-version 52 --application-version 0 --application ...\nRF5_SDK_17.0.2_d674dde\examples\ble_peripheral\ble_hrs\pca10040\s132\armgcc\_build\nrf52832_xxaa.hex --sd-req 0x0101 --key-file keys/private.key app_001001-B.zip
    Zip created at app.zip

    I had already added NRF_DFU_TRANSPORT_BLE=1 and NRF_DFU_SVCI_ENABLED to keil and makefile. But I have not this flag even in keil: BL_SETTINGS_ACCESS_ONLY

    My problem is that everything seems ok with keil. But I can not use gcc complier.

  • Tai said:
    But when I tryed to program the package via DFU, the connection stoped and the package did not upload.

     Maybe you could use the debug variant of the bootloader, it's the bootloader project with the _debug prefix, and take a look at the nrf_log output from the bootloader to see if you get any errors in the bootloader when DFU is performed?

    Tai said:
    My problem is that everything seems ok with keil. But I can not use gcc complier

    Check if RAM and FLASH start address is the same in Keil and in the GCC linker script. Maybe there is a difference there.

Related