From a398f3b7420525b11c31dadf07b0cd696f1f6d3c Mon Sep 17 00:00:00 2001
From: xengineering <me@xengineering.eu>
Date: Fri, 21 Mar 2025 22:48:02 +0100
Subject: fw: Use MCUboot bootloader for nucleo_f767zi

Using it for the native_sim board is not trivial. Thus it is first only
added for the Nucleo board.
---
 fw/CMakeLists.txt                           | 17 +++++++++++++++++
 fw/nucleo.conf                              |  5 +++++
 fw/nucleo.sh                                | 29 +++++++++++++++++++++++------
 fw/zephyrproject/bootloader/bootloader.conf |  7 +++++++
 4 files changed, 52 insertions(+), 6 deletions(-)
 create mode 100644 fw/nucleo.conf
 create mode 100644 fw/zephyrproject/bootloader/bootloader.conf

(limited to 'fw')

diff --git a/fw/CMakeLists.txt b/fw/CMakeLists.txt
index 8d9591f..eff06f2 100644
--- a/fw/CMakeLists.txt
+++ b/fw/CMakeLists.txt
@@ -11,6 +11,23 @@ set(ZEPHYR_MODULES
 	"${CMAKE_CURRENT_SOURCE_DIR}/zephyrproject/modules/crypto/mbedtls"
 	"${CMAKE_CURRENT_SOURCE_DIR}/zephyrproject/bootloader/mcuboot"
 )
+
+string(REPLACE ";" "," ZEPHYR_MODULES_COMMA "${ZEPHYR_MODULES}")
+include(ExternalProject)
+ExternalProject_Add(
+	bootloader
+	PREFIX bootloader
+	SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/zephyrproject/bootloader/mcuboot/boot/zephyr"
+	BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/bootloader"
+	INSTALL_COMMAND ""
+	LIST_SEPARATOR ","
+	CMAKE_ARGS
+		"-DBOARD=nucleo_f767zi"
+		"-DZEPHYR_MODULES=${ZEPHYR_MODULES_COMMA}"
+		"-DEXTRA_CONF_FILE=${CMAKE_CURRENT_SOURCE_DIR}/zephyrproject/bootloader/bootloader.conf"
+		-DCONFIG_BOOT_SIGNATURE_KEY_FILE="${KEY}"
+)
+
 find_package(Zephyr
 	REQUIRED
 	HINTS
diff --git a/fw/nucleo.conf b/fw/nucleo.conf
new file mode 100644
index 0000000..32e6d4a
--- /dev/null
+++ b/fw/nucleo.conf
@@ -0,0 +1,5 @@
+# This Source Code Form is subject to the terms of the Mozilla Public License,
+# v. 2.0. If a copy of the MPL was not distributed with this file, You can
+# obtain one at https://mozilla.org/MPL/2.0/.
+
+CONFIG_BOOTLOADER_MCUBOOT=y
diff --git a/fw/nucleo.sh b/fw/nucleo.sh
index 24966b1..be694b8 100755
--- a/fw/nucleo.sh
+++ b/fw/nucleo.sh
@@ -23,24 +23,41 @@ SCRIPT="$(realpath "$0")"
 FW="$(dirname "$SCRIPT")"
 ROOT="$(dirname "$FW")"
 BUILD="${ROOT}/nucleo"
-FIRMWARE="${BUILD}/fw/zephyr/zephyr.bin"
-FLASH_ADDRESS='0x8000000'
+BOOTLOADER_FIRMWARE="${BUILD}/fw/bootloader/zephyr/zephyr.bin"
+APPLICATION_FIRMWARE="${BUILD}/fw/zephyr/zephyr.bin"
+APPLICATION_FIRMWARE_SIGNED="${BUILD}/fw/zephyr/zephyr.signed.bin"
+BOOTLOADER_FLASH_ADDRESS='0x8000000'
+APPLICATION_FLASH_ADDRESS='0x8040000'
+MCUBOOT="${ROOT}/fw/zephyrproject/bootloader/mcuboot"
+IMGTOOL="${MCUBOOT}/scripts/imgtool.py"
+KEY="${HOME}/mcuboot/key.pem"
 BOARD='nucleo_f767zi'
+EXTRA_CONFIGS="${ROOT}/fw/nucleo.conf"
 BAUDRATE='115200'
 SERIAL_PORT='/dev/ttyACM0'
 CONFIG_OVERLAY="${FW}/my.conf"
 
 
-overlay_config=''
 if test -f "$CONFIG_OVERLAY"
 then
-	overlay_config="-DEXTRA_CONF_FILE="${CONFIG_OVERLAY}""
+	EXTRA_CONFIGS="${EXTRA_CONFIGS} ${CONFIG_OVERLAY}"
 fi
 
 set -x
 
 rm -rf "$BUILD"
-cmake "-B${BUILD}" -GNinja -DBOARD="$BOARD" "$overlay_config"
+cmake "-B${BUILD}" -GNinja -DBOARD="$BOARD" \
+	-DEXTRA_CONF_FILE="${EXTRA_CONFIGS}" -DKEY="$KEY"
 ninja -C "$BUILD"
-st-flash --connect-under-reset write "$FIRMWARE" "$FLASH_ADDRESS"
+python "$IMGTOOL" sign \
+	--version 0.0.0 \
+	--header-size 0x200 \
+	--slot-size 0xc0000 \
+	--key "$KEY" \
+	"$APPLICATION_FIRMWARE" \
+	"$APPLICATION_FIRMWARE_SIGNED"
+st-flash --connect-under-reset write "$BOOTLOADER_FIRMWARE" \
+	"$BOOTLOADER_FLASH_ADDRESS"
+st-flash --connect-under-reset write "$APPLICATION_FIRMWARE_SIGNED" \
+	"$APPLICATION_FLASH_ADDRESS"
 picocom -b "$BAUDRATE" "$SERIAL_PORT"
diff --git a/fw/zephyrproject/bootloader/bootloader.conf b/fw/zephyrproject/bootloader/bootloader.conf
new file mode 100644
index 0000000..c42b7fc
--- /dev/null
+++ b/fw/zephyrproject/bootloader/bootloader.conf
@@ -0,0 +1,7 @@
+# This Source Code Form is subject to the terms of the Mozilla Public License,
+# v. 2.0. If a copy of the MPL was not distributed with this file, You can
+# obtain one at https://mozilla.org/MPL/2.0/.
+
+
+CONFIG_BOOT_MAX_IMG_SECTORS_AUTO=n
+CONFIG_BOOT_SIGNATURE_TYPE_ED25519=y
-- 
cgit v1.2.3-70-g09d2