Hi @ll,
I'm still trying to get the Mesh DFU example up and running. I'm following the guide in the documentation. (Mesh Version 2.0.0: it's the same in 2.0.1 so don't worry about the version)
Setup: Everything flashed (Softdevice 6.0.0, Bootloader, DevicePage and DFU example application)
Once I try to send a dfu packet the device throws this error:
<t: 452185>, nrf_mesh_dfu.c, 901, ERROR: No CMD handler!
Looking at the code I found something that looks strange to me:
nrf_mesh_dfu.c in mesh/dfu/src
uint32_t nrf_mesh_dfu_init(void) { uint32_t error_code; #if !defined(HOST) error_code = dfu_cmd_handler_set(*((bl_if_cmd_handler_t*) (DEVICE_DATA_RAM_END_GET() - sizeof(bl_if_cmd_handler_t)))); if (error_code != NRF_SUCCESS) { m_transfer_state.state = NRF_MESH_DFU_STATE_INITIALIZED; return NRF_ERROR_NOT_SUPPORTED; }
This part calls dfu_cmd_handler_set with an address that is in the range of RAM (for the nRF52 about 0x2000xxxx)
But the function it self does/checks this:
nrf_mesh_dfu.c in mesh/dfu/src
static uint32_t dfu_cmd_handler_set(bl_if_cmd_handler_t handler) { if (handler == NULL) { return NRF_ERROR_NULL; } if (BOOTLOADERADDR() == 0xFFFFFFFF) { /* No bootloader present. */ return NRF_ERROR_NOT_SUPPORTED; } if (((uint32_t) handler >= DEVICE_FLASH_END_GET()) || ((uint32_t) handler < BOOTLOADERADDR())) { /* out of bounds. */ return NRF_ERROR_INVALID_ADDR; }
So it compares the address it gets with a FLASH address? Speaking about address in the range of 0x00000000-0x00080000.
So this will always return NRF_ERROR_INVALID_ADDR in case there is a bootloader address in NRF_UICR->NRFFW[0]? Otherwise it will always return NRF_ERROR_INVALID_ADDR?
Maybe I got something wrong
Thank you in advance for your help
Bye
Andrej