blob: 894ebcadec8e493e2e1ae7f26762b778c510565f [file] [log] [blame]
# 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
)