Skip to content

Commit 8d1d78f

Browse files
committed
suit: Add support for A/B image generation
Add extensions to SUIT build system, so it is capable of automatic generation of two slots for all sysbuild images if the A/B update scheme is enabled. ref: NCSDK-30812 Signed-off-by: Tomasz Chyrowicz <[email protected]>
1 parent d192005 commit 8d1d78f

File tree

4 files changed

+74
-10
lines changed

4 files changed

+74
-10
lines changed

cmake/sysbuild/suit.cmake

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,10 @@ function(suit_create_package)
249249
sysbuild_get(BINARY_FILE IMAGE ${image} VAR CONFIG_KERNEL_BIN_NAME KCONFIG)
250250
sysbuild_get(target IMAGE ${image} VAR CONFIG_SUIT_ENVELOPE_TARGET KCONFIG)
251251
sysbuild_get(encrypt IMAGE ${image} VAR CONFIG_SUIT_ENVELOPE_TARGET_ENCRYPT KCONFIG)
252+
get_property(is_variant_image TARGET ${image} PROPERTY NCS_VARIANT_APPLICATION)
253+
if(DEFINED is_variant_image)
254+
set(target "${target}_b")
255+
endif()
252256

253257
set(BINARY_FILE "${BINARY_FILE}.bin")
254258

@@ -331,11 +335,15 @@ function(suit_create_package)
331335
message(SEND_ERROR "DFU: Creation of SUIT artifacts failed.")
332336
return()
333337
endif()
338+
get_property(is_variant_image TARGET ${image} PROPERTY NCS_VARIANT_APPLICATION)
339+
if(DEFINED is_variant_image)
340+
set(target "${target}_b")
341+
endif()
334342

335343
set(ENVELOPE_YAML_FILE ${SUIT_ROOT_DIRECTORY}${target}.yaml)
336344
set(ENVELOPE_SUIT_FILE ${SUIT_ROOT_DIRECTORY}${target}.suit)
337345

338-
suit_render_template(${INPUT_ENVELOPE_JINJA_FILE} ${ENVELOPE_YAML_FILE} "${TEMPLATE_ARGS}")
346+
suit_render_template(${INPUT_ENVELOPE_JINJA_FILE} ${ENVELOPE_YAML_FILE} "${TEMPLATE_ARGS}" ${target})
339347
suit_create_envelope(${ENVELOPE_YAML_FILE} ${ENVELOPE_SUIT_FILE})
340348

341349
unset(sign_envelope)
@@ -455,7 +463,7 @@ function(suit_create_package)
455463
suit_set_absolute_or_relative_path(${INPUT_APP_RECOVERY_ENVELOPE_JINJA_FILE} ${app_config_dir} INPUT_APP_RECOVERY_ENVELOPE_JINJA_FILE)
456464
set(APP_RECOVERY_ENVELOPE_YAML_FILE ${SUIT_ROOT_DIRECTORY}${APP_RECOVERY_NAME}.yaml)
457465
set(APP_RECOVERY_ENVELOPE_SUIT_FILE ${SUIT_ROOT_DIRECTORY}${APP_RECOVERY_NAME}.suit)
458-
suit_render_template(${INPUT_APP_RECOVERY_ENVELOPE_JINJA_FILE} ${APP_RECOVERY_ENVELOPE_YAML_FILE} "${TEMPLATE_ARGS}")
466+
suit_render_template(${INPUT_APP_RECOVERY_ENVELOPE_JINJA_FILE} ${APP_RECOVERY_ENVELOPE_YAML_FILE} "${TEMPLATE_ARGS}" ${APP_RECOVERY_NAME})
459467
suit_create_envelope(${APP_RECOVERY_ENVELOPE_YAML_FILE} ${APP_RECOVERY_ENVELOPE_SUIT_FILE})
460468

461469
if(SB_CONFIG_SUIT_ENVELOPE_APP_RECOVERY_SIGN)
@@ -515,7 +523,7 @@ function(suit_create_package)
515523
suit_set_absolute_or_relative_path(${INPUT_ROOT_ENVELOPE_JINJA_FILE} ${app_config_dir} INPUT_ROOT_ENVELOPE_JINJA_FILE)
516524
set(ROOT_ENVELOPE_YAML_FILE ${SUIT_ROOT_DIRECTORY}${ROOT_NAME}.yaml)
517525
set(ROOT_ENVELOPE_SUIT_FILE ${SUIT_ROOT_DIRECTORY}${ROOT_NAME}.suit)
518-
suit_render_template(${INPUT_ROOT_ENVELOPE_JINJA_FILE} ${ROOT_ENVELOPE_YAML_FILE} "${TEMPLATE_ARGS}")
526+
suit_render_template(${INPUT_ROOT_ENVELOPE_JINJA_FILE} ${ROOT_ENVELOPE_YAML_FILE} "${TEMPLATE_ARGS}" ${ROOT_NAME})
519527
suit_create_envelope(${ROOT_ENVELOPE_YAML_FILE} ${ROOT_ENVELOPE_SUIT_FILE})
520528

521529
if(SB_CONFIG_SUIT_ENVELOPE_ROOT_SIGN)
@@ -610,6 +618,27 @@ endfunction()
610618
# suit_setup_merge()
611619
#
612620
function(suit_setup_merge)
621+
foreach(image ${IMAGES})
622+
unset(target)
623+
sysbuild_get(target IMAGE ${image} VAR CONFIG_SUIT_ENVELOPE_TARGET KCONFIG)
624+
if(NOT DEFINED target OR target STREQUAL "")
625+
continue()
626+
endif()
627+
628+
sysbuild_get(IMAGE_BINARY_DIR IMAGE ${image} VAR APPLICATION_BINARY_DIR CACHE)
629+
sysbuild_get(IMAGE_BINARY_FILE IMAGE ${image} VAR CONFIG_KERNEL_BIN_NAME KCONFIG)
630+
631+
unset(main_image)
632+
get_property(main_image TARGET ${image} PROPERTY NCS_VARIANT_APPLICATION)
633+
if(DEFINED main_image)
634+
suit_add_merge_hex_file(
635+
FILES "${IMAGE_BINARY_DIR}/zephyr/${IMAGE_BINARY_FILE}.hex"
636+
DEPENDENCIES ${main_image}
637+
TARGET ${target}
638+
)
639+
endif()
640+
endforeach()
641+
613642
sysbuild_get(BINARY_DIR IMAGE ${DEFAULT_IMAGE} VAR APPLICATION_BINARY_DIR CACHE)
614643
foreach(image ${IMAGES})
615644
set(ARTIFACTS_TO_MERGE)
@@ -620,9 +649,9 @@ function(suit_setup_merge)
620649
continue()
621650
endif()
622651

623-
unset(IMAGE_TARGET_NAME)
624-
sysbuild_get(IMAGE_TARGET_NAME IMAGE ${image} VAR CONFIG_SUIT_ENVELOPE_TARGET KCONFIG)
625-
if(NOT DEFINED IMAGE_TARGET_NAME OR IMAGE_TARGET_NAME STREQUAL "")
652+
unset(target)
653+
sysbuild_get(target IMAGE ${image} VAR CONFIG_SUIT_ENVELOPE_TARGET KCONFIG)
654+
if(NOT DEFINED target OR target STREQUAL "")
626655
message(STATUS "DFU: Target name for ${image} is not defined. Skipping.")
627656
continue()
628657
endif()
@@ -633,16 +662,16 @@ function(suit_setup_merge)
633662

634663
set(OUTPUT_HEX_FILE "${IMAGE_BINARY_DIR}/zephyr/${CONFIG_SUIT_ENVELOPE_OUTPUT_ARTIFACT}")
635664

636-
list(APPEND ARTIFACTS_TO_MERGE ${BINARY_DIR}/zephyr/suit_installed_envelopes_${IMAGE_TARGET_NAME}_merged.hex)
665+
list(APPEND ARTIFACTS_TO_MERGE ${BINARY_DIR}/zephyr/suit_installed_envelopes_${target}_merged.hex)
637666
list(APPEND ARTIFACTS_TO_MERGE ${IMAGE_BINARY_DIR}/zephyr/${IMAGE_BINARY_FILE}.hex)
638667
list(APPEND ARTIFACTS_TO_MERGE ${IMAGE_BINARY_DIR}/zephyr/uicr.hex)
639668

640669
# Get a list of files (and their dependencies) which need merging into the uicr merged file
641670
# and add them at the end of the list, allowing for overwriting
642671
unset(merge_files)
643672
unset(merge_dependencies)
644-
get_property(merge_files GLOBAL PROPERTY SUIT_MERGE_${IMAGE_TARGET_NAME}_FILE)
645-
get_property(merge_dependencies GLOBAL PROPERTY SUIT_MERGE_${IMAGE_TARGET_NAME}_DEPENDENCIES)
673+
get_property(merge_files GLOBAL PROPERTY SUIT_MERGE_${target}_FILE)
674+
get_property(merge_dependencies GLOBAL PROPERTY SUIT_MERGE_${target}_DEPENDENCIES)
646675
if(NOT DEFINED merge_files)
647676
set(merge_files)
648677
set(merge_dependencies)

cmake/sysbuild/suit_utilities.cmake

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,14 @@ endfunction()
9393
# 'input_file' - path to input jinja template
9494
# 'output_file' - path to output yaml file
9595
# 'core_arguments' - list of arguments for registered cores
96-
function(suit_render_template input_file output_file core_arguments)
96+
# 'target' - target name
97+
function(suit_render_template input_file output_file core_arguments target)
9798
set(TEMPLATE_ARGS)
9899
list(APPEND TEMPLATE_ARGS
99100
--template-suit ${input_file}
100101
--output-suit ${output_file}
101102
--zephyr-base ${ZEPHYR_BASE}
103+
--target ${target}
102104
)
103105
list(APPEND TEMPLATE_ARGS ${core_arguments})
104106
list(APPEND TEMPLATE_ARGS --artifacts-folder "${SUIT_ROOT_DIRECTORY}")

sysbuild/Kconfig.suit

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ config SUIT_ENVELOPE_NORDIC_TOP_EXTRACT_PAYLOADS_TO_CACHE
6969
config SUIT_ENVELOPE_NORDIC_TOP_EXTRACT_PAYLOADS_FOR_PULL
7070
bool "Extract payloads from the nordic_top envelope for the use of the pull model"
7171
depends on !SUIT_ENVELOPE_NORDIC_TOP_EXTRACT_PAYLOADS_TO_CACHE
72+
default y if SUIT_BUILD_AB_UPDATE
7273
help
7374
When this option is enabled, the build system extracts payloads from
7475
the nordic_top envelope into binaries. The binaries are stored in the
@@ -177,6 +178,7 @@ if SUIT_BUILD_RECOVERY
177178

178179
choice SUIT_RECOVERY_APPLICATION
179180
prompt "Select SUIT recovery application"
181+
default SUIT_RECOVERY_APPLICATION_NONE if SUIT_BUILD_AB_UPDATE
180182
default SUIT_RECOVERY_APPLICATION_DEFAULT
181183

182184
config SUIT_RECOVERY_APPLICATION_DEFAULT
@@ -310,4 +312,9 @@ config FLASH_COMPANION_TARGET_CPUCLUSTER
310312

311313
endif # SUIT_BUILD_FLASH_COMPANION
312314

315+
config SUIT_BUILD_AB_UPDATE
316+
bool "Build AB variant"
317+
help
318+
Build two applications for the A and B update.
319+
313320
endmenu

sysbuild/suit.cmake

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,29 @@ if(SB_CONFIG_SUIT_BUILD_RECOVERY AND NOT SB_CONFIG_SUIT_RECOVERY_APPLICATION_NON
3939
set_config_bool(recovery CONFIG_SUIT_LOCAL_ENVELOPE_GENERATE n)
4040
endif()
4141
endif()
42+
43+
if(SB_CONFIG_SUIT_BUILD_AB_UPDATE)
44+
cmake_path(APPEND APP_DIR "sysbuild" OUTPUT_VARIABLE slot_overlay_dir)
45+
46+
get_property(images GLOBAL PROPERTY sysbuild_images)
47+
foreach(image ${images})
48+
cmake_path(APPEND slot_overlay_dir "${image}_slot_b.overlay" OUTPUT_VARIABLE overlay)
49+
if(NOT EXISTS ${overlay})
50+
continue()
51+
else()
52+
message(STATUS "Generate slot B for image: ${image}")
53+
endif()
54+
55+
set(variant_image "${image}_variant_b")
56+
ExternalNcsVariantProject_Add(
57+
APPLICATION ${image}
58+
VARIANT ${variant_image}
59+
SPLIT_KCONFIG true
60+
)
61+
# Choose slot_b_partition as the active code partition
62+
add_overlay_dts(${variant_image} "${overlay}")
63+
# Disable BICR and UICR generation
64+
set_config_bool(${variant_image} CONFIG_SOC_NRF54H20_GENERATE_BICR n)
65+
set_config_bool(${variant_image} CONFIG_NRF_REGTOOL_GENERATE_UICR n)
66+
endforeach()
67+
endif()

0 commit comments

Comments
 (0)