From e605ec381316ff5543b6b4d26a5e9a078cdd78a3 Mon Sep 17 00:00:00 2001 From: Gilberto Conti Date: Mon, 18 May 2026 16:32:12 +0200 Subject: [PATCH 01/11] loader: add ota support On boot, install /ota:/UPDATE_SKETCH.BIN into the user_sketch partition when the file is present. Validates the inner sketch header and bounds, and keeps UPDATE_SKETCH.BIN on post-erase failure so the next boot can retry. Signed-off-by: Gilberto Conti --- boards.txt | 15 +++ cores/arduino/llext_wrappers.c | 2 + cores/arduino/ota_api.h | 11 ++ loader/CMakeLists.txt | 2 + loader/Kconfig | 2 + loader/llext_exports.c | 4 + loader/main.c | 5 + loader/ota/CMakeLists.txt | 9 ++ loader/ota/Kconfig | 44 ++++++++ loader/ota/ota_api.h | 20 ++++ loader/ota/ota_llext_exports.c | 11 ++ loader/ota/ota_sketch.c | 42 +++++++ loader/ota/ota_sketch_check.c | 194 +++++++++++++++++++++++++++++++++ loader/ota/ota_sketch_check.h | 20 ++++ platform.txt | 5 + 15 files changed, 386 insertions(+) create mode 100644 cores/arduino/ota_api.h create mode 100644 loader/ota/CMakeLists.txt create mode 100644 loader/ota/Kconfig create mode 100644 loader/ota/ota_api.h create mode 100644 loader/ota/ota_llext_exports.c create mode 100644 loader/ota/ota_sketch.c create mode 100644 loader/ota/ota_sketch_check.c create mode 100644 loader/ota/ota_sketch_check.h diff --git a/boards.txt b/boards.txt index 798564387..00cd99c5b 100644 --- a/boards.txt +++ b/boards.txt @@ -72,6 +72,9 @@ giga.debug.server.openocd.scripts.2=target/stm32h7x_dual_bank.cfg giga.debug.cortex-debug.custom.request=attach giga.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM7.svd +giga.build.ota.magic=0x23410266 +giga.build.ota.sketch_offset=0xA0000 + ########################################################################################## nano33ble.name=Arduino Nano 33 BLE @@ -256,6 +259,9 @@ portentah7.bootloader.interface=0 portentah7.bootloader.file=zephyr-{build.variant}.bin portentah7.bootloader.address=0x08040000 +portentah7.build.ota.magic=0x2341025B +portentah7.build.ota.sketch_offset=0xA0000 + portentah7.debug.tool=gdb portentah7.debug.server.openocd.scripts.0=interface/{programmer.protocol}.cfg portentah7.debug.server.openocd.scripts.1={programmer.transport_script} @@ -308,6 +314,9 @@ nicla_vision.bootloader.interface=0 nicla_vision.bootloader.file=zephyr-{build.variant}.bin nicla_vision.bootloader.address=0x08040000 +nicla_vision.build.ota.magic=0x2341025F +nicla_vision.build.ota.sketch_offset=0xA0000 + nicla_vision.debug.tool=gdb nicla_vision.debug.server.openocd.scripts.0=interface/{programmer.protocol}.cfg nicla_vision.debug.server.openocd.scripts.1={programmer.transport_script} @@ -458,6 +467,9 @@ portentac33.leave.dfuse={empty} -Q portentac33.loader.args.with_sketch={empty} -w portentac33.sketch.args.without_loader={empty} -w +portentac33.build.ota.magic=0x23410068 +portentac33.build.ota.sketch_offset=0xF0000 + ########################################################################################## opta.name=Arduino Opta @@ -510,6 +522,9 @@ opta.debug.server.openocd.scripts.2=target/stm32h7x_dual_bank.cfg opta.debug.cortex-debug.custom.request=attach opta.debug.svd_file={runtime.platform.path}/svd/STM32H747_CM7.svd +opta.build.ota.magic=0x23410064 +opta.build.ota.sketch_offset=0xA0000 + ########################################################################################## nano_matter.name=Arduino Nano Matter diff --git a/cores/arduino/llext_wrappers.c b/cores/arduino/llext_wrappers.c index 0ea624939..8168076c8 100644 --- a/cores/arduino/llext_wrappers.c +++ b/cores/arduino/llext_wrappers.c @@ -109,6 +109,7 @@ W2(char *, strstr, const char *, const char *) W2(int, strcmp, const char *, const char *) W3(int, strncmp, const char *, const char *, size_t) W2(int, strcasecmp, const char *, const char *) +W3(int, strncasecmp, const char *, const char *, size_t) W3(char *, strncpy, char *, const char *, size_t) W2(char *, strcat, char *, const char *) W2(char *, strcpy, char *, const char *) @@ -216,6 +217,7 @@ VN(__aeabi_fcmpun) VN(__aeabi_d2iz) VN(__aeabi_d2uiz) VN(__aeabi_d2lz) +VN(__aeabi_d2ulz) VN(__aeabi_i2d) VN(__aeabi_ui2d) VN(__aeabi_l2d) diff --git a/cores/arduino/ota_api.h b/cores/arduino/ota_api.h new file mode 100644 index 000000000..e97bf3460 --- /dev/null +++ b/cores/arduino/ota_api.h @@ -0,0 +1,11 @@ +/* + * Copyright (c) Arduino s.r.l. and/or its affiliated companies + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#ifdef CONFIG_OTA + +#include "../../loader/ota/ota_api.h" + +#endif // CONFIG_OTA diff --git a/loader/CMakeLists.txt b/loader/CMakeLists.txt index 5e6f2c9f2..d132ba12d 100644 --- a/loader/CMakeLists.txt +++ b/loader/CMakeLists.txt @@ -18,6 +18,7 @@ find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) project(app LANGUAGES C CXX) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/blobs) +add_subdirectory_ifdef(CONFIG_OTA ${CMAKE_CURRENT_SOURCE_DIR}/ota) # Memory region relocation based on Kconfig # Relocate LLEXT heap if region specified @@ -44,3 +45,4 @@ target_compile_definitions(app PUBLIC _XOPEN_SOURCE=700) target_compile_definitions(app PUBLIC _GNU_SOURCE) target_link_libraries(app PUBLIC blobs) +target_link_libraries_ifdef(CONFIG_OTA app PUBLIC ota) diff --git a/loader/Kconfig b/loader/Kconfig index 9965f3757..31b291958 100644 --- a/loader/Kconfig +++ b/loader/Kconfig @@ -23,3 +23,5 @@ config MAIN_STACK_REGION depends on CODE_DATA_RELOCATION help Specify the memory region for main stack. + +rsource "ota/Kconfig" diff --git a/loader/llext_exports.c b/loader/llext_exports.c index 4c2c6e8a9..587b41950 100644 --- a/loader/llext_exports.c +++ b/loader/llext_exports.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -53,6 +54,7 @@ EXPORT_LIBC_SYM(strstr); EXPORT_LIBC_SYM(strncmp); EXPORT_LIBC_SYM(strncpy); EXPORT_LIBC_SYM(strcasecmp); +EXPORT_LIBC_SYM(strncasecmp); EXPORT_LIBC_SYM(strcmp); EXPORT_LIBC_SYM(strlen); EXPORT_LIBC_SYM(strnlen); @@ -349,6 +351,7 @@ EXPORT_LIBC_SYM(gettimeofday); #endif EXPORT_SYMBOL(sys_clock_settime); + EXPORT_SYMBOL(mktime); EXPORT_SYMBOL(gmtime); @@ -409,6 +412,7 @@ EXPORT_AEABI_SYM(__aeabi_fcmpun); EXPORT_AEABI_SYM(__aeabi_d2iz); EXPORT_AEABI_SYM(__aeabi_d2uiz); EXPORT_AEABI_SYM(__aeabi_d2lz); +EXPORT_AEABI_SYM(__aeabi_d2ulz); EXPORT_AEABI_SYM(__aeabi_i2d); EXPORT_AEABI_SYM(__aeabi_ui2d); EXPORT_AEABI_SYM(__aeabi_l2d); diff --git a/loader/main.c b/loader/main.c index 0947559ea..c8fa42fa2 100644 --- a/loader/main.c +++ b/loader/main.c @@ -24,6 +24,7 @@ LOG_MODULE_REGISTER(sketch); #include #include "../cores/arduino/zephyr_sketch_header.h" +#include "ota/ota_sketch_check.h" #define SKETCH_RAM_BUFFER_LEN 131072 @@ -136,6 +137,10 @@ static int loader(const struct shell *sh) { return rc; } +#if defined(CONFIG_OTA) + try_ota_update(fa); +#endif + uintptr_t base_addr = DT_PARTITION_ADDR(DT_NODELABEL(user_sketch)); char header[SKETCH_HEADER_LEN]; diff --git a/loader/ota/CMakeLists.txt b/loader/ota/CMakeLists.txt new file mode 100644 index 000000000..0229b0137 --- /dev/null +++ b/loader/ota/CMakeLists.txt @@ -0,0 +1,9 @@ +# SPDX-License-Identifier: Apache-2.0 + +zephyr_interface_library_named(ota) + +target_sources(app PRIVATE ${CMAKE_CURRENT_LIST_DIR}/ota_sketch_check.c) +target_sources(app PRIVATE ${CMAKE_CURRENT_LIST_DIR}/ota_llext_exports.c) +zephyr_include_directories(${CMAKE_CURRENT_LIST_DIR}) + +target_sources(app PRIVATE ${CMAKE_CURRENT_LIST_DIR}/ota_sketch.c) diff --git a/loader/ota/Kconfig b/loader/ota/Kconfig new file mode 100644 index 000000000..43a100be5 --- /dev/null +++ b/loader/ota/Kconfig @@ -0,0 +1,44 @@ +# +# Copyright (c) Arduino s.r.l. and/or its affiliated companies +# +# SPDX-License-Identifier: Apache-2.0 +# + +menuconfig OTA + bool "Enable lookup for sketch update at boot" + depends on FILE_SYSTEM + select REBOOT + select RTC if SOC_SERIES_STM32H7X + default n + help + Enable checking for an update inside of the filesystem. If a file inside of + OTA_SKETCH_UPDATE_PATH is found during the boot, the OTA procedure is started and the + current sketch binary is replaced + +if OTA + +config OTA_SKETCH_UPDATE_PATH + string "The path it is looked for ota" + default "/ota:/UPDATE_SKETCH.BIN" + help + the path that is checked for a sketch new binary + +config OTA_SKETCH_TEMP_PATH_POSTFIX + string "temporary file name postfix for sketch ota not ready" + default ".TEMP" + help + String that is appended to sketch ota filename when it is still not ready to be loaded, + a rename operation is required to make the ota file enabled for next reboot + +config OTA_TRANSCRIPTION_CHUNK_SIZE + int "The size of the stack allocated chunk in bytes for transcription" + default 1024 + help + The size of the stack allocated chunk in bytes for ota file transcription + +module = OTA +module-str = OTA +module-help = Sets log level for OTA +source "subsys/logging/Kconfig.template.log_config" + +endif diff --git a/loader/ota/ota_api.h b/loader/ota/ota_api.h new file mode 100644 index 000000000..d30faba9a --- /dev/null +++ b/loader/ota/ota_api.h @@ -0,0 +1,20 @@ +/* + * Copyright (c) Arduino s.r.l. and/or its affiliated companies + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +#define OTA_SKETCH_FILENAME CONFIG_OTA_SKETCH_UPDATE_PATH CONFIG_OTA_SKETCH_TEMP_PATH_POSTFIX + +int ota_sketch_ready(); +int ota_sketch_start(); + +#ifdef __cplusplus +} +#endif diff --git a/loader/ota/ota_llext_exports.c b/loader/ota/ota_llext_exports.c new file mode 100644 index 000000000..c0e069f55 --- /dev/null +++ b/loader/ota/ota_llext_exports.c @@ -0,0 +1,11 @@ +/* + * Copyright (c) Arduino s.r.l. and/or its affiliated companies + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "ota_api.h" +#include + +EXPORT_SYMBOL(ota_sketch_ready); +EXPORT_SYMBOL(ota_sketch_start); diff --git a/loader/ota/ota_sketch.c b/loader/ota/ota_sketch.c new file mode 100644 index 000000000..6014b737e --- /dev/null +++ b/loader/ota/ota_sketch.c @@ -0,0 +1,42 @@ +/* + * Copyright (c) Arduino s.r.l. and/or its affiliated companies + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include + +#include "ota_api.h" + +#include +LOG_MODULE_REGISTER(ota_sketch, CONFIG_OTA_LOG_LEVEL); + +int ota_sketch_ready() { + struct fs_dirent entry; + int ret; + + if (fs_stat(OTA_SKETCH_FILENAME, &entry) < 0) { + LOG_WRN("tried to perform an ota without binary present"); + return -1; + } + + if (sizeof(CONFIG_OTA_SKETCH_TEMP_PATH_POSTFIX) > 1) { + ret = fs_rename(OTA_SKETCH_FILENAME, CONFIG_OTA_SKETCH_UPDATE_PATH); + + if (ret < 0) { + LOG_ERR("unable to rename ota file: %d", ret); + } + } + + LOG_INF("OTA marked as ready"); + + return ret; +} + +int ota_sketch_start() { + LOG_INF("OTA started, reboot in progress"); + + sys_reboot(SYS_REBOOT_COLD); + return 0; +} diff --git a/loader/ota/ota_sketch_check.c b/loader/ota/ota_sketch_check.c new file mode 100644 index 000000000..dced0c415 --- /dev/null +++ b/loader/ota/ota_sketch_check.c @@ -0,0 +1,194 @@ +/* + * Copyright (c) Arduino s.r.l. and/or its affiliated companies + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +LOG_MODULE_REGISTER(ota, CONFIG_OTA_LOG_LEVEL); + +#include "ota_sketch_check.h" +#include "../../cores/arduino/zephyr_sketch_header.h" + +#include +#include +#include + +#include + +static int verify_sketch_header(const struct flash_area *fa, const struct sketch_header_v1 *hdr, + struct fs_dirent *entry) { + int rc = 0; + + LOG_DBG("Header ver: %02x, len: %d, magic: %04x, flags: %02X", hdr->ver, hdr->len, hdr->magic, + hdr->flags); + + if (sketch_header_v1_verify(hdr) != 0) { + LOG_ERR("invalid sketch header (ver=0x%x magic=0x%x)", hdr->ver, hdr->magic); + return -1; + } + + LOG_INF("sketch length = %u bytes", (unsigned)hdr->len); + + /* Bounds-check before the destructive erase. */ + if (hdr->len > fa->fa_size) { + LOG_ERR("sketch too large for partition (%u > %u)", (unsigned)hdr->len, + (unsigned)fa->fa_size); + return -1; + } + + if ((off_t)hdr->len > entry->size) { + LOG_ERR("header len exceeds file size (%u > %ld)", (unsigned)hdr->len, (long)entry->size); + return -1; + } + + return rc; +} + +static int perform_ota(const struct flash_area *fa, struct fs_file_t *file, + const struct sketch_header_v1 *hdr) { + int rc = 0; + + size_t wbs = flash_area_align(fa) > 0 ? flash_area_align(fa) : 1; + + uint8_t chunk[CONFIG_OTA_TRANSCRIPTION_CHUNK_SIZE]; + __ASSERT(wbs < CONFIG_OTA_TRANSCRIPTION_CHUNK_SIZE, + "OTA internal buffer is smaller(%d) than write block size(%d)", + CONFIG_OTA_TRANSCRIPTION_CHUNK_SIZE, wbs); + + __ASSERT(CONFIG_OTA_TRANSCRIPTION_CHUNK_SIZE % wbs == 0, + "OTA internal buffer(%d) is not multiple of write block " + "size(%d)" CONFIG_OTA_TRANSCRIPTION_CHUNK_SIZE, + wbs); + + off_t offset = 0; + size_t remaining = hdr->len; + ssize_t n; + size_t wlen; + + LOG_INF("erasing flash partition (%u bytes)...", (unsigned)fa->fa_size); + rc = flash_area_erase(fa, 0, fa->fa_size); + + if (rc) { + LOG_ERR("flash erase failed, rc %d — retry on next boot", rc); + goto exit; + } + + if ((rc = fs_seek(file, 0, FS_SEEK_SET))) { + LOG_ERR("failed to seek to start of file, rc %d — retry on next boot", rc); + goto exit; + } + + LOG_INF("rewriting sketch binary"); + + while (remaining > 0 && + (n = fs_read(file, chunk, remaining < sizeof(chunk) ? remaining : sizeof(chunk))) > 0) { + wlen = (size_t)n; + /* Pad the final partial chunk to the write-block-size with 0xFF + * (erased value); flash rejects unaligned writes. */ + if (wlen % wbs != 0) { + memset(chunk + wlen, 0xff, ROUND_UP(wlen, wbs) - wlen); + wlen = ROUND_UP(wlen, wbs); + } + + if ((rc = flash_area_write(fa, offset, chunk, wlen))) { + LOG_ERR("flash write failed at offset %ld, rc %d — retry on next boot", (long)offset, + rc); + + goto exit; + } + offset += n; + remaining -= n; + } + + if (remaining > 0) { + LOG_ERR("short read, %u bytes missing — retry on next boot", (unsigned)remaining); + goto exit; + } + + LOG_INF("wrote %ld bytes to flash", (long)offset); +exit: + return rc; +} + +/* + * Install /ota:/UPDATE.BIN into the sketch partition if present. The sketch + * validates the OTA payload (magic, CRC32, decompression) before writing it, + * so the loader trusts the file and only re-checks the inner sketch_header_v1. + * + * On failure before the erase, UPDATE.BIN is removed and the existing sketch + * boots. On failure after it, the partition is already partial so UPDATE.BIN + * is kept and the next boot retries — the only way back without DFU. + */ +int try_ota_update(const struct flash_area *fa) { + int rc = 0; + + struct fs_file_t file = {0}; + struct fs_dirent entry; + + struct sketch_header_v1 *hdr = NULL; + char header[SKETCH_HEADER_LEN]; + bool delete = false; + + LOG_DBG("checking for ota in \"%s\"", CONFIG_OTA_SKETCH_UPDATE_PATH); + + if (fa == NULL) { + rc = -1; + goto exit; + } + + if (fs_stat(CONFIG_OTA_SKETCH_UPDATE_PATH, &entry) != 0) { + LOG_DBG("no update pending"); + goto exit; + } + + LOG_INF("update pending, validating..."); + + fs_file_t_init(&file); + rc = fs_open(&file, CONFIG_OTA_SKETCH_UPDATE_PATH, FS_O_READ); + if (rc < 0) { + LOG_ERR("failed to open %s, rc %d", CONFIG_OTA_SKETCH_UPDATE_PATH, rc); + delete = true; + goto exit; + } + + if (entry.size < SKETCH_HEADER_LEN) { + LOG_ERR("file too small (%ld bytes)", (long)entry.size); + delete = true; + rc = -1; + goto exit; + } + + rc = fs_read(&file, header, SKETCH_HEADER_LEN); + if (rc != SKETCH_HEADER_LEN) { + LOG_ERR("failed to read header"); + delete = true; + rc = -1; + goto exit; + } + + hdr = (struct sketch_header_v1 *)(header + 7); + if ((rc = verify_sketch_header(fa, hdr, &entry))) { + delete = true; + goto exit; + } + + /* Partition becomes inconsistent past here; keep UPDATE.BIN on failure. */ + LOG_INF("performing ota"); + if ((rc = perform_ota(fa, &file, hdr))) { + goto exit; + } + delete = true; + LOG_INF("update complete"); +exit: + + if (file.mp != NULL && (rc = fs_close(&file))) { + LOG_ERR("error on fs_close %d", rc); + } + + if (delete && (rc = fs_unlink(CONFIG_OTA_SKETCH_UPDATE_PATH))) { + LOG_ERR("error on fs_unlink %d", rc); + } + + return rc; +} diff --git a/loader/ota/ota_sketch_check.h b/loader/ota/ota_sketch_check.h new file mode 100644 index 000000000..6b669b314 --- /dev/null +++ b/loader/ota/ota_sketch_check.h @@ -0,0 +1,20 @@ +/* + * Copyright (c) Arduino s.r.l. and/or its affiliated companies + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +// rename this into sketch ota check or something +// not part of OTA api, internal use +// TODO remove parameter, the flash area should be provided by config +int try_ota_update(const struct flash_area *fa); + +#ifdef __cplusplus +} +#endif diff --git a/platform.txt b/platform.txt index 4eee89658..bc8821cf4 100644 --- a/platform.txt +++ b/platform.txt @@ -69,6 +69,10 @@ build.link_mode=dynamic build.boot_mode=wait upload.extension=elf-zsk.bin +# OTA generation defaults. Boards opt in by setting build.ota.magic and +# build.ota.sketch_offset; with magic empty, postobjcopy.3 is a no-op. +build.ota.magic= +build.ota.sketch_offset= build.ldscript.path={runtime.platform.path}/variants/_ldscripts build.link_command="{compiler.path}{compiler.c.elf.cmd}" "-L{build.path}" "-L{build.variant.path}" {compiler.c.elf.flags} {compiler.c.elf.extra_flags} {build.extra_flags} {build.extra_ldflags} {compiler.zephyr.common_ldflags} {compiler.ldflags} {object_files} -Wl,--start-group "{build.path}/{archive_file}" {compiler.zephyr.extra_ldflags} {compiler.libraries.ldflags} -Wl,--end-group {build.link_args.{build.link_mode}} @@ -163,6 +167,7 @@ recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf ## Mangle the file recipe.hooks.objcopy.postobjcopy.1.pattern="{runtime.tools.zephyr-sketch-tool.path}/zephyr-sketch-tool" {build.zsk_args.debug} {build.zsk_args.mode-{build.link_mode}} {build.zsk_args.startup-mode-{build.boot_mode}} "{build.path}/{build.project_name}.elf" recipe.hooks.objcopy.postobjcopy.2.pattern="{runtime.tools.zephyr-sketch-tool.path}/zephyr-sketch-tool" {build.zsk_args.debug} {build.zsk_args.mode-{build.link_mode}} {build.zsk_args.startup-mode-{build.boot_mode}} "{build.path}/{build.project_name}.bin" +recipe.hooks.objcopy.postobjcopy.3.pattern="{runtime.tools.zephyr-sketch-tool.path}/zephyr-sketch-tool" -ota -ota-loader "{runtime.platform.path}/firmwares/zephyr-{build.variant}.bin" -ota-sketch "{build.path}/{build.project_name}.{upload.extension}" -ota-offset {build.ota.sketch_offset} -ota-magic {build.ota.magic} -output "{build.path}/{build.project_name}" ## Compute size recipe.size.pattern="{runtime.tools.zephyr-check-size.path}/zephyr-check-size" {build.link_mode} "{runtime.platform.path}/firmwares/zephyr-{build.variant}.config" "{build.path}/{build.project_name}.{upload.extension}" "{build.path}/{build.project_name}.elf" From 7d25fe67c929a23c79baacffe74403e19ee9fd35 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Tue, 21 Jul 2026 14:41:35 +0200 Subject: [PATCH 02/11] variants: ota: enable ota support enable ota support for tested boards Signed-off-by: Andrea Gilardoni --- .../arduino_giga_r1_stm32h747xx_m7.conf | 2 ++ .../arduino_nicla_vision_stm32h747xx_m7.conf | 2 ++ .../arduino_opta_stm32h747xx_m7.conf | 2 ++ .../arduino_portenta_c33_r7fa6m5bh3cfc.conf | 2 +- .../arduino_portenta_h7_stm32h747xx_m7.conf | 2 ++ 5 files changed, 9 insertions(+), 1 deletion(-) diff --git a/variants/arduino_giga_r1_stm32h747xx_m7/arduino_giga_r1_stm32h747xx_m7.conf b/variants/arduino_giga_r1_stm32h747xx_m7/arduino_giga_r1_stm32h747xx_m7.conf index bb0db0fd7..5a5bdee72 100644 --- a/variants/arduino_giga_r1_stm32h747xx_m7/arduino_giga_r1_stm32h747xx_m7.conf +++ b/variants/arduino_giga_r1_stm32h747xx_m7/arduino_giga_r1_stm32h747xx_m7.conf @@ -212,3 +212,5 @@ CONFIG_NET_CONFIG_AUTO_INIT=n CONFIG_NET_CONNECTION_MANAGER=y #CONFIG_WIFI_NM_MAX_MANAGED_INTERFACES=2 CONFIG_NET_L2_ETHERNET_MGMT=y + +CONFIG_OTA=y diff --git a/variants/arduino_nicla_vision_stm32h747xx_m7/arduino_nicla_vision_stm32h747xx_m7.conf b/variants/arduino_nicla_vision_stm32h747xx_m7/arduino_nicla_vision_stm32h747xx_m7.conf index f6c0395c4..9e3f6191f 100644 --- a/variants/arduino_nicla_vision_stm32h747xx_m7/arduino_nicla_vision_stm32h747xx_m7.conf +++ b/variants/arduino_nicla_vision_stm32h747xx_m7/arduino_nicla_vision_stm32h747xx_m7.conf @@ -193,3 +193,5 @@ CONFIG_VIDEO_BUFFER_POOL_ALIGN=32 CONFIG_VIDEO_GC2145=y CONFIG_FLASH=y + +CONFIG_OTA=y diff --git a/variants/arduino_opta_stm32h747xx_m7/arduino_opta_stm32h747xx_m7.conf b/variants/arduino_opta_stm32h747xx_m7/arduino_opta_stm32h747xx_m7.conf index df52fe27c..292ef12b6 100644 --- a/variants/arduino_opta_stm32h747xx_m7/arduino_opta_stm32h747xx_m7.conf +++ b/variants/arduino_opta_stm32h747xx_m7/arduino_opta_stm32h747xx_m7.conf @@ -191,3 +191,5 @@ CONFIG_BT_RX_STACK_SIZE=4096 CONFIG_STM32H7_BOOT_M4_AT_INIT=n CONFIG_I2C_STM32_V2_TIMING=y + +CONFIG_OTA=y diff --git a/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf b/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf index 278b9f9ce..dcab1eb7d 100644 --- a/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf +++ b/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf @@ -187,5 +187,5 @@ CONFIG_FS_FATFS_CUSTOM_MOUNT_POINTS="wlan,ota,SD" CONFIG_DYNAMIC_INTERRUPTS=n CONFIG_SPI_ASYNC=y +CONFIG_LED=y -CONFIG_LED=y \ No newline at end of file diff --git a/variants/arduino_portenta_h7_stm32h747xx_m7/arduino_portenta_h7_stm32h747xx_m7.conf b/variants/arduino_portenta_h7_stm32h747xx_m7/arduino_portenta_h7_stm32h747xx_m7.conf index 7d5555dca..0dab568f0 100644 --- a/variants/arduino_portenta_h7_stm32h747xx_m7/arduino_portenta_h7_stm32h747xx_m7.conf +++ b/variants/arduino_portenta_h7_stm32h747xx_m7/arduino_portenta_h7_stm32h747xx_m7.conf @@ -204,3 +204,5 @@ CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 CONFIG_BT_RX_STACK_SIZE=4096 CONFIG_STM32H7_BOOT_M4_AT_INIT=n + +CONFIG_OTA=y From 3e4f137cb9e32d6ffc4f8b46f010aa94842d4afa Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Tue, 28 Jul 2026 12:52:26 +0200 Subject: [PATCH 03/11] tools: ota: produce loader + sketch only bundle Add the possibility to produce an artifact that is compatible with arduino-cloud-cli for ota, which is made of loader + ff padding + sketch, without the ota header and not compressed --- tools/zephyr-sketch-tool/ota.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tools/zephyr-sketch-tool/ota.go b/tools/zephyr-sketch-tool/ota.go index 860a92de7..f1a331bd7 100644 --- a/tools/zephyr-sketch-tool/ota.go +++ b/tools/zephyr-sketch-tool/ota.go @@ -78,17 +78,24 @@ func runOTA(loaderPath, sketchPath, offsetStr, magicStr, outputBase string) erro suffix string payload []byte compress bool + header bool label string }{ - {".ota", sketch, false, "sketch"}, - {".lzss.ota", sketch, true, "sketch (LZSS)"}, - {"-bundle.ota", merged, false, "loader+sketch"}, - {"-bundle.lzss.ota", merged, true, "loader+sketch (LZSS)"}, + {".ota", sketch, false, true, "sketch"}, + {".lzss.ota", sketch, true, true, "sketch (LZSS)"}, + {"-bundle.bin", merged, false, false, "loader+sketch"}, + {"-bundle.ota", merged, false, true, "loader+sketch"}, + {"-bundle.lzss.ota", merged, true, true, "loader+sketch (LZSS)"}, } for _, v := range variants { path := base + v.suffix - out := buildOTA(uint32(magic), v.payload, v.compress) + + out := v.payload + if v.header { + out = buildOTA(uint32(magic), v.payload, v.compress) + } + if err := os.WriteFile(path, out, 0644); err != nil { return fmt.Errorf("write %s: %w", path, err) } From e4f2ec284f9811d16053b6559f0a99b7845e3c14 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Tue, 22 Sep 2026 08:50:01 +0200 Subject: [PATCH 04/11] ota: implement ota for loader binary extend the ota api to allow performing loader updates by means of bootloader --- loader/ota/CMakeLists.txt | 3 ++ loader/ota/Kconfig | 14 ++++++++ loader/ota/ota_api.h | 4 +++ loader/ota/ota_arduino_stm32h7.c | 55 ++++++++++++++++++++++++++++++++ loader/ota/ota_llext_exports.c | 3 ++ 5 files changed, 79 insertions(+) create mode 100644 loader/ota/ota_arduino_stm32h7.c diff --git a/loader/ota/CMakeLists.txt b/loader/ota/CMakeLists.txt index 0229b0137..1a7514086 100644 --- a/loader/ota/CMakeLists.txt +++ b/loader/ota/CMakeLists.txt @@ -6,4 +6,7 @@ target_sources(app PRIVATE ${CMAKE_CURRENT_LIST_DIR}/ota_sketch_check.c) target_sources(app PRIVATE ${CMAKE_CURRENT_LIST_DIR}/ota_llext_exports.c) zephyr_include_directories(${CMAKE_CURRENT_LIST_DIR}) +target_sources_ifdef(CONFIG_SOC_SERIES_STM32H7X app PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/ota_arduino_stm32h7.c) + target_sources(app PRIVATE ${CMAKE_CURRENT_LIST_DIR}/ota_sketch.c) diff --git a/loader/ota/Kconfig b/loader/ota/Kconfig index 43a100be5..89b68bc63 100644 --- a/loader/ota/Kconfig +++ b/loader/ota/Kconfig @@ -30,6 +30,20 @@ config OTA_SKETCH_TEMP_PATH_POSTFIX String that is appended to sketch ota filename when it is still not ready to be loaded, a rename operation is required to make the ota file enabled for next reboot +config OTA_LOADER_UPDATE_PATH + string "The path it is looked for ota" + default "/ota:/UPDATE.BIN" + help + the path that is checked for the loader new binary + +config OTA_LOADER_TEMP_PATH_POSTFIX + string "temporary file name postfix for loader ota not ready" + default "" if SOC_SERIES_STM32H7X + default ".TEMP" + help + String that is appended to loader ota filename when it is still not ready to be loaded, + a rename operation is required to make the ota file enabled for next reboot + config OTA_TRANSCRIPTION_CHUNK_SIZE int "The size of the stack allocated chunk in bytes for transcription" default 1024 diff --git a/loader/ota/ota_api.h b/loader/ota/ota_api.h index d30faba9a..d84ecc029 100644 --- a/loader/ota/ota_api.h +++ b/loader/ota/ota_api.h @@ -11,10 +11,14 @@ extern "C" { #endif #define OTA_SKETCH_FILENAME CONFIG_OTA_SKETCH_UPDATE_PATH CONFIG_OTA_SKETCH_TEMP_PATH_POSTFIX +#define OTA_LOADER_FILENAME CONFIG_OTA_LOADER_UPDATE_PATH CONFIG_OTA_LOADER_TEMP_PATH_POSTFIX int ota_sketch_ready(); int ota_sketch_start(); +int ota_loader_ready(); +int ota_loader_start(); + #ifdef __cplusplus } #endif diff --git a/loader/ota/ota_arduino_stm32h7.c b/loader/ota/ota_arduino_stm32h7.c new file mode 100644 index 000000000..739ae02af --- /dev/null +++ b/loader/ota/ota_arduino_stm32h7.c @@ -0,0 +1,55 @@ +/* + * Copyright (c) Arduino s.r.l. and/or its affiliated companies + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "ota_api.h" +#include +#include +#include +#include + +#include +LOG_MODULE_REGISTER(ota_loader, CONFIG_OTA_LOG_LEVEL); + +#define OTA_MAGIC_BOOT 0x07AA +// #define OTA_STORAGE_TYPE 0xA4 // QSPI_FLASH | FATFS | MBR +#define OTA_STORAGE_TYPE ((1 << 2) | (1 << 5) | (1 << 7)) +#define OTA_MBR_PART 2 + +int ota_loader_ready() { + struct fs_dirent entry; + int ret; + + if (fs_stat(OTA_LOADER_FILENAME, &entry) < 0) { + LOG_WRN("tried to perform an ota without binary present"); + return -1; + } + + if (sizeof(CONFIG_OTA_LOADER_TEMP_PATH_POSTFIX) > 1) { + ret = fs_rename(OTA_LOADER_FILENAME, CONFIG_OTA_LOADER_UPDATE_PATH); + if (ret < 0) { + LOG_ERR("unable to rename ota file: %d", ret); + return ret; + } + } + + stm32_backup_domain_enable_access(); + LL_RTC_BAK_SetRegister(RTC, RTC_BKP_DR0, OTA_MAGIC_BOOT); + LL_RTC_BAK_SetRegister(RTC, RTC_BKP_DR1, OTA_STORAGE_TYPE); + LL_RTC_BAK_SetRegister(RTC, RTC_BKP_DR2, OTA_MBR_PART); + LL_RTC_BAK_SetRegister(RTC, RTC_BKP_DR3, entry.size); + stm32_backup_domain_disable_access(); + + LOG_INF("OTA marked as ready"); + + return 0; +} + +int ota_loader_start() { + LOG_INF("OTA started, reboot in progress"); + + sys_reboot(SYS_REBOOT_COLD); + return 0; // unreachable +} diff --git a/loader/ota/ota_llext_exports.c b/loader/ota/ota_llext_exports.c index c0e069f55..39947fc4e 100644 --- a/loader/ota/ota_llext_exports.c +++ b/loader/ota/ota_llext_exports.c @@ -9,3 +9,6 @@ EXPORT_SYMBOL(ota_sketch_ready); EXPORT_SYMBOL(ota_sketch_start); + +EXPORT_SYMBOL(ota_loader_ready); +EXPORT_SYMBOL(ota_loader_start); From 2be38d7622037be236c76f9e3dfebb5d6a91af61 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Tue, 22 Sep 2026 08:50:35 +0200 Subject: [PATCH 05/11] ota: loader: add portentac33 support implemented portentac33 ota loader support --- loader/ota/CMakeLists.txt | 3 +++ loader/ota/ota_portentac33.c | 41 ++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 loader/ota/ota_portentac33.c diff --git a/loader/ota/CMakeLists.txt b/loader/ota/CMakeLists.txt index 1a7514086..079b7c8b2 100644 --- a/loader/ota/CMakeLists.txt +++ b/loader/ota/CMakeLists.txt @@ -6,6 +6,9 @@ target_sources(app PRIVATE ${CMAKE_CURRENT_LIST_DIR}/ota_sketch_check.c) target_sources(app PRIVATE ${CMAKE_CURRENT_LIST_DIR}/ota_llext_exports.c) zephyr_include_directories(${CMAKE_CURRENT_LIST_DIR}) +target_sources_ifdef(CONFIG_BOARD_ARDUINO_PORTENTA_C33 app PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/ota_portentac33.c) + target_sources_ifdef(CONFIG_SOC_SERIES_STM32H7X app PRIVATE ${CMAKE_CURRENT_LIST_DIR}/ota_arduino_stm32h7.c) diff --git a/loader/ota/ota_portentac33.c b/loader/ota/ota_portentac33.c new file mode 100644 index 000000000..335f6fbc1 --- /dev/null +++ b/loader/ota/ota_portentac33.c @@ -0,0 +1,41 @@ +/* + * Copyright (c) Arduino s.r.l. and/or its affiliated companies + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include "ota_api.h" + +#include +#include + +#include +LOG_MODULE_REGISTER(ota_loader, CONFIG_OTA_LOG_LEVEL); + +int ota_loader_ready() { + // C33: SFU checks for UPDATE.BIN.OTA on every boot — no action needed + struct fs_dirent entry; + int ret; + + if (fs_stat(OTA_LOADER_FILENAME, &entry) < 0) { + LOG_WRN("tried to perform an ota without binary present"); + return -1; + } + + if (sizeof(CONFIG_OTA_LOADER_TEMP_PATH_POSTFIX) > 1) { + ret = fs_rename(OTA_LOADER_FILENAME, CONFIG_OTA_LOADER_UPDATE_PATH); + + if (ret < 0) { + LOG_ERR("unable to rename ota file: %d", ret); + } + } + + LOG_INF("OTA marked as ready"); + return ret; +} + +int ota_loader_start() { + sys_reboot(SYS_REBOOT_COLD); + + return 0; // unreachable +} From 3c080eb33b8c3a350bfec4561765b9c0f3fec814 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Wed, 9 Sep 2026 17:42:18 +0200 Subject: [PATCH 06/11] scripts: boards: export sfu details if present allow get_board_details.sh to export value for sfu.file and sfu.address --- extra/get_board_details.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/extra/get_board_details.sh b/extra/get_board_details.sh index a70d8b8b0..94efb8696 100755 --- a/extra/get_board_details.sh +++ b/extra/get_board_details.sh @@ -24,6 +24,8 @@ for BOARD in $(get_boards); do ARTIFACT=$(get_board_field $BOARD "build\\.artifact") ARTIFACT=${ARTIFACT:-zephyr_contrib} UPLOAD_OFFSET=$(get_board_field $BOARD "upload\\.offset") + SFU_FILE=$(get_board_field $BOARD "sfu\\.file") + SFU_SIZE=$(get_board_field $BOARD "sfu\\.size") ARTIFACT_JSON=extra/artifacts/$ARTIFACT.json if ! [ -f "$ARTIFACT_JSON" ] ; then @@ -51,7 +53,9 @@ for BOARD in $(get_boards); do "hals": "$HALS", "artifact": "$ARTIFACT", "subarch": "$SUBARCH", - "upload_offset": "$UPLOAD_OFFSET" + "upload_offset": "$UPLOAD_OFFSET", + "sfu_file": "$SFU_FILE", + "sfu_size": "$SFU_SIZE" } EOF done | jq -crs . From 6dd0402b8a294e87d03a9424ccd21a2ecb5f6ea7 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Wed, 9 Sep 2026 17:44:33 +0200 Subject: [PATCH 07/11] boards: portentac33: add details for sfu add the sfu file and size for portentac33 in boards.txt --- boards.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/boards.txt b/boards.txt index 00cd99c5b..36a536090 100644 --- a/boards.txt +++ b/boards.txt @@ -454,9 +454,12 @@ portentac33.upload.wait_for_upload_port=false portentac33.upload.native_usb=true portentac33.upload.dfuse= +portentac33.sfu.file=loader/blobs/c33_sfu.bin +portentac33.sfu.size=0x20000 + portentac33.bootloader.tool=dfu-util portentac33.bootloader.tool.default=dfu-util -portentac33.bootloader.file=zephyr-{build.variant}.bin +portentac33.bootloader.file=zephyr-{build.variant}-sfu.bin portentac33.bootloader.interface=0 portentac33.bootloader.address=0x10000 portentac33.bootloader.pid=0x0368 From 56a44de7e72d167faa7fc46e24cf77e0da1b3b4c Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Wed, 9 Sep 2026 17:45:40 +0200 Subject: [PATCH 08/11] blobs: portentac33: add blob for sfu add portenta sfu binary file --- loader/blobs/c33_sfu.bin | Bin 0 -> 114636 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 loader/blobs/c33_sfu.bin diff --git a/loader/blobs/c33_sfu.bin b/loader/blobs/c33_sfu.bin new file mode 100644 index 0000000000000000000000000000000000000000..52732e05500cfc04a74b4d908372d8763de6f680 GIT binary patch literal 114636 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�ATOt{dn|nEqx;zgJ1W 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 hJHLTjE8e&D32ZL Date: Wed, 9 Sep 2026 17:46:17 +0200 Subject: [PATCH 09/11] scripts: build.sh: combine sfu file if specified if sfu file is specified in boards.txt combine it with the loader binary into another file. this file will be placed in firmwares/zephyr-$variant-sfu.bin --- extra/build.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/extra/build.sh b/extra/build.sh index 4678b134a..cbaf42cf6 100755 --- a/extra/build.sh +++ b/extra/build.sh @@ -57,6 +57,10 @@ if ! [ -z "$chosen_board" ]; then if [ x$2 == x"--debug" ]; then args+=(-- -DEXTRA_CONF_FILE=../extra/debug.conf) fi + + # check if the board requires to prepend a second stage bootloader to the loader + sfu_file=$(jq -cr '.sfu_file' <<< "$chosen_board") + sfu_size=$(jq -cr '.sfu_size' <<< "$chosen_board") else # expect Zephyr-compatible target and args target=$1 @@ -125,6 +129,17 @@ done cp ${BUILD_DIR}/zephyr/zephyr.dts firmwares/zephyr-$variant.dts cp ${BUILD_DIR}/zephyr/.config firmwares/zephyr-$variant.config +# Some boards, like the C33, need a second stage bootloader to enable OTA upgrades, +# if the file is specified in boards.txt under .sfu.file, prepend it to the loader binary into a +# firmwares/zephyr-$variant-sfu.bin file. +# this file needs to be specified in bootloader.file=zephyr-{build.variant}-sfu.bin +if [ "$sfu_file" ] ; then + dd if=${sfu_file} of=firmwares/zephyr-$variant-sfu.bin conv=notrunc status=none + + offset=$(printf "%d" "${sfu_size}") + dd if=firmwares/zephyr-$variant.bin of=firmwares/zephyr-$variant-sfu.bin bs=1 seek=${offset} conv=notrunc status=none +fi + # Generate the provides.ld file for linked builds echo "Generating exported symbol scripts" extra/gen_provides.py "${BUILD_DIR}/zephyr/zephyr.elf" -T > ${VARIANT_DIR}/tls-syms.S From 7934b36fd2d043e5acf4e6892d6155afa9d96cd8 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Wed, 9 Sep 2026 17:49:31 +0200 Subject: [PATCH 10/11] variants: portentac33: sfu partition in overlay adjust partitions in overlay file to include sfu --- .../arduino_portenta_c33_r7fa6m5bh3cfc.overlay | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.overlay b/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.overlay index 122c24ef2..514f66719 100644 --- a/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.overlay +++ b/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.overlay @@ -25,13 +25,19 @@ &flash0 { partitions { + /delete-node/ partition@10000; + mcuboot: partition@0 { label = "mcuboot"; reg = <0x00000000 DT_SIZE_K(64)>; }; - code_partition: partition@10000 { + sfu_partition: partition@10000 { + label = "sfu"; + reg = <0x00010000 (DT_SIZE_K(128))>; + }; + code_partition: partition@30000 { label = "image-0"; - reg = <0x00010000 (DT_SIZE_M(1) - DT_SIZE_K(64))>; + reg = <0x00030000 (DT_SIZE_M(1) - DT_SIZE_K(64) - DT_SIZE_K(128))>; }; user_sketch: partition@100000 { label = "user_sketch"; From 928d0da8e33310c82f93cb0cf92802023e0063e0 Mon Sep 17 00:00:00 2001 From: Andrea Gilardoni Date: Tue, 8 Sep 2026 10:34:58 +0200 Subject: [PATCH 11/11] variants: portentac33: enable ota support enable ota support for portentac33 --- .../arduino_portenta_c33_r7fa6m5bh3cfc.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf b/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf index dcab1eb7d..6a2c9f620 100644 --- a/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf +++ b/variants/arduino_portenta_c33_r7fa6m5bh3cfc/arduino_portenta_c33_r7fa6m5bh3cfc.conf @@ -189,3 +189,5 @@ CONFIG_DYNAMIC_INTERRUPTS=n CONFIG_SPI_ASYNC=y CONFIG_LED=y +CONFIG_OTA=y +CONFIG_OTA_LOG_LEVEL_DBG=y