# 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/ti_simplelink_sdk.gni")
import("${ti_simplelink_sdk_build_root}/ti_simplelink_sdk.gni")

declare_args() {
  # Build target to use for TI SimpleLink SDK. Use this to set global SDK defines.
  ti_simplelink_sdk_target = ""
  ti_simplelink_sysconfig_target = ""
}

assert(ti_simplelink_sdk_target != "",
       "ti_simplelink_sdk_target must be specified")
assert(ti_simplelink_sysconfig_target != "",
       "ti_simplelink_sysconfig_target must be specified")

group("ti_simplelink_sdk") {
  public_deps = [ ti_simplelink_sdk_target ]
}

group("ti_simplelink_sysconfig") {
  public_deps = [ ti_simplelink_sysconfig_target ]
}

source_set("syscalls_stub") {
  sources = [ "syscalls_stubs.cpp" ]
}

config("ti_simplelink_mbedtls_config") {
  if (ti_simplelink_device_family == "cc13x2_26x2" ||
      ti_simplelink_device_family == "cc13x2x7_26x2x7") {
    defines = [ "MBEDTLS_CONFIG_FILE=\"cc13x2_26x2-mbedtls-config.h\"" ]

    include_dirs = [
      "${chip_root}/src/platform/cc13xx_26xx/",
      "${chip_root}/src/platform/cc13xx_26xx/cc13x2_26x2",
      "${chip_root}/src/platform/cc13xx_26xx/cc13x2_26x2/crypto",
      "${ti_simplelink_sdk_root}/source",
    ]
  } else if (ti_simplelink_device_family == "cc13x4_26x4") {
    defines = [ "MBEDTLS_CONFIG_FILE=\"cc13x4_26x4-mbedtls-config.h\"" ]
    include_dirs = [
      "${chip_root}/src/platform/cc13xx_26xx/",
      "${chip_root}/src/platform/cc13xx_26xx/cc13x4_26x4",
      "${chip_root}/src/platform/cc13xx_26xx/cc13x4_26x4/crypto",
      "${ti_simplelink_sdk_root}/source",
    ]
  } else if (ti_simplelink_device_family == "cc32xx") {
    defines = [ "MBEDTLS_CONFIG_FILE=\"cc32xx-mbedtls-config.h\"" ]

    include_dirs = [ "${chip_root}/src/platform/cc32xx" ]
  }
}

mbedtls_target("mbedtls") {
  # Hardware acceleration
  if (ti_simplelink_device_family == "cc13x2_26x2" ||
      ti_simplelink_device_family == "cc13x2x7_26x2x7") {
    sources = [
      "${chip_root}/src/platform/cc13xx_26xx/cc13x2_26x2/crypto/aes_alt.c",
      "${chip_root}/src/platform/cc13xx_26xx/cc13x2_26x2/crypto/ecdh_alt.c",
      "${chip_root}/src/platform/cc13xx_26xx/cc13x2_26x2/crypto/ecdsa_alt.c",
      "${chip_root}/src/platform/cc13xx_26xx/cc13x2_26x2/crypto/ecjpake_alt.c",
      "${chip_root}/src/platform/cc13xx_26xx/cc13x2_26x2/crypto/sha256_alt.c",
    ]
  }

  public_configs = [ ":ti_simplelink_mbedtls_config" ]

  public_deps = [ ti_simplelink_sysconfig_target ]

  deps = [ ":syscalls_stub" ]
}

config("ti_simplelink_freertos_config") {
  if (ti_simplelink_device_family == "cc13x2_26x2" ||
      ti_simplelink_device_family == "cc13x2x7_26x2x7") {
    include_dirs = [
      "${chip_root}/src/platform/cc13xx_26xx",
      "${chip_root}/src/platform/cc13xx_26xx/cc13x2_26x2",
      "${freertos_root}/repo/portable/GCC/ARM_CM4F",
    ]
  } else if (ti_simplelink_device_family == "cc13x4_26x4") {
    include_dirs = [
      "${chip_root}/src/platform/cc13xx_26xx/cc13x4_26x4",
      "${freertos_root}/repo/portable/GCC/ARM_CM33_NTZ",
      "${freertos_root}/repo/portable/GCC/ARM_CM33_NTZ/non_secure",
      "${chip_root}/src/platform/cc13xx_26xx",
    ]
  } else if (ti_simplelink_device_family == "cc32xx") {
    include_dirs = [
      "${chip_root}/src/platform/cc32xx",
      "${freertos_root}/repo/portable/GCC/ARM_CM3",
    ]
  }
}

config("ti_simplelink_posix_config") {
  include_dirs = [ "${ti_simplelink_sdk_root}/source/ti/posix/gcc" ]
  cflags_c = [ "-std=c11" ]
  cflags_cc = [ "-std=c++14" ]
  cflags = [
    "-Wno-maybe-uninitialized",
    "-Wno-sign-compare",
  ]
}

freertos_target("freertos") {
  if (ti_simplelink_device_family == "cc13x2_26x2" ||
      ti_simplelink_device_family == "cc13x2x7_26x2x7") {
    sources = [ "${freertos_root}/repo/portable/GCC/ARM_CM4F/port.c" ]
  } else if (ti_simplelink_device_family == "cc13x4_26x4" ||
             ti_simplelink_device_family == "cc13x4_26x4") {
    sources = [
      "${freertos_root}/repo/portable/GCC/ARM_CM33_NTZ/non_secure/port.c",
      "${freertos_root}/repo/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c",
    ]
  } else if (ti_simplelink_device_family == "cc32xx") {
    sources = [
      "${freertos_root}/repo/portable/GCC/ARM_CM3/port.c",
      "${freertos_root}/repo/portable/MemMang/heap_4.c",
    ]
  }

  public_configs = [ ":ti_simplelink_freertos_config" ]

  if (ti_simplelink_device_family == "cc13x2x7_26x2x7" ||
      ti_simplelink_device_family == "cc13x4_26x4") {
    # BLE has to have it's own heap config
    public_deps =
        [ "${chip_root}/third_party/ti_simplelink_sdk:ti_simplelink_sysconfig" ]
  } else if (ti_simplelink_device_family == "cc32xx") {
    public_deps =
        [ "${chip_root}/third_party/ti_simplelink_sdk:ti_simplelink_sysconfig" ]
  }

  deps = [ ":syscalls_stub" ]
}
