BLE NRF52805 DFU bootloader can't jump to the app

Hi,

Setup: SDK 17.1.0, SES 8.2, S112, custom buttonless uartless nrf52805 board, non-BLE test apps.

Objective: To enable robust wireless image download as next batch of boards will have debug interface removed. Security doesn't matter at all

Problem: I can't make secure bootloader to jump to app.

Description

I took BLE secure bootloader as a basis despite of extrta security steps which are not needed but hoping it would work out-of-the-box.

By following this guide, I have successfully built debug version of the bootloader. In addition, I have created a test app by slimming random number generator example so the app takes only 8k of flash. My custom application is also tiny. None of the apps require softdevice so the upgrade is only for the app itself.

The bootloader seems to be working as 'advertised' - DFU app (Android phone) works without any issues, bootloader RTT messages look just fine during upgrade, but nothing happens after that.

The initial DFU cycle log:

00> <info> app: Inside main
00> 
00> <debug> app: In nrf_bootloader_init
00> 
00> <debug> nrf_dfu_settings: Calling nrf_dfu_settings_init()...
00> 
00> <debug> nrf_dfu_flash: Initializing nrf_fstorage_nvmc backend.
00> 
00> <warning> nrf_dfu_settings: Resetting bootloader settings since neither the settings page nor the backup are valid (CRC error).
00> 
00> <debug> nrf_dfu_settings: Writing settings...
00> 
00> <debug> nrf_dfu_settings: Erasing old settings at: 0x0002F000
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0002F000, len=1 pages), queue usage: 0
00> 
00> <debug> nrf_dfu_flash: Flash erase success: addr=0x0002F000, pending 0
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0002F000, src=0x20003BA8, len=896 bytes), queue usage: 1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x0002F000, pending 0
00> 
00> <info> nrf_dfu_settings: Backing up settings page to address 0x2E000.
00> 
00> <debug> nrf_dfu_settings: Writing settings...
00> 
00> <debug> nrf_dfu_settings: Erasing old settings at: 0x0002E000
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0002E000, len=1 pages), queue usage: 1
00> 
00> <debug> nrf_dfu_flash: Flash erase success: addr=0x0002E000, pending 0
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0002E000, src=0x20003828, len=896 bytes), queue usage: 1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x0002E000, pending 0
00> 
00> <debug> app: Enter nrf_bootloader_fw_activate
00> 
00> <info> app: No firmware to activate.
00> 
00> <info> app: Boot validation failed. No valid app to boot.
00> 
00> <debug> app: DFU mode because app is not valid.
00> 
00> <info> nrf_bootloader_wdt: WDT is not enabled
00> 
00> <debug> app: in weak nrf_dfu_init_user
00> 
00> <debug> app: timer_stop (0x200022E8)
00> 
00> <debug> app: timer_activate (0x200022E8)
00> 
00> <info> app: Entering DFU mode.
00> 
00> <debug> app: Initializing transports (found: 1)
00> 
00> <debug> nrf_dfu_ble: Initializing BLE DFU transport
00> 
00> <debug> nrf_dfu_ble: Setting up vector table: 0x00022000
00> 
00> <debug> nrf_dfu_ble: Enabling SoftDevice.
00> 
00> <debug> nrf_dfu_ble: Configuring BLE stack.
00> 
00> <debug> nrf_dfu_ble: Enabling the BLE stack.
00> 
00> <debug> nrf_dfu_ble: No advertising name found
00> 
00> <debug> nrf_dfu_ble: Using default advertising name
00> 
00> <debug> nrf_dfu_ble: Advertising...
00> 
00> <debug> nrf_dfu_ble: BLE DFU transport initialized.
00> 
00> <debug> nrf_dfu_flash: Initializing nrf_fstorage_sd backend.
00> 
00> <debug> app: Enter main loop
00> 
00> <debug> nrf_dfu_ble: Connected
00> 
00> <debug> nrf_dfu_ble: Received BLE_GAP_EVT_CONN_PARAM_UPDATE
00> 
00> <debug> nrf_dfu_ble: max_conn_interval: 12
00> 
00> <debug> nrf_dfu_ble: min_conn_interval: 12
00> 
00> <debug> nrf_dfu_ble: slave_latency: 0
00> 
00> <debug> nrf_dfu_ble: conn_sup_timeout: 600
00> 
00> <debug> nrf_dfu_ble: Received BLE_GAP_EVT_CONN_PARAM_UPDATE
00> 
00> <debug> nrf_dfu_ble: max_conn_interval: 6
00> 
00> <debug> nrf_dfu_ble: min_conn_interval: 6
00> 
00> <debug> nrf_dfu_ble: slave_latency: 0
00> 
00> <debug> nrf_dfu_ble: conn_sup_timeout: 500
00> 
00> <debug> nrf_dfu_ble: Received BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST (request: 517, reply: 247).
00> 
00> <debug> nrf_dfu_ble: Received BLE_GAP_EVT_CONN_PARAM_UPDATE
00> 
00> <debug> nrf_dfu_ble: max_conn_interval: 12
00> 
00> <debug> nrf_dfu_ble: min_conn_interval: 12
00> 
00> <debug> nrf_dfu_ble: slave_latency: 0
00> 
00> <debug> nrf_dfu_ble: conn_sup_timeout: 600
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_SELECT (command)
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_ble: Set receipt notif
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_RECEIPT_NOTIF_SET
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> app: Shutting down transports (found: 1)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_CREATE (command)
00> 
00> <debug> app: timer_stop (0x200022E8)
00> 
00> <debug> app: timer_activate (0x200022E8)
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002790 acquired, len 141 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (command)
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002790
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_CRC_GET (command)
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_EXECUTE (command)
00> 
00> <debug> nrf_dfu_validation: PB: Init packet data len: 64
00> 
00> <info> nrf_dfu_validation: Signature required. Checking signature.
00> 
00> <info> nrf_dfu_validation: Calculating hash (len: 64)
00> 
00> <info> nrf_dfu_validation: Verify signature
00> 
00> <debug> nrf_dfu_ble: Received BLE_GAP_EVT_CONN_PARAM_UPDATE
00> 
00> <debug> nrf_dfu_ble: max_conn_interval: 12
00> 
00> <debug> nrf_dfu_ble: min_conn_interval: 12
00> 
00> <debug> nrf_dfu_ble: slave_latency: 0
00> 
00> <debug> nrf_dfu_ble: conn_sup_timeout: 500
00> 
00> <info> nrf_dfu_validation: Image verified
00> 
00> <debug> app: Enter nrf_dfu_cache_prepare()
00> 
00> <debug> app: required_size: 0x11BC.
00> 
00> <debug> app: single_bank: false.
00> 
00> <debug> app: keep_app: false.
00> 
00> <debug> app: keep_softdevice: true.
00> 
00> <debug> app: SD_PRESENT: true.
00> 
00> <debug> app: Bank contents:
00> 
00> <debug> app: Bank 0 code: 0x00: Size: 0x0
00> 
00> <debug> app: Bank 1 code: 0x00: Size: 0x0
00> 
00> <debug> app: pass: 0.
00> 
00> <debug> app: cache_address: 0x19000.
00> 
00> <debug> app: cache_too_small: false.
00> 
00> <debug> app: keep_firmware: false.
00> 
00> <debug> app: delete_more: false.
00> 
00> <debug> nrf_dfu_validation: Write address set to 0x00019000
00> 
00> <debug> nrf_dfu_settings: Writing settings...
00> 
00> <debug> nrf_dfu_settings: Erasing old settings at: 0x0002F000
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0002F000, len=1 pages), queue usage: 1
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0002F000, src=0x20003BA8, len=896 bytes), queue usage: 2
00> 
00> <info> nrf_dfu_settings: Backing up settings page to address 0x2E000.
00> 
00> <debug> nrf_dfu_settings: Writing settings...
00> 
00> <debug> nrf_dfu_settings: Erasing old settings at: 0x0002E000
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0002E000, len=1 pages), queue usage: 3
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0002E000, src=0x20003828, len=896 bytes), queue usage: 4
00> 
00> <debug> nrf_dfu_req_handler: Writing valid init command to flash.
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_SELECT (data)
00> 
00> <debug> nrf_dfu_req_handler: crc = 0x0, offset = 0x0, max_size = 0x1000
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash erase success: addr=0x0002F000, pending 4
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_CREATE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x00019000, len=1 pages), queue usage: 4
00> 
00> <debug> nrf_dfu_req_handler: Creating object with size: 4096. Offset: 0x00000000, CRC: 0x00000000
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x0002F000, pending 4
00> 
00> <debug> nrf_dfu_flash: Flash erase success: addr=0x0002E000, pending 3
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x0002E000, pending 2
00> 
00> <debug> nrf_dfu_flash: Flash erase success: addr=0x00019000, pending 1
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002790 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00019000, src=0x20002790, len=244 bytes), queue usage: 1
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002884 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000190F4, src=0x20002884, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x00019000, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002790
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002790 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000191E8, src=0x20002790, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x000190F4, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002884
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002884 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000192DC, src=0x20002884, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x000191E8, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002790
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002790 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000193D0, src=0x20002790, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x000192DC, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002884
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002884 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000194C4, src=0x20002884, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x000193D0, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002790
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002790 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000195B8, src=0x20002790, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x000194C4, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002884
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002884 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000196AC, src=0x20002884, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x000195B8, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002790
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002790 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000197A0, src=0x20002790, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x000196AC, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002884
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x000197A0, pending 1
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002790
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002790 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00019894, src=0x20002790, len=244 bytes), queue usage: 1
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002884 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00019988, src=0x20002884, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x00019894, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002790
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002790 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00019A7C, src=0x20002790, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x00019988, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002884
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002884 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00019B70, src=0x20002884, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x00019A7C, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002790
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002790 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00019C64, src=0x20002790, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x00019B70, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002884
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002884 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00019D58, src=0x20002884, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x00019C64, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002790
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002790 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00019E4C, src=0x20002790, len=244 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x00019D58, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002884
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002884 acquired, len 192 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00019F40, src=0x20002884, len=192 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_CRC_GET (data)
00> 
00> <debug> nrf_dfu_req_handler: Offset:4096, CRC:0x87A77365
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x00019E4C, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002790
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x00019F40, pending 1
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002884
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_EXECUTE (data)
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> app: timer_stop (0x200022E8)
00> 
00> <debug> app: timer_activate (0x200022E8)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_CREATE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0001A000, len=1 pages), queue usage: 1
00> 
00> <debug> nrf_dfu_req_handler: Creating object with size: 444. Offset: 0x00001000, CRC: 0x87A77365
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash erase success: addr=0x0001A000, pending 1
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002884 acquired, len 244 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0001A000, src=0x20002884, len=244 bytes), queue usage: 1
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_ble: Buffer 0x20002790 acquired, len 200 (244)
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0001A0F4, src=0x20002790, len=200 bytes), queue usage: 2
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_CRC_GET (data)
00> 
00> <debug> nrf_dfu_req_handler: Offset:4540, CRC:0x75B42CCA
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x0001A000, pending 2
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002884
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x0001A0F4, pending 1
00> 
00> <debug> nrf_dfu_ble: Freeing buffer 0x20002790
00> 
00> <debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_EXECUTE (data)
00> 
00> <debug> nrf_dfu_req_handler: Whole firmware image received. Postvalidating.
00> 
00> <debug> nrf_dfu_validation: Hash verification. start address: 0x19000, size: 0x11BC
00> 
00> <debug> nrf_dfu_validation: Invalidating old application in bank 0.
00> 
00> <debug> nrf_dfu_settings: Writing settings...
00> 
00> <debug> nrf_dfu_settings: Erasing old settings at: 0x0002F000
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0002F000, len=1 pages), queue usage: 1
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0002F000, src=0x20003BA8, len=896 bytes), queue usage: 2
00> 
00> <info> nrf_dfu_settings: Backing up settings page to address 0x2E000.
00> 
00> <debug> nrf_dfu_settings: Writing settings...
00> 
00> <debug> nrf_dfu_settings: Erasing old settings at: 0x0002E000
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0002E000, len=1 pages), queue usage: 3
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0002E000, src=0x20003828, len=896 bytes), queue usage: 4
00> 
00> <debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
00> 
00> <debug> app: timer_stop (0x200022E8)
00> 
00> <debug> app: timer_activate (0x200022E8)
00> 
00> <debug> nrf_dfu_flash: Flash erase success: addr=0x0002F000, pending 4
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x0002F000, pending 3
00> 
00> <debug> nrf_dfu_flash: Flash erase success: addr=0x0002E000, pending 2
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x0002E000, pending 1
00> 
00> <debug> nrf_dfu_req_handler: All flash operations have completed. DFU completed.
00> 
00> <debug> app: Shutting down transports (found: 1)
00> 
00> <debug> nrf_dfu_ble: Shutting down BLE transport.
00> 
00> <debug> nrf_dfu_ble: Disconnecting.
00> 
00> <debug> nrf_dfu_ble: BLE transport shut down.
00> 
00> <debug> app: Resetting bootloader.
00> 
00> <info> nrf_dfu_settings: Backing up settings page to address 0x2E000.
00> 
00> <debug> nrf_dfu_settings: Destination settings are identical to source, wri<info> app: Inside main
00> 
00> <debug> app: In nrf_bootloader_init
00> 
00> <debug> nrf_dfu_settings: Calling nrf_dfu_settings_init()...
00> 
00> <debug> nrf_dfu_flash: Initializing nrf_fstorage_nvmc backend.
00> 
00> <debug> nrf_dfu_settings: Using settings page.
00> 
00> <debug> nrf_dfu_settings: Copying forbidden parts from backup page.
00> 
00> <debug> nrf_dfu_settings: Destination settings are identical to source, write not needed. Skipping.
00> 
00> <info> nrf_dfu_settings: Backing up settings page to address 0x2E000.
00> 
00> <debug> nrf_dfu_settings: Destination settings are identical to source, write not needed. Skipping.
00> 
00> <debug> app: Enter nrf_bootloader_fw_activate
00> 
00> <debug> app: Valid App
00> 
00> <debug> app: Enter nrf_dfu_app_continue
00> 
00> <debug> app: No copy needed
00> 
00> <debug> app: Setting app as valid
00> 
00> <debug> nrf_dfu_settings: Writing settings...
00> 
00> <debug> nrf_dfu_settings: Erasing old settings at: 0x0002F000
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0002F000, len=1 pages), queue usage: 0
00> 
00> <debug> nrf_dfu_flash: Flash erase success: addr=0x0002F000, pending 0
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0002F000, src=0x20003BA8, len=896 bytes), queue usage: 1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x0002F000, pending 0
00> 
00> <info> nrf_dfu_settings: Backing up settings page to address 0x2E000.
00> 
00> <debug> nrf_dfu_settings: Writing settings...
00> 
00> <debug> nrf_dfu_settings: Erasing old settings at: 0x0002E000
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0002E000, len=1 pages), queue usage: 1
00> 
00> <debug> nrf_dfu_flash: Flash erase success: addr=0x0002E000, pending 0
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0002E000, src=0x20003828, len=896 bytes), queue usage: 1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x0002E000, pending 0
00> 
00> <debug> app: Resetting bootloader.
00> 
00> <info> nrf_dfu_settings: Backing up settings page to address 0x2E000.
00> 
00> <debug> nrf_dfu_settings: Destination settings are identical to source, write not needed. Skipping.
00> 
00> <info> app: Inside main
00> 
00> <debug> app: In nrf_bootloader_init
00> 
00> <debug> nrf_dfu_settings: Calling nrf_dfu_settings_init()...
00> 
00> <debug> nrf_dfu_flash: Initializing nrf_fstorage_nvmc backend.
00> 
00> <debug> nrf_dfu_settings: Using settings page.
00> 
00> <debug> nrf_dfu_settings: Copying forbidden parts from backup page.
00> 
00> <debug> nrf_dfu_settings: Destination settings are identical to source, write not needed. Skipping.
00> 
00> <info> nrf_dfu_settings: Backing up settings page to address 0x2E000.
00> 
00> <debug> nrf_dfu_settings: Destination settings are identical to source, write not needed. Skipping.
00> 
00> <debug> app: Enter nrf_bootloader_fw_activate
00> 
00> <info> app: No firmware to activate.
00> 
00> <debug> app: App is valid
00> 
00> <debug> nrf_dfu_settings_svci: Erasing settings page additional data.
00> 
00> <info> nrf_dfu_settings: Backing up settings page to address 0x2E000.
00> 
00> <debug> nrf_dfu_settings: Writing settings...
00> 
00> <debug> nrf_dfu_settings: Erasing old settings at: 0x0002E000
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0002E000, len=1 pages), queue usage: 0
00> 
00> <debug> nrf_dfu_flash: Flash erase success: addr=0x0002E000, pending 0
00> 
00> <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0002E000, src=0x20003828, len=896 bytes), queue usage: 1
00> 
00> <debug> nrf_dfu_flash: Flash write success: addr=0x0002E000, pending 0
00> 
00> <debug> app: Running nrf_bootloader_app_start with address: 0x00001000
00> 
00> <debug> app: Disabling interrupts. NVIC->ICER[0]: 0x0

The output after reboot:

00> <info> app: Inside main
00> 
00> <debug> app: In nrf_bootloader_init
00> 
00> <debug> nrf_dfu_settings: Calling nrf_dfu_settings_init()...
00> 
00> <debug> nrf_dfu_flash: Initializing nrf_fstorage_nvmc backend.
00> 
00> <debug> nrf_dfu_settings: Using settings page.
00> 
00> <debug> nrf_dfu_settings: Copying forbidden parts from backup page.
00> 
00> <debug> nrf_dfu_settings: Destination settings are identical to source, write not needed. Skipping.
00> 
00> <info> nrf_dfu_settings: Backing up settings page to address 0x2E000.
00> 
00> E000.
00> 
00> 001000

If I generate bootloader setting and program them as well, the bootloader never starts DFU even on a blank (erased) chip with the same message as above.

Judging by the power consumption (about 2.5ma)  nrf52805 is stuck in some sort of waiting loop or similar.

I went through a gazillion of similar issues here on Devzone but, frankly, it didn't help much.

I am looking for some guidance here as I suspect it is something simple I have overlooked. 

Questions that I have at the moment:

  1. Is there some bootloader/app integration guide? Or bootloader is smart enough to relocate off-the-shelf app to jump to?
  2. What NO_VTOR_CONFIG actually does? Just sets vector table? I presume Softdevce sets vector table so both bootloader and app should be compiled with NO_VTOR_CONFIG?
  3. What app version 0xff means? Ignore?

Thanks in advance.

Parents
  • Hello,

    I don't think it's what's causing the problem with not booting the app in this, but please use Segger Embedded Studio version 5.x to build your app and bootloader as versions 6.20 and later have known compatibility issues with this SDK. 

    If I generate bootloader setting and program them as well, the bootloader never starts DFU even on a blank (erased) chip with the same message as above.

    Judging by the power consumption (about 2.5ma)  nrf52805 is stuck in some sort of waiting loop or similar.

    I recommend you start a debug session in SES and pause the debugger when you have reached this state. You can then check the Program Counter register (PC) in the register view to determine where the code hangs.

    Is there some bootloader/app integration guide? Or bootloader is smart enough to relocate off-the-shelf app to jump to?

    The bootloader is branching to address 0x1000 + 4 which is the address of the Softdevice's reset handler, so this is correct.

    What NO_VTOR_CONFIG actually does? Just sets vector table? I presume Softdevce sets vector table so both bootloader and app should be compiled with NO_VTOR_CONFIG?

    The SES startup code will set the VTOR register to match the start address of the application unless NO_VTOR_CONFIG is set. VTOR needs to be =0 when working with the Softdevice to ensure interrupts are received by the MBR/Softdevice and not just the application.

    Another thing to keep in mind is that the MBR/Softdevice uses the first to words of RAM even if the application is not enabling the Softdevice. This means that you should reserve the first 8 bytes of RAM in your application by setting the RAM start address to 0x20000008 or more. E.g.,

    (Note: RAM_SIZE must not exceed total RAM on device - 8).

    Best regards,

    Vidar

  • It seems to be some sort of missing config thing. 

    I have traced bootloader execution down to 

    jump_to_addr(new_msp, reset_handler); // Jump directly to the App's Reset Handler.

    in nrf_bootloader_app_start_final.c. And I have added both parameters to the watch list - neither is recognised.

Reply Children
Related