NCS 2.7
NRF52840
Building with sysbuild, MCUBOOT, and 2 different applications (mfg and end-user)
My custom board includes a sensor fusion IMU from bosch. The firmware that must be loaded for this IMU is ~133 KB. My initial development effort embedded the imu firmware into the application image. The resulting update image consumes more than 50% of the flash space, and therefore would require reserving space in the external flash for updates.
The IMU is an excellent candidate for independent update. It has a well defined communication interface that remains constant across versions. It may also only need 1-2 updates over the product lifecycle.
I modified my static partition to create a ext_fw partition area to contain the external firmware image.
xt_fw: address: 0xc200 end_address: 0x2F000 region: flash_primary size: 0x22200 app: address: 0x2F000 end_address: 0x94000 region: flash_primary size: 0x65000 mcuboot: address: 0x0 end_address: 0xc000 placement: before: - mcuboot_primary region: flash_primary size: 0xc000 mcuboot_pad: address: 0xc000 end_address: 0xc200 placement: align: start: 0x1000 before: - mcuboot_primary_app region: flash_primary size: 0x200 mcuboot_primary: address: 0xc000 end_address: 0x94000 orig_span: &id001 - mcuboot_pad - ext_fw - app region: flash_primary size: 0x88000 span: *id001 mcuboot_primary_app: address: 0xc200 orig_span: &id002 - ext_fw - app region: flash_primary size: 0x85E00 span: *id002 mcuboot_secondary: address: 0x94000 end_address: 0xfa000 placement: after: - mcuboot_primary align: start: 0x1000 region: flash_primary share_size: - mcuboot_primary size: 0x66000 nvs_storage: address: 0xfa000 end_address: 0x100000 placement: align: start: 0x1000 before: - end region: flash_primary size: 0x6000 sram_primary: address: 0x20000000 end_address: 0x20040000 region: sram_primary size: 0x40000
From the board dts,I defined two zephyr memory regions. One region holds meta data such as the image size, and external firmware image kernel version and a pointer to the firmware image data. The other memory region holds the firmware image itself.
flash@C200 { compatible = "zephyr,memory-region"; reg = <0xC200 0x100>; zephyr,memory-region = "ext_fw_meta"; status = "okay"; }; flash@C300 { compatible = "zephyr,memory-region"; reg = <0xC300 0x22D00>; zephyr,memory-region = "ext_fw_data"; status = "okay"; };
I'm trying to figure out how to proceed with sysbuild to add another buildable image.
I added a sysbuild.cmake as documented docs.nordicsemi.com/.../index.html:
ExternalZephyrProject_Add( APPLICATION xx_bhi360_ext_fw_xx SOURCE_DIR ${ZEPHYR_BASE}/../app.git/bhi360_ext_fw )
When I run the build by adding a build configuration within VS Code NRF Connect Extension I get an error about that the directory is empty:
-- west build: generating a build system Loading Zephyr module(s) (Zephyr base): sysbuild_default -- Found Python3: C:/ncs/toolchains/ce3b5ff664/opt/bin/python.exe (found suitable version "3.9.13", minimum required is "3.8") found components: Interpreter -- Cache files will be written to: D:/Flipperz/flipper_workspace/zephyr/.cache -- Found west (found suitable version "1.2.0", minimum required is "0.14.0") -- Board: thomas_b, qualifiers: nrf52840 Parsing D:/Flipperz/flipper_workspace/zephyr/share/sysbuild/Kconfig Loaded configuration 'D:/Flipperz/flipper_workspace/app.git/app/build_1/_sysbuild/empty.conf' Merged configuration 'D:/Flipperz/flipper_workspace/app.git/app/sysbuild.conf' Configuration saved to 'D:/Flipperz/flipper_workspace/app.git/app/build_1/zephyr/.config' Kconfig header saved to 'D:/Flipperz/flipper_workspace/app.git/app/build_1/_sysbuild/autoconf.h' CMake Error at C:/ncs/toolchains/ce3b5ff664/opt/share/cmake-3.21/Modules/ExternalProject.cmake:2866 (message): No download info given for 'bhi360_ext_fw' and its source directory: D:/Flipperz/flipper_workspace/app.git/app/build_1/bhi360_ext_fw is not an existing non-empty directory. Please specify one of: * SOURCE_DIR with an existing non-empty directory * DOWNLOAD_COMMAND * URL * GIT_REPOSITORY * SVN_REPOSITORY * HG_REPOSITORY * CVS_REPOSITORY and CVS_MODULE Call Stack (most recent call first): C:/ncs/toolchains/ce3b5ff664/opt/share/cmake-3.21/Modules/ExternalProject.cmake:3700 (_ep_add_download_command) cmake/modules/sysbuild_extensions.cmake:350 (ExternalProject_Add) D:/Flipperz/flipper_workspace/app.git/bhi360_ext_fw/sysbuild.cmake:1 (ExternalZephyrProject_Add) cmake/modules/sysbuild_extensions.cmake:670 (include) cmake/modules/sysbuild_images.cmake:13 (sysbuild_add_subdirectory) cmake/modules/sysbuild_default.cmake:19 (include) D:/Flipperz/flipper_workspace/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:75 (include) D:/Flipperz/flipper_workspace/zephyr/share/zephyr-package/cmake/ZephyrConfig.cmake:92 (include_boilerplate) D:/Flipperz/flipper_workspace/zephyr/share/sysbuild-package/cmake/SysbuildConfig.cmake:8 (include) template/CMakeLists.txt:10 (find_package) -- ***************************** * Running CMake for mcuboot * *****************************
cmake doesn't seem to be copying the files from app.git/bhi360_ext_fw into the build folder.
Is this a fault in NCS 2.7 sysbuild that might be fixed if I go to a more recent release?
Is there an existing example of using sysbuild to add an additional image?
What configuration will I need to add for mcuboot to be able to update (one-at-a-time) both the application and the ext_fw partition?