blob: 94e7851bc60a35f05581c236294dd0ff0439c2a6 [file] [log] [blame]
# Copyright (c) 2020 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import("//build_overrides/build.gni")
import("//build_overrides/chip.gni")
import("//build_overrides/ti_simplelink_sdk.gni")
import("${build_root}/toolchain/flashable_executable.gni")
import("${chip_root}/src/platform/cc13xx_26xx/factory_data_config.gni")
import("${chip_root}/src/platform/device.gni")
import("ti_simplelink_board.gni")
import("ti_simplelink_sdk.gni")
declare_args() {
matter_device_vid = ""
matter_device_pid = ""
matter_software_ver = ""
matter_software_ver_str = ""
}
assert(matter_device_vid != "", "matter_device_vid must be specified")
assert(matter_device_pid != "", "matter_device_pid must be specified")
assert(matter_software_ver != "", "matter_software_ver must be specified")
assert(matter_software_ver_str != "",
"matter_software_ver_str must be specified")
template("ti_simplelink_executable") {
simplelink_target_name = target_name
output_base_name = get_path_info(invoker.output_name, "name")
#used for OTA image creator for the cc13xx
if (ti_simplelink_device_family == "cc13x4_26x4") {
objcopy_image_name = output_base_name + ".hex"
objcopy_image_format = "ihex"
} else {
objcopy_image_name = output_base_name + ".bin"
objcopy_image_format = "binary"
}
objcopy = "arm-none-eabi-objcopy"
config("${simplelink_target_name}_config") {
defines = []
if (defined(invoker.defines)) {
defines += invoker.defines
}
# add OTA options if available
defines += [
"CHIP_DEVICE_CONFIG_DEVICE_VENDOR_ID=${matter_device_vid}",
"CHIP_DEVICE_CONFIG_DEVICE_PRODUCT_ID=${matter_device_pid}",
"CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION=${matter_software_ver}",
"CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING=\"${matter_software_ver_str}\"",
]
}
flashable_executable("${simplelink_target_name}.out") {
forward_variables_from(invoker, "*")
public_configs = [ ":${simplelink_target_name}_config" ]
if (ti_simplelink_device_family == "cc13x4_26x4") {
if (chip_enable_ota_requestor) {
sources +=
[ "${chip_root}/src/platform/cc13xx_26xx/oad_image_header.c" ]
if (custom_factory_data) {
ldscript = "${chip_root}/src/platform/cc13xx_26xx/cc13x4_26x4/cc13x4_cc26x4_freertos_ota_factory_data.lds"
} else {
ldscript = "${chip_root}/src/platform/cc13xx_26xx/cc13x4_26x4/cc13x4_cc26x4_freertos_ota.lds"
}
} else {
if (custom_factory_data) {
ldscript = "${chip_root}/src/platform/cc13xx_26xx/cc13x4_26x4/cc13x4_cc26x4_freertos_factory_data.lds"
} else {
ldscript = "${chip_root}/src/platform/cc13xx_26xx/cc13x4_26x4/cc13x4_cc26x4_freertos.lds"
}
}
} else if (ti_simplelink_device_family == "cc32xx") {
ldscript = "${ti_simplelink_sdk_root}/source/ti/boards/cc32xxsf/cc32xxsf_freertos.lds"
}
inputs = [ ldscript ]
ldflags = [
"-L" + rebase_path(ti_simplelink_sdk_root + "/source", root_build_dir),
rebase_path(
"${target_gen_dir}/sysconfig/ti_utils_build_linker.cmd.genlibs",
root_build_dir),
"-T" + rebase_path(ldscript, root_build_dir),
]
}
if (chip_enable_ota_requestor) {
if (ti_simplelink_device_family == "cc13x4_26x4") {
if (custom_factory_data) {
pw_python_action("${simplelink_target_name}-without-factory-data.hex") {
public_deps = [ ":${simplelink_target_name}.out.image" ]
script = "${ti_simplelink_sdk_build_root}/factory_data_trim.py"
sources = [ "${root_out_dir}/${objcopy_image_name}" ]
outputs =
[ "${root_out_dir}/${output_base_name}-without-factory-data.hex" ]
args = [
rebase_path("${root_out_dir}/${output_base_name}.hex",
root_out_dir),
rebase_path("${root_out_dir}/${output_base_name}.out.map",
root_out_dir),
rebase_path(
"${root_out_dir}/${output_base_name}-without-factory-data.hex",
root_out_dir),
"cc13x4_26x4",
]
}
pw_python_action("${simplelink_target_name}-factory-data.hex") {
script = "${ti_simplelink_sdk_build_root}/create_factory_data.py"
sources = [
"${chip_root}/src/platform/cc13xx_26xx/factory_data.schema",
"${chip_root}/src/platform/cc13xx_26xx/factory_data_cc13xx_26xx.json",
]
outputs = [ "${root_out_dir}/${output_base_name}-factory-data.hex" ]
args = [
"-factory_data",
rebase_path(
"${chip_root}/src/platform/cc13xx_26xx/factory_data_cc13xx_26xx.json"),
"-schema",
rebase_path(
"${chip_root}/src/platform/cc13xx_26xx/factory_data.schema"),
"-o",
rebase_path("${root_out_dir}/${output_base_name}-factory-data.hex",
root_out_dir),
"-device",
"cc13x4_26x4",
]
}
}
# add MCUBoot Header to the executable
action("${simplelink_target_name}_header.hex") {
if (custom_factory_data) {
public_deps =
[ ":${simplelink_target_name}-without-factory-data.hex" ]
} else {
public_deps = [ ":${simplelink_target_name}.out.image" ]
}
script = "${ti_simplelink_sdk_root}/source/third_party/mcuboot/scripts/imgtool.py"
if (custom_factory_data) {
sources =
[ "${root_out_dir}/${output_base_name}-without-factory-data.hex" ]
input_path =
"${root_out_dir}/${output_base_name}-without-factory-data.hex"
} else {
sources = [ "${root_out_dir}/${output_base_name}.hex" ]
input_path = "${root_out_dir}/${output_base_name}.hex"
}
outputs = [ "${root_out_dir}/${output_base_name}_header.hex" ]
args = [
"sign",
"--header-size",
"0x80",
"--align",
"4",
"--slot-size",
"0x000F6000", # must match the flash_map_backend definitions
"--version",
matter_software_ver_str,
"--pad-header",
"--pad",
"--key",
rebase_path(
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/root-ec-p256.pem",
root_build_dir),
rebase_path(input_path, root_out_dir),
rebase_path("${root_out_dir}/${output_base_name}_header.hex",
root_out_dir),
]
}
action("${simplelink_target_name}_header.bin") {
inputs = [ "${root_out_dir}/${output_base_name}_header.hex" ]
outputs = [ "${root_out_dir}/${output_base_name}_header.bin" ]
deps = [ ":${simplelink_target_name}_header.hex" ]
args = [
objcopy,
"-I",
"ihex",
"-O",
"binary",
rebase_path("${root_out_dir}/${output_base_name}_header.hex",
root_build_dir),
rebase_path("${root_out_dir}/${output_base_name}_header.bin",
root_build_dir),
]
script = "${build_root}/gn_run_binary.py"
}
# Generate MCUBoot sysconfig
ti_sysconfig("${simplelink_target_name}_mcuboot.syscfg") {
sources = [ "${ti_simplelink_sdk_build_root}/mcuboot/mcuboot.syscfg" ]
rtos = "nortos"
outputs = [
"ti_drivers_config.c",
"ti_drivers_config.h",
"ti_devices_config.c",
"ti_devices_config.h",
# not traditional source files
#"ti_utils_build_linker.cmd.genlibs",
#"syscfg_c.rov.xs",
]
}
#build MCUBoot bootloader
# config("${simplelink_target_name}_mcubootloader_config") {
# # libs = [ "${ti_simplelink_sdk_root}/source/ti/devices/cc13x4_cc26x4/driverlib/bin/gcc/driverlib.lib" ]
# }
flashable_executable("${simplelink_target_name}_mcubootloader") {
output_name = "${output_base_name}.mcubootloader.out"
output_dir = root_out_dir
deps = [
":${simplelink_target_name}_mcuboot.syscfg",
":build_external_library",
]
public_configs = [ ":external_library_config" ]
ldscript =
"${ti_simplelink_sdk_build_root}/mcuboot/mcuboot_cc13x4_cc26x4.lds"
objcopy_image_name = "${output_base_name}.mcubootloader.hex"
objcopy_image_format = "ihex"
inputs = [ ldscript ]
sources = [
"${ti_simplelink_sdk_build_root}/mcuboot/flash_map_backend.c",
"${ti_simplelink_sdk_build_root}/mcuboot/mcuboot_config/mcuboot_config.h",
"${ti_simplelink_sdk_build_root}/syscalls_stubs.cpp",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/boot_record.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/bootutil_misc.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/bootutil_public.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/caps.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/encrypted.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/fault_injection_hardening.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/fault_injection_hardening_delay_rng_mbedtls.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/image_ec.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/image_ec256.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/image_ed25519.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/image_rsa.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/image_validate.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/loader.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/swap_misc.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/swap_move.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/swap_priv.h",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/swap_scratch.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src/tlv.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/ti/source/mcuboot_app/keys.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/ti/source/mcuboot_app/mcuboot_app.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/ti/source/mcuboot_app/security_cnt.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/ext/mbedtls-asn1/src/asn1parse.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/ext/mbedtls-asn1/src/platform_util.c",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/ext/ti-crypto/sl_crypto.c",
"${ti_simplelink_sdk_root}/source/ti/common/cc26xx/debug/led_debug.c",
"${ti_simplelink_sdk_root}/source/ti/common/cc26xx/ecc/ECDSACC26X4_driverlib.c",
"${ti_simplelink_sdk_root}/source/ti/common/cc26xx/sha2/sha2_driverlib.c",
"${ti_simplelink_sdk_root}/source/ti/common/flash/no_rtos/extFlash/bsp_spi_cc13x4_cc26x4.c",
"${ti_simplelink_sdk_root}/source/ti/common/flash/no_rtos/extFlash/ext_flash.c",
"${ti_simplelink_sdk_root}/source/ti/common/mcuboot/boot_seed/boot_seed_cc13x4_cc26x4.c",
]
include_dirs = [
# === MUST BE BEFORE ===
# "${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/ti/source/mcuboot_app"
# to eclipse the mcuboot config header
"${ti_simplelink_sdk_build_root}/mcuboot",
"${ti_simplelink_sdk_root}/kernel/nortos",
"${ti_simplelink_sdk_root}/source",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/include",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/bootutil/src",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/boot/ti/source/mcuboot_app",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/ext",
"${ti_simplelink_sdk_root}/source/third_party/mcuboot/ext/mbedtls-asn1/include",
"${ti_simplelink_sdk_root}/source/ti",
"${ti_simplelink_sdk_root}/source/ti/common/cc26xx/ecc",
"${ti_simplelink_sdk_root}/source/ti/common/cc26xx/sha2",
"${ti_simplelink_sdk_root}/source/ti/common/flash/no_rtos/extFlash",
]
defines = [
"EXCLUDE_TRACE",
"BOOT_LOADER",
]
ldflags = [
"-eresetISR",
"-L" +
rebase_path(ti_simplelink_sdk_root + "/source", root_build_dir),
"-L" + rebase_path(ti_simplelink_sdk_root + "/kernel/nortos",
root_build_dir),
rebase_path(
"${target_gen_dir}/${simplelink_target_name}_mcuboot.syscfg/ti_utils_build_linker.cmd.genlibs",
root_build_dir),
"-T" + rebase_path(ldscript, root_build_dir),
]
}
action("${simplelink_target_name}-mcuboot.hex") {
public_deps = [
":${simplelink_target_name}_header.bin",
":${simplelink_target_name}_mcubootloader.image",
]
if (custom_factory_data) {
public_deps += [ ":${simplelink_target_name}-factory-data.hex" ]
script = "${ti_simplelink_sdk_build_root}/oad_and_factory_data_merge_tool.py"
sources = [
"${root_out_dir}/${output_base_name}-factory-data.hex",
"${root_out_dir}/${output_base_name}.mcubootloader.hex",
"${root_out_dir}/${output_base_name}_header.bin",
]
} else {
script = "${ti_simplelink_sdk_build_root}/oad_merge_tool.py"
sources = [
"${root_out_dir}/${output_base_name}.mcubootloader.hex",
"${root_out_dir}/${output_base_name}_header.bin",
]
}
outputs = [ "${root_out_dir}/${output_base_name}-mcuboot.hex" ]
if (custom_factory_data) {
args = [
rebase_path("${root_out_dir}/${output_base_name}_header.hex",
root_build_dir),
rebase_path("${root_out_dir}/${output_base_name}.mcubootloader.hex",
root_build_dir),
rebase_path("${root_out_dir}/${output_base_name}-factory-data.hex",
root_build_dir),
rebase_path("${root_out_dir}/${output_base_name}-mcuboot.hex",
root_build_dir),
]
} else {
args = [
rebase_path("${root_out_dir}/${output_base_name}_header.hex",
root_build_dir),
rebase_path("${root_out_dir}/${output_base_name}.mcubootloader.hex",
root_build_dir),
rebase_path("${root_out_dir}/${output_base_name}-mcuboot.hex",
root_build_dir),
]
}
}
pw_python_action("${target_name}.ota") {
# For MCUBoot the image could be truncated to the actual executable
# size. The hex file is padded to the slot size.
public_deps = [ ":${simplelink_target_name}_header.bin" ]
script = "${chip_root}/src/app/ota_image_tool.py"
sources = [ "${root_out_dir}/${output_base_name}_header.bin" ]
outputs = [ "${root_out_dir}/${output_base_name}.ota" ]
args = [
"create",
rebase_path("${root_out_dir}/${output_base_name}_header.bin",
root_build_dir),
rebase_path("${root_out_dir}/${output_base_name}.ota",
root_build_dir),
]
args += [
"-v",
matter_device_vid,
"-p",
matter_device_pid,
"-vn",
matter_software_ver,
"-vs",
matter_software_ver_str,
]
if (defined(invoker.ota_digest)) {
args += [
"-da",
matter_ota_digest,
]
} else {
args += [
"-da",
"sha256",
]
}
if (defined(invoker.ota_args)) {
args += invoker.ota_args
}
}
}
} else if (ti_simplelink_device_family == "cc13x4_26x4" &&
custom_factory_data) {
pw_python_action("${simplelink_target_name}-without-factory-data.hex") {
public_deps = [ ":${simplelink_target_name}.out.image" ]
script = "${ti_simplelink_sdk_build_root}/factory_data_trim.py"
sources = [ "${root_out_dir}/${objcopy_image_name}" ]
outputs =
[ "${root_out_dir}/${output_base_name}-without-factory-data.hex" ]
args = [
rebase_path("${root_out_dir}/${output_base_name}.hex", root_out_dir),
rebase_path("${root_out_dir}/${output_base_name}.out.map",
root_out_dir),
rebase_path(
"${root_out_dir}/${output_base_name}-without-factory-data.hex",
root_out_dir),
"cc13x4_26x4",
]
}
pw_python_action("${simplelink_target_name}-factory-data.hex") {
script = "${ti_simplelink_sdk_build_root}/create_factory_data.py"
sources = [
"${chip_root}/src/platform/cc13xx_26xx/factory_data.schema",
"${chip_root}/src/platform/cc13xx_26xx/factory_data_cc13xx_26xx.json",
]
outputs = [ "${root_out_dir}/${output_base_name}-factory-data.hex" ]
args = [
"-factory_data",
rebase_path(
"${chip_root}/src/platform/cc13xx_26xx/factory_data_cc13xx_26xx.json"),
"-schema",
rebase_path(
"${chip_root}/src/platform/cc13xx_26xx/factory_data.schema"),
"-o",
rebase_path("${root_out_dir}/${output_base_name}-factory-data.hex",
root_out_dir),
"-device",
"cc13x4_26x4",
]
}
pw_python_action("${simplelink_target_name}-and-factory-data.hex") {
public_deps = [
":${simplelink_target_name}-factory-data.hex",
":${simplelink_target_name}-without-factory-data.hex",
]
script = "${ti_simplelink_sdk_build_root}/factory_data_merge_tool.py"
sources = [
"${root_out_dir}/${output_base_name}-factory-data.hex",
"${root_out_dir}/${output_base_name}-without-factory-data.hex",
]
outputs = [ "${root_out_dir}/${output_base_name}-and-factory-data.hex" ]
args = [
rebase_path(
"${root_out_dir}/${output_base_name}-without-factory-data.hex",
root_build_dir),
rebase_path("${root_out_dir}/${output_base_name}-factory-data.hex",
root_build_dir),
rebase_path("${root_out_dir}/${output_base_name}-and-factory-data.hex",
root_build_dir),
]
args += [ "${root_out_dir}/${output_base_name}-and-factory-data.hex" ]
}
}
group(simplelink_target_name) {
if (chip_enable_ota_requestor) {
# Generating the ota binary image
if (ti_simplelink_device_family == "cc13x4_26x4") {
data_deps = [
":${simplelink_target_name}-mcuboot.hex",
":${simplelink_target_name}.ota",
":${simplelink_target_name}.out",
]
}
} else {
# The executable is the final target.
data_deps = [ ":${simplelink_target_name}.out" ]
}
if (defined(invoker.data_deps)) {
data_deps += invoker.data_deps
}
}
}