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:
- Is there some bootloader/app integration guide? Or bootloader is smart enough to relocate off-the-shelf app to jump to?
- 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?
- What app version 0xff means? Ignore?
Thanks in advance.