From 8a8b91843d9ea76767ec5fa8b21c315c888e1a48 Mon Sep 17 00:00:00 2001 From: Jamie McCrae Date: Thu, 20 Feb 2025 13:39:30 +0000 Subject: [PATCH] sysbuild: Add firmware loader application type support Adds support for setting up a firmware loader image in a build, which can also optionally automatically configure MCUboot and the application image to be able to boot the firmware loader image using the retention subsystem Signed-off-by: Jamie McCrae --- .../cmake/modules/sysbuild_extensions.cmake | 2 +- .../BOOTLOADER_image_default.cmake | 11 +++++- .../FIRMWARE_LOADER_image_default.cmake | 22 +++++++++++ .../MAIN_image_default.cmake | 11 +++++- share/sysbuild/images/CMakeLists.txt | 1 + share/sysbuild/images/Kconfig | 1 + share/sysbuild/images/bootloader/Kconfig | 8 ++++ .../images/firmware_loader/CMakeLists.txt | 11 ++++++ share/sysbuild/images/firmware_loader/Kconfig | 37 +++++++++++++++++++ 9 files changed, 99 insertions(+), 5 deletions(-) create mode 100644 share/sysbuild/image_configurations/FIRMWARE_LOADER_image_default.cmake create mode 100644 share/sysbuild/images/firmware_loader/CMakeLists.txt create mode 100644 share/sysbuild/images/firmware_loader/Kconfig diff --git a/share/sysbuild/cmake/modules/sysbuild_extensions.cmake b/share/sysbuild/cmake/modules/sysbuild_extensions.cmake index a0ca87c4253..ec45fbdef5d 100644 --- a/share/sysbuild/cmake/modules/sysbuild_extensions.cmake +++ b/share/sysbuild/cmake/modules/sysbuild_extensions.cmake @@ -216,7 +216,7 @@ endfunction() # and debugging. # function(ExternalZephyrProject_Add) - set(app_types MAIN BOOTLOADER) + set(app_types MAIN BOOTLOADER FIRMWARE_LOADER) cmake_parse_arguments(ZBUILD "" "APPLICATION;BOARD;BOARD_REVISION;SOURCE_DIR;APP_TYPE;BUILD_ONLY" "" ${ARGN}) if(ZBUILD_UNPARSED_ARGUMENTS) diff --git a/share/sysbuild/image_configurations/BOOTLOADER_image_default.cmake b/share/sysbuild/image_configurations/BOOTLOADER_image_default.cmake index 75b0bc3668a..9125de71fac 100644 --- a/share/sysbuild/image_configurations/BOOTLOADER_image_default.cmake +++ b/share/sysbuild/image_configurations/BOOTLOADER_image_default.cmake @@ -29,10 +29,17 @@ elseif(SB_CONFIG_MCUBOOT_MODE_DIRECT_XIP OR SB_CONFIG_MCUBOOT_MODE_DIRECT_XIP_WI set(bootmode CONFIG_BOOT_DIRECT_XIP) elseif(SB_CONFIG_MCUBOOT_MODE_RAM_LOAD) set(bootmode CONFIG_BOOT_RAM_LOAD) -elseif(SB_CONFIG_MCUBOOT_MODE_FIRMWARE_UPDATER) - set(bootmode CONFIG_BOOT_FIRMWARE_LOADER) elseif(SB_CONFIG_MCUBOOT_MODE_SINGLE_APP_RAM_LOAD) set(bootmode CONFIG_SINGLE_APPLICATION_SLOT_RAM_LOAD) +elseif(SB_CONFIG_MCUBOOT_MODE_FIRMWARE_UPDATER) + set(bootmode CONFIG_BOOT_FIRMWARE_LOADER) + + if(SB_CONFIG_MCUBOOT_MODE_FIRMWARE_UPDATER_BOOT_MODE_ENTRANCE) + set_config_bool(${ZCMAKE_APPLICATION} CONFIG_RETAINED_MEM y) + set_config_bool(${ZCMAKE_APPLICATION} CONFIG_RETENTION y) + set_config_bool(${ZCMAKE_APPLICATION} CONFIG_RETENTION_BOOT_MODE y) + set_config_bool(${ZCMAKE_APPLICATION} CONFIG_BOOT_FIRMWARE_LOADER_BOOT_MODE y) + endif() endif() foreach(loopbootmode ${bootmodes}) diff --git a/share/sysbuild/image_configurations/FIRMWARE_LOADER_image_default.cmake b/share/sysbuild/image_configurations/FIRMWARE_LOADER_image_default.cmake new file mode 100644 index 00000000000..c4edc7e3daf --- /dev/null +++ b/share/sysbuild/image_configurations/FIRMWARE_LOADER_image_default.cmake @@ -0,0 +1,22 @@ +# Copyright (c) 2025 Nordic Semiconductor +# +# SPDX-License-Identifier: Apache-2.0 + +# This sysbuild CMake file sets the sysbuild controlled settings as properties +# on a firmware updater image. + +set_config_bool(${ZCMAKE_APPLICATION} CONFIG_BOOTLOADER_MCUBOOT "${SB_CONFIG_BOOTLOADER_MCUBOOT}") +set_config_string(${ZCMAKE_APPLICATION} CONFIG_MCUBOOT_SIGNATURE_KEY_FILE + "${SB_CONFIG_BOOT_SIGNATURE_KEY_FILE}" +) +set_config_string(${ZCMAKE_APPLICATION} CONFIG_MCUBOOT_ENCRYPTION_KEY_FILE + "${SB_CONFIG_BOOT_ENCRYPTION_KEY_FILE}" +) + +if("${SB_CONFIG_SIGNATURE_TYPE}" STREQUAL "NONE") + set_config_bool(${ZCMAKE_APPLICATION} CONFIG_MCUBOOT_GENERATE_UNSIGNED_IMAGE y) +else() + set_config_bool(${ZCMAKE_APPLICATION} CONFIG_MCUBOOT_GENERATE_UNSIGNED_IMAGE n) +endif() + +set_config_bool(${ZCMAKE_APPLICATION} CONFIG_MCUBOOT_BOOTLOADER_MODE_FIRMWARE_UPDATER y) diff --git a/share/sysbuild/image_configurations/MAIN_image_default.cmake b/share/sysbuild/image_configurations/MAIN_image_default.cmake index 653f7328892..a6c29c8d756 100644 --- a/share/sysbuild/image_configurations/MAIN_image_default.cmake +++ b/share/sysbuild/image_configurations/MAIN_image_default.cmake @@ -39,9 +39,16 @@ if(SB_CONFIG_BOOTLOADER_MCUBOOT) set_config_bool(${ZCMAKE_APPLICATION} CONFIG_MCUBOOT_BOOTLOADER_MODE_RAM_LOAD y) set_config_bool(${ZCMAKE_APPLICATION} CONFIG_XIP n) set_config_int(${ZCMAKE_APPLICATION} CONFIG_FLASH_SIZE 0) - elseif(SB_CONFIG_MCUBOOT_MODE_FIRMWARE_UPDATER) - set_config_bool(${ZCMAKE_APPLICATION} CONFIG_MCUBOOT_BOOTLOADER_MODE_FIRMWARE_UPDATER y) elseif(SB_CONFIG_MCUBOOT_MODE_SINGLE_APP_RAM_LOAD) set_config_bool(${ZCMAKE_APPLICATION} CONFIG_MCUBOOT_BOOTLOADER_MODE_SINGLE_APP_RAM_LOAD y) + elseif(SB_CONFIG_MCUBOOT_MODE_FIRMWARE_UPDATER) + set_config_bool(${ZCMAKE_APPLICATION} CONFIG_MCUBOOT_BOOTLOADER_MODE_FIRMWARE_UPDATER y) + + if(SB_CONFIG_MCUBOOT_MODE_FIRMWARE_UPDATER_BOOT_MODE_ENTRANCE) + set_config_bool(${ZCMAKE_APPLICATION} CONFIG_REBOOT y) + set_config_bool(${ZCMAKE_APPLICATION} CONFIG_RETAINED_MEM y) + set_config_bool(${ZCMAKE_APPLICATION} CONFIG_RETENTION y) + set_config_bool(${ZCMAKE_APPLICATION} CONFIG_RETENTION_BOOT_MODE y) + endif() endif() endif() diff --git a/share/sysbuild/images/CMakeLists.txt b/share/sysbuild/images/CMakeLists.txt index 1d9e381fa5c..b6276a311c4 100644 --- a/share/sysbuild/images/CMakeLists.txt +++ b/share/sysbuild/images/CMakeLists.txt @@ -12,6 +12,7 @@ ExternalZephyrProject_Add( # This allows for MCUboot to be included. sysbuild_add_subdirectory(bootloader) +sysbuild_add_subdirectory(firmware_loader) # Include zephyr modules generated sysbuild CMake file. foreach(SYSBUILD_CURRENT_MODULE_NAME ${SYSBUILD_MODULE_NAMES}) diff --git a/share/sysbuild/images/Kconfig b/share/sysbuild/images/Kconfig index 616b0a7c23d..f247a0bd64a 100644 --- a/share/sysbuild/images/Kconfig +++ b/share/sysbuild/images/Kconfig @@ -3,3 +3,4 @@ # SPDX-License-Identifier: Apache-2.0 rsource "bootloader/Kconfig" +rsource "firmware_loader/Kconfig" diff --git a/share/sysbuild/images/bootloader/Kconfig b/share/sysbuild/images/bootloader/Kconfig index 54e429fcc97..7a416f2fe23 100644 --- a/share/sysbuild/images/bootloader/Kconfig +++ b/share/sysbuild/images/bootloader/Kconfig @@ -141,6 +141,14 @@ config MCUBOOT_MODE_SINGLE_APP_RAM_LOAD endchoice +config MCUBOOT_MODE_FIRMWARE_UPDATER_BOOT_MODE_ENTRANCE + bool "Firmware updater retention boot mode entrance" + depends on MCUBOOT_MODE_FIRMWARE_UPDATER + help + Will enable retained memory, retention and the boot mode module in MCUboot and the main + application so that it can be used to force booting the firmware loader application + image. This needs the ``zephyr,boot-mode`` chosen node to be correctly configured. + config SIGNATURE_TYPE string default "NONE" if BOOT_SIGNATURE_TYPE_NONE diff --git a/share/sysbuild/images/firmware_loader/CMakeLists.txt b/share/sysbuild/images/firmware_loader/CMakeLists.txt new file mode 100644 index 00000000000..21fbf62b118 --- /dev/null +++ b/share/sysbuild/images/firmware_loader/CMakeLists.txt @@ -0,0 +1,11 @@ +# Copyright (c) 2025 Nordic Semiconductor +# +# SPDX-License-Identifier: Apache-2.0 + +if(SB_CONFIG_FIRMWARE_LOADER_IMAGE_PATH) + ExternalZephyrProject_Add( + APPLICATION ${SB_CONFIG_FIRMWARE_LOADER_IMAGE_NAME} + SOURCE_DIR ${SB_CONFIG_FIRMWARE_LOADER_IMAGE_PATH} + APP_TYPE FIRMWARE_LOADER + ) +endif() diff --git a/share/sysbuild/images/firmware_loader/Kconfig b/share/sysbuild/images/firmware_loader/Kconfig new file mode 100644 index 00000000000..a5c4283ad5c --- /dev/null +++ b/share/sysbuild/images/firmware_loader/Kconfig @@ -0,0 +1,37 @@ +# Copyright (c) 2025 Nordic Semiconductor +# +# SPDX-License-Identifier: Apache-2.0 + +config SUPPORT_FIRMWARE_LOADER_SMP_SVR + bool + default y + +choice FIRMWARE_LOADER + prompt "Firmware loader image" + default FIRMWARE_LOADER_IMAGE_NONE + depends on MCUBOOT_MODE_FIRMWARE_UPDATER + +config FIRMWARE_LOADER_IMAGE_NONE + bool "None" + help + Do not Include a firmware loader image in the build. + +config FIRMWARE_LOADER_IMAGE_SMP_SVR + bool "smp_svr" + depends on SUPPORT_FIRMWARE_LOADER_SMP_SVR + help + Include the MCUmgr ``smp_svr`` sample as the firmware loader image to use. + +endchoice + +config FIRMWARE_LOADER_IMAGE_NAME + string + default "smp_svr" if FIRMWARE_LOADER_IMAGE_SMP_SVR + help + Name of firmware loader image. + +config FIRMWARE_LOADER_IMAGE_PATH + string + default "${ZEPHYR_BASE}/samples/subsys/mgmt/mcumgr/smp_svr" if FIRMWARE_LOADER_IMAGE_SMP_SVR + help + Source directory of firmware loader image.