Skip to content

Commit a75b378

Browse files
LucasTamboralmir-okato
authored andcommitted
boot: espressif: integrate Espressif Port with Zephyr sysbuild system
Enable building MCUboot Espressif Port through Zephyr's sysbuild for Espressif chips. Signed-off-by: Lucas Tamborrino <[email protected]> Signed-off-by: Almir Okato <[email protected]>
1 parent cb55846 commit a75b378

15 files changed

+1212
-375
lines changed

boot/espressif/CMakeLists.txt

+110-374
Large diffs are not rendered by default.

boot/espressif/common.cmake

+273
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,273 @@
1+
# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
add_definitions(-DMCUBOOT_TARGET=${MCUBOOT_TARGET})
6+
add_definitions(-D__ESPRESSIF__=1)
7+
8+
# Set directories
9+
set(BOOTUTIL_DIR ${MCUBOOT_ROOT_DIR}/boot/bootutil)
10+
set(BOOT_SERIAL_DIR ${MCUBOOT_ROOT_DIR}/boot/boot_serial)
11+
set(ZCBOR_DIR ${MCUBOOT_ROOT_DIR}/boot/zcbor)
12+
13+
# Set chip arch
14+
if("${MCUBOOT_TARGET}" STREQUAL "esp32" OR
15+
"${MCUBOOT_TARGET}" STREQUAL "esp32s2" OR
16+
"${MCUBOOT_TARGET}" STREQUAL "esp32s3")
17+
set(MCUBOOT_ARCH "xtensa")
18+
elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c3" OR
19+
"${MCUBOOT_TARGET}" STREQUAL "esp32c6" OR
20+
"${MCUBOOT_TARGET}" STREQUAL "esp32c2" OR
21+
"${MCUBOOT_TARGET}" STREQUAL "esp32h2")
22+
set(MCUBOOT_ARCH "riscv")
23+
endif()
24+
25+
# Set the minimum revision for each supported chip
26+
if("${MCUBOOT_TARGET}" STREQUAL "esp32")
27+
set(ESP_MIN_REVISION 3)
28+
elseif("${MCUBOOT_TARGET}" STREQUAL "esp32s2")
29+
set(ESP_MIN_REVISION 0)
30+
elseif("${MCUBOOT_TARGET}" STREQUAL "esp32s3")
31+
set(ESP_MIN_REVISION 0)
32+
elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c3")
33+
set(ESP_MIN_REVISION 3)
34+
elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c6")
35+
set(ESP_MIN_REVISION 0)
36+
elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c2")
37+
set(ESP_MIN_REVISION 0)
38+
elseif("${MCUBOOT_TARGET}" STREQUAL "esp32h2")
39+
set(ESP_MIN_REVISION 0)
40+
else()
41+
message(FATAL_ERROR "Unsupported target ${MCUBOOT_TARGET}")
42+
endif()
43+
44+
# Get MCUboot revision to be added into bootloader image version
45+
execute_process(
46+
COMMAND git describe --tags
47+
WORKING_DIRECTORY ${ESPRESSIF_PORT_DIR}
48+
OUTPUT_VARIABLE MCUBOOT_VER
49+
OUTPUT_STRIP_TRAILING_WHITESPACE
50+
)
51+
add_definitions(-DMCUBOOT_VER=\"${MCUBOOT_VER}\")
52+
53+
# Set Espressif HAL to use
54+
if(NOT DEFINED ESP_HAL_PATH)
55+
if(DEFINED ENV{ESP_HAL_PATH})
56+
set(ESP_HAL_PATH $ENV{ESP_HAL_PATH})
57+
else()
58+
message(WARNING "ESP_HAL_PATH not defined, checking if IDF_PATH exists.")
59+
if(DEFINED ENV{IDF_PATH})
60+
set(ESP_HAL_PATH $ENV{IDF_PATH})
61+
message("IDF installation found in the system, using IDF_PATH as ESP_HAL_PATH.")
62+
else ()
63+
message(FATAL_ERROR "Please set -DESP_HAL_PATH parameter or define ESP_HAL_PATH environment variable.")
64+
endif()
65+
endif()
66+
endif()
67+
message(STATUS "Defined ESP_HAL_PATH: ${ESP_HAL_PATH}")
68+
69+
# Verify from which IDF version the HAL is based on
70+
set(IDF_VER_HEADER_FILE "${ESP_HAL_PATH}/components/esp_common/include/esp_idf_version.h")
71+
72+
get_version_from_header("ESP_IDF_VERSION_MAJOR" ${IDF_VER_HEADER_FILE} IDF_VERSION_MAJOR)
73+
get_version_from_header("ESP_IDF_VERSION_MINOR" ${IDF_VER_HEADER_FILE} IDF_VERSION_MINOR)
74+
get_version_from_header("ESP_IDF_VERSION_PATCH" ${IDF_VER_HEADER_FILE} IDF_VERSION_PATCH)
75+
76+
set(IDF_VERSION "${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}.${IDF_VERSION_PATCH}")
77+
78+
if(NOT IDF_VERSION VERSION_EQUAL ${EXPECTED_IDF_HAL_VERSION})
79+
message(
80+
FATAL_ERROR "
81+
Unsupported HAL version ${IDF_VERSION}, expected ${EXPECTED_IDF_HAL_VERSION}. \
82+
Verify if the RTOS repository, where you are trying to build from, is up to date, \
83+
or check the installation pointed on ESP_HAL_PATH."
84+
)
85+
else ()
86+
message(STATUS "HAL based on ESP-IDF version: ${IDF_VERSION}")
87+
endif()
88+
89+
# Find imgtool.
90+
# Go with an explicitly installed imgtool first, falling
91+
# back to mcuboot/scripts/imgtool.py.
92+
find_program(IMGTOOL_COMMAND
93+
NAMES imgtool imgtool.py
94+
)
95+
if("${IMGTOOL_COMMAND}" MATCHES "IMGTOOL_COMMAND-NOTFOUND")
96+
set(imgtool_path "${MCUBOOT_ROOT_DIR}/scripts/imgtool.py")
97+
else()
98+
set(imgtool_path "${IMGTOOL_COMMAND}")
99+
endif()
100+
101+
set(inc_directories
102+
${BOOTUTIL_DIR}/include
103+
${BOOTUTIL_DIR}/src
104+
${ESPRESSIF_PORT_DIR}/include
105+
)
106+
107+
set(main_src ${ESPRESSIF_PORT_DIR}/main.c)
108+
109+
set(port_srcs
110+
${ESPRESSIF_PORT_DIR}/port/esp_mcuboot.c
111+
${ESPRESSIF_PORT_DIR}/port/esp_loader.c
112+
${ESPRESSIF_PORT_DIR}/os.c
113+
)
114+
115+
set(bootutil_srcs
116+
${BOOTUTIL_DIR}/src/boot_record.c
117+
${BOOTUTIL_DIR}/src/bootutil_misc.c
118+
${BOOTUTIL_DIR}/src/bootutil_public.c
119+
${BOOTUTIL_DIR}/src/caps.c
120+
${BOOTUTIL_DIR}/src/encrypted.c
121+
${BOOTUTIL_DIR}/src/fault_injection_hardening.c
122+
${BOOTUTIL_DIR}/src/fault_injection_hardening_delay_rng_mbedtls.c
123+
${BOOTUTIL_DIR}/src/image_ecdsa.c
124+
${BOOTUTIL_DIR}/src/image_ed25519.c
125+
${BOOTUTIL_DIR}/src/image_rsa.c
126+
${BOOTUTIL_DIR}/src/image_validate.c
127+
${BOOTUTIL_DIR}/src/loader.c
128+
${BOOTUTIL_DIR}/src/swap_misc.c
129+
${BOOTUTIL_DIR}/src/swap_move.c
130+
${BOOTUTIL_DIR}/src/swap_scratch.c
131+
${BOOTUTIL_DIR}/src/swap_offset.c
132+
${BOOTUTIL_DIR}/src/tlv.c
133+
)
134+
135+
if(CONFIG_BOOT_RAM_LOAD)
136+
list(APPEND bootutil_srcs ${BOOTUTIL_DIR}/src/ram_load.c)
137+
endif()
138+
139+
if(DEFINED CONFIG_ESP_SIGN_RSA)
140+
include(${ESPRESSIF_PORT_DIR}/include/crypto_config/rsa.cmake)
141+
elseif(DEFINED CONFIG_ESP_SIGN_EC256)
142+
include(${ESPRESSIF_PORT_DIR}/include/crypto_config/ec256.cmake)
143+
elseif(DEFINED CONFIG_ESP_SIGN_ED25519)
144+
include(${ESPRESSIF_PORT_DIR}/include/crypto_config/ed25519.cmake)
145+
else()
146+
# No signature verification
147+
set(TINYCRYPT_DIR ${MCUBOOT_ROOT_DIR}/ext/tinycrypt/lib)
148+
set(CRYPTO_INC
149+
${TINYCRYPT_DIR}/include
150+
)
151+
set(crypto_srcs
152+
${TINYCRYPT_DIR}/source/sha256.c
153+
${TINYCRYPT_DIR}/source/utils.c
154+
)
155+
endif()
156+
157+
if(DEFINED CONFIG_ESP_SIGN_KEY_FILE)
158+
if(IS_ABSOLUTE ${CONFIG_ESP_SIGN_KEY_FILE})
159+
set(KEY_FILE ${CONFIG_ESP_SIGN_KEY_FILE})
160+
else()
161+
set(KEY_FILE ${MCUBOOT_ROOT_DIR}/${CONFIG_ESP_SIGN_KEY_FILE})
162+
endif()
163+
message("MCUBoot bootloader key file: ${KEY_FILE}")
164+
165+
set(GENERATED_PUBKEY ${CMAKE_CURRENT_BINARY_DIR}/autogen-pubkey.c)
166+
add_custom_command(
167+
OUTPUT ${GENERATED_PUBKEY}
168+
COMMAND
169+
${imgtool_path}
170+
getpub
171+
-k
172+
${KEY_FILE}
173+
> ${GENERATED_PUBKEY}
174+
DEPENDS ${KEY_FILE}
175+
)
176+
list(APPEND crypto_srcs ${GENERATED_PUBKEY})
177+
endif()
178+
179+
if(CONFIG_ESP_MCUBOOT_SERIAL)
180+
set(MBEDTLS_DIR "${MCUBOOT_ROOT_DIR}/ext/mbedtls")
181+
182+
list(APPEND bootutil_srcs
183+
${BOOT_SERIAL_DIR}/src/boot_serial.c
184+
${BOOT_SERIAL_DIR}/src/zcbor_bulk.c
185+
${ZCBOR_DIR}/src/zcbor_decode.c
186+
${ZCBOR_DIR}/src/zcbor_encode.c
187+
${ZCBOR_DIR}/src/zcbor_common.c
188+
)
189+
list(APPEND inc_directories
190+
${BOOT_SERIAL_DIR}/include
191+
${ZCBOR_DIR}/include
192+
)
193+
list(APPEND port_srcs
194+
${ESPRESSIF_PORT_DIR}/port/${MCUBOOT_TARGET}/serial_adapter.c
195+
${MBEDTLS_DIR}/library/base64.c
196+
)
197+
list(APPEND CRYPTO_INC
198+
${MBEDTLS_DIR}/include
199+
)
200+
endif()
201+
202+
list(APPEND inc_directories
203+
${CRYPTO_INC}
204+
)
205+
206+
set(CFLAGS
207+
"-Wno-frame-address"
208+
"-Wall"
209+
"-Wextra"
210+
"-W"
211+
"-Wdeclaration-after-statement"
212+
"-Wwrite-strings"
213+
"-Wlogical-op"
214+
"-Wshadow"
215+
"-ffunction-sections"
216+
"-fdata-sections"
217+
"-fstrict-volatile-bitfields"
218+
"-Werror=all"
219+
"-Wno-error=unused-function"
220+
"-Wno-error=unused-but-set-variable"
221+
"-Wno-error=unused-variable"
222+
"-Wno-error=deprecated-declarations"
223+
"-Wno-unused-parameter"
224+
"-Wno-sign-compare"
225+
"-ggdb"
226+
"-Os"
227+
"-D_GNU_SOURCE"
228+
"-std=gnu17"
229+
"-Wno-old-style-declaration"
230+
"-Wno-implicit-int"
231+
"-Wno-declaration-after-statement"
232+
)
233+
234+
set(LDFLAGS
235+
"-nostdlib"
236+
"-Wno-frame-address"
237+
"-Wl,--cref"
238+
"-fno-rtti"
239+
"-fno-lto"
240+
"-Wl,--gc-sections"
241+
"-Wl,--undefined=uxTopUsedPriority"
242+
"-lm"
243+
"-lgcc"
244+
"-lgcov"
245+
)
246+
247+
if("${MCUBOOT_ARCH}" STREQUAL "xtensa")
248+
list(APPEND CFLAGS
249+
"-mlongcalls"
250+
)
251+
list(APPEND LDFLAGS
252+
"-mlongcalls"
253+
)
254+
endif()
255+
256+
# Set linker script
257+
set(ld_input ${ESPRESSIF_PORT_DIR}/port/${MCUBOOT_TARGET}/ld/bootloader.ld)
258+
set(ld_output ${CMAKE_CURRENT_BINARY_DIR}/ld/bootloader.ld)
259+
260+
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/ld")
261+
262+
get_directory_property(configs COMPILE_DEFINITIONS)
263+
foreach(c ${configs})
264+
list(APPEND conf_defines "-D${c}")
265+
endforeach()
266+
267+
# Preprocess linker script
268+
add_custom_command(
269+
TARGET ${APP_EXECUTABLE} PRE_LINK
270+
COMMAND ${CMAKE_C_COMPILER} -x c -E -P -o ${ld_output} ${conf_defines} ${ld_input}
271+
MAIN_DEPENDENCY ${ld_input}
272+
COMMENT "Preprocessing bootloader.ld linker script..."
273+
)

boot/espressif/hal/CMakeLists.txt

+18-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@
44

55
cmake_minimum_required(VERSION 3.13)
66

7+
if(CONFIG_BUILD_FROM_ZEPHYR)
8+
message(STATUS "Building HAL for MCUboot Espressif Port")
9+
10+
add_compile_definitions(CONFIG_ESP_CONSOLE_UART=${CONFIG_ESP_CONSOLE_UART})
11+
add_compile_definitions(CONFIG_ESP_CONSOLE_UART_NUM=${CONFIG_ESP_CONSOLE_UART_NUM})
12+
add_compile_definitions(CONFIG_MCUBOOT_ESPRESSIF=1)
13+
endif()
14+
715
project(hal)
816

917
set(esp_hal_dir ${ESP_HAL_PATH})
@@ -156,7 +164,6 @@ set(CFLAGS
156164
set(LDFLAGS
157165
"-Wno-frame-address"
158166
"-Wl,--cref"
159-
"-Wl,--Map=${APP_NAME}.map"
160167
"-fno-rtti"
161168
"-fno-lto"
162169
"-Wl,--gc-sections"
@@ -166,6 +173,16 @@ set(LDFLAGS
166173
"-lgcov"
167174
)
168175

176+
if(CONFIG_BUILD_FROM_ZEPHYR)
177+
list(APPEND include_dirs
178+
${ESPRESSIF_PORT_DIR}/zephyr/include
179+
)
180+
else()
181+
list(APPEND LDFLAGS
182+
"-Wl,--Map=${APP_NAME}.map"
183+
)
184+
endif()
185+
169186
if("${MCUBOOT_ARCH}" STREQUAL "xtensa")
170187
list(APPEND CFLAGS
171188
"-mlongcalls"

boot/espressif/zephyr/CMakeLists.txt

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
2+
#
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
cmake_minimum_required(VERSION 3.20.0)
6+
cmake_policy(SET CMP0109 NEW)
7+
8+
include(${CMAKE_CURRENT_LIST_DIR}/../tools/utils.cmake)
9+
10+
message(STATUS "Building MCUboot for Zephyr OS -- ESPRESSIF PORT")
11+
12+
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
13+
14+
# Set Zephyr referenced variables
15+
set(MCUBOOT_ROOT_DIR ${ZEPHYR_MCUBOOT_MODULE_DIR})
16+
set(ESPRESSIF_PORT_DIR ${MCUBOOT_ROOT_DIR}/boot/espressif)
17+
set(MCUBOOT_TARGET ${CONFIG_SOC})
18+
set(ESP_HAL_PATH ${ZEPHYR_HAL_ESPRESSIF_MODULE_DIR})
19+
set(APP_EXECUTABLE ${ZEPHYR_CURRENT_LIBRARY})
20+
set(EXPECTED_IDF_HAL_VERSION "5.1.5")
21+
22+
project(NONE)
23+
24+
include(../common.cmake)
25+
26+
zephyr_library_include_directories(
27+
${inc_directories}
28+
)
29+
30+
zephyr_library_sources(
31+
${main_src}
32+
${bootutil_srcs}
33+
${crypto_srcs}
34+
${port_srcs}
35+
)
36+
37+
zephyr_library_link_libraries(
38+
gcc
39+
-T${ld_output}
40+
${LDFLAGS}
41+
)
42+
43+
if("${MCUBOOT_ARCH}" STREQUAL "xtensa")
44+
zephyr_include_directories(
45+
${ESP_HAL_PATH}/components/${MCUBOOT_ARCH}/${MCUBOOT_TARGET}/include
46+
${ESP_HAL_PATH}/components/${MCUBOOT_ARCH}/include
47+
)
48+
endif()
49+
50+
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../hal ${CMAKE_CURRENT_BINARY_DIR}/hal)
51+
zephyr_library_link_libraries(hal)

0 commit comments

Comments
 (0)