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

Buttonless DFU not flashing new firmware SDK 15.2.0

Hello,

We are trying to get DFU to work on our custom board running nrf52832. It has previously worked on the devkit. Our board does not have a crystal so we are using NRF_CLOCK_LF_SRC_RC both in the bootloader and application. Our bootloader is based on the example secure_bootloader_ble_s132_pca10040, the only changes we made are led/button behavior, public key and enabled rtt logging for debugging.

We are testing the DFU functionality using nrf connect for android.

The bootloader receives the signed zip but does not flash it. Below are some errors from the log (Flash write/erase failed (0x3))

<debug> nrf_dfu_flash: Flash write success: addr=0x0003DA7C, pending 1
<debug> nrf_dfu_ble: Freeing buffer 0x200068F8
<debug> nrf_dfu_req_handler: Whole firmware image received. Postvalidating.
<debug> nrf_dfu_validation: Hash verification. Firmware start address: 0x32000, size: 0xBB54
<debug> nrf_dfu_validation: Invalidating old application in bank 0.
<debug> nrf_dfu_settings: Writing settings...
<debug> nrf_dfu_settings: Erasing old settings at: 0x0007F000
<debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0007F000, len=1 pages), queue usage: 1
<debug> nrf_dfu_flash: Flash erase failed (0x3): addr=0x0007F000, len=0x1 bytes, pending 0
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0007F000, src=0x200074D0, len=440 bytes), queue usage: 1
<debug> nrf_dfu_flash: Flash write failed (0x3): addr=0x0007F000, len=0x1B8 bytes, pending 0
<info> nrf_dfu_settings: Backing up settings page to address 0x7E000.
<debug> nrf_dfu_settings: Writing settings...
<debug> nrf_dfu_settings: Erasing old settings at: 0x0007E000
<debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0007E000, len=1 pages), queue usage: 1
<debug> nrf_dfu_flash: Flash erase failed (0x3): addr=0x0007E000, len=0x1 bytes, pending 0
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0007E000, src=0x20007688, len=440 bytes), queue usage: 1
<debug> nrf_dfu_flash: Flash write failed (0x3): addr=0x0007E000, len=0x1B8 bytes, pending 0
<debug> nrf_dfu_req_handler: All flash operations have completed. DFU completed.

What could be causing those errors? I've also attached a more full log.

Thanks

<info> app: Inside main
<debug> app: In nrf_bootloader_init
<debug> nrf_dfu_settings: Calling nrf_dfu_settings_init()...
<debug> nrf_dfu_flash: Initializing nrf_fstorage<info> app: Inside main
<debug> app: In nrf_bootloader_init
<debug> nrf_dfu_settings: Calling nrf_dfu_settings_init()...
<debug> nrf_dfu_flash: Initializing nrf_fstorage_nvmc backend.
<debug> nrf_dfu_settings: Settings OK
<debug> app: Enter nrf_bootloader_fw_activate
<info> app: No firmware to activate.
<debug> app: Enter nrf_dfu_app_is_valid
<debug> app: Return true. App was valid
<info> nrf_dfu_settings: Backing up settings page to address 0x7E000.
<debug> nrf_dfu_settings: Destination settings are identical to source, write not needed. Skipping.
<debug> app: Running nrf_bootloader_app_start with address: 0x00001000
<debug> app: Disabling interrupts. NVIC->ICER[0]: 0x0
<debug> app: running irq table set
<debug> app: After running irq table set
<info> app: Inside main
<debug> app: In nrf_bootloader_init
<debug> nrf_dfu_settings: Calling nrf_dfu_settings_init()...
<debug> nrf_dfu_flash: Initializing nrf_fstorage_nvmc backend.
<debug> nrf_dfu_settings: Settings OK
<debug> app: Enter nrf_bootloader_fw_activate
<info> app: No firmware to activate.
<debug> app: Enter nrf_dfu_app_is_valid
<debug> app: Return true. App was valid
<debug> app: DFU mode requested via GPREGRET.
<info> nrf_bootloader_wdt: WDT is not enabled
<debug> app: in weak nrf_dfu_init_user
<debug> app: timer_stop (0x200057D4)
<debug> app: timer_activate (0x200057D4)
<info> app: Entering DFU mode.
<debug> app: Initializing transports (found: 1)
<debug> nrf_dfu_ble: Initializing BLE DFU transport
<debug> nrf_dfu_ble: Setting up vector table: 0x00072000
<debug> nrf_dfu_ble: Enabling SoftDevice.
<debug> nrf_dfu_ble: Configuring BLE stack.
<debug> nrf_dfu_ble: Enabling the BLE stack.
<debug> nrf_dfu_ble: No advertising name found
<debug> nrf_dfu_ble: Using default advertising name
<debug> nrf_dfu_ble: Advertising...
<debug> nrf_dfu_ble: BLE DFU transport initialized.
<debug> nrf_dfu_flash: Initializing nrf_fstorage_sd backend.
<debug> app: Enter main loop
<debug> nrf_dfu_ble: Connected
<debug> nrf_dfu_ble: Received BLE_GAP_EVT_CONN_PARAM_UPDATE
<debug> nrf_dfu_ble: max_conn_interval: 12
<debug> nrf_dfu_ble: min_conn_interval: 12
<debug> nrf_dfu_ble: slave_latency: 0
<debug> nrf_dfu_ble: conn_sup_timeout: 600
<debug> nrf_dfu_ble: Received BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST.
<debug> nrf_dfu_ble: Received BLE_GAP_EVT_DATA_LENGTH_UPDATE (100, max_rx_time 912).
<debug> nrf_dfu_ble: Received BLE_GAP_EVT_CONN_PARAM_UPDATE
<debug> nrf_dfu_ble: max_conn_interval: 6
<debug> nrf_dfu_ble: min_conn_interval: 6
<debug> nrf_dfu_ble: slave_latency: 0
<debug> nrf_dfu_ble: conn_sup_timeout: 500
<debug> nrf_dfu_ble: Received BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST.
<debug> nrf_dfu_ble: Received BLE_GAP_EVT_DATA_LENGTH_UPDATE (100, max_rx_time 912).
<debug> nrf_dfu_ble: Received BLE_GAP_EVT_CONN_PARAM_UPDATE
<debug> nrf_dfu_ble: max_conn_interval: 12
<debug> nrf_dfu_ble: min_conn_interval: 12
<debug> nrf_dfu_ble: slave_latency: 0
<debug> nrf_dfu_ble: conn_sup_timeout: 600
<debug> nrf_dfu_ble: Received BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST.
<debug> nrf_dfu_ble: Received BLE_GAP_EVT_DATA_LENGTH_UPDATE (100, max_rx_time 912).
<debug> nrf_dfu_ble: Received BLE_GATTS_EVT_EXCHANGE_MTU_REQUEST (request: 517, reply: 247).
<debug> nrf_dfu_ble: Received BLE_GAP_EVT_DATA_LENGTH_UPDATE_REQUEST.
<debug> nrf_dfu_ble: Received BLE_GAP_EVT_DATA_LENGTH_UPDATE (100, max_rx_time 1096).
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_SELECT (command)
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Set receipt notif
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_RECEIPT_NOTIF_SET
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> app: Shutting down transports (found: 1)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_CREATE (command)
<debug> app: timer_stop (0x200057D4)
<debug> app: timer_activate (0x200057D4)
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006434 acquired, len 141 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (command)
<debug> nrf_dfu_ble: Freeing buffer 0x20006434
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_CRC_GET (command)
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_EXECUTE (command)
<debug> nrf_dfu_validation: PB: Init packet data len: 64
<info> nrf_dfu_validation: Signature required. Checking signature.
<info> nrf_dfu_validation: Calculating init packet hash (init packet len: 64)
<info> nrf_dfu_validation: Verify signature
<info> nrf_dfu_validation: Image verified
<debug> app: Enter nrf_dfu_cache_prepare()
<debug> app: required_size: 0xBB54.
<debug> app: single_bank: false.
<debug> app: keep_app: false.
<debug> app: keep_softdevice: true.
<debug> app: SD_PRESENT: true.
<debug> app: Bank contents:
<debug> app: Bank 0 code: 0x01: Size: 0xBB54
<debug> app: Bank 1 code: 0x00: Size: 0x0
<debug> app: pass: 0.
<debug> app: cache_address: 0x32000.
<debug> app: cache_too_small: false.
<debug> app: keep_firmware: false.
<debug> app: delete_more: false.
<debug> nrf_dfu_validation: Write address set to 0x00032000
<debug> nrf_dfu_settings: Writing settings...
<debug> nrf_dfu_settings: Erasing old settings at: 0x0007F000
<debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0007F000, len=1 pages), queue usage: 0
<debug> nrf_dfu_flash: Flash erase failed (0x3): addr=0x0007F000, len=0x1 bytes, pending 0
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0007F000, src=0x200074D0, len=440 bytes), queue usage: 1
<debug> nrf_dfu_flash: Flash write failed (0x3): addr=0x0007F000, len=0x1B8 bytes, pending 0
<info> nrf_dfu_settings: Backing up settings page to address 0x7E000.
<debug> nrf_dfu_settings: Writing settings...
<debug> nrf_dfu_settings: Erasing old settings at: 0x0007E000
<debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0007E000, len=1 pages), queue usage: 1
<debug> nrf_dfu_flash: Flash erase failed (0x3): addr=0x0007E000, len=0x1 bytes, pending 0
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0007E000, src=0x20007688, len=440 bytes), queue usage: 1
<debug> nrf_dfu_flash: Flash write failed (0x3): addr=0x0007E000, len=0x1B8 bytes, pending 0
<debug> nrf_dfu_req_handler: Writing valid init command to flash.
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_SELECT (data)
<debug> nrf_dfu_req_handler: crc = 0x0, offset = 0x0, max_size = 0x1000
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> app: Shutting down transports (found: 1)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_CREATE (data)
<debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x00032000, len=1 pages), queue usage: 1
<debug> nrf_dfu_req_handler: Creating object with size: 4096. Offset: 0x00000000, CRC: 0x00000000
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash erase success: addr=0x00032000, pending 1
<debug> nrf_dfu_ble: Buffer 0x20006434 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00032000, src=0x20006434, len=244 bytes), queue usage: 1
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006528 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000320F4, src=0x20006528, len=244 bytes), queue usage: 2
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x00032000, pending 2
<debug> nrf_dfu_ble: Freeing buffer 0x20006434
<debug> nrf_dfu_ble: Buffer 0x20006434 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000321E8, src=0x20006434, len=244 bytes), queue usage: 2
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x2000661C acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000322DC, src=0x2000661C, len=244 bytes), queue usage: 3
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000320F4, pending 3
<debug> nrf_dfu_ble: Freeing buffer 0x20006528
<debug> nrf_dfu_ble: Buffer 0x20006528 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000323D0, src=0x20006528, len=244 bytes), queue usage: 3
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006710 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000324C4, src=0x20006710, len=244 bytes), queue usage: 4
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006804 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000325B8, src=0x20006804, len=244 bytes), queue usage: 5
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000321E8, pending 5
<debug> nrf_dfu_ble: Freeing buffer 0x20006434
<debug> nrf_dfu_ble: Buffer 0x20006434 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000326AC, src=0x20006434, len=244 bytes), queue usage: 5
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000322DC, pending 5
<debug> nrf_dfu_ble: Freeing buffer 0x2000661C
<debug> nrf_dfu_ble: Buffer 0x2000661C acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000327A0, src=0x2000661C, len=244 bytes), queue usage: 5
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x200068F8 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00032894, src=0x200068F8, len=244 bytes), queue usage: 6
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x200069EC acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00032988, src=0x200069EC, len=244 bytes), queue usage: 7
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000323D0, pending 7
<debug> nrf_dfu_ble: Freeing buffer 0x20006528
<debug> nrf_dfu_ble: Buffer 0x20006528 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00032A7C, src=0x20006528, len=244 bytes), queue usage: 7
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006AE0 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00032B70, src=0x20006AE0, len=244 bytes), queue usage: 8
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000324C4, pending 8
<debug> nrf_dfu_ble: Freeing buffer 0x20006710
<debug> nrf_dfu_ble: Buffer 0x20006710 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00032C64, src=0x20006710, len=244 bytes), queue usage: 8
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006BD4 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00032D58, src=0x20006BD4, len=244 bytes), queue usage: 9
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006CC8 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00032E4C, src=0x20006CC8, len=244 bytes), queue usage: 10
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000325B8, pending 10
<debug> nrf_dfu_ble: Freeing buffer 0x20006804
<debug> nrf_dfu_ble: Buffer 0x20006804 acquired, len 192 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00032F40, src=0x20006804, len=192 bytes), queue usage: 10
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_CRC_GET (data)
<debug> nrf_dfu_req_handler: Offset:4096, CRC:0x1D65A037
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000326AC, pending 10
<debug> nrf_dfu_ble: Freeing buffer 0x20006434
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_EXECUTE (data)
<debug> app: timer_stop (0x200057D4)
<debug> app: timer_activate (0x200057D4)
<debug> nrf_dfu_flash: Flash write success: addr=0x000327A0, pending 9
<debug> nrf_dfu_ble: Freeing buffer 0x2000661C
<debug> nrf_dfu_flash: Flash write success: addr=0x00032894, pending 8
<debug> nrf_dfu_ble: Freeing buffer 0x200068F8
<debug> nrf_dfu_flash: Flash write success: addr=0x00032988, pending 7
<debug> nrf_dfu_ble: Freeing buffer 0x200069EC
<debug> nrf_dfu_flash: Flash write success: addr=0x00032A7C, pending 6
<debug> nrf_dfu_ble: Freeing buffer 0x20006528
<debug> nrf_dfu_flash: Flash write success: addr=0x00032B70, pending 5
<debug> nrf_dfu_ble: Freeing buffer 0x20006AE0
<debug> nrf_dfu_flash: Flash write success: addr=0x00032C64, pending 4
<debug> nrf_dfu_ble: Freeing buffer 0x20006710
<debug> nrf_dfu_flash: Flash write success: addr=0x00032D58, pending 3
<debug> nrf_dfu_ble: Freeing buffer 0x20006BD4
<debug> nrf_dfu_flash: Flash write success: addr=0x00032E4C, pending 2
<debug> nrf_dfu_ble: Freeing buffer 0x20006CC8
<debug> nrf_dfu_flash: Flash write success: addr=0x00032F40, pending 1
<debug> nrf_dfu_ble: Freeing buffer 0x20006804
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> app: Shutting down transports (found: 1)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_CREATE (data)
<debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x00033000, len=1 pages), queue usage: 1
<debug> nrf_dfu_req_handler: Creating object with size: 4096. Offset: 0x00001000, CRC: 0x1D65A037
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006804 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00033000, src=0x20006804, len=244 bytes), queue usage: 2
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash erase success: addr=0x00033000, pending 2
<debug> nrf_dfu_flash: Flash write success: addr=0x00033000, pending 1
<debug> nrf_dfu_ble: Freeing buffer 0x20006804
<debug> nrf_dfu_ble: Buffer 0x20006804 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000330F4, src=0x20006804, len=244 bytes), queue usage: 1
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006CC8 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000331E8, src=0x20006CC8, len=244 bytes), queue usage: 2
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000330F4, pending 2
<debug> nrf_dfu_ble: Freeing buffer 0x20006804
<debug> nrf_dfu_ble: Buffer 0x20006804 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000332DC, src=0x20006804, len=244 bytes), queue usage: 2
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006BD4 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000333D0, src=0x20006BD4, len=244 bytes), queue usage: 3
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000331E8, pending 3
<debug> nrf_dfu_ble: Freeing buffer 0x20006CC8
<debug> nrf_dfu_ble: Buffer 0x20006CC8 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000334C4, src=0x20006CC8, len=244 bytes), queue usage: 3
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006710 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000335B8, src=0x20006710, len=244 bytes), queue usage: 4
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006AE0 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000336AC, src=0x20006AE0, len=244 bytes), queue usage: 5
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000332DC, pending 5
<debug> nrf_dfu_ble: Freeing buffer 0x20006804
<debug> nrf_dfu_ble: Buffer 0x20006804 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x000337A0, src=0x20006804, len=244 bytes), queue usage: 5
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000333D0, pending 5
<debug> nrf_dfu_ble: Freeing buffer 0x20006BD4
<debug> nrf_dfu_ble: Buffer 0x20006BD4 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00033894, src=0x20006BD4, len=244 bytes), queue usage: 5
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006528 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00033988, src=0x20006528, len=244 bytes), queue usage: 6
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x200069EC acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00033A7C, src=0x200069EC, len=244 bytes), queue usage: 7
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000334C4, pending 7
<debug> nrf_dfu_ble: Freeing buffer 0x20006CC8
<debug> nrf_dfu_ble: Buffer 0x20006CC8 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00033B70, src=0x20006CC8, len=244 bytes), queue usage: 7
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x200068F8 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00033C64, src=0x200068F8, len=244 bytes), queue usage: 8
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000335B8, pending 8
<debug> nrf_dfu_ble: Freeing buffer 0x20006710
<debug> nrf_dfu_ble: Buffer 0x20006710 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00033D58, src=0x20006710, len=244 bytes), queue usage: 8
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x2000661C acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00033E4C, src=0x2000661C, len=244 bytes), queue usage: 9
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x20006434 acquired, len 192 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x00033F40, src=0x20006434, len=192 bytes), queue usage: 10
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_CRC_GET (data)
<debug> nrf_dfu_req_handler: Offset:8192, CRC:0xAC0E61A0
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x000336AC, pending 10
<debug> nrf_dfu_ble: Freeing buffer 0x20006AE0
<debug> nrf_dfu_flash: Flash write success: addr=0x000337A0, pending 9
<debug> nrf_dfu_ble: Freeing buffer 0x20006804
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_EXECUTE (data)
<debug> app: timer_stop (0x200057D4)
<debug> app: timer_activate (0x200057D4)
<debug> nrf_dfu_flash: Flash write success: addr=0x00033894, pending 8
<debug> nrf_dfu_ble: Freeing buffer 0x20006BD4
<debug> nrf_dfu_flash: Flash write success: addr=0x00033988, pending 7
<debug> nrf_dfu_ble: Freeing buffer 0x20006528
<debug> nrf_dfu_flash: Flash write success: addr=0x00033A7C, pending 6
<debug> nrf_dfu_ble: Freeing buffer 0x200069EC
<debug> nrf_dfu_flash: Flash write success: addr=0x00033B70, pending 5
<debug> nrf_dfu_ble: Freeing buffer 0x20006CC8
<debug> nrf_dfu_flash: Flash write success: addr=0x00033C64, pending 4
<debug> nrf_dfu_ble: Freeing buffer 0x200068F8
<debug> nrf_dfu_flash: Flash write success: addr=0x00033D58, pending 3
<debug> nrf_dfu_ble: Freeing buffer 0x20006710
<debug> nrf_dfu_flash: Flash write success: addr=0x00033E4C, pending 2
<debug> nrf_dfu_ble: Freeing buffer 0x2000661C
<debug> nrf_dfu_flash: Flash write success: addr=0x00033F40, pending 1
<debug> nrf_dfu_ble: Freeing buffer 0x20006434
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> app: Shutting down transports (found: 1)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_CREATE (data)
<debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x00034000, len=1 pages), queue usage: 1
<debug> nrf_dfu_req_handler: Creating object with size: 4096. Offset: 0x00002000, CRC: 0xAC0E61A0
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
...
...
more logs here
...
...
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x200069EC acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0003D7A0, src=0x200069EC, len=244 bytes), queue usage: 5
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x0003D3D0, pending 5
<debug> nrf_dfu_ble: Freeing buffer 0x20006BD4
<debug> nrf_dfu_ble: Buffer 0x20006BD4 acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0003D894, src=0x20006BD4, len=244 bytes), queue usage: 5
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_ble: Buffer 0x2000661C acquired, len 244 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0003D988, src=0x2000661C, len=244 bytes), queue usage: 6
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x0003D4C4, pending 6
<debug> nrf_dfu_ble: Freeing buffer 0x200068F8
<debug> nrf_dfu_ble: Buffer 0x200068F8 acquired, len 216 (244)
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_WRITE (data)
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0003DA7C, src=0x200068F8, len=216 bytes), queue usage: 6
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_CRC_GET (data)
<debug> nrf_dfu_req_handler: Offset:47956, CRC:0xD1B4219C
<debug> nrf_dfu_req_handler: Request handling complete. Result: 0x1
<debug> nrf_dfu_flash: Flash write success: addr=0x0003D5B8, pending 6
<debug> nrf_dfu_ble: Freeing buffer 0x20006434
<debug> nrf_dfu_req_handler: Handle NRF_DFU_OP_OBJECT_EXECUTE (data)
<debug> app: timer_stop (0x200057D4)
<debug> app: timer_activate (0x200057D4)
<debug> nrf_dfu_flash: Flash write success: addr=0x0003D6AC, pending 5
<debug> nrf_dfu_ble: Freeing buffer 0x20006710
<debug> nrf_dfu_flash: Flash write success: addr=0x0003D7A0, pending 4
<debug> nrf_dfu_ble: Freeing buffer 0x200069EC
<debug> nrf_dfu_flash: Flash write success: addr=0x0003D894, pending 3
<debug> nrf_dfu_ble: Freeing buffer 0x20006BD4
<debug> nrf_dfu_flash: Flash write success: addr=0x0003D988, pending 2
<debug> nrf_dfu_ble: Freeing buffer 0x2000661C
<debug> nrf_dfu_flash: Flash write success: addr=0x0003DA7C, pending 1
<debug> nrf_dfu_ble: Freeing buffer 0x200068F8
<debug> nrf_dfu_req_handler: Whole firmware image received. Postvalidating.
<debug> nrf_dfu_validation: Hash verification. Firmware start address: 0x32000, size: 0xBB54
<debug> nrf_dfu_validation: Invalidating old application in bank 0.
<debug> nrf_dfu_settings: Writing settings...
<debug> nrf_dfu_settings: Erasing old settings at: 0x0007F000
<debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0007F000, len=1 pages), queue usage: 1
<debug> nrf_dfu_flash: Flash erase failed (0x3): addr=0x0007F000, len=0x1 bytes, pending 0
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0007F000, src=0x200074D0, len=440 bytes), queue usage: 1
<debug> nrf_dfu_flash: Flash write failed (0x3): addr=0x0007F000, len=0x1B8 bytes, pending 0
<info> nrf_dfu_settings: Backing up settings page to address 0x7E000.
<debug> nrf_dfu_settings: Writing settings...
<debug> nrf_dfu_settings: Erasing old settings at: 0x0007E000
<debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0007E000, len=1 pages), queue usage: 1
<debug> nrf_dfu_flash: Flash erase failed (0x3): addr=0x0007E000, len=0x1 bytes, pending 0
<debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0007E000, src=0x20007688, len=440 bytes), queue usage: 1
<debug> nrf_dfu_flash: Flash write failed (0x3): addr=0x0007E000, len=0x1B8 bytes, pending 0
<debug> nrf_dfu_req_handler: All flash operations have completed. DFU completed.
<debug> app: Shutting down transports (found: 1)
<debug> nrf_dfu_ble: Shutting down BLE transport.
<debug> nrf_dfu_ble: Disconnecting.
<debug> nrf_dfu_ble: BLE transport shut down.
<debug> app: Resetting bootloader.
<info> nrf_dfu_settings: Backing up settings page to address 0x7E000.
<debug> nrf_dfu_settings: Destination settings are identical to source, write not needed. Skipping.
<info> app: Inside main
<debug> app: In nrf_bootloader_init
<debug> nrf_dfu_settings: Calling nrf_dfu_settings_init()...
<debug> nrf_dfu_flash: Initializing nrf_fstorage_nvmc backend.
<debug> nrf_dfu_settings: Settings OK
<debug> app: Enter nrf_bootloader_fw_activate
<info> app: No firmware to activate.
<debug> app: Enter nrf_dfu_app_is_valid
<debug> app: Return true. App was valid
<info> nrf_dfu_settings: Backing up settings page to address 0x7E000.
<debug> nrf_dfu_settings: Destination settings are identical to source, write not needed. Skipping.
<debug> app: Running nrf_bootloader_app_start with address: 0x00001000
<debug> app: Disabling interrupts. NVIC->ICER[0]: 0x0
<debug> app: running irq table set
<debug> app: After running irq table set

  • Hi Nem22, 

    are you able to reproduce this on a nRF52 DK? If so then I would be great if you could share the project  + dfu images so that I could debug it. 

    I am not seeing any "Could not erase the settings page!" or "Could not write the DFU settings page!" statements in the log output, which I would expect when nrf_fstorage_write() and nrf_fstorage_erase() are returning NRF_ERROR_INTERNAL. Could you setup breakpoints in settings_write() in nrf_dfu_settings.c and see why this is not caught? 

    static ret_code_t settings_write(void                   * p_dst,
                                     void const             * p_src,
                                     nrf_dfu_flash_callback_t callback,
                                     nrf_dfu_settings_t     * p_dfu_settings_buffer)
    {
        ret_code_t err_code;
    
        if (memcmp(p_dst, p_src, sizeof(nrf_dfu_settings_t)) == 0)
        {
            NRF_LOG_DEBUG("Destination settings are identical to source, write not needed. Skipping.");
            if (callback != NULL)
            {
                callback(NULL);
            }
            return NRF_SUCCESS;
        }
    
        if (NRF_DFU_SETTINGS_IN_APP && !settings_forbidden_parts_equal_to_backup((uint8_t *)&s_dfu_settings))
        {
            NRF_LOG_WARNING("Settings write aborted since it tries writing to forbidden settings.");
            // Assuming NRF_DFU_SETTINGS_ALLOW_UPDATE_FROM_APP is configured the same as in bootloader.
            return NRF_ERROR_FORBIDDEN;
        }
    
        NRF_LOG_DEBUG("Writing settings...");
        NRF_LOG_DEBUG("Erasing old settings at: 0x%08x", p_dst);
    
        // Not setting the callback function because ERASE is required before STORE
        // Only report completion on successful STORE.
        err_code = nrf_dfu_flash_erase((uint32_t)p_dst, 1, NULL);
    
        if (err_code != NRF_SUCCESS)
        {
            NRF_LOG_ERROR("Could not erase the settings page!");
            return NRF_ERROR_INTERNAL;
        }
    
        ASSERT(p_dfu_settings_buffer != NULL);
        memcpy(p_dfu_settings_buffer, p_src, sizeof(nrf_dfu_settings_t));
    
        err_code = nrf_dfu_flash_store((uint32_t)p_dst,
                                       p_dfu_settings_buffer,
                                       sizeof(nrf_dfu_settings_t),
                                       callback);
    
        if (err_code != NRF_SUCCESS)
        {
            NRF_LOG_ERROR("Could not write the DFU settings page!");
            return NRF_ERROR_INTERNAL;
        }
    
        return NRF_SUCCESS;
    }

    Best regards

    Bjørn

  • Hello Bjorn,

    I have not been able to reproduce the issue on nRF52 DK, dfu works perfectly, no errors when flashing settings page.

    I added log_infos after nrf_dfu_flash_erase and nrf_dfu_flash_store and they are both returning 0 - NRF_SUCCESS

    <debug> nrf_dfu_settings: Writing settings...
    <debug> nrf_dfu_settings: Erasing old settings at: 0x0007F000
    <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0007F000, len=1 pages), queue usage: 1
    <debug> nrf_dfu_flash: Flash erase failed (0x3): addr=0x0007F000, len=0x1 bytes, pending 0
    <info> nrf_dfu_settings: flash erase err code: 0
    <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0007F000, src=0x200074D0, len=440 bytes), queue usage: 1
    <debug> nrf_dfu_flash: Flash write failed (0x3): addr=0x0007F000, len=0x1B8 bytes, pending 0
    <info> nrf_dfu_settings: flash store err code: 0
    <info> nrf_dfu_settings: Backing up settings page to address 0x7E000.
    <debug> nrf_dfu_settings: Writing settings...
    <debug> nrf_dfu_settings: Erasing old settings at: 0x0007E000
    <debug> nrf_dfu_flash: nrf_fstorage_erase(addr=0x0x0007E000, len=1 pages), queue usage: 1
    <debug> nrf_dfu_flash: Flash erase failed (0x3): addr=0x0007E000, len=0x1 bytes, pending 0
    <info> nrf_dfu_settings: flash erase err code: 0
    <debug> nrf_dfu_flash: nrf_fstorage_write(addr=0x0007E000, src=0x20007688, len=440 bytes), queue usage: 1
    <debug> nrf_dfu_flash: Flash write failed (0x3): addr=0x0007E000, len=0x1B8 bytes, pending 0
    <debug> nrf_dfu_req_handler: All flash operations have completed. DFU completed.
    <debug> app: Shutting down transports (found: 1)

    Is there a SB or jumper on the DK I can use to confirm it's not using the crystal?

    Thanks

  • Hi nem22, 

    to me that makes no sense. How can nrf_fstorage_write() and nrf_fstorage_erase() return return code 0x03, which in turn is returned by nrf_dfu_flash_erase() and nrf_dfu_flash_store() as err_code in  settings_write()? A non-zero( i.e. not NRF_SUCCESS) should be caught by the if (err_code != NRF_SUCCESS) check. Can you double check that rc in nrf_dfu_flash_store/erase is not modified between the nrf_fstorage_write/erase call and the return rc statment?

     

    ret_code_t nrf_dfu_flash_store(uint32_t                   dest,
                                   void               const * p_src,
                                   uint32_t                   len,
                                   nrf_dfu_flash_callback_t   callback)
    {
        ret_code_t rc;
    
        NRF_LOG_DEBUG("nrf_fstorage_write(addr=%p, src=%p, len=%d bytes), queue usage: %d",
                      dest, p_src, len, m_flash_operations_pending);
    
        //lint -save -e611 (Suspicious cast)
        rc = nrf_fstorage_write(&m_fs, dest, p_src, len, (void *)callback);
        //lint -restore
    
        if ((NRF_LOG_ENABLED) && (rc == NRF_SUCCESS))
        {
            m_flash_operations_pending++;
        }
        else
        {
            NRF_LOG_WARNING("nrf_fstorage_write() failed with error 0x%x.", rc);
        }
    
        return rc;
    }
    
    ret_code_t nrf_dfu_flash_erase(uint32_t                 page_addr,
                                   uint32_t                 num_pages,
                                   nrf_dfu_flash_callback_t callback)
    {
        ret_code_t rc;
    
        NRF_LOG_DEBUG("nrf_fstorage_erase(addr=0x%p, len=%d pages), queue usage: %d",
                      page_addr, num_pages, m_flash_operations_pending);
    
        //lint -save -e611 (Suspicious cast)
        rc = nrf_fstorage_erase(&m_fs, page_addr, num_pages, (void *)callback);
        //lint -restore
    
        if ((NRF_LOG_ENABLED) && (rc == NRF_SUCCESS))
        {
            m_flash_operations_pending++;
        }
        else
        {
            NRF_LOG_WARNING("nrf_fstorage_erase() failed with error 0x%x.", rc);
        }
    
        return rc;
    }
    
    static ret_code_t settings_write(void                   * p_dst,
                                     void const             * p_src,
                                     nrf_dfu_flash_callback_t callback,
                                     nrf_dfu_settings_t     * p_dfu_settings_buffer)
    {
        ret_code_t err_code;
    
        if (memcmp(p_dst, p_src, sizeof(nrf_dfu_settings_t)) == 0)
        {
            NRF_LOG_DEBUG("Destination settings are identical to source, write not needed. Skipping.");
            if (callback != NULL)
            {
                callback(NULL);
            }
            return NRF_SUCCESS;
        }
    
        if (NRF_DFU_SETTINGS_IN_APP && !settings_forbidden_parts_equal_to_backup((uint8_t *)&s_dfu_settings))
        {
            NRF_LOG_WARNING("Settings write aborted since it tries writing to forbidden settings.");
            // Assuming NRF_DFU_SETTINGS_ALLOW_UPDATE_FROM_APP is configured the same as in bootloader.
            return NRF_ERROR_FORBIDDEN;
        }
    
        NRF_LOG_DEBUG("Writing settings...");
        NRF_LOG_DEBUG("Erasing old settings at: 0x%08x", p_dst);
    
        // Not setting the callback function because ERASE is required before STORE
        // Only report completion on successful STORE.
        err_code = nrf_dfu_flash_erase((uint32_t)p_dst, 1, NULL);
    
        if (err_code != NRF_SUCCESS)
        {
            NRF_LOG_ERROR("Could not erase the settings page!");
            return NRF_ERROR_INTERNAL;
        }
    
        ASSERT(p_dfu_settings_buffer != NULL);
        memcpy(p_dfu_settings_buffer, p_src, sizeof(nrf_dfu_settings_t));
    
        err_code = nrf_dfu_flash_store((uint32_t)p_dst,
                                       p_dfu_settings_buffer,
                                       sizeof(nrf_dfu_settings_t),
                                       callback);
    
        if (err_code != NRF_SUCCESS)
        {
            NRF_LOG_ERROR("Could not write the DFU settings page!");
            return NRF_ERROR_INTERNAL;
        }
    
        return NRF_SUCCESS;
    }

    nem22 said:
    Is there a SB or jumper on the DK I can use to confirm it's not using the crystal?

     No, the 32kHz crystal is connected directly to the nRF52832 on the nRF52DK. There are no jumpers or solder bridges in between. 

  • Hello Bjorn,

    I added a breakpoint before nrf_fstorage_erase() in nrf_dfu_flash, using if(page_addr==0x0007F000) to catch the problematic call. The moment nrf_fstorage_erase() returns, rc is set to 0.

    nrf_fstorage_erase() and nrf_fstorage_write() both return 0, the error is printed by dfu_fstorage_evt_handler()

    ret_code_t nrf_dfu_flash_erase(uint32_t                 page_addr,
                                   uint32_t                 num_pages,
                                   nrf_dfu_flash_callback_t callback)
    {
        ret_code_t rc;
    
        NRF_LOG_DEBUG("nrf_fstorage_erase(addr=0x%p, len=%d pages), queue usage: %d",
                      page_addr, num_pages, m_flash_operations_pending);
    
        if(page_addr==0x0007F000)
          NRF_LOG_INFO("0x0007F000");
    
        //lint -save -e611 (Suspicious cast)
        rc = nrf_fstorage_erase(&m_fs, page_addr, num_pages, (void *)callback);
        //lint -restore
        NRF_LOG_INFO("nrf_fstorage_erase() returned %d in nrf_dfu_flash", rc);
    
    
        if ((NRF_LOG_ENABLED) && (rc == NRF_SUCCESS))
        {
            m_flash_operations_pending++;
        }
        else
        {
            NRF_LOG_WARNING("nrf_fstorage_erase() failed with error 0x%x.", rc);
        }
    
        return rc;
    }

  • Ah, my bad. I now see that the log messages does not fit and it makes sense as nrf_fstorage_write/erase will only queue the flash operations which are asynchronous. So the queuing of the flash operations are ok, but the operation it self( which occurs afterwards) fails with NRF_ERROR_INTERNAL. 

    The question is then why would the erase and write operations fail with NRF_ERROR_INTERNAL.

    Do you see this issue on multiple custom boards or just one? 

Related