Hi,
I am using SDK 1.9.1 and nRF5340.
Scenario
I am investigating the following scenario:
- files containing the firmware upgrade for the app and/or net cores will be initially stored in the filesystem partition (extenal flash) as they are produced during the compilation phase (app_update.bin and net_core_app_update.bin);
- on request, the upgrade of the app or net core will start;
- the request will be handled by the firmware running in the app core: the request will specify the file to use for the upgrade;
- the file containing the upgrade will be first validated; if validation is passed, the file will be copy into the mcuboot_secondary partition (external flash, but at the moment internal) and MCUBoot will take over the control of this phase and perform the upgrade of the core;
- due a bug, i cannot used the external flash to store the new image of the app and net core, so at the moment internal flash will be used; but the final goal is to use the external spi flash.
Looking in the documentation and in some tickets, I understood that one possible way to do it would be to use the DFU taget library. Here below the pseudo-code:
uint8_t buffer[1024] = {0}; (void)fileOpen("app_update.bin", READ_MODE, handle); (void)fileRead(handle, &buffer[0], 4); /* read the first 4 bytes at the beginning of the upgrade bin file */ int imageType = dfu_target_img_type(const void *const &buffer[0], sizeof(buffer)); /* imageType should be 0x01, DFU_TARGET_IMAGE_TYPE_MCUBOOT */ uint32_t fileSize = fileSize("app_update.bin"); int ret = dfu_target_init(imageType, fileSize, NULL); if (ret < 0) return; uint32_t offset = 0; do { uint32_t bytesRead = fileRead(handle, offset, &buffer[0], sizeof(buffer)); ret = dfu_target_write(&buffer[0], bytesRead); fileSize -= bytesRead; offset += bytesRead; }while ((filesize > 0) && (ret > 0)); if ((filesize == 0) && (ret == 0)) { dfu_target_done(true); } else { dfu_target_done(false); dfu_target_reset(); /*Reset the nRF5340 */ }
When the upgraded app firmware restarts, the function boot_write_img_confirmed() will be invoked.
Using the app nRF Connect Device Manager i am able to update both app and net core.
In my actual project i have defined only mcuboot_secondary partition.
I can see that with the app is possible to swap the firmware, instead with the netcore is not.
Questions:
- is the reported approach correct ? If not, could you kindly indicate an example that suites my scenario ?
- Can it work also for the network core ? How do i specify the core to be updated ? Basically, doing the same thing that nRF Connect Device Manager does.
- Is there a function that perform the validation of the bin files before being copy in the DFU target ?
- I saw that there is DFU multi-image library. is there any example using that ? is the zip file produced during the compilation that need to be sent to the DFU target?
Thanks in advance for your kind help.