| # SPDX-License-Identifier: Apache-2.0 |
| |
| cmake_minimum_required(VERSION 3.20.0) |
| |
| find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) |
| |
| project(tfm_psa_firmware) |
| |
| |
| if (NOT CONFIG_APP_FIRMWARE_UPDATE_IMAGE) |
| message(FATAL_ERROR "CONFIG_APP_FIRMWARE_UPDATE_IMAGE required") |
| endif() |
| |
| # NOTE: These must not include ${CMAKE_BINARY_DIR} otherwise you get an |
| # absolute path as part of the C symbols in the generated object file. |
| # This is difficult to use in a correct and portable way. Instead, we will |
| # take advantage of running everything from within the build directory. |
| set(UPDATE_SIGNED_HEX update-signed.hex) |
| set(UPDATE_BIN update-image.bin) |
| set(UPDATE_OBJ update-image.o) |
| set(UPDATE_HEADER_BIN update-header.bin) |
| set(UPDATE_HEADER_OBJ update-header.o) |
| |
| # The following sequence of add_custom_command calls builds a dependency |
| # graph of all the bits we need to sign# an image. The process looks |
| # something like: |
| # |
| # [(1) sample.hex ] |
| # | |
| # v |
| # [(2) sign with imgtool ] |
| # | |
| # v |
| # [(3) split-header.py ] |
| # | | |
| # app | | header |
| # v v |
| # [(4,5) objdump bin to obj ] |
| # | | |
| # app obj | | header obj |
| # v v |
| # [(6) target_sources(..) ] |
| # |
| # Note that node (1) is an input. |
| |
| # This is duplicated from the trusted-firmware-m CMakeLists.txt, as this |
| # needs it and CMAKE does not allow us to import the varibales from that |
| # directory. |
| set(TFM_MCUBOOT_DIR "${ZEPHYR_TRUSTED_FIRMWARE_M_MODULE_DIR}/bl2/ext/mcuboot") |
| # Node (2) in the above graphic |
| add_custom_command( |
| DEPENDS ${CONFIG_APP_FIRMWARE_UPDATE_IMAGE} |
| OUTPUT ${UPDATE_SIGNED_HEX} |
| COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${ZEPHYR_MCUBOOT_MODULE_DIR}/scripts |
| ${PYTHON_EXECUTABLE} |
| ${TFM_MCUBOOT_DIR}/scripts/wrapper/wrapper.py |
| --layout "${CMAKE_BINARY_DIR}/tfm/bl2/ext/mcuboot/CMakeFiles/signing_layout_ns.dir/signing_layout_ns.o" |
| -k ${CONFIG_TFM_KEY_FILE_NS} |
| --public-key-format "full" |
| --align 1 |
| -v ${CONFIG_APP_FIRMWARE_UPDATE_IMAGE_VERSION} |
| --pad |
| -s auto |
| -H ${CONFIG_ROM_START_OFFSET} |
| ${CONFIG_APP_FIRMWARE_UPDATE_IMAGE} |
| ${UPDATE_SIGNED_HEX} |
| ) |
| |
| # Node (3) in the above graphic |
| add_custom_command( |
| OUTPUT ${UPDATE_HEADER_BIN} |
| OUTPUT ${UPDATE_BIN} |
| DEPENDS ${UPDATE_SIGNED_HEX} |
| COMMAND ${PYTHON_EXECUTABLE} |
| ${CMAKE_CURRENT_LIST_DIR}/split-header.py |
| ${UPDATE_SIGNED_HEX} |
| ${UPDATE_BIN} |
| ${UPDATE_HEADER_BIN} |
| ) |
| |
| # Node (4) in the above graphic |
| add_custom_command( |
| OUTPUT ${UPDATE_HEADER_OBJ} |
| DEPENDS ${UPDATE_HEADER_BIN} |
| COMMAND ${CMAKE_OBJCOPY} -I binary -O elf32-littlearm -B arm |
| ${UPDATE_HEADER_BIN} |
| ${UPDATE_HEADER_OBJ} |
| ) |
| |
| # Node (5) in the above graphic |
| add_custom_command( |
| OUTPUT ${UPDATE_OBJ} |
| DEPENDS ${UPDATE_BIN} |
| COMMAND ${CMAKE_OBJCOPY} -I binary -O elf32-littlearm -B arm |
| ${UPDATE_BIN} |
| ${UPDATE_OBJ} |
| ) |
| |
| # Source files in this sample |
| # Node (6) in the above graphic |
| target_sources(app PRIVATE src/main.c ${UPDATE_OBJ} ${UPDATE_HEADER_OBJ}) |
| |
| target_include_directories(app PRIVATE |
| $<TARGET_PROPERTY:tfm,TFM_BINARY_DIR>/install/interface/include |
| ) |