# 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/chip.gni")
import("//build_overrides/efr32_sdk.gni")
import("//build_overrides/jlink.gni")
import("//build_overrides/mbedtls.gni")

import("${chip_root}/src/lib/lib.gni")
import("silabs_board.gni")

declare_args() {
  # Location of the efr32 SDK.
  efr32_sdk_root = "${chip_root}/third_party/silabs/gecko_sdk"
  sdk_support_root = "${chip_root}/third_party/silabs/matter_support"
  wiseconnect_sdk_root =
      "${chip_root}/third_party/silabs/wiseconnect-wifi-bt-sdk"
  wisemcu_sdk_root = "${chip_root}/third_party/silabs/wisemcu-wifi-bt-sdk"
  examples_plat_dir = "${chip_root}/examples/platform/silabs/SiWx917"

  # Build openthread with prebuilt silabs lib
  use_silabs_thread_lib = false
  enable_openthread_cli = true

  kvs_max_entries = 75
  use_external_flash = true

  # Use Silabs factory data provider example.
  # Users can implement their own.
  use_efr32_factory_data_provider = true

  # Enable Segger System View
  use_system_view = false
}

# Explorer Kit and MGM240L do not have external flash
if (silabs_board == "BRD2703A" || silabs_board == "BRD4319A") {
  use_external_flash = false
}

# Enable LEDs by default
use_wstk_leds = true

# Board does not support LEDs and Buttons at the same time
if (silabs_board == "BRD4317A" || silabs_board == "BRD4316A" ||
    silabs_board == "BRD4319A") {
  use_wstk_leds = false
}

assert(efr32_sdk_root != "", "efr32_sdk_root must be specified")

# Defines an efr32 SDK build target.
#
# Parameters:
#   efr32_sdk_root - The location of the erf32 SDK.
#   sources - The sources files to build.
template("efr32_sdk") {
  if (defined(invoker.efr32_sdk_root)) {
    efr32_sdk_root = invoker.efr32_sdk_root
  }

  assert(efr32_sdk_root != "", "efr32_sdk_root must be specified")

  sdk_target_name = target_name

  config("${sdk_target_name}_config") {
    include_dirs = []
    libs = []
    if (defined(invoker.include_dirs)) {
      include_dirs += invoker.include_dirs
    }

    # Treat these includes as system includes, so warnings in them are not fatal.
    _include_dirs = [
      "${sdk_support_root}/platform/emdrv/nvm3/inc",
      "${sdk_support_root}/matter/mbedtls/tinycrypt/inc",
      "${chip_root}/third_party/mbedtls/repo/include",
      "${chip_root}/third_party/mbedtls/repo/library",

      ### CCP includes ###
      "${wisemcu_sdk_root}/platforms/si91x/drivers/peripheral_drivers/inc",
      "${wisemcu_sdk_root}/platforms/si91x/core/chip/inc",
      "${wisemcu_sdk_root}/platforms/si91x/core/config",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/cmsis_driver/config",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/rom_driver/inc",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/systemlevel/inc",

      "${wisemcu_sdk_root}/platforms/si91x/drivers/cmsis_driver",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/cmsis_driver/CMSIS/Driver/Include",
      "${wisemcu_sdk_root}/platforms/si91x/boards/brd4325a/inc",
      "${wisemcu_sdk_root}/platforms/si91x/core/cmsis",
      "${wisemcu_sdk_root}/third_party/freertos/include",
      "${wisemcu_sdk_root}/third_party/freertos/portable/GCC/ARM_CM4F",
      "${examples_plat_dir}/device/inc",

      "${wiseconnect_sdk_root}/sapi/include",

      "${chip_root}/examples/platform/SiWx917/SiWx917",
      "${chip_root}/examples/platform/SiWx917/SiWx917/hal",
    ]

    # Note that we're setting the mbedTLS and PSA configuration files through a
    # define. This means the build system by default does not pick up changes in
    # the content of these, only when changing the filename itself.
    # To fix this, these files are also manually depended upon in the source set
    # declared in efr32_mbedtls_config further down this file.
    defines = [
      "MBEDTLS_CONFIG_FILE=\"siwx917-chip-mbedtls-config.h\"",
      "__STARTUP_CLEAR_BSS",
      "HARD_FAULT_LOG_ENABLE",
      "CORTEXM3_EFM32_MICRO",
      "SILABS_LOG_ENABLED=1",

      #Matter required at least 40960 but SiWx917 SoC requires an extra 20k to resolve nvm3_open() error, Need to be checked.
      "NVM3_DEFAULT_NVM_SIZE=73728",
      "NVM3_DEFAULT_MAX_OBJECT_SIZE=4092",
      "KVS_MAX_ENTRIES=${kvs_max_entries}",
      "EFR32_OPENTHREAD_API",
      "PHY=EMBER_PHY_RAIL",
      "CORTEXM3",
      "MICRO=EMBER_MICRO_CORTEXM3_EFR32",
      "PLAT=EMBER_PLATFORM_CORTEXM3",
      "${silabs_mcu}=1",
      "${silabs_board}=1",
      "__HEAP_SIZE=0",
      "SL_COMPONENT_CATALOG_PRESENT",
      "PLATFORM_HEADER=\"platform-header.h\"",
      "USE_NVM3=1",
      "RSI_ARM_CM4F",
      "RSI_BLE_ENABLE=1",
      "BRD4325A",
      "CHIP_9117",
      "RSI_BLE_ENABLE=1",
      "TINYCRYPT_PRIMITIVES",
      "OPTIMIZE_TINYCRYPT_ASM",
      "RS91X_BLE_ENABLE=1",
    ]

    if (use_system_view) {
      _include_dirs += [
        "${efr32_sdk_root}/util/third_party/segger/systemview/SEGGER",
        "${efr32_sdk_root}/util/third_party/segger/systemview/Sample/FreeRTOSV10/Config/Cortex-M",
        "${efr32_sdk_root}/util/third_party/segger/systemview/Sample/FreeRTOSV10",
        "${efr32_sdk_root}/util/third_party/segger/systemview/Config/",
      ]

      defines += [ "SL_SYSTEM_VIEW=1" ]
    }

    defines += board_defines

    if (defined(invoker.enable_sleepy_device)) {
      if (invoker.enable_sleepy_device) {
        defines += [
          "CHIP_DEVICE_CONFIG_ENABLE_SED=1",
          "SL_CATALOG_POWER_MANAGER_PRESENT",
          "SL_CATALOG_SLEEPTIMER_PRESENT",
        ]
      }
    }

    if (chip_build_libshell) {  # matter shell
      defines += [
        "ENABLE_CHIP_SHELL",
        "OPENTHREAD_CONFIG_CLI_TRANSPORT=OT_CLI_TRANSPORT_CONSOLE",
        "CHIP_DEVICE_CONFIG_THREAD_ENABLE_CLI=1",
      ]
    } else {
      if (enable_openthread_cli) {  # ot-cli only
        defines += [ "CHIP_DEVICE_CONFIG_THREAD_ENABLE_CLI=1" ]
      }
    }

    # USART include files
    if ((defined(invoker.chip_enable_pw_rpc) && invoker.chip_enable_pw_rpc) ||
        chip_build_libshell || enable_openthread_cli ||
        (defined(invoker.chip_enable_wifi) && invoker.chip_enable_wifi) ||
        (defined(invoker.show_qr_code) && invoker.show_qr_code) ||
        (defined(invoker.disable_lcd) && !invoker.disable_lcd) ||
        (defined(invoker.use_external_flash) && use_external_flash)) {
      defines += [ "CONFIG_ENABLE_UART" ]

      if (defined(invoker.use_external_flash) && use_external_flash) {
        defines += [ "CONFIG_USE_EXTERNAL_FLASH" ]

        _include_dirs += [ "${efr32_sdk_root}/hardware/driver/mx25_flash_shutdown/inc/sl_mx25_flash_shutdown_usart" ]
      }

      _include_dirs += [
        "${efr32_sdk_root}/platform/emdrv/uartdrv/inc",
        "${efr32_sdk_root}/platform/emdrv/uartdrv/config",
        "${efr32_sdk_root}/hardware/driver/memlcd/inc/memlcd_usart",
        "${efr32_sdk_root}/platform/common/errno/inc",
      ]
    }

    libs += [ "${sdk_support_root}/platform/emdrv/nvm3/lib/libnvm3_CM4_gcc.a" ]

    cflags = []
    foreach(include_dir, _include_dirs) {
      cflags += [ "-isystem" + rebase_path(include_dir, root_build_dir) ]
    }

    cflags += [
      "-Wno-maybe-uninitialized",
      "-Wno-shadow",
    ]

    if (silabs_family == "efr32mg24" || silabs_family == "mgm24") {
      cflags += [ "-mcmse" ]
    }

    if (defined(invoker.use_rs911x)) {
      if (invoker.use_rs911x == true) {
        #add compilation flags for rs991x build. This will be addressed directly in wiseconnect sdk in the next version release of that sdk
        cflags += invoker.rs911x_cflags
      }
    }

    if (defined(invoker.defines)) {
      defines += invoker.defines
    }
  }

  source_set("si917_mbedtls_config") {
    # We're setting the mbedTLS config flags here as the efr32_sdk target
    # acts as the mbedTLS target for EFR32 builds. We need this for the build
    # system to recompile mbedTLS (= the SDK) when the mbedTLS config gets
    # edited.
    sources = [
      "${chip_root}/src/platform/silabs/SiWx917/siwx917-chip-mbedtls-config.h",
    ]

    public_deps = [ "${chip_root}/src/crypto:crypto_buildconfig" ]
  }

  source_set(sdk_target_name) {
    sources = [
      "${examples_plat_dir}/device/src/startup_RS1xxxx.c",
      "${sdk_support_root}/platform/emdrv/nvm3/src/ccp_flash_dev.c",
      "${sdk_support_root}/platform/emdrv/nvm3/src/ccp_flash_intf.c",
      "${sdk_support_root}/platform/emdrv/nvm3/src/ccp_flash_prg.c",
      "${sdk_support_root}/platform/emdrv/nvm3/src/nvm3_default.c",

      ### nvm3 for ccp platform ###
      "${sdk_support_root}/platform/emdrv/nvm3/src/nvm3_hal_flash_ccp.c",
      "${sdk_support_root}/platform/emdrv/nvm3/src/nvm3_lock.c",

      ######## CCP Platform #########
      "${wisemcu_sdk_root}/platforms/si91x/boards/brd4325a/src/rsi_board.c",

      #"${wisemcu_sdk_root}/platforms/si91x/boards/brd4325a/src/syscalls.c",
      "${wisemcu_sdk_root}/platforms/si91x/core/chip/src/rsi_deepsleep_commonflash.c",
      "${wisemcu_sdk_root}/platforms/si91x/core/chip/src/rsi_ps_ram_func.c",
      "${wisemcu_sdk_root}/platforms/si91x/core/chip/src/rsi_system_config.c",
      "${wisemcu_sdk_root}/platforms/si91x/core/chip/src/system_RS1xxxx.c",

      # Bluetooth
      "${wiseconnect_sdk_root}/sapi/bluetooth/rsi_ble_gap_apis.c",
      "${wiseconnect_sdk_root}/sapi/bluetooth/rsi_ble_gatt_apis.c",
      "${wiseconnect_sdk_root}/sapi/bluetooth/rsi_bt_common_apis.c",
      "${wiseconnect_sdk_root}/sapi/driver/rsi_bt_ble.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/clock_update.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_comparator.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_egpio.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_udma.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_udma_wrapper.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/peripheral_drivers/src/rsi_usart.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_ipmu.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_pll.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_power_save.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_processor_sensor.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_rtc.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_temp_sensor.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_time_period.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_ulpss_clk.c",
      "${wisemcu_sdk_root}/platforms/si91x/drivers/systemlevel/src/rsi_wwdt.c",
      "${wisemcu_sdk_root}/third_party/freertos/croutine.c",
      "${wisemcu_sdk_root}/third_party/freertos/event_groups.c",
      "${wisemcu_sdk_root}/third_party/freertos/list.c",
      "${wisemcu_sdk_root}/third_party/freertos/portable/GCC/ARM_CM4F/port.c",
      "${wisemcu_sdk_root}/third_party/freertos/queue.c",
      "${wisemcu_sdk_root}/third_party/freertos/stream_buffer.c",
      "${wisemcu_sdk_root}/third_party/freertos/tasks.c",
      "${wisemcu_sdk_root}/third_party/freertos/timers.c",

      # mbedtls
      "${chip_root}/third_party/mbedtls/repo/library/aes.c",
      "${chip_root}/third_party/mbedtls/repo/library/asn1parse.c",
      "${chip_root}/third_party/mbedtls/repo/library/asn1write.c",
      "${chip_root}/third_party/mbedtls/repo/library/bignum.c",
      "${chip_root}/third_party/mbedtls/repo/library/ccm.c",
      "${chip_root}/third_party/mbedtls/repo/library/cipher.c",
      "${chip_root}/third_party/mbedtls/repo/library/cipher_wrap.c",
      "${chip_root}/third_party/mbedtls/repo/library/constant_time.c",
      "${chip_root}/third_party/mbedtls/repo/library/ctr_drbg.c",
      "${chip_root}/third_party/mbedtls/repo/library/ecdh.c",
      "${chip_root}/third_party/mbedtls/repo/library/ecdsa.c",
      "${chip_root}/third_party/mbedtls/repo/library/ecp.c",
      "${chip_root}/third_party/mbedtls/repo/library/ecp_curves.c",
      "${chip_root}/third_party/mbedtls/repo/library/entropy.c",
      "${chip_root}/third_party/mbedtls/repo/library/hkdf.c",
      "${chip_root}/third_party/mbedtls/repo/library/hmac_drbg.c",
      "${chip_root}/third_party/mbedtls/repo/library/md.c",
      "${chip_root}/third_party/mbedtls/repo/library/pkcs5.c",
      "${chip_root}/third_party/mbedtls/repo/library/platform.c",
      "${chip_root}/third_party/mbedtls/repo/library/sha256.c",
      "${chip_root}/third_party/mbedtls/repo/library/sha512.c",
      "${chip_root}/third_party/mbedtls/repo/library/x509_create.c",
      "${sdk_support_root}/matter/mbedtls/tinycrypt/src/ecc.c",
      "${sdk_support_root}/matter/mbedtls/tinycrypt/src/ecc_dh.c",
      "${sdk_support_root}/matter/mbedtls/tinycrypt/src/ecc_dsa.c",
      "${sdk_support_root}/matter/mbedtls/tinycrypt/src/error.c",
      "${sdk_support_root}/matter/mbedtls/tinycrypt/src/oid.c",
      "${sdk_support_root}/matter/mbedtls/tinycrypt/src/pk.c",
      "${sdk_support_root}/matter/mbedtls/tinycrypt/src/pk_wrap.c",
      "${sdk_support_root}/matter/mbedtls/tinycrypt/src/pkparse.c",
      "${sdk_support_root}/matter/mbedtls/tinycrypt/src/pkwrite.c",
      "${sdk_support_root}/matter/mbedtls/tinycrypt/src/platform_util.c",
      "${sdk_support_root}/matter/mbedtls/tinycrypt/src/x509_crt.c",
      "${sdk_support_root}/matter/mbedtls/tinycrypt/src/x509write_csr.c",
    ]

    public_deps = [
      ":si917_mbedtls_config",
      "${segger_rtt_root}:segger_rtt",
      "${segger_rtt_root}:segger_rtt_printf",
      "${segger_rtt_root}:segger_rtt_syscalls",
    ]

    if (defined(invoker.sources)) {
      sources += invoker.sources
    }

    public_configs = [ ":${sdk_target_name}_config" ]
  }
}
