This blog is to show how to use the SPI bootloader to load the specify firmware from SPI flash for device firmware upgrade. Following up the blog (SPI bootloader), I would continuous to use the nRF52840 DK board and use its onboard qspi flash as SPI flash.

For example, there are 3 difference application firmware FW#1, FW#2 and FW#3 storing on the SPI flash.

By using the SPI bootloader, it would swap on the application region.

On each Application firmware, it also consists of two binary files.

  • Initial header file of FW
  • Binary file of FW

The format of the init configure file is

WORDData field length = 16
WORDFirmware version
WORDFirmware size
WORDFirmware CRC-32
WORDCRC-32 for the 12-byte data
Header file of the FW (init)

Address of the FW storing at the SPI FLASH

The address of the application firmware on the SPI flash are

Test Firmwares

I used the ble_app_buttonless as the demo application firmware.

  • ble_app_buttonless_01.hex
  • ble_app_buttonless_02.hex
  • ble_app_buttonless_03.hex

Each application firmware has its own device name which would be shown during power up.

Each application firmware has the button to trigger for upgrade difference firmware by using the general retention register.

#define BOOTLOADER_DFU_START_FW1        0x03//00000011b
#define BOOTLOADER_DFU_START_FW2        0x0C//00001100b
#define BOOTLOADER_DFU_START_FW3        0x30//00110000b

Preparation the application firmware to store on QSPI flash

Generate the header file and binary file from the hex file.

nrfutil_spi pkg generate --hw-version 52 --application-version 1 --application ble_app_buttonless_01.hex --sd-req 0xAE ble_app_buttonless_01_pkg.zip
nrfutil_spi pkg generate --hw-version 52 --application-version 1 --application ble_app_buttonless_02.hex --sd-req 0xAE ble_app_buttonless_02_pkg.zip
nrfutil_spi pkg generate --hw-version 52 --application-version 1 --application ble_app_buttonless_03.hex --sd-req 0xAE ble_app_buttonless_03_pkg.zip

After unzip the file, it consists of binary file (.bin), header file (.dat) and file info (json).

By using the objcopy to re-map the address (in order to store on the QSPI),

arm-none-eabi-objcopy -v -I binary -O ihex --change-addresses 0x12000000 ble_app_buttonless_01_pkg\ble_app_buttonless_01.dat   qspi\ble_app_buttonless_01_qspi_init.hex
arm-none-eabi-objcopy -v -I binary -O ihex --change-addresses 0x12001000 ble_app_buttonless_01_pkg\ble_app_buttonless_01.bin   qspi\ble_app_buttonless_01_qspi_app.hex
arm-none-eabi-objcopy -v -I binary -O ihex --change-addresses 0x12020000 ble_app_buttonless_02_pkg\ble_app_buttonless_02.dat   qspi\ble_app_buttonless_02_qspi_init.hex
arm-none-eabi-objcopy -v -I binary -O ihex --change-addresses 0x12021000 ble_app_buttonless_02_pkg\ble_app_buttonless_02.bin   qspi\ble_app_buttonless_02_qspi_app.hex
arm-none-eabi-objcopy -v -I binary -O ihex --change-addresses 0x12040000 ble_app_buttonless_03_pkg\ble_app_buttonless_03.dat   qspi\ble_app_buttonless_03_qspi_init.hex
arm-none-eabi-objcopy -v -I binary -O ihex --change-addresses 0x12041000 ble_app_buttonless_03_pkg\ble_app_buttonless_03.bin   qspi\ble_app_buttonless_03_qspi_app.hex

For example,

  • QSPI address 0x1200000 is equal to the SPI flash address 0x0000 0000.
  • QSPI address 0x1202000 is equal to the SPI flash address 0x0002 0000.

Program the application firmware on the qspi flash,

nrfjprog -f nrf52 --qspicustominit --qspieraseall

nrfjprog -f nrf52 --qspicustominit --program qspi\ble_app_buttonless_01_qspi_init.hex
nrfjprog -f nrf52 --qspicustominit --program qspi\ble_app_buttonless_01_qspi_app.hex
nrfjprog -f nrf52 --qspicustominit --program qspi\ble_app_buttonless_02_qspi_init.hex
nrfjprog -f nrf52 --qspicustominit --program qspi\ble_app_buttonless_02_qspi_app.hex
nrfjprog -f nrf52 --qspicustominit --program qspi\ble_app_buttonless_03_qspi_init.hex
nrfjprog -f nrf52 --qspicustominit --program qspi\ble_app_buttonless_03_qspi_app.hex

After program the bootloader and softdevice,

By pressing the button on the NRF52840 DK,

  • Button 2 – Device 01 (ble_app_buttonless_01.hex)
  • Button 3 – Device 02 (ble_app_buttonless_02.hex)
  • Button 4 – Device 03 (ble_app_buttonless_03.hex)

All the demo hex can be found at URL.

If you need to get the full source code, please send the email to me on request.