From cb55846aa55a914890fda519d53b0575961f97a7 Mon Sep 17 00:00:00 2001 From: Almir Okato Date: Thu, 6 Mar 2025 13:48:55 -0300 Subject: [PATCH 1/2] boot: espressif: reorganize cmake build script file Signed-off-by: Almir Okato --- boot/espressif/CMakeLists.txt | 372 ++++++++++++++++++---------------- 1 file changed, 196 insertions(+), 176 deletions(-) diff --git a/boot/espressif/CMakeLists.txt b/boot/espressif/CMakeLists.txt index 05358839c..507bb66f6 100644 --- a/boot/espressif/CMakeLists.txt +++ b/boot/espressif/CMakeLists.txt @@ -7,33 +7,42 @@ cmake_policy(SET CMP0109 NEW) include(${CMAKE_CURRENT_LIST_DIR}/tools/utils.cmake) -if (NOT DEFINED MCUBOOT_TARGET) - message(FATAL_ERROR "MCUBOOT_TARGET not defined. Please pass -DMCUBOOT_TARGET flag.") -endif() - -add_definitions(-DMCUBOOT_TARGET=${MCUBOOT_TARGET}) -add_definitions(-D__ESPRESSIF__=1) +set(MCUBOOT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) +set(ESPRESSIF_PORT_DIR ${MCUBOOT_ROOT_DIR}/boot/espressif) +set(APP_NAME mcuboot_${MCUBOOT_TARGET}) +set(APP_EXECUTABLE ${APP_NAME}.elf) set(EXPECTED_IDF_HAL_VERSION "5.1.4") -if ("${MCUBOOT_TARGET}" STREQUAL "esp32" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32s2" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32s3") - set(MCUBOOT_ARCH "xtensa") -elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c3" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32c6" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32c2" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32h2") - set(MCUBOOT_ARCH "riscv") +project(mcuboot_${MCUBOOT_TARGET}) + +add_executable( + ${APP_EXECUTABLE} + ${ESPRESSIF_PORT_DIR}/main.c + ) + +# Set MCUboot Espressif Port configuration file +if(NOT DEFINED MCUBOOT_CONFIG_FILE) + set(MCUBOOT_CONFIG_FILE "${ESPRESSIF_PORT_DIR}/port/${MCUBOOT_TARGET}/bootloader.conf") + message("MCUBOOT_CONFIG_FILE: ${MCUBOOT_CONFIG_FILE}") endif() -if (NOT DEFINED CMAKE_TOOLCHAIN_FILE) - if (DEFINED TOOLCHAIN_BIN_DIR) +string(REPLACE " " ";" MCUBOOT_CONFIG_FILE_LIST "${MCUBOOT_CONFIG_FILE}") +foreach(CONFIG_FILE ${MCUBOOT_CONFIG_FILE_LIST}) + if(NOT EXISTS "${CONFIG_FILE}") + message(FATAL_ERROR "MCUboot configuration file does not exist at ${CONFIG_FILE}") + endif() + parse_and_set_config_file(${CONFIG_FILE}) +endforeach() + +# Fetch and set toolchain +if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) + if(DEFINED TOOLCHAIN_BIN_DIR) message("CMAKE_TOOLCHAIN_FILE not defined, searching for toolchain compiler in TOOLCHAIN_BIN_DIR: ${TOOLCHAIN_BIN_DIR}") set(CMAKE_SYSTEM_NAME Generic) file(GLOB C_COMPILER_BIN "${TOOLCHAIN_BIN_DIR}/*${MCUBOOT_ARCH}*elf-gcc") - if (NOT C_COMPILER_BIN) + if(NOT C_COMPILER_BIN) message(FATAL_ERROR "No C compiler found. Please ensure that TOOLCHAIN_BIN_DIR directory contains a set of C compiling tools compatible with the target") endif() set(CMAKE_C_COMPILER ${C_COMPILER_BIN}) @@ -41,14 +50,14 @@ if (NOT DEFINED CMAKE_TOOLCHAIN_FILE) message("C compiler found: ${CMAKE_C_COMPILER}") file(GLOB CXX_COMPILER_BIN "${TOOLCHAIN_BIN_DIR}/*${MCUBOOT_ARCH}*elf-g++") - if (NOT CXX_COMPILER_BIN) + if(NOT CXX_COMPILER_BIN) message(FATAL_ERROR "No C++ compiler found. Please ensure that TOOLCHAIN_BIN_DIR directory contains a set of C++ compiling tools compatible with the target") endif() set(CMAKE_CXX_COMPILER ${CXX_COMPILER_BIN}) message("CXX compiler found: ${CMAKE_CXX_COMPILER}") else() # Set toolchain file that expect the same toolchain as IDF sets on PATH - set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/tools/toolchain-${MCUBOOT_TARGET}.cmake) + set(CMAKE_TOOLCHAIN_FILE ${ESPRESSIF_PORT_DIR}/tools/toolchain-${MCUBOOT_TARGET}.cmake) message("No user-defined toolchain, setting default toolchain file: ${CMAKE_TOOLCHAIN_FILE}") endif() @@ -60,10 +69,31 @@ else() message("CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}") endif() -project(mcuboot_${MCUBOOT_TARGET}) +# Set directories +set(BOOTUTIL_DIR ${MCUBOOT_ROOT_DIR}/boot/bootutil) +set(BOOT_SERIAL_DIR ${MCUBOOT_ROOT_DIR}/boot/boot_serial) +set(ZCBOR_DIR ${MCUBOOT_ROOT_DIR}/boot/zcbor) + +if(NOT DEFINED MCUBOOT_TARGET) + message(FATAL_ERROR "MCUBOOT_TARGET not defined. Please pass -DMCUBOOT_TARGET flag.") +endif() +add_definitions(-DMCUBOOT_TARGET=${MCUBOOT_TARGET}) +add_definitions(-D__ESPRESSIF__=1) + +# Set chip arch +if("${MCUBOOT_TARGET}" STREQUAL "esp32" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32s2" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32s3") + set(MCUBOOT_ARCH "xtensa") +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c3" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32c6" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32c2" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32h2") + set(MCUBOOT_ARCH "riscv") +endif() # Set the minimum revision for each supported chip -if ("${MCUBOOT_TARGET}" STREQUAL "esp32") +if("${MCUBOOT_TARGET}" STREQUAL "esp32") set(ESP_MIN_REVISION 3) elseif("${MCUBOOT_TARGET}" STREQUAL "esp32s2") set(ESP_MIN_REVISION 0) @@ -81,12 +111,22 @@ else() message(FATAL_ERROR "Unsupported target ${MCUBOOT_TARGET}") endif() -if (NOT DEFINED ESP_HAL_PATH) - if (DEFINED ENV{ESP_HAL_PATH}) +# Get MCUboot revision to be added into bootloader image version +execute_process( + COMMAND git describe --tags + WORKING_DIRECTORY ${ESPRESSIF_PORT_DIR} + OUTPUT_VARIABLE MCUBOOT_VER + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +add_definitions(-DMCUBOOT_VER=\"${MCUBOOT_VER}\") + +# Set Espressif HAL to use +if(NOT DEFINED ESP_HAL_PATH) + if(DEFINED ENV{ESP_HAL_PATH}) set(ESP_HAL_PATH $ENV{ESP_HAL_PATH}) else() message(WARNING "ESP_HAL_PATH not defined, checking if IDF_PATH exists.") - if (DEFINED ENV{IDF_PATH}) + if(DEFINED ENV{IDF_PATH}) set(ESP_HAL_PATH $ENV{IDF_PATH}) message("IDF installation found in the system, using IDF_PATH as ESP_HAL_PATH.") else () @@ -105,7 +145,7 @@ get_version_from_header("ESP_IDF_VERSION_PATCH" ${IDF_VER_HEADER_FILE} IDF_VERSI set(IDF_VERSION "${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}.${IDF_VERSION_PATCH}") -if (NOT IDF_VERSION VERSION_EQUAL ${EXPECTED_IDF_HAL_VERSION}) +if(NOT IDF_VERSION VERSION_EQUAL ${EXPECTED_IDF_HAL_VERSION}) message(FATAL_ERROR "Unsupported HAL version ${IDF_VERSION}, expected ${EXPECTED_IDF_HAL_VERSION}. \ Verify if the RTOS repository, where you are trying to build from, is up to date, \ @@ -114,92 +154,64 @@ else () message(STATUS "HAL based on ESP-IDF version: ${IDF_VERSION}") endif() -execute_process( - COMMAND git describe --tags - WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} - OUTPUT_VARIABLE MCUBOOT_VER - OUTPUT_STRIP_TRAILING_WHITESPACE - ) -add_definitions(-DMCUBOOT_VER=\"${MCUBOOT_VER}\") - -if (NOT DEFINED MCUBOOT_CONFIG_FILE) - set(MCUBOOT_CONFIG_FILE "${CMAKE_CURRENT_LIST_DIR}/port/${MCUBOOT_TARGET}/bootloader.conf") -endif() - -string(REPLACE " " ";" MCUBOOT_CONFIG_FILE_LIST "${MCUBOOT_CONFIG_FILE}") -foreach(CONFIG_FILE ${MCUBOOT_CONFIG_FILE_LIST}) - if (NOT EXISTS "${CONFIG_FILE}") - message(FATAL_ERROR "MCUboot configuration file does not exist at ${CONFIG_FILE}") - endif() - parse_and_set_config_file(${CONFIG_FILE}) -endforeach() - -set(APP_NAME mcuboot_${MCUBOOT_TARGET}) -set(APP_EXECUTABLE ${APP_NAME}.elf) - -set(MCUBOOT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) -set(BOOTUTIL_DIR ${MCUBOOT_ROOT_DIR}/boot/bootutil) -set(BOOT_SERIAL_DIR ${MCUBOOT_ROOT_DIR}/boot/boot_serial) -set(ZCBOR_DIR ${MCUBOOT_ROOT_DIR}/boot/zcbor) -set(ESPRESSIF_PORT_DIR ${CMAKE_CURRENT_LIST_DIR}) - # Find imgtool. # Go with an explicitly installed imgtool first, falling # back to mcuboot/scripts/imgtool.py. find_program(IMGTOOL_COMMAND NAMES imgtool imgtool.py ) -if ("${IMGTOOL_COMMAND}" MATCHES "IMGTOOL_COMMAND-NOTFOUND") +if("${IMGTOOL_COMMAND}" MATCHES "IMGTOOL_COMMAND-NOTFOUND") set(imgtool_path "${MCUBOOT_ROOT_DIR}/scripts/imgtool.py") else() set(imgtool_path "${IMGTOOL_COMMAND}") endif() -# Find installed esptool, if not found falls to IDF's -find_program(ESPTOOL_COMMAND - NAMES esptool esptool.py +set(inc_directories + ${BOOTUTIL_DIR}/include + ${BOOTUTIL_DIR}/src + ${ESPRESSIF_PORT_DIR}/include ) -if ("${ESPTOOL_COMMAND}" MATCHES "ESPTOOL_COMMAND-NOTFOUND") - if (DEFINED ENV{IDF_PATH}) - set(esptool_path "${IDF_PATH}/components/esptool_py/esptool/esptool.py") - else() - message(FATAL_ERROR "esptool.py not found. Please install it using \'pip install esptool\'.") - endif() -else() - set(esptool_path "${ESPTOOL_COMMAND}") -endif() -# Flash frequency parameter for esptool.py, for more information, check `esptool.py -h` -if (NOT DEFINED ESP_FLASH_FREQ) - if ("${MCUBOOT_TARGET}" STREQUAL "esp32" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32s2" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32s3" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32c3" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32c6") - set(ESP_FLASH_FREQ "40m") - elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c2") - set(ESP_FLASH_FREQ "60m") - elseif("${MCUBOOT_TARGET}" STREQUAL "esp32h2") - set(ESP_FLASH_FREQ "24m") - endif() -endif() +set(main_src ${ESPRESSIF_PORT_DIR}/main.c) -# Flash mode parameter for esptool.py, for more information, check `esptool.py -h` -if (NOT DEFINED ESP_FLASH_MODE) - set(ESP_FLASH_MODE "dio") -endif() +set(port_srcs + ${ESPRESSIF_PORT_DIR}/port/esp_mcuboot.c + ${ESPRESSIF_PORT_DIR}/port/esp_loader.c + ${ESPRESSIF_PORT_DIR}/os.c + ) -# Serial baud rate parameter for esptool.py flash use, for more information, check `esptool.py -h` -if (NOT DEFINED ESP_BAUD_RATE) - set(ESP_BAUD_RATE 115200) +set(bootutil_srcs + ${BOOTUTIL_DIR}/src/boot_record.c + ${BOOTUTIL_DIR}/src/bootutil_misc.c + ${BOOTUTIL_DIR}/src/bootutil_public.c + ${BOOTUTIL_DIR}/src/caps.c + ${BOOTUTIL_DIR}/src/encrypted.c + ${BOOTUTIL_DIR}/src/fault_injection_hardening.c + ${BOOTUTIL_DIR}/src/fault_injection_hardening_delay_rng_mbedtls.c + ${BOOTUTIL_DIR}/src/image_ecdsa.c + ${BOOTUTIL_DIR}/src/image_ed25519.c + ${BOOTUTIL_DIR}/src/image_rsa.c + ${BOOTUTIL_DIR}/src/image_validate.c + ${BOOTUTIL_DIR}/src/loader.c + ${BOOTUTIL_DIR}/src/swap_misc.c + ${BOOTUTIL_DIR}/src/swap_move.c + ${BOOTUTIL_DIR}/src/swap_scratch.c + ${BOOTUTIL_DIR}/src/swap_offset.c + ${BOOTUTIL_DIR}/src/tlv.c + ) + +if(CONFIG_BOOT_RAM_LOAD) + list(APPEND bootutil_srcs + ${BOOTUTIL_DIR}/src/ram_load.c + ) endif() -if (DEFINED CONFIG_ESP_SIGN_RSA) - include(${CMAKE_CURRENT_LIST_DIR}/include/crypto_config/rsa.cmake) -elseif (DEFINED CONFIG_ESP_SIGN_EC256) - include(${CMAKE_CURRENT_LIST_DIR}/include/crypto_config/ec256.cmake) -elseif (DEFINED CONFIG_ESP_SIGN_ED25519) - include(${CMAKE_CURRENT_LIST_DIR}/include/crypto_config/ed25519.cmake) +if(DEFINED CONFIG_ESP_SIGN_RSA) + include(${ESPRESSIF_PORT_DIR}/include/crypto_config/rsa.cmake) +elseif(DEFINED CONFIG_ESP_SIGN_EC256) + include(${ESPRESSIF_PORT_DIR}/include/crypto_config/ec256.cmake) +elseif(DEFINED CONFIG_ESP_SIGN_ED25519) + include(${ESPRESSIF_PORT_DIR}/include/crypto_config/ed25519.cmake) else() # No signature verification set(TINYCRYPT_DIR ${MCUBOOT_ROOT_DIR}/ext/tinycrypt/lib) @@ -234,31 +246,32 @@ if(DEFINED CONFIG_ESP_SIGN_KEY_FILE) list(APPEND crypto_srcs ${GENERATED_PUBKEY}) endif() -set(bootutil_srcs - ${BOOTUTIL_DIR}/src/boot_record.c - ${BOOTUTIL_DIR}/src/bootutil_misc.c - ${BOOTUTIL_DIR}/src/bootutil_public.c - ${BOOTUTIL_DIR}/src/caps.c - ${BOOTUTIL_DIR}/src/encrypted.c - ${BOOTUTIL_DIR}/src/fault_injection_hardening.c - ${BOOTUTIL_DIR}/src/fault_injection_hardening_delay_rng_mbedtls.c - ${BOOTUTIL_DIR}/src/image_ecdsa.c - ${BOOTUTIL_DIR}/src/image_ed25519.c - ${BOOTUTIL_DIR}/src/image_rsa.c - ${BOOTUTIL_DIR}/src/image_validate.c - ${BOOTUTIL_DIR}/src/loader.c - ${BOOTUTIL_DIR}/src/swap_misc.c - ${BOOTUTIL_DIR}/src/swap_move.c - ${BOOTUTIL_DIR}/src/swap_scratch.c - ${BOOTUTIL_DIR}/src/tlv.c - ) +if(CONFIG_ESP_MCUBOOT_SERIAL) + set(MBEDTLS_DIR "${MCUBOOT_ROOT_DIR}/ext/mbedtls") -if(CONFIG_BOOT_RAM_LOAD) list(APPEND bootutil_srcs - ${BOOTUTIL_DIR}/src/ram_load.c + ${BOOT_SERIAL_DIR}/src/boot_serial.c + ${BOOT_SERIAL_DIR}/src/zcbor_bulk.c + ${ZCBOR_DIR}/src/zcbor_decode.c + ${ZCBOR_DIR}/src/zcbor_encode.c + ${ZCBOR_DIR}/src/zcbor_common.c + ) + list(APPEND inc_directories + ${BOOT_SERIAL_DIR}/include + ${ZCBOR_DIR}/include + ) + list(APPEND port_srcs + ${ESPRESSIF_PORT_DIR}/port/${MCUBOOT_TARGET}/serial_adapter.c + ${MBEDTLS_DIR}/library/base64.c + ) + list(APPEND CRYPTO_INC + ${MBEDTLS_DIR}/include ) endif() -set(bootutil_paths) + +list(APPEND inc_directories + ${CRYPTO_INC} + ) set(CFLAGS "-Wno-frame-address" @@ -292,7 +305,6 @@ set(LDFLAGS "-nostdlib" "-Wno-frame-address" "-Wl,--cref" - "-Wl,--Map=${APP_NAME}.map" "-fno-rtti" "-fno-lto" "-Wl,--gc-sections" @@ -302,7 +314,7 @@ set(LDFLAGS "-lgcov" ) -if ("${MCUBOOT_ARCH}" STREQUAL "xtensa") +if("${MCUBOOT_ARCH}" STREQUAL "xtensa") list(APPEND CFLAGS "-mlongcalls" ) @@ -311,46 +323,37 @@ if ("${MCUBOOT_ARCH}" STREQUAL "xtensa") ) endif() -add_subdirectory(hal) -add_executable( - ${APP_EXECUTABLE} - ${CMAKE_CURRENT_LIST_DIR}/main.c +# Set linker script +set(ld_input ${ESPRESSIF_PORT_DIR}/port/${MCUBOOT_TARGET}/ld/bootloader.ld) +set(ld_output ${CMAKE_CURRENT_BINARY_DIR}/ld/bootloader.ld) + +file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/ld") + +get_directory_property(configs COMPILE_DEFINITIONS) +foreach(c ${configs}) + list(APPEND conf_defines "-D${c}") +endforeach() + +# Preprocess linker script +add_custom_command( + TARGET ${APP_EXECUTABLE} PRE_LINK + COMMAND ${CMAKE_C_COMPILER} -x c -E -P -o ${ld_output} ${conf_defines} ${ld_input} + MAIN_DEPENDENCY ${ld_input} + COMMENT "Preprocessing bootloader.ld linker script..." ) +list(APPEND LDFLAGS + "-Wl,--Map=${APP_NAME}.map" + ) + +add_subdirectory(hal) + target_compile_options( ${APP_EXECUTABLE} PUBLIC ${CFLAGS} ) -set(port_srcs - ${CMAKE_CURRENT_LIST_DIR}/port/esp_mcuboot.c - ${CMAKE_CURRENT_LIST_DIR}/port/esp_loader.c - ${CMAKE_CURRENT_LIST_DIR}/os.c - ) - -if(CONFIG_ESP_MCUBOOT_SERIAL) - set(MBEDTLS_DIR "${MCUBOOT_ROOT_DIR}/ext/mbedtls") - - list(APPEND bootutil_srcs - ${BOOT_SERIAL_DIR}/src/boot_serial.c - ${BOOT_SERIAL_DIR}/src/zcbor_bulk.c - ${ZCBOR_DIR}/src/zcbor_decode.c - ${ZCBOR_DIR}/src/zcbor_encode.c - ${ZCBOR_DIR}/src/zcbor_common.c - ) - list(APPEND bootutil_paths - ${ZCBOR_DIR}/include - ) - list(APPEND port_srcs - ${CMAKE_CURRENT_LIST_DIR}/port/${MCUBOOT_TARGET}/serial_adapter.c - ${MBEDTLS_DIR}/library/base64.c - ) - list(APPEND CRYPTO_INC - ${MBEDTLS_DIR}/include - ) -endif() - target_sources( ${APP_EXECUTABLE} PUBLIC @@ -362,30 +365,7 @@ target_sources( target_include_directories( ${APP_EXECUTABLE} PUBLIC - ${BOOTUTIL_DIR}/include - ${BOOTUTIL_DIR}/src - ${BOOT_SERIAL_DIR}/include - ${CRYPTO_INC} - ${CMAKE_CURRENT_LIST_DIR}/include - ${bootutil_paths} - ) - -set(ld_input ${CMAKE_CURRENT_LIST_DIR}/port/${MCUBOOT_TARGET}/ld/bootloader.ld) -set(ld_output ${CMAKE_CURRENT_BINARY_DIR}/ld/bootloader.ld) - -file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/ld") - -get_directory_property(configs COMPILE_DEFINITIONS) -foreach(c ${configs}) - list(APPEND conf_defines "-D${c}") -endforeach() - -# Preprocess linker script -add_custom_command( - TARGET ${APP_EXECUTABLE} PRE_LINK - COMMAND ${CMAKE_C_COMPILER} -x c -E -P -o ${ld_output} ${conf_defines} ${ld_input} - MAIN_DEPENDENCY ${ld_input} - COMMENT "Preprocessing bootloader.ld linker script..." + ${inc_directories} ) target_link_libraries( @@ -401,6 +381,45 @@ target_link_libraries( hal ) +# Find installed esptool, if not found falls to IDF's +find_program(ESPTOOL_COMMAND + NAMES esptool esptool.py + ) +if("${ESPTOOL_COMMAND}" MATCHES "ESPTOOL_COMMAND-NOTFOUND") + if(DEFINED ENV{IDF_PATH}) + set(esptool_path "${IDF_PATH}/components/esptool_py/esptool/esptool.py") + else() + message(FATAL_ERROR "esptool.py not found. Please install it using \'pip install esptool\'.") + endif() +else() + set(esptool_path "${ESPTOOL_COMMAND}") +endif() + +# Flash frequency parameter for esptool.py, for more information, check `esptool.py -h` +if(NOT DEFINED ESP_FLASH_FREQ) + if("${MCUBOOT_TARGET}" STREQUAL "esp32" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32s2" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32s3" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32c3" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32c6") + set(ESP_FLASH_FREQ "40m") + elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c2") + set(ESP_FLASH_FREQ "60m") + elseif("${MCUBOOT_TARGET}" STREQUAL "esp32h2") + set(ESP_FLASH_FREQ "24m") + endif() +endif() + +# Flash mode parameter for esptool.py, for more information, check `esptool.py -h` +if(NOT DEFINED ESP_FLASH_MODE) + set(ESP_FLASH_MODE "dio") +endif() + +# Serial baud rate parameter for esptool.py flash use, for more information, check `esptool.py -h` +if(NOT DEFINED ESP_BAUD_RATE) + set(ESP_BAUD_RATE 115200) +endif() + # This step uses esptool.py for generating the final bootloader binary in # Espressif compatible format. # Note: Both binary generation and flash steps still have some default arguments @@ -412,17 +431,18 @@ add_custom_command(TARGET ${APP_EXECUTABLE} POST_BUILD -o ${APP_NAME}.bin ${APP_NAME}.elf ) -if (DEFINED MCUBOOT_FLASH_PORT) +if(DEFINED MCUBOOT_FLASH_PORT) set(FLASH_PORT ${MCUBOOT_FLASH_PORT}) else() # Defaults to the first USB serial port set(FLASH_PORT "/dev/ttyUSB0") endif() -if (NOT EXISTS "${FLASH_PORT}") +if(NOT EXISTS "${FLASH_PORT}") message(WARNING "Could not open ${FLASH_PORT}, serial port does not exist") endif() +# Target for flashing the bootloader using esptool.py add_custom_target(flash DEPENDS ${APP_NAME}.bin) add_custom_command(TARGET flash USES_TERMINAL From 44098113fdc05555c833be045a6b418c7e0ba43a Mon Sep 17 00:00:00 2001 From: Lucas Tamborrino Date: Fri, 25 Oct 2024 07:57:38 -0300 Subject: [PATCH 2/2] boot: espressif: integrate Espressif Port with Zephyr sysbuild system Enable building MCUboot Espressif Port through Zephyr's sysbuild for Espressif chips. This commit creates boot/espressif/zephyr directory and files required by Zephyr's build system to build Espressif Port through sysbuild or as "out-of-tree" project. It also moves shared parts from the main espressif/CMakeLists.txt script. Signed-off-by: Lucas Tamborrino Signed-off-by: Almir Okato --- boot/espressif/CMakeLists.txt | 484 ++++-------------- boot/espressif/common.cmake | 273 ++++++++++ boot/espressif/hal/CMakeLists.txt | 28 +- .../espressif/hal/include/esp32c2/sdkconfig.h | 2 +- .../include/mcuboot_config/mcuboot_assert.h | 2 + boot/espressif/zephyr/CMakeLists.txt | 51 ++ boot/espressif/zephyr/Kconfig | 354 +++++++++++++ boot/espressif/zephyr/include/stubs.h | 7 + boot/espressif/zephyr/prj.conf | 1 + boot/espressif/zephyr/socs/esp32_procpu.conf | 51 ++ boot/espressif/zephyr/socs/esp32c2.conf | 49 ++ boot/espressif/zephyr/socs/esp32c3.conf | 49 ++ .../espressif/zephyr/socs/esp32c6_hpcore.conf | 49 ++ boot/espressif/zephyr/socs/esp32s2.conf | 51 ++ .../espressif/zephyr/socs/esp32s3_procpu.conf | 51 ++ ...d-espressif-port-from-zephyros-sysbuild.md | 1 + 16 files changed, 1127 insertions(+), 376 deletions(-) create mode 100644 boot/espressif/common.cmake create mode 100644 boot/espressif/zephyr/CMakeLists.txt create mode 100644 boot/espressif/zephyr/Kconfig create mode 100644 boot/espressif/zephyr/include/stubs.h create mode 100644 boot/espressif/zephyr/prj.conf create mode 100644 boot/espressif/zephyr/socs/esp32_procpu.conf create mode 100644 boot/espressif/zephyr/socs/esp32c2.conf create mode 100644 boot/espressif/zephyr/socs/esp32c3.conf create mode 100644 boot/espressif/zephyr/socs/esp32c6_hpcore.conf create mode 100644 boot/espressif/zephyr/socs/esp32s2.conf create mode 100644 boot/espressif/zephyr/socs/esp32s3_procpu.conf create mode 100644 docs/release-notes.d/espressif-build-espressif-port-from-zephyros-sysbuild.md diff --git a/boot/espressif/CMakeLists.txt b/boot/espressif/CMakeLists.txt index 507bb66f6..3a275032c 100644 --- a/boot/espressif/CMakeLists.txt +++ b/boot/espressif/CMakeLists.txt @@ -7,9 +7,14 @@ cmake_policy(SET CMP0109 NEW) include(${CMAKE_CURRENT_LIST_DIR}/tools/utils.cmake) +message(STATUS "Building MCUboot -- ESPRESSIF PORT") + +if(NOT DEFINED MCUBOOT_TARGET) + message(FATAL_ERROR "MCUBOOT_TARGET not defined. Please pass -DMCUBOOT_TARGET flag.") +endif() + set(MCUBOOT_ROOT_DIR ${CMAKE_CURRENT_LIST_DIR}/../..) set(ESPRESSIF_PORT_DIR ${MCUBOOT_ROOT_DIR}/boot/espressif) - set(APP_NAME mcuboot_${MCUBOOT_TARGET}) set(APP_EXECUTABLE ${APP_NAME}.elf) set(EXPECTED_IDF_HAL_VERSION "5.1.4") @@ -17,440 +22,171 @@ set(EXPECTED_IDF_HAL_VERSION "5.1.4") project(mcuboot_${MCUBOOT_TARGET}) add_executable( - ${APP_EXECUTABLE} - ${ESPRESSIF_PORT_DIR}/main.c - ) + ${APP_EXECUTABLE} + ${ESPRESSIF_PORT_DIR}/main.c + ) # Set MCUboot Espressif Port configuration file if(NOT DEFINED MCUBOOT_CONFIG_FILE) - set(MCUBOOT_CONFIG_FILE "${ESPRESSIF_PORT_DIR}/port/${MCUBOOT_TARGET}/bootloader.conf") - message("MCUBOOT_CONFIG_FILE: ${MCUBOOT_CONFIG_FILE}") + set(MCUBOOT_CONFIG_FILE "${ESPRESSIF_PORT_DIR}/port/${MCUBOOT_TARGET}/bootloader.conf") + message("MCUBOOT_CONFIG_FILE: ${MCUBOOT_CONFIG_FILE}") endif() string(REPLACE " " ";" MCUBOOT_CONFIG_FILE_LIST "${MCUBOOT_CONFIG_FILE}") foreach(CONFIG_FILE ${MCUBOOT_CONFIG_FILE_LIST}) - if(NOT EXISTS "${CONFIG_FILE}") - message(FATAL_ERROR "MCUboot configuration file does not exist at ${CONFIG_FILE}") - endif() - parse_and_set_config_file(${CONFIG_FILE}) + if(NOT EXISTS "${CONFIG_FILE}") + message(FATAL_ERROR "MCUboot configuration file does not exist at ${CONFIG_FILE}") + endif() + parse_and_set_config_file(${CONFIG_FILE}) endforeach() # Fetch and set toolchain if(NOT DEFINED CMAKE_TOOLCHAIN_FILE) - if(DEFINED TOOLCHAIN_BIN_DIR) - message("CMAKE_TOOLCHAIN_FILE not defined, searching for toolchain compiler in TOOLCHAIN_BIN_DIR: ${TOOLCHAIN_BIN_DIR}") - set(CMAKE_SYSTEM_NAME Generic) - - file(GLOB C_COMPILER_BIN "${TOOLCHAIN_BIN_DIR}/*${MCUBOOT_ARCH}*elf-gcc") - if(NOT C_COMPILER_BIN) - message(FATAL_ERROR "No C compiler found. Please ensure that TOOLCHAIN_BIN_DIR directory contains a set of C compiling tools compatible with the target") - endif() - set(CMAKE_C_COMPILER ${C_COMPILER_BIN}) - set(CMAKE_ASM_COMPILER ${C_COMPILER_BIN}) - message("C compiler found: ${CMAKE_C_COMPILER}") + if(DEFINED TOOLCHAIN_BIN_DIR) + message("CMAKE_TOOLCHAIN_FILE not defined, searching for toolchain compiler in TOOLCHAIN_BIN_DIR: ${TOOLCHAIN_BIN_DIR}") + set(CMAKE_SYSTEM_NAME Generic) - file(GLOB CXX_COMPILER_BIN "${TOOLCHAIN_BIN_DIR}/*${MCUBOOT_ARCH}*elf-g++") - if(NOT CXX_COMPILER_BIN) - message(FATAL_ERROR "No C++ compiler found. Please ensure that TOOLCHAIN_BIN_DIR directory contains a set of C++ compiling tools compatible with the target") - endif() - set(CMAKE_CXX_COMPILER ${CXX_COMPILER_BIN}) - message("CXX compiler found: ${CMAKE_CXX_COMPILER}") - else() - # Set toolchain file that expect the same toolchain as IDF sets on PATH - set(CMAKE_TOOLCHAIN_FILE ${ESPRESSIF_PORT_DIR}/tools/toolchain-${MCUBOOT_TARGET}.cmake) - message("No user-defined toolchain, setting default toolchain file: ${CMAKE_TOOLCHAIN_FILE}") + file(GLOB C_COMPILER_BIN "${TOOLCHAIN_BIN_DIR}/*${MCUBOOT_ARCH}*elf-gcc") + if(NOT C_COMPILER_BIN) + message(FATAL_ERROR "No C compiler found. Please ensure that TOOLCHAIN_BIN_DIR directory contains a set of C compiling tools compatible with the target") endif() + set(CMAKE_C_COMPILER ${C_COMPILER_BIN}) + set(CMAKE_ASM_COMPILER ${C_COMPILER_BIN}) + message("C compiler found: ${CMAKE_C_COMPILER}") - # This flag is needed when redefining a different compiler toolchain at this point - # on CMakeLists, the reason is that CMake does a compiler testing prior to building - # that may fail due to cross-compilation - set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY") -else() - message("CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}") -endif() - -# Set directories -set(BOOTUTIL_DIR ${MCUBOOT_ROOT_DIR}/boot/bootutil) -set(BOOT_SERIAL_DIR ${MCUBOOT_ROOT_DIR}/boot/boot_serial) -set(ZCBOR_DIR ${MCUBOOT_ROOT_DIR}/boot/zcbor) - -if(NOT DEFINED MCUBOOT_TARGET) - message(FATAL_ERROR "MCUBOOT_TARGET not defined. Please pass -DMCUBOOT_TARGET flag.") -endif() -add_definitions(-DMCUBOOT_TARGET=${MCUBOOT_TARGET}) -add_definitions(-D__ESPRESSIF__=1) - -# Set chip arch -if("${MCUBOOT_TARGET}" STREQUAL "esp32" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32s2" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32s3") - set(MCUBOOT_ARCH "xtensa") -elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c3" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32c6" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32c2" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32h2") - set(MCUBOOT_ARCH "riscv") -endif() - -# Set the minimum revision for each supported chip -if("${MCUBOOT_TARGET}" STREQUAL "esp32") - set(ESP_MIN_REVISION 3) -elseif("${MCUBOOT_TARGET}" STREQUAL "esp32s2") - set(ESP_MIN_REVISION 0) -elseif("${MCUBOOT_TARGET}" STREQUAL "esp32s3") - set(ESP_MIN_REVISION 0) -elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c3") - set(ESP_MIN_REVISION 3) -elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c6") - set(ESP_MIN_REVISION 0) -elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c2") - set(ESP_MIN_REVISION 0) -elseif("${MCUBOOT_TARGET}" STREQUAL "esp32h2") - set(ESP_MIN_REVISION 0) -else() - message(FATAL_ERROR "Unsupported target ${MCUBOOT_TARGET}") -endif() - -# Get MCUboot revision to be added into bootloader image version -execute_process( - COMMAND git describe --tags - WORKING_DIRECTORY ${ESPRESSIF_PORT_DIR} - OUTPUT_VARIABLE MCUBOOT_VER - OUTPUT_STRIP_TRAILING_WHITESPACE - ) -add_definitions(-DMCUBOOT_VER=\"${MCUBOOT_VER}\") - -# Set Espressif HAL to use -if(NOT DEFINED ESP_HAL_PATH) - if(DEFINED ENV{ESP_HAL_PATH}) - set(ESP_HAL_PATH $ENV{ESP_HAL_PATH}) - else() - message(WARNING "ESP_HAL_PATH not defined, checking if IDF_PATH exists.") - if(DEFINED ENV{IDF_PATH}) - set(ESP_HAL_PATH $ENV{IDF_PATH}) - message("IDF installation found in the system, using IDF_PATH as ESP_HAL_PATH.") - else () - message(FATAL_ERROR "Please set -DESP_HAL_PATH parameter or define ESP_HAL_PATH environment variable.") - endif() + file(GLOB CXX_COMPILER_BIN "${TOOLCHAIN_BIN_DIR}/*${MCUBOOT_ARCH}*elf-g++") + if(NOT CXX_COMPILER_BIN) + message(FATAL_ERROR "No C++ compiler found. Please ensure that TOOLCHAIN_BIN_DIR directory contains a set of C++ compiling tools compatible with the target") endif() -endif() -message(STATUS "Defined ESP_HAL_PATH: ${ESP_HAL_PATH}") - -# Verify from which IDF version the HAL is based on -set(IDF_VER_HEADER_FILE "${ESP_HAL_PATH}/components/esp_common/include/esp_idf_version.h") - -get_version_from_header("ESP_IDF_VERSION_MAJOR" ${IDF_VER_HEADER_FILE} IDF_VERSION_MAJOR) -get_version_from_header("ESP_IDF_VERSION_MINOR" ${IDF_VER_HEADER_FILE} IDF_VERSION_MINOR) -get_version_from_header("ESP_IDF_VERSION_PATCH" ${IDF_VER_HEADER_FILE} IDF_VERSION_PATCH) - -set(IDF_VERSION "${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}.${IDF_VERSION_PATCH}") - -if(NOT IDF_VERSION VERSION_EQUAL ${EXPECTED_IDF_HAL_VERSION}) - message(FATAL_ERROR - "Unsupported HAL version ${IDF_VERSION}, expected ${EXPECTED_IDF_HAL_VERSION}. \ - Verify if the RTOS repository, where you are trying to build from, is up to date, \ - or check the installation pointed on ESP_HAL_PATH.") -else () - message(STATUS "HAL based on ESP-IDF version: ${IDF_VERSION}") -endif() - -# Find imgtool. -# Go with an explicitly installed imgtool first, falling -# back to mcuboot/scripts/imgtool.py. -find_program(IMGTOOL_COMMAND - NAMES imgtool imgtool.py - ) -if("${IMGTOOL_COMMAND}" MATCHES "IMGTOOL_COMMAND-NOTFOUND") - set(imgtool_path "${MCUBOOT_ROOT_DIR}/scripts/imgtool.py") + set(CMAKE_CXX_COMPILER ${CXX_COMPILER_BIN}) + message("CXX compiler found: ${CMAKE_CXX_COMPILER}") + else() + # Set toolchain file that expect the same toolchain as IDF sets on PATH + set(CMAKE_TOOLCHAIN_FILE ${ESPRESSIF_PORT_DIR}/tools/toolchain-${MCUBOOT_TARGET}.cmake) + message("No user-defined toolchain, setting default toolchain file: ${CMAKE_TOOLCHAIN_FILE}") + endif() + + # This flag is needed when redefining a different compiler toolchain at this point + # on CMakeLists, the reason is that CMake does a compiler testing prior to building + # that may fail due to cross-compilation + set(CMAKE_TRY_COMPILE_TARGET_TYPE "STATIC_LIBRARY") else() - set(imgtool_path "${IMGTOOL_COMMAND}") + message("CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}") endif() -set(inc_directories - ${BOOTUTIL_DIR}/include - ${BOOTUTIL_DIR}/src - ${ESPRESSIF_PORT_DIR}/include - ) - -set(main_src ${ESPRESSIF_PORT_DIR}/main.c) - -set(port_srcs - ${ESPRESSIF_PORT_DIR}/port/esp_mcuboot.c - ${ESPRESSIF_PORT_DIR}/port/esp_loader.c - ${ESPRESSIF_PORT_DIR}/os.c - ) - -set(bootutil_srcs - ${BOOTUTIL_DIR}/src/boot_record.c - ${BOOTUTIL_DIR}/src/bootutil_misc.c - ${BOOTUTIL_DIR}/src/bootutil_public.c - ${BOOTUTIL_DIR}/src/caps.c - ${BOOTUTIL_DIR}/src/encrypted.c - ${BOOTUTIL_DIR}/src/fault_injection_hardening.c - ${BOOTUTIL_DIR}/src/fault_injection_hardening_delay_rng_mbedtls.c - ${BOOTUTIL_DIR}/src/image_ecdsa.c - ${BOOTUTIL_DIR}/src/image_ed25519.c - ${BOOTUTIL_DIR}/src/image_rsa.c - ${BOOTUTIL_DIR}/src/image_validate.c - ${BOOTUTIL_DIR}/src/loader.c - ${BOOTUTIL_DIR}/src/swap_misc.c - ${BOOTUTIL_DIR}/src/swap_move.c - ${BOOTUTIL_DIR}/src/swap_scratch.c - ${BOOTUTIL_DIR}/src/swap_offset.c - ${BOOTUTIL_DIR}/src/tlv.c - ) - -if(CONFIG_BOOT_RAM_LOAD) - list(APPEND bootutil_srcs - ${BOOTUTIL_DIR}/src/ram_load.c - ) -endif() - -if(DEFINED CONFIG_ESP_SIGN_RSA) - include(${ESPRESSIF_PORT_DIR}/include/crypto_config/rsa.cmake) -elseif(DEFINED CONFIG_ESP_SIGN_EC256) - include(${ESPRESSIF_PORT_DIR}/include/crypto_config/ec256.cmake) -elseif(DEFINED CONFIG_ESP_SIGN_ED25519) - include(${ESPRESSIF_PORT_DIR}/include/crypto_config/ed25519.cmake) -else() - # No signature verification - set(TINYCRYPT_DIR ${MCUBOOT_ROOT_DIR}/ext/tinycrypt/lib) - set(CRYPTO_INC - ${TINYCRYPT_DIR}/include - ) - set(crypto_srcs - ${TINYCRYPT_DIR}/source/sha256.c - ${TINYCRYPT_DIR}/source/utils.c - ) -endif() - -if(DEFINED CONFIG_ESP_SIGN_KEY_FILE) - if(IS_ABSOLUTE ${CONFIG_ESP_SIGN_KEY_FILE}) - set(KEY_FILE ${CONFIG_ESP_SIGN_KEY_FILE}) - else() - set(KEY_FILE ${MCUBOOT_ROOT_DIR}/${CONFIG_ESP_SIGN_KEY_FILE}) - endif() - message("MCUBoot bootloader key file: ${KEY_FILE}") - - set(GENERATED_PUBKEY ${CMAKE_CURRENT_BINARY_DIR}/autogen-pubkey.c) - add_custom_command( - OUTPUT ${GENERATED_PUBKEY} - COMMAND - ${imgtool_path} - getpub - -k - ${KEY_FILE} - > ${GENERATED_PUBKEY} - DEPENDS ${KEY_FILE} - ) - list(APPEND crypto_srcs ${GENERATED_PUBKEY}) -endif() - -if(CONFIG_ESP_MCUBOOT_SERIAL) - set(MBEDTLS_DIR "${MCUBOOT_ROOT_DIR}/ext/mbedtls") - - list(APPEND bootutil_srcs - ${BOOT_SERIAL_DIR}/src/boot_serial.c - ${BOOT_SERIAL_DIR}/src/zcbor_bulk.c - ${ZCBOR_DIR}/src/zcbor_decode.c - ${ZCBOR_DIR}/src/zcbor_encode.c - ${ZCBOR_DIR}/src/zcbor_common.c - ) - list(APPEND inc_directories - ${BOOT_SERIAL_DIR}/include - ${ZCBOR_DIR}/include - ) - list(APPEND port_srcs - ${ESPRESSIF_PORT_DIR}/port/${MCUBOOT_TARGET}/serial_adapter.c - ${MBEDTLS_DIR}/library/base64.c - ) - list(APPEND CRYPTO_INC - ${MBEDTLS_DIR}/include - ) -endif() - -list(APPEND inc_directories - ${CRYPTO_INC} - ) - -set(CFLAGS - "-Wno-frame-address" - "-Wall" - "-Wextra" - "-W" - "-Wdeclaration-after-statement" - "-Wwrite-strings" - "-Wlogical-op" - "-Wshadow" - "-ffunction-sections" - "-fdata-sections" - "-fstrict-volatile-bitfields" - "-Werror=all" - "-Wno-error=unused-function" - "-Wno-error=unused-but-set-variable" - "-Wno-error=unused-variable" - "-Wno-error=deprecated-declarations" - "-Wno-unused-parameter" - "-Wno-sign-compare" - "-ggdb" - "-Os" - "-D_GNU_SOURCE" - "-std=gnu17" - "-Wno-old-style-declaration" - "-Wno-implicit-int" - "-Wno-declaration-after-statement" - ) - -set(LDFLAGS - "-nostdlib" - "-Wno-frame-address" - "-Wl,--cref" - "-fno-rtti" - "-fno-lto" - "-Wl,--gc-sections" - "-Wl,--undefined=uxTopUsedPriority" - "-lm" - "-lgcc" - "-lgcov" - ) - -if("${MCUBOOT_ARCH}" STREQUAL "xtensa") - list(APPEND CFLAGS - "-mlongcalls" - ) - list(APPEND LDFLAGS - "-mlongcalls" - ) -endif() - -# Set linker script -set(ld_input ${ESPRESSIF_PORT_DIR}/port/${MCUBOOT_TARGET}/ld/bootloader.ld) -set(ld_output ${CMAKE_CURRENT_BINARY_DIR}/ld/bootloader.ld) - -file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/ld") - -get_directory_property(configs COMPILE_DEFINITIONS) -foreach(c ${configs}) - list(APPEND conf_defines "-D${c}") -endforeach() - -# Preprocess linker script -add_custom_command( - TARGET ${APP_EXECUTABLE} PRE_LINK - COMMAND ${CMAKE_C_COMPILER} -x c -E -P -o ${ld_output} ${conf_defines} ${ld_input} - MAIN_DEPENDENCY ${ld_input} - COMMENT "Preprocessing bootloader.ld linker script..." - ) +include(common.cmake) list(APPEND LDFLAGS "-Wl,--Map=${APP_NAME}.map" ) -add_subdirectory(hal) - target_compile_options( - ${APP_EXECUTABLE} - PUBLIC - ${CFLAGS} - ) + ${APP_EXECUTABLE} + PUBLIC + ${CFLAGS} + ) target_sources( - ${APP_EXECUTABLE} - PUBLIC - ${bootutil_srcs} - ${crypto_srcs} - ${port_srcs} - ) + ${APP_EXECUTABLE} + PUBLIC + ${bootutil_srcs} + ${crypto_srcs} + ${port_srcs} + ) target_include_directories( - ${APP_EXECUTABLE} - PUBLIC - ${inc_directories} - ) + ${APP_EXECUTABLE} + PUBLIC + ${inc_directories} + ) target_link_libraries( - ${APP_EXECUTABLE} - PUBLIC - -T${ld_output} - ${LDFLAGS} - ) + ${APP_EXECUTABLE} + PUBLIC + -T${ld_output} + ${LDFLAGS} + ) + +add_subdirectory(hal) target_link_libraries( - ${APP_EXECUTABLE} - PUBLIC - hal - ) + ${APP_EXECUTABLE} + PUBLIC + hal + ) # Find installed esptool, if not found falls to IDF's find_program(ESPTOOL_COMMAND - NAMES esptool esptool.py - ) + NAMES esptool esptool.py + ) if("${ESPTOOL_COMMAND}" MATCHES "ESPTOOL_COMMAND-NOTFOUND") - if(DEFINED ENV{IDF_PATH}) - set(esptool_path "${IDF_PATH}/components/esptool_py/esptool/esptool.py") - else() - message(FATAL_ERROR "esptool.py not found. Please install it using \'pip install esptool\'.") - endif() + if(DEFINED ENV{IDF_PATH}) + set(esptool_path "${IDF_PATH}/components/esptool_py/esptool/esptool.py") + else() + message(FATAL_ERROR "esptool.py not found. Please install it using \'pip install esptool\'.") + endif() else() - set(esptool_path "${ESPTOOL_COMMAND}") + set(esptool_path "${ESPTOOL_COMMAND}") endif() # Flash frequency parameter for esptool.py, for more information, check `esptool.py -h` if(NOT DEFINED ESP_FLASH_FREQ) - if("${MCUBOOT_TARGET}" STREQUAL "esp32" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32s2" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32s3" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32c3" OR - "${MCUBOOT_TARGET}" STREQUAL "esp32c6") - set(ESP_FLASH_FREQ "40m") - elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c2") - set(ESP_FLASH_FREQ "60m") - elseif("${MCUBOOT_TARGET}" STREQUAL "esp32h2") - set(ESP_FLASH_FREQ "24m") - endif() + if("${MCUBOOT_TARGET}" STREQUAL "esp32" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32s2" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32s3" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32c3" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32c6") + set(ESP_FLASH_FREQ "40m") + elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c2") + set(ESP_FLASH_FREQ "60m") + elseif("${MCUBOOT_TARGET}" STREQUAL "esp32h2") + set(ESP_FLASH_FREQ "24m") + endif() endif() # Flash mode parameter for esptool.py, for more information, check `esptool.py -h` if(NOT DEFINED ESP_FLASH_MODE) - set(ESP_FLASH_MODE "dio") + set(ESP_FLASH_MODE "dio") endif() # Serial baud rate parameter for esptool.py flash use, for more information, check `esptool.py -h` if(NOT DEFINED ESP_BAUD_RATE) - set(ESP_BAUD_RATE 115200) + set(ESP_BAUD_RATE 115200) endif() # This step uses esptool.py for generating the final bootloader binary in # Espressif compatible format. # Note: Both binary generation and flash steps still have some default arguments -add_custom_command(TARGET ${APP_EXECUTABLE} POST_BUILD - COMMAND - ${esptool_path} - --chip ${MCUBOOT_TARGET} elf2image --min-rev ${ESP_MIN_REVISION} - --flash_mode ${ESP_FLASH_MODE} --flash_freq ${ESP_FLASH_FREQ} --flash_size ${CONFIG_ESP_FLASH_SIZE} - -o ${APP_NAME}.bin ${APP_NAME}.elf - ) +add_custom_command( + TARGET ${APP_EXECUTABLE} POST_BUILD + COMMAND + ${esptool_path} + --chip ${MCUBOOT_TARGET} elf2image --min-rev ${ESP_MIN_REVISION} + --flash_mode ${ESP_FLASH_MODE} --flash_freq ${ESP_FLASH_FREQ} --flash_size ${CONFIG_ESP_FLASH_SIZE} + -o ${APP_NAME}.bin ${APP_NAME}.elf + ) if(DEFINED MCUBOOT_FLASH_PORT) - set(FLASH_PORT ${MCUBOOT_FLASH_PORT}) + set(FLASH_PORT ${MCUBOOT_FLASH_PORT}) else() - # Defaults to the first USB serial port - set(FLASH_PORT "/dev/ttyUSB0") + # Defaults to the first USB serial port + set(FLASH_PORT "/dev/ttyUSB0") endif() if(NOT EXISTS "${FLASH_PORT}") - message(WARNING "Could not open ${FLASH_PORT}, serial port does not exist") + message(WARNING "Could not open ${FLASH_PORT}, serial port does not exist") endif() # Target for flashing the bootloader using esptool.py add_custom_target(flash DEPENDS ${APP_NAME}.bin) -add_custom_command(TARGET flash - USES_TERMINAL - COMMAND - ${esptool_path} - -p ${FLASH_PORT} -b ${ESP_BAUD_RATE} --before default_reset --after no_reset - --chip ${MCUBOOT_TARGET} write_flash - --flash_mode ${ESP_FLASH_MODE} --flash_size ${CONFIG_ESP_FLASH_SIZE} - --flash_freq ${ESP_FLASH_FREQ} ${CONFIG_ESP_BOOTLOADER_OFFSET} - ${APP_NAME}.bin - ) +add_custom_command( + TARGET flash + USES_TERMINAL + COMMAND + ${esptool_path} + -p ${FLASH_PORT} -b ${ESP_BAUD_RATE} --before default_reset --after no_reset + --chip ${MCUBOOT_TARGET} write_flash + --flash_mode ${ESP_FLASH_MODE} --flash_size ${CONFIG_ESP_FLASH_SIZE} + --flash_freq ${ESP_FLASH_FREQ} ${CONFIG_ESP_BOOTLOADER_OFFSET} + ${APP_NAME}.bin + ) diff --git a/boot/espressif/common.cmake b/boot/espressif/common.cmake new file mode 100644 index 000000000..ce20716df --- /dev/null +++ b/boot/espressif/common.cmake @@ -0,0 +1,273 @@ +# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD +# +# SPDX-License-Identifier: Apache-2.0 + +add_definitions(-DMCUBOOT_TARGET=${MCUBOOT_TARGET}) +add_definitions(-D__ESPRESSIF__=1) + +# Set directories +set(BOOTUTIL_DIR ${MCUBOOT_ROOT_DIR}/boot/bootutil) +set(BOOT_SERIAL_DIR ${MCUBOOT_ROOT_DIR}/boot/boot_serial) +set(ZCBOR_DIR ${MCUBOOT_ROOT_DIR}/boot/zcbor) + +# Set chip arch +if("${MCUBOOT_TARGET}" STREQUAL "esp32" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32s2" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32s3") + set(MCUBOOT_ARCH "xtensa") +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c3" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32c6" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32c2" OR + "${MCUBOOT_TARGET}" STREQUAL "esp32h2") + set(MCUBOOT_ARCH "riscv") +endif() + +# Set the minimum revision for each supported chip +if("${MCUBOOT_TARGET}" STREQUAL "esp32") + set(ESP_MIN_REVISION 3) +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32s2") + set(ESP_MIN_REVISION 0) +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32s3") + set(ESP_MIN_REVISION 0) +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c3") + set(ESP_MIN_REVISION 3) +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c6") + set(ESP_MIN_REVISION 0) +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32c2") + set(ESP_MIN_REVISION 0) +elseif("${MCUBOOT_TARGET}" STREQUAL "esp32h2") + set(ESP_MIN_REVISION 0) +else() + message(FATAL_ERROR "Unsupported target ${MCUBOOT_TARGET}") +endif() + +# Get MCUboot revision to be added into bootloader image version +execute_process( + COMMAND git describe --tags + WORKING_DIRECTORY ${ESPRESSIF_PORT_DIR} + OUTPUT_VARIABLE MCUBOOT_VER + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +add_definitions(-DMCUBOOT_VER=\"${MCUBOOT_VER}\") + +# Set Espressif HAL to use +if(NOT DEFINED ESP_HAL_PATH) + if(DEFINED ENV{ESP_HAL_PATH}) + set(ESP_HAL_PATH $ENV{ESP_HAL_PATH}) + else() + message(WARNING "ESP_HAL_PATH not defined, checking if IDF_PATH exists.") + if(DEFINED ENV{IDF_PATH}) + set(ESP_HAL_PATH $ENV{IDF_PATH}) + message("IDF installation found in the system, using IDF_PATH as ESP_HAL_PATH.") + else () + message(FATAL_ERROR "Please set -DESP_HAL_PATH parameter or define ESP_HAL_PATH environment variable.") + endif() + endif() +endif() +message(STATUS "Defined ESP_HAL_PATH: ${ESP_HAL_PATH}") + +# Verify from which IDF version the HAL is based on +set(IDF_VER_HEADER_FILE "${ESP_HAL_PATH}/components/esp_common/include/esp_idf_version.h") + +get_version_from_header("ESP_IDF_VERSION_MAJOR" ${IDF_VER_HEADER_FILE} IDF_VERSION_MAJOR) +get_version_from_header("ESP_IDF_VERSION_MINOR" ${IDF_VER_HEADER_FILE} IDF_VERSION_MINOR) +get_version_from_header("ESP_IDF_VERSION_PATCH" ${IDF_VER_HEADER_FILE} IDF_VERSION_PATCH) + +set(IDF_VERSION "${IDF_VERSION_MAJOR}.${IDF_VERSION_MINOR}.${IDF_VERSION_PATCH}") + +if(NOT IDF_VERSION VERSION_EQUAL ${EXPECTED_IDF_HAL_VERSION}) + message( + FATAL_ERROR " + Unsupported HAL version ${IDF_VERSION}, expected ${EXPECTED_IDF_HAL_VERSION}. \ + Verify if the RTOS repository, where you are trying to build from, is up to date, \ + or check the installation pointed on ESP_HAL_PATH." + ) +else () + message(STATUS "HAL based on ESP-IDF version: ${IDF_VERSION}") +endif() + +# Find imgtool. +# Go with an explicitly installed imgtool first, falling +# back to mcuboot/scripts/imgtool.py. +find_program(IMGTOOL_COMMAND + NAMES imgtool imgtool.py + ) +if("${IMGTOOL_COMMAND}" MATCHES "IMGTOOL_COMMAND-NOTFOUND") + set(imgtool_path "${MCUBOOT_ROOT_DIR}/scripts/imgtool.py") +else() + set(imgtool_path "${IMGTOOL_COMMAND}") +endif() + +set(inc_directories + ${BOOTUTIL_DIR}/include + ${BOOTUTIL_DIR}/src + ${ESPRESSIF_PORT_DIR}/include + ) + +set(main_src ${ESPRESSIF_PORT_DIR}/main.c) + +set(port_srcs + ${ESPRESSIF_PORT_DIR}/port/esp_mcuboot.c + ${ESPRESSIF_PORT_DIR}/port/esp_loader.c + ${ESPRESSIF_PORT_DIR}/os.c + ) + +set(bootutil_srcs + ${BOOTUTIL_DIR}/src/boot_record.c + ${BOOTUTIL_DIR}/src/bootutil_misc.c + ${BOOTUTIL_DIR}/src/bootutil_public.c + ${BOOTUTIL_DIR}/src/caps.c + ${BOOTUTIL_DIR}/src/encrypted.c + ${BOOTUTIL_DIR}/src/fault_injection_hardening.c + ${BOOTUTIL_DIR}/src/fault_injection_hardening_delay_rng_mbedtls.c + ${BOOTUTIL_DIR}/src/image_ecdsa.c + ${BOOTUTIL_DIR}/src/image_ed25519.c + ${BOOTUTIL_DIR}/src/image_rsa.c + ${BOOTUTIL_DIR}/src/image_validate.c + ${BOOTUTIL_DIR}/src/loader.c + ${BOOTUTIL_DIR}/src/swap_misc.c + ${BOOTUTIL_DIR}/src/swap_move.c + ${BOOTUTIL_DIR}/src/swap_scratch.c + ${BOOTUTIL_DIR}/src/swap_offset.c + ${BOOTUTIL_DIR}/src/tlv.c + ) + +if(CONFIG_BOOT_RAM_LOAD) + list(APPEND bootutil_srcs ${BOOTUTIL_DIR}/src/ram_load.c) +endif() + +if(DEFINED CONFIG_ESP_SIGN_RSA) + include(${ESPRESSIF_PORT_DIR}/include/crypto_config/rsa.cmake) +elseif(DEFINED CONFIG_ESP_SIGN_EC256) + include(${ESPRESSIF_PORT_DIR}/include/crypto_config/ec256.cmake) +elseif(DEFINED CONFIG_ESP_SIGN_ED25519) + include(${ESPRESSIF_PORT_DIR}/include/crypto_config/ed25519.cmake) +else() + # No signature verification + set(TINYCRYPT_DIR ${MCUBOOT_ROOT_DIR}/ext/tinycrypt/lib) + set(CRYPTO_INC + ${TINYCRYPT_DIR}/include + ) + set(crypto_srcs + ${TINYCRYPT_DIR}/source/sha256.c + ${TINYCRYPT_DIR}/source/utils.c + ) +endif() + +if(DEFINED CONFIG_ESP_SIGN_KEY_FILE) + if(IS_ABSOLUTE ${CONFIG_ESP_SIGN_KEY_FILE}) + set(KEY_FILE ${CONFIG_ESP_SIGN_KEY_FILE}) + else() + set(KEY_FILE ${MCUBOOT_ROOT_DIR}/${CONFIG_ESP_SIGN_KEY_FILE}) + endif() + message("MCUBoot bootloader key file: ${KEY_FILE}") + + set(GENERATED_PUBKEY ${CMAKE_CURRENT_BINARY_DIR}/autogen-pubkey.c) + add_custom_command( + OUTPUT ${GENERATED_PUBKEY} + COMMAND + ${imgtool_path} + getpub + -k + ${KEY_FILE} + > ${GENERATED_PUBKEY} + DEPENDS ${KEY_FILE} + ) + list(APPEND crypto_srcs ${GENERATED_PUBKEY}) +endif() + +if(CONFIG_ESP_MCUBOOT_SERIAL) + set(MBEDTLS_DIR "${MCUBOOT_ROOT_DIR}/ext/mbedtls") + + list(APPEND bootutil_srcs + ${BOOT_SERIAL_DIR}/src/boot_serial.c + ${BOOT_SERIAL_DIR}/src/zcbor_bulk.c + ${ZCBOR_DIR}/src/zcbor_decode.c + ${ZCBOR_DIR}/src/zcbor_encode.c + ${ZCBOR_DIR}/src/zcbor_common.c + ) + list(APPEND inc_directories + ${BOOT_SERIAL_DIR}/include + ${ZCBOR_DIR}/include + ) + list(APPEND port_srcs + ${ESPRESSIF_PORT_DIR}/port/${MCUBOOT_TARGET}/serial_adapter.c + ${MBEDTLS_DIR}/library/base64.c + ) + list(APPEND CRYPTO_INC + ${MBEDTLS_DIR}/include + ) +endif() + +list(APPEND inc_directories + ${CRYPTO_INC} + ) + +set(CFLAGS + "-Wno-frame-address" + "-Wall" + "-Wextra" + "-W" + "-Wdeclaration-after-statement" + "-Wwrite-strings" + "-Wlogical-op" + "-Wshadow" + "-ffunction-sections" + "-fdata-sections" + "-fstrict-volatile-bitfields" + "-Werror=all" + "-Wno-error=unused-function" + "-Wno-error=unused-but-set-variable" + "-Wno-error=unused-variable" + "-Wno-error=deprecated-declarations" + "-Wno-unused-parameter" + "-Wno-sign-compare" + "-ggdb" + "-Os" + "-D_GNU_SOURCE" + "-std=gnu17" + "-Wno-old-style-declaration" + "-Wno-implicit-int" + "-Wno-declaration-after-statement" + ) + +set(LDFLAGS + "-nostdlib" + "-Wno-frame-address" + "-Wl,--cref" + "-fno-rtti" + "-fno-lto" + "-Wl,--gc-sections" + "-Wl,--undefined=uxTopUsedPriority" + "-lm" + "-lgcc" + "-lgcov" + ) + +if("${MCUBOOT_ARCH}" STREQUAL "xtensa") + list(APPEND CFLAGS + "-mlongcalls" + ) + list(APPEND LDFLAGS + "-mlongcalls" + ) +endif() + +# Set linker script +set(ld_input ${ESPRESSIF_PORT_DIR}/port/${MCUBOOT_TARGET}/ld/bootloader.ld) +set(ld_output ${CMAKE_CURRENT_BINARY_DIR}/ld/bootloader.ld) + +file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/ld") + +get_directory_property(configs COMPILE_DEFINITIONS) +foreach(c ${configs}) + list(APPEND conf_defines "-D${c}") +endforeach() + +# Preprocess linker script +add_custom_command( + TARGET ${APP_EXECUTABLE} PRE_LINK + COMMAND ${CMAKE_C_COMPILER} -x c -E -P -o ${ld_output} ${conf_defines} ${ld_input} + MAIN_DEPENDENCY ${ld_input} + COMMENT "Preprocessing bootloader.ld linker script..." + ) diff --git a/boot/espressif/hal/CMakeLists.txt b/boot/espressif/hal/CMakeLists.txt index d248c2670..795552262 100644 --- a/boot/espressif/hal/CMakeLists.txt +++ b/boot/espressif/hal/CMakeLists.txt @@ -4,6 +4,23 @@ cmake_minimum_required(VERSION 3.13) +if(CONFIG_BUILD_FROM_ZEPHYR) + message(STATUS "Building HAL for MCUboot Espressif Port") + + if(${CONFIG_ESP_CONSOLE_UART}) + add_compile_definitions(CONFIG_ESP_CONSOLE_UART=${CONFIG_ESP_CONSOLE_UART}) + add_compile_definitions(CONFIG_ESP_CONSOLE_UART_NUM=${CONFIG_ESP_CONSOLE_UART_NUM}) + if(${CONFIG_ESP_CONSOLE_UART_CUSTOM}) + add_compile_definitions(CONFIG_ESP_CONSOLE_UART_CUSTOM=${CONFIG_ESP_CONSOLE_UART_CUSTOM}) + add_compile_definitions(CONFIG_ESP_CONSOLE_UART_TX_GPIO=${CONFIG_ESP_CONSOLE_UART_TX_GPIO}) + add_compile_definitions(CONFIG_ESP_CONSOLE_UART_RX_GPIO=${CONFIG_ESP_CONSOLE_UART_RX_GPIO}) + endif() + elseif(${CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG}) + add_compile_definitions(CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG=${CONFIG_ESP_CONSOLE_USB_SERIAL_JTAG}) + endif() + add_compile_definitions(CONFIG_MCUBOOT_ESPRESSIF=1) +endif() + project(hal) set(esp_hal_dir ${ESP_HAL_PATH}) @@ -156,7 +173,6 @@ set(CFLAGS set(LDFLAGS "-Wno-frame-address" "-Wl,--cref" - "-Wl,--Map=${APP_NAME}.map" "-fno-rtti" "-fno-lto" "-Wl,--gc-sections" @@ -166,6 +182,16 @@ set(LDFLAGS "-lgcov" ) +if(CONFIG_BUILD_FROM_ZEPHYR) + list(APPEND include_dirs + ${ESPRESSIF_PORT_DIR}/zephyr/include + ) +else() + list(APPEND LDFLAGS + "-Wl,--Map=${APP_NAME}.map" + ) +endif() + if("${MCUBOOT_ARCH}" STREQUAL "xtensa") list(APPEND CFLAGS "-mlongcalls" diff --git a/boot/espressif/hal/include/esp32c2/sdkconfig.h b/boot/espressif/hal/include/esp32c2/sdkconfig.h index f71490b2b..3aff5d885 100644 --- a/boot/espressif/hal/include/esp32c2/sdkconfig.h +++ b/boot/espressif/hal/include/esp32c2/sdkconfig.h @@ -21,7 +21,7 @@ #define CONFIG_MCUBOOT 1 #define NDEBUG 1 #define CONFIG_BOOTLOADER_WDT_TIME_MS 9000 -#define CONFIG_ESP_CONSOLE_UART_BAUDRATE 115200 +#define CONFIG_ESP_CONSOLE_UART_BAUDRATE 74880 #define CONFIG_BOOTLOADER_OFFSET_IN_FLASH 0x0000 #define CONFIG_PARTITION_TABLE_OFFSET 0x10000 #define CONFIG_EFUSE_VIRTUAL_OFFSET 0x250000 diff --git a/boot/espressif/hal/include/mcuboot_config/mcuboot_assert.h b/boot/espressif/hal/include/mcuboot_config/mcuboot_assert.h index fc5990901..c58743946 100644 --- a/boot/espressif/hal/include/mcuboot_config/mcuboot_assert.h +++ b/boot/espressif/hal/include/mcuboot_config/mcuboot_assert.h @@ -17,3 +17,5 @@ extern void mcuboot_assert_handler(const char *file, int line, const char *func) mcuboot_assert_handler(__FILE__, __LINE__, __func__); \ } \ } while(0) + +#define ASSERT(arg) assert(arg) diff --git a/boot/espressif/zephyr/CMakeLists.txt b/boot/espressif/zephyr/CMakeLists.txt new file mode 100644 index 000000000..9e6f7f6ef --- /dev/null +++ b/boot/espressif/zephyr/CMakeLists.txt @@ -0,0 +1,51 @@ +# SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD +# +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) +cmake_policy(SET CMP0109 NEW) + +include(${CMAKE_CURRENT_LIST_DIR}/../tools/utils.cmake) + +message(STATUS "Building MCUboot for Zephyr OS -- ESPRESSIF PORT") + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) + +# Set Zephyr referenced variables +set(MCUBOOT_ROOT_DIR ${ZEPHYR_MCUBOOT_MODULE_DIR}) +set(ESPRESSIF_PORT_DIR ${MCUBOOT_ROOT_DIR}/boot/espressif) +set(MCUBOOT_TARGET ${CONFIG_SOC}) +set(ESP_HAL_PATH ${ZEPHYR_HAL_ESPRESSIF_MODULE_DIR}) +set(APP_EXECUTABLE ${ZEPHYR_CURRENT_LIBRARY}) +set(EXPECTED_IDF_HAL_VERSION "5.1.5") + +project(NONE) + +include(../common.cmake) + +zephyr_library_include_directories( + ${inc_directories} + ) + +zephyr_library_sources( + ${main_src} + ${bootutil_srcs} + ${crypto_srcs} + ${port_srcs} + ) + +zephyr_library_link_libraries( + gcc + -T${ld_output} + ${LDFLAGS} + ) + +if("${MCUBOOT_ARCH}" STREQUAL "xtensa") + zephyr_include_directories( + ${ESP_HAL_PATH}/components/${MCUBOOT_ARCH}/${MCUBOOT_TARGET}/include + ${ESP_HAL_PATH}/components/${MCUBOOT_ARCH}/include + ) +endif() + +add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../hal ${CMAKE_CURRENT_BINARY_DIR}/hal) +zephyr_library_link_libraries(hal) diff --git a/boot/espressif/zephyr/Kconfig b/boot/espressif/zephyr/Kconfig new file mode 100644 index 000000000..a8581e7d8 --- /dev/null +++ b/boot/espressif/zephyr/Kconfig @@ -0,0 +1,354 @@ +mainmenu "MCUboot Espressif Port configuration" + +config MCUBOOT_ESPRESSIF + bool + default y + help + Hidden option used to indicate that the current image is MCUBoot + Espressif Port + +config BUILD_FROM_ZEPHYR + bool + default y if ZEPHYR_HAL_ESPRESSIF_MODULE + help + Hidden option used to indicate that the MCUBoot Espressif Port + is being built from Zephyr + +config ESP_USE_MBEDTLS + bool + # Hidden option + help + Use mbedTLS for crypto primitives. + +config ESP_USE_TINYCRYPT + bool + # Hidden option + help + Use TinyCrypt for crypto primitives. + +menu "MCUBoot settings" + +config ESP_SINGLE_APPLICATION_SLOT + bool "Single slot bootloader" + help + Single image area is used for application which means that + uploading a new application overwrites the one that previously + occupied the area. + +choice ESP_SIGN_TYPE + prompt "Signature type" + default ESP_SIGN_NONE + +config ESP_SIGN_NONE + bool "No signature; use only hash check" + +config ESP_SIGN_RSA + bool "RSA signatures" + select ESP_USE_MBEDTLS + +if ESP_SIGN_RSA +config ESP_SIGN_RSA_LEN + int "RSA signature length" + range 2048 3072 + default 2048 +endif + +config ESP_SIGN_EC256 + bool "Elliptic curve digital signatures with curve P-256" + select ESP_USE_TINYCRYPT + +config ESP_SIGN_ED25519 + bool "Edwards curve digital signatures using ed25519" + select ESP_USE_TINYCRYPT + help + This is ed25519 signature calculated over SHA512 of SHA256 of application + image. + +endchoice # ESP_SIGN_TYPE + +config ESP_SIGN_KEY_FILE + string "PEM key file" + depends on !ESP_SIGN_NONE + default "root-ec-p256.pem" if ESP_SIGN_EC256 + default "root-ed25519.pem" if ESP_SIGN_ED25519 + default "root-rsa-3072.pem" if ESP_SIGN_RSA && ESP_SIGN_RSA_LEN=3072 + default "root-rsa-2048.pem" if ESP_SIGN_RSA && ESP_SIGN_RSA_LEN=2048 + default "" + help + You can use either absolute or relative path. + In case relative path is used, the build system assumes that it starts + from the directory where the MCUBoot KConfig configuration file is + located. If the key file is not there, the build system uses relative + path that starts from the MCUBoot repository root directory. + The key file will be parsed by imgtools getpub command and a .c source + with the public key information will be written in a format expected by + MCUboot. + +if !ESP_SINGLE_APPLICATION_SLOT +choice ESP_BOOT_IMAGE_UPGRADE_MODE + prompt "Image upgrade modes" + default ESP_BOOT_SWAP_USING_SCRATCH + +config ESP_BOOT_SWAP_USING_SCRATCH + bool "Swap mode that run with the scratch partition" + help + This is the most conservative swap mode but it can work even on + devices with heterogeneous flash page layout. + +config ESP_BOOT_UPGRADE_ONLY + bool "Overwrite image updates instead of swapping" + help + If y, overwrite the primary slot with the upgrade image instead + of swapping them. This prevents the fallback recovery, but + uses a much simpler code path. + +config ESP_BOOT_SWAP_USING_OFFSET + bool "Swap using offset mode without scratch partition" + help + If y, the swap upgrade is done by each sector X+1 in the secondary slot moved index X in + the primary slot, then the sector at X+1 in the primary is moved to index X in the + secondary. + This allows a swap upgrade without using a scratch partition, but is currently limited + to all sectors in both slots being of the same size. This mode offers faster swap times + with less flash endurance usage than swap using move, firmware updates must be placed at + the second sector in the second slot instead of the first. + +config ESP_BOOT_SWAP_USING_MOVE + bool "Swap using move mode without scratch partition" + help + If y, the swap upgrade is done in two steps, where first every + sector of the primary slot is moved up one sector, then for + each sector X in the secondary slot, it is moved to index X in + the primary slot, then the sector at X+1 in the primary is + moved to index X in the secondary. + This allows a swap upgrade without using a scratch partition, + but is currently limited to all sectors in both slots being of + the same size. + +endchoice # ESP_BOOT_IMAGE_UPGRADE_MODE + +endif # !ESP_SINGLE_APPLICATION_SLOT + +config ESP_IMAGE_NUMBER + int "Number of updateable images" + default 1 + range 1 1 if ESP_SINGLE_APPLICATION_SLOT + range 1 2 if !ESP_SINGLE_APPLICATION_SLOT + help + Enables support of multi image update. + +config ESP_DOWNGRADE_PREVENTION + bool "Downgrade prevention" + help + Prevent downgrades by enforcing incrementing version numbers. + When this option is set, any upgrade must have greater major version + or greater minor version with equal major version. This mechanism + only protects against some attacks against version downgrades (for + example, a JTAG could be used to write an older version). + +config ESP_DOWNGRADE_PREVENTION_SECURITY_COUNTER + bool "Use image security counter instead of version number" + depends on ESP_DOWNGRADE_PREVENTION + depends on (ESP_BOOT_SWAP_USING_MOVE || ESP_BOOT_SWAP_USING_SCRATCH || ESP_BOOT_SWAP_USING_OFFSET) + help + Security counter is used for version eligibility check instead of pure + version. When this option is set, any upgrade must have greater or + equal security counter value. + Because of the acceptance of equal values it allows for software + downgrades to some extent. + +endmenu # MCUboot Settings + +menu "Flash map organization settings" + +if BUILD_FROM_ZEPHYR +DT_BOOT_PARTITION_PATH := $(dt_nodelabel_path,boot_partition) +DT_IMG0_SLOT0_PARTITION_PATH := $(dt_nodelabel_path,slot0_partition) +DT_IMG0_SLOT1_PARTITION_PATH := $(dt_nodelabel_path,slot1_partition) +DT_SCRATCH_PARTITION_PATH := $(dt_nodelabel_path,scratch_partition) +DT_FLASH_SIZE := $(div, $(dt_node_reg_size_int,$(dt_nodelabel_path,flash0)),1048576) +endif # BUILD_FROM_ZEPHYR + +choice ESP_FLASHSIZE + prompt "Flash size" + default ESP_FLASHSIZE_4MB + depends on !BUILD_FROM_ZEPHYR + help + SPI flash size, in megabytes + +config ESP_FLASHSIZE_1MB + bool "1 MB" +config ESP_FLASHSIZE_2MB + bool "2 MB" +config ESP_FLASHSIZE_4MB + bool "4 MB" +config ESP_FLASHSIZE_8MB + bool "8 MB" +config ESP_FLASHSIZE_16MB + bool "16 MB" +config ESP_FLASHSIZE_32MB + bool "32 MB" +config ESP_FLASHSIZE_64MB + bool "64 MB" +config ESP_FLASHSIZE_128MB + bool "128 MB" +endchoice # ESP_FLASHSIZE + +config ESP_FLASH_SIZE + string + default "$(DT_FLASH_SIZE)MB" if BUILD_FROM_ZEPHYR + default "1MB" if ESP_FLASHSIZE_1MB + default "2MB" if ESP_FLASHSIZE_2MB + default "4MB" if ESP_FLASHSIZE_4MB + default "8MB" if ESP_FLASHSIZE_8MB + default "16MB" if ESP_FLASHSIZE_16MB + default "32MB" if ESP_FLASHSIZE_32MB + default "64MB" if ESP_FLASHSIZE_64MB + default "128MB" if ESP_FLASHSIZE_128MB + +config ESP_BOOTLOADER_OFFSET + hex + default $(dt_node_reg_addr_hex,$(DT_BOOT_PARTITION_PATH)) if BUILD_FROM_ZEPHYR + default 0x1000 if SOC_ESP32 || SOC_ESP32S2 + default 0x0 + help + Offset address that 2nd bootloader will be flashed to. + The value is determined by the ROM bootloader. + +config ESP_BOOTLOADER_SIZE + hex "Bootloader size" + default $(dt_node_reg_size_hex,$(DT_BOOT_PARTITION_PATH)) if BUILD_FROM_ZEPHYR + default 0xF000 + help + Bootloader size + +config ESP_IMAGE0_PRIMARY_START_ADDRESS + hex "Image 0 primary slot offset" + default $(dt_node_reg_addr_hex,$(DT_IMG0_SLOT0_PARTITION_PATH)) if BUILD_FROM_ZEPHYR + default 0x10000 + help + Primary slot flash offset for Image 0 + +config ESP_APPLICATION_SIZE + hex "Applicaton image size" + default $(dt_node_reg_size_hex,$(DT_IMG0_SLOT0_PARTITION_PATH)) if BUILD_FROM_ZEPHYR + default 0x100000 + help + Application image size + +if !ESP_SINGLE_APPLICATION_SLOT +config ESP_IMAGE0_SECONDARY_START_ADDRESS + hex "Image 0 secondary slot offset" + default $(dt_node_reg_addr_hex,$(DT_IMG0_SLOT1_PARTITION_PATH)) if BUILD_FROM_ZEPHYR + default 0x110000 + help + Secondary slot flash offset for Image 0 + +if ESP_BOOT_SWAP_USING_SCRATCH +config ESP_SCRATCH_OFFSET + hex "Scratch area offset" + default $(dt_node_reg_addr_hex,$(DT_SCRATCH_PARTITION_PATH)) if BUILD_FROM_ZEPHYR + default 0x210000 + help + Scratch area offset + +config ESP_SCRATCH_SIZE + hex "Scratch area size" + default $(dt_node_reg_size_hex,$(DT_SCRATCH_PARTITION_PATH)) if BUILD_FROM_ZEPHYR + default 0x40000 + help + Scratch area size +endif # ESP_BOOT_SWAP_USING_SCRATCH +endif # !ESP_SINGLE_APPLICATION_SLOT + +endmenu # Flash map organization settings + +menu "Console output settings" + +if BUILD_FROM_ZEPHYR +DT_CHOSEN_Z_CONSOLE := zephyr,console +endif # BUILD_FROM_ZEPHYR + +choice ESP_CONSOLE_CHANNEL + prompt "Channel for console output from bootloader" + default ESP_CONSOLE_CHANNEL_USB_SERIAL_JTAG if BUILD_FROM_ZEPHYR && \ + $(dt_nodelabel_enabled,usb_serial) && $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_CONSOLE)) = $(dt_nodelabel_reg_addr_hex,usb_serial) + default ESP_CONSOLE_CHANNEL_UART_CUSTOM if BUILD_FROM_ZEPHYR && \ + $(dt_nodelabel_enabled,uart1) && $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_CONSOLE)) = $(dt_nodelabel_reg_addr_hex,uart1) + default ESP_CONSOLE_CHANNEL_UART_DEFAULT + help + Select where to send console output +config ESP_CONSOLE_CHANNEL_UART_DEFAULT + bool "Default UART0" +config ESP_CONSOLE_CHANNEL_USB_SERIAL_JTAG + bool "USB Serial/JTAG Controller" + depends on SOC_ESP32C3 || SOC_ESP32C6 || SOC_ESP32S3 +config ESP_CONSOLE_CHANNEL_UART_CUSTOM + bool "Custom UART" +endchoice + +config ESP_CONSOLE_UART + bool + default y if ESP_CONSOLE_CHANNEL_UART_DEFAULT || ESP_CONSOLE_CHANNEL_UART_CUSTOM + +config ESP_CONSOLE_UART_CUSTOM + bool + default y if ESP_CONSOLE_CHANNEL_UART_CUSTOM + +config ESP_CONSOLE_USB_SERIAL_JTAG + bool + default y if ESP_CONSOLE_CHANNEL_USB_SERIAL_JTAG + +config ESP_CONSOLE_MULTIPLE_UART + bool + default y if !SOC_ESP32C3 && !SOC_ESP32H2 && !SOC_ESP32C2 && !SOC_ESP32C6 + +choice ESP_CONSOLE_UART_CUSTOM_NUM + prompt "UART port to use for console output (0-1)" + depends on ESP_CONSOLE_UART_CUSTOM && ESP_CONSOLE_MULTIPLE_UART + default ESP_CONSOLE_UART_CUSTOM_NUM_0 if BUILD_FROM_ZEPHYR && \ + $(dt_nodelabel_enabled,uart0) && $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_CONSOLE)) = $(dt_nodelabel_reg_addr_hex,uart0) + default ESP_CONSOLE_UART_CUSTOM_NUM_1 if BUILD_FROM_ZEPHYR && \ + $(dt_nodelabel_enabled,uart1) && $(dt_chosen_reg_addr_hex,$(DT_CHOSEN_Z_CONSOLE)) = $(dt_nodelabel_reg_addr_hex,uart1) + help + This UART peripheral is used for console output from bootloader. + +config ESP_CONSOLE_UART_CUSTOM_NUM_0 + bool "UART0" +config ESP_CONSOLE_UART_CUSTOM_NUM_1 + bool "UART1" +endchoice + +config ESP_CONSOLE_UART_NUM + int + default 0 if ESP_CONSOLE_CHANNEL_UART_DEFAULT + default 0 if !ESP_CONSOLE_MULTIPLE_UART + default 0 if ESP_CONSOLE_UART_CUSTOM_NUM_0 + default 1 if ESP_CONSOLE_UART_CUSTOM_NUM_1 + depends on ESP_CONSOLE_UART + +config ESP_CONSOLE_UART_TX_GPIO + int "UART TX GPIO pin" + depends on ESP_CONSOLE_UART_CUSTOM + range 0 46 + default 1 if SOC_ESP32 + default 20 if SOC_ESP32C2 + default 21 if SOC_ESP32C3 + default 9 if SOC_ESP32C6 + default 24 if SOC_ESP32H2 + default 43 + +config ESP_CONSOLE_UART_RX_GPIO + int "UART RX GPIO pin" + depends on ESP_CONSOLE_UART_CUSTOM + range 0 46 + default 3 if SOC_ESP32 + default 19 if SOC_ESP32C2 + default 20 if SOC_ESP32C3 + default 8 if SOC_ESP32C6 + default 23 if SOC_ESP32H2 + default 44 + +endmenu # Console output settings + +source "Kconfig.zephyr" diff --git a/boot/espressif/zephyr/include/stubs.h b/boot/espressif/zephyr/include/stubs.h new file mode 100644 index 000000000..1a0e3a1f2 --- /dev/null +++ b/boot/espressif/zephyr/include/stubs.h @@ -0,0 +1,7 @@ +/* + * SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD + * + * SPDX-License-Identifier: Apache-2.0 + */ + + /* Empty stub file, needed when building from Zephyr sysbuild */ diff --git a/boot/espressif/zephyr/prj.conf b/boot/espressif/zephyr/prj.conf new file mode 100644 index 000000000..48d446fe0 --- /dev/null +++ b/boot/espressif/zephyr/prj.conf @@ -0,0 +1 @@ +# Empty prj.conf, needed when building from Zephyr sysbuild diff --git a/boot/espressif/zephyr/socs/esp32_procpu.conf b/boot/espressif/zephyr/socs/esp32_procpu.conf new file mode 100644 index 000000000..c048a626e --- /dev/null +++ b/boot/espressif/zephyr/socs/esp32_procpu.conf @@ -0,0 +1,51 @@ +CONFIG_INTC_ESP32=n +CONFIG_CLOCK_CONTROL=n +CONFIG_CLOCK_CONTROL_ESP32=n +CONFIG_SYS_CLOCK_EXISTS=n +CONFIG_LOG=n + +# Drivers and peripherals +CONFIG_I2C=n +CONFIG_WATCHDOG=n +CONFIG_GPIO=n +CONFIG_GPIO_ESP32=n +CONFIG_PINCTRL=n +CONFIG_PINCTRL_ESP32=n +CONFIG_SPI=n +CONFIG_SERIAL=n +CONFIG_FLASH=n + +# Power management +CONFIG_PM=n + +# Interrupts +CONFIG_DYNAMIC_INTERRUPTS=n +CONFIG_IRQ_OFFLOAD=n + +# Memory protection +CONFIG_THREAD_CUSTOM_DATA=n +CONFIG_FPU=n + +# Boot +CONFIG_BOOT_BANNER=n + +# Console +CONFIG_CONSOLE=n +CONFIG_UART_CONSOLE=n +CONFIG_STDOUT_CONSOLE=n +CONFIG_PRINTK=n +CONFIG_EARLY_CONSOLE=n +CONFIG_UART_ESP32=n + +CONFIG_KERNEL_MEM_POOL=n +CONFIG_NUM_PREEMPT_PRIORITIES=0 +CONFIG_SCHED_DUMB=n +CONFIG_WAITQ_DUMB=n + +CONFIG_GEN_SW_ISR_TABLE=n +CONFIG_GEN_ISR_TABLES=n +CONFIG_CHECK_INIT_PRIORITIES=n + +CONFIG_LINKER_ORPHAN_SECTION_PLACE=y + +CONFIG_XTENSA_ENABLE_BACKTRACE=n diff --git a/boot/espressif/zephyr/socs/esp32c2.conf b/boot/espressif/zephyr/socs/esp32c2.conf new file mode 100644 index 000000000..bfefdc219 --- /dev/null +++ b/boot/espressif/zephyr/socs/esp32c2.conf @@ -0,0 +1,49 @@ +CONFIG_INTC_ESP32=n +CONFIG_CLOCK_CONTROL=n +CONFIG_CLOCK_CONTROL_ESP32=n +CONFIG_SYS_CLOCK_EXISTS=n +CONFIG_LOG=n + +# Drivers and peripherals +CONFIG_I2C=n +CONFIG_WATCHDOG=n +CONFIG_GPIO=n +CONFIG_GPIO_ESP32=n +CONFIG_PINCTRL=n +CONFIG_PINCTRL_ESP32=n +CONFIG_SPI=n +CONFIG_SERIAL=n +CONFIG_FLASH=n + +# Power management +CONFIG_PM=n + +# Interrupts +CONFIG_DYNAMIC_INTERRUPTS=n +CONFIG_IRQ_OFFLOAD=n + +# Memory protection +CONFIG_THREAD_STACK_INFO=n +CONFIG_THREAD_CUSTOM_DATA=n +CONFIG_FPU=n + +# Boot +CONFIG_BOOT_BANNER=n + +# Console +CONFIG_CONSOLE=n +CONFIG_UART_CONSOLE=n +CONFIG_STDOUT_CONSOLE=n +CONFIG_PRINTK=n +CONFIG_EARLY_CONSOLE=n +CONFIG_UART_ESP32=n + +CONFIG_MULTITHREADING=n +CONFIG_KERNEL_MEM_POOL=n +CONFIG_NUM_PREEMPT_PRIORITIES=0 + +CONFIG_GEN_SW_ISR_TABLE=n +CONFIG_GEN_ISR_TABLES=n +CONFIG_CHECK_INIT_PRIORITIES=n + +CONFIG_LINKER_ORPHAN_SECTION_PLACE=y diff --git a/boot/espressif/zephyr/socs/esp32c3.conf b/boot/espressif/zephyr/socs/esp32c3.conf new file mode 100644 index 000000000..bfefdc219 --- /dev/null +++ b/boot/espressif/zephyr/socs/esp32c3.conf @@ -0,0 +1,49 @@ +CONFIG_INTC_ESP32=n +CONFIG_CLOCK_CONTROL=n +CONFIG_CLOCK_CONTROL_ESP32=n +CONFIG_SYS_CLOCK_EXISTS=n +CONFIG_LOG=n + +# Drivers and peripherals +CONFIG_I2C=n +CONFIG_WATCHDOG=n +CONFIG_GPIO=n +CONFIG_GPIO_ESP32=n +CONFIG_PINCTRL=n +CONFIG_PINCTRL_ESP32=n +CONFIG_SPI=n +CONFIG_SERIAL=n +CONFIG_FLASH=n + +# Power management +CONFIG_PM=n + +# Interrupts +CONFIG_DYNAMIC_INTERRUPTS=n +CONFIG_IRQ_OFFLOAD=n + +# Memory protection +CONFIG_THREAD_STACK_INFO=n +CONFIG_THREAD_CUSTOM_DATA=n +CONFIG_FPU=n + +# Boot +CONFIG_BOOT_BANNER=n + +# Console +CONFIG_CONSOLE=n +CONFIG_UART_CONSOLE=n +CONFIG_STDOUT_CONSOLE=n +CONFIG_PRINTK=n +CONFIG_EARLY_CONSOLE=n +CONFIG_UART_ESP32=n + +CONFIG_MULTITHREADING=n +CONFIG_KERNEL_MEM_POOL=n +CONFIG_NUM_PREEMPT_PRIORITIES=0 + +CONFIG_GEN_SW_ISR_TABLE=n +CONFIG_GEN_ISR_TABLES=n +CONFIG_CHECK_INIT_PRIORITIES=n + +CONFIG_LINKER_ORPHAN_SECTION_PLACE=y diff --git a/boot/espressif/zephyr/socs/esp32c6_hpcore.conf b/boot/espressif/zephyr/socs/esp32c6_hpcore.conf new file mode 100644 index 000000000..bfefdc219 --- /dev/null +++ b/boot/espressif/zephyr/socs/esp32c6_hpcore.conf @@ -0,0 +1,49 @@ +CONFIG_INTC_ESP32=n +CONFIG_CLOCK_CONTROL=n +CONFIG_CLOCK_CONTROL_ESP32=n +CONFIG_SYS_CLOCK_EXISTS=n +CONFIG_LOG=n + +# Drivers and peripherals +CONFIG_I2C=n +CONFIG_WATCHDOG=n +CONFIG_GPIO=n +CONFIG_GPIO_ESP32=n +CONFIG_PINCTRL=n +CONFIG_PINCTRL_ESP32=n +CONFIG_SPI=n +CONFIG_SERIAL=n +CONFIG_FLASH=n + +# Power management +CONFIG_PM=n + +# Interrupts +CONFIG_DYNAMIC_INTERRUPTS=n +CONFIG_IRQ_OFFLOAD=n + +# Memory protection +CONFIG_THREAD_STACK_INFO=n +CONFIG_THREAD_CUSTOM_DATA=n +CONFIG_FPU=n + +# Boot +CONFIG_BOOT_BANNER=n + +# Console +CONFIG_CONSOLE=n +CONFIG_UART_CONSOLE=n +CONFIG_STDOUT_CONSOLE=n +CONFIG_PRINTK=n +CONFIG_EARLY_CONSOLE=n +CONFIG_UART_ESP32=n + +CONFIG_MULTITHREADING=n +CONFIG_KERNEL_MEM_POOL=n +CONFIG_NUM_PREEMPT_PRIORITIES=0 + +CONFIG_GEN_SW_ISR_TABLE=n +CONFIG_GEN_ISR_TABLES=n +CONFIG_CHECK_INIT_PRIORITIES=n + +CONFIG_LINKER_ORPHAN_SECTION_PLACE=y diff --git a/boot/espressif/zephyr/socs/esp32s2.conf b/boot/espressif/zephyr/socs/esp32s2.conf new file mode 100644 index 000000000..c048a626e --- /dev/null +++ b/boot/espressif/zephyr/socs/esp32s2.conf @@ -0,0 +1,51 @@ +CONFIG_INTC_ESP32=n +CONFIG_CLOCK_CONTROL=n +CONFIG_CLOCK_CONTROL_ESP32=n +CONFIG_SYS_CLOCK_EXISTS=n +CONFIG_LOG=n + +# Drivers and peripherals +CONFIG_I2C=n +CONFIG_WATCHDOG=n +CONFIG_GPIO=n +CONFIG_GPIO_ESP32=n +CONFIG_PINCTRL=n +CONFIG_PINCTRL_ESP32=n +CONFIG_SPI=n +CONFIG_SERIAL=n +CONFIG_FLASH=n + +# Power management +CONFIG_PM=n + +# Interrupts +CONFIG_DYNAMIC_INTERRUPTS=n +CONFIG_IRQ_OFFLOAD=n + +# Memory protection +CONFIG_THREAD_CUSTOM_DATA=n +CONFIG_FPU=n + +# Boot +CONFIG_BOOT_BANNER=n + +# Console +CONFIG_CONSOLE=n +CONFIG_UART_CONSOLE=n +CONFIG_STDOUT_CONSOLE=n +CONFIG_PRINTK=n +CONFIG_EARLY_CONSOLE=n +CONFIG_UART_ESP32=n + +CONFIG_KERNEL_MEM_POOL=n +CONFIG_NUM_PREEMPT_PRIORITIES=0 +CONFIG_SCHED_DUMB=n +CONFIG_WAITQ_DUMB=n + +CONFIG_GEN_SW_ISR_TABLE=n +CONFIG_GEN_ISR_TABLES=n +CONFIG_CHECK_INIT_PRIORITIES=n + +CONFIG_LINKER_ORPHAN_SECTION_PLACE=y + +CONFIG_XTENSA_ENABLE_BACKTRACE=n diff --git a/boot/espressif/zephyr/socs/esp32s3_procpu.conf b/boot/espressif/zephyr/socs/esp32s3_procpu.conf new file mode 100644 index 000000000..c048a626e --- /dev/null +++ b/boot/espressif/zephyr/socs/esp32s3_procpu.conf @@ -0,0 +1,51 @@ +CONFIG_INTC_ESP32=n +CONFIG_CLOCK_CONTROL=n +CONFIG_CLOCK_CONTROL_ESP32=n +CONFIG_SYS_CLOCK_EXISTS=n +CONFIG_LOG=n + +# Drivers and peripherals +CONFIG_I2C=n +CONFIG_WATCHDOG=n +CONFIG_GPIO=n +CONFIG_GPIO_ESP32=n +CONFIG_PINCTRL=n +CONFIG_PINCTRL_ESP32=n +CONFIG_SPI=n +CONFIG_SERIAL=n +CONFIG_FLASH=n + +# Power management +CONFIG_PM=n + +# Interrupts +CONFIG_DYNAMIC_INTERRUPTS=n +CONFIG_IRQ_OFFLOAD=n + +# Memory protection +CONFIG_THREAD_CUSTOM_DATA=n +CONFIG_FPU=n + +# Boot +CONFIG_BOOT_BANNER=n + +# Console +CONFIG_CONSOLE=n +CONFIG_UART_CONSOLE=n +CONFIG_STDOUT_CONSOLE=n +CONFIG_PRINTK=n +CONFIG_EARLY_CONSOLE=n +CONFIG_UART_ESP32=n + +CONFIG_KERNEL_MEM_POOL=n +CONFIG_NUM_PREEMPT_PRIORITIES=0 +CONFIG_SCHED_DUMB=n +CONFIG_WAITQ_DUMB=n + +CONFIG_GEN_SW_ISR_TABLE=n +CONFIG_GEN_ISR_TABLES=n +CONFIG_CHECK_INIT_PRIORITIES=n + +CONFIG_LINKER_ORPHAN_SECTION_PLACE=y + +CONFIG_XTENSA_ENABLE_BACKTRACE=n diff --git a/docs/release-notes.d/espressif-build-espressif-port-from-zephyros-sysbuild.md b/docs/release-notes.d/espressif-build-espressif-port-from-zephyros-sysbuild.md new file mode 100644 index 000000000..101a35e2a --- /dev/null +++ b/docs/release-notes.d/espressif-build-espressif-port-from-zephyros-sysbuild.md @@ -0,0 +1 @@ +- Enable building MCUboot Espressif Port from Zephyr's build system for Espressif chips.