Development Environment: VS Code on Windows 10, SDK: 2.0.0, HW: nRF5340 Development Kit
I am trying to perform just a network core update on the nRF5340 DK based off of the smp_svr sample where the secondary slot for incoming updates is on an external QSPI. Using the Device Manager app, I can perform application core updates without issue, but when doing a network core update, MCUBoot seems to interpret the incoming image as an application core update no matter what. Which causes a second boot cycle as it swaps the images back.
uart:~$ *** Booting Zephyr OS build v3.0.99-ncs1 *** I: Starting bootloader I: Primary image: magic=good, swap_type=0x4, copy_done=0x1, image_ok=0x1 I: Secondary image: magic=good, swap_type=0x2, copy_done=0x3, image_ok=0x3 I: Boot source: none I: Swap type: test I: Starting swap using move algorithm. I: Bootloader chainload address offset: 0xc000 *** Booting Zephyr OS build v3.0.99-ncs1 *** I: Starting bootloader I: Primary image: magic=good, swap_type=0x2, copy_done=0x1, image_ok=0x3 I: Secondary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3 I: Boot source: none I: Swap type: revert I: Starting swap using move algorithm. I: Secondary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3 I: Bootloader chainload address offset: 0xc000 *** Booting Zephyr OS build v3.0.99-ncs1 *** [00:00:00.017,791] <inf> smp_sample: build time: Jul 6 2022 15:24:46 [00:00:00.041,656] <inf> smp_bt_sample: Bluetooth initialized [00:00:00.045,532] <inf> smp_bt_sample: Advertising successfully started
I have an overlay both top level and the child images containing:
// Choose the external flash to be used by partition manager (and allow MCUBoot to use external flash) / { chosen { nordic,pm-ext-flash = &mx25r64; }; };
And the following config files:
prj.conf:
## Bootloader # Enable mcumgr. CONFIG_MCUBOOT_IMAGE_VERSION="1.0.0+0" CONFIG_MCUMGR=y CONFIG_MCUBOOT_IMG_MANAGER=y CONFIG_IMG_MANAGER=y CONFIG_MCUMGR_CMD_IMG_MGMT=y CONFIG_MCUMGR_CMD_OS_MGMT=y # Some command handlers require a large stack. CONFIG_MAIN_STACK_SIZE=2048 # Ensure an MCUboot-compatible binary is generated andcanp update the net core CONFIG_BOOTLOADER_MCUBOOT=y # Enable flash operations. CONFIG_FLASH=y CONFIG_FLASH_MAP=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_STREAM_FLASH_ERASE=y # QSPI for External Flash CONFIG_SPI=n CONFIG_NORDIC_QSPI_NOR=y CONFIG_NORDIC_QSPI_NOR_STACK_WRITE_BUFFER_SIZE=16 CONFIG_NORDIC_QSPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096 # Enable logging CONFIG_LOG=y CONFIG_MCUBOOT_UTIL_LOG_LEVEL_WRN=y # Enable shell commands. CONFIG_SHELL=y CONFIG_MCUMGR_CMD_SHELL_MGMT=y ## BLE # Allow for large Bluetooth data packets. CONFIG_BT_L2CAP_TX_MTU=498 CONFIG_BT_BUF_ACL_RX_SIZE=502 CONFIG_BT_BUF_ACL_TX_SIZE=502 CONFIG_BT_CTLR_DATA_LENGTH_MAX=251 # Enable the Bluetooth mcumgr transport (unauthenticated). CONFIG_MCUMGR_SMP_BT=y CONFIG_MCUMGR_SMP_BT_AUTHEN=n CONFIG_MCUMGR_SMP_BT_CONN_PARAM_CONTROL=y # Enable the Shell mcumgr transport. CONFIG_MCUMGR_SMP_SHELL=y # Enable the mcumgr Packet Reassembly feature over Bluetooth and its configuration dependencies. # MCUmgr buffer size is optimized to fit one SMP packet divided into five Bluetooth Write Commands, # transmitted with the maximum possible MTU value: 498 bytes. CONFIG_MCUMGR_SMP_REASSEMBLY_BT=y CONFIG_MCUMGR_BUF_SIZE=2475 CONFIG_OS_MGMT_MCUMGR_PARAMS=y CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096 CONFIG_DEBUG_THREAD_INFO=y CONFIG_DEBUG_OPTIMIZATIONS=y
child_image/mcuboot.conf:
# MCUboot requires a large stack size, otherwise an MPU fault will occur CONFIG_MAIN_STACK_SIZE=10240 # Net Core Update Support? CONFIG_PCD_APP=y CONFIG_FLASH=y CONFIG_FLASH_MAP=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_STREAM_FLASH=y CONFIG_STREAM_FLASH_ERASE=y CONFIG_FLASH_SIMULATOR=y CONFIG_FLASH_SIMULATOR_DOUBLE_WRITES=y CONFIG_FLASH_SIMULATOR_STATS=n CONFIG_MULTITHREADING=y # This must be increased to accommodate the bigger images. CONFIG_BOOT_MAX_IMG_SECTORS=256 # External QSPI secondary slot CONFIG_NORDIC_QSPI_NOR=y CONFIG_NORDIC_QSPI_NOR_FLASH_LAYOUT_PAGE_SIZE=4096 CONFIG_NORDIC_QSPI_NOR_STACK_WRITE_BUFFER_SIZE=16 # Various Things to Be small enough but still have logging prints CONFIG_SIZE_OPTIMIZATIONS=y CONFIG_DEBUG_OPTIMIZATIONS=n CONFIG_LOG=y CONFIG_LOG_MODE_MINIMAL=y # former CONFIG_MODE_MINIMAL CONFIG_LOG_DEFAULT_LEVEL=0
Am I missing something here? I do notice when I debug to MCUBoot's loader.c line 982, where the vector table of the image is grabbed, the loaded data seems to be from the internal flash rather than the external memory. I have gone through the thread here nRF5340 Netcore firmware update using external flash - Nordic Q&A - Nordic DevZone - Nordic DevZone (nordicsemi.com) but my behavior isn't lining up and discussion is all on pre 2.0.0 SDKs. I tried UPGRADE_ONLY but it seems to do the same thing but not be able to revert back and so end up in a boot loop. As said in the title I have no need for simultaneous updates, I am just trying to perform core updates one at a time from the external QSPI.
Attached at the bottom is my minimal reproduction based off of smp_svr. Would greatly appreciate any assistance or pointers on this.
Regards,
D Miller