# Copyright 2021 The Pigweed 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
#
#     https://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/pigweed.gni")

import("$dir_pw_rpc/system_server/backend.gni")
import("$dir_pw_sys_io/backend.gni")
import("$dir_pw_toolchain/arm_gcc/toolchains.gni")

_target_config = {
  # Use the logging main.
  pw_unit_test_MAIN = "$dir_pw_unit_test:logging_main"

  # Configuration options for Pigweed executable targets.
  pw_build_EXECUTABLE_TARGET_TYPE = "stm32f439zi_executable"

  pw_build_EXECUTABLE_TARGET_TYPE_FILE =
      get_path_info("stm32f439zi_executable.gni", "abspath")

  # Path to the bloaty config file for the output binaries.
  pw_bloat_BLOATY_CONFIG = "$dir_pw_boot_armv7m/bloaty_config.bloaty"

  #TODO: Fix test server: likely have to fork stm32f429i-disc1 implementation
  # if (pw_use_test_server) {
  #   _test_runner_script = "py/stm32f439zi-nucleo_utils/unit_test_client.py"
  #   pw_unit_test_AUTOMATIC_RUNNER =
  #       get_path_info(_test_runner_script, "abspath")
  # }

  # Facade backends
  pw_assert_BACKEND = dir_pw_assert_basic
  pw_boot_BACKEND = dir_pw_boot_armv7m

  ### pw_cpu_exception not yet used
  # pw_cpu_exception_ENTRY_BACKEND =
  #     "$dir_pw_cpu_exception_cortex_m:cpu_exception_armv7m"
  # pw_cpu_exception_HANDLER_BACKEND = "$dir_pw_cpu_exception:basic_handler"
  # pw_cpu_exception_SUPPORT_BACKEND =
  #     "$dir_pw_cpu_exception_cortex_m:support_armv7m"
  pw_sync_INTERRUPT_SPIN_LOCK_BACKEND =
      "$dir_pw_sync_baremetal:interrupt_spin_lock"
  pw_log_BACKEND = dir_pw_log_basic
  pw_sys_io_BACKEND = dir_pw_sys_io_stm32cubef4
  pw_sys_io_stm32cubef4_usart_num = "3"
  pw_sys_io_stm32cubef4_gpio_port = "D"
  pw_sys_io_stm32cubef4_gpio_tx_pin = "8"
  pw_sys_io_stm32cubef4_gpio_rx_pin = "9"

  #TODO: remove dependency on stm32f429i-disc1 rpc server.
  pw_rpc_system_server_BACKEND =
      "$dir_pigweed/targets/stm32f429i-disc1:system_rpc_server"
  pw_malloc_BACKEND = dir_pw_malloc_freelist

  pw_boot_armv7m_LINK_CONFIG_DEFINES = [
    "PW_BOOT_FLASH_BEGIN=0x08000200",
    "PW_BOOT_FLASH_SIZE=2048K",

    # TODO(pwbug/219): Currently "pw_tokenizer/detokenize_test" requires at
    # least 6K bytes in heap when using pw_malloc_freelist. The heap size
    # required for tests should be investigated.
    "PW_BOOT_HEAP_SIZE=7K",
    "PW_BOOT_MIN_STACK_SIZE=1K",
    "PW_BOOT_RAM_BEGIN=0x20000000",
    "PW_BOOT_RAM_SIZE=192K",
    "PW_BOOT_VECTOR_TABLE_BEGIN=0x08000000",
    "PW_BOOT_VECTOR_TABLE_SIZE=512",
  ]

  current_cpu = "arm"
  current_os = ""

  pw_board_led_BACKEND = dir_pw_board_led_stm32cubef4
  pw_board_led_stm32cubef4_gpio_port = "B"
  pw_board_led_stm32cubef4_gpio_pin = "0"

  pw_spin_delay_BACKEND = dir_pw_spin_delay_stm32cubef4

  pw_third_party_stm32cubef4_product = "STM32F439xx"

  # stm32f439zi-nucleo has an 8Mhz external clock fed by the st-link
  pw_third_party_stm32cubef4_hse_hz = "8000000"

  dir_pw_third_party_freertos = "//third_party/freertos"
  pw_third_party_freertos_CONFIG =
      "//targets/stm32f439zi-nucleo:freertos_config"
  pw_third_party_freertos_PORT = "//third_party/freertos:arm_cm4f_freertos_port"
}

_toolchain_properties = {
  final_binary_extension = ".elf"
}

_target_default_configs = [
  "$dir_pw_build:extra_strict_warnings",
  "$dir_pw_toolchain/arm_gcc:enable_float_printf",
]

pw_target_toolchain_stm32f439zi_nucleo = {
  _excluded_members = [
    "defaults",
    "name",
  ]

  debug = {
    name = "stm32f439zi_nucleo_debug"
    _toolchain_base = pw_toolchain_arm_gcc.cortex_m4f_debug
    forward_variables_from(_toolchain_base, "*", _excluded_members)
    forward_variables_from(_toolchain_properties, "*")
    defaults = {
      forward_variables_from(_toolchain_base.defaults, "*")
      forward_variables_from(_target_config, "*")
      default_configs += _target_default_configs
    }
  }

  speed_optimized = {
    name = "stm32f439zi_nucleo_speed_optimized"
    _toolchain_base = pw_toolchain_arm_gcc.cortex_m4f_speed_optimized
    forward_variables_from(_toolchain_base, "*", _excluded_members)
    forward_variables_from(_toolchain_properties, "*")
    defaults = {
      forward_variables_from(_toolchain_base.defaults, "*")
      forward_variables_from(_target_config, "*")
      default_configs += _target_default_configs
    }
  }

  size_optimized = {
    name = "stm32f439zi_nucleo_size_optimized"
    _toolchain_base = pw_toolchain_arm_gcc.cortex_m4f_size_optimized
    forward_variables_from(_toolchain_base, "*", _excluded_members)
    forward_variables_from(_toolchain_properties, "*")
    defaults = {
      forward_variables_from(_toolchain_base.defaults, "*")
      forward_variables_from(_target_config, "*")
      default_configs += _target_default_configs
    }
  }
}

# This list just contains the members of the above scope for convenience to make
# it trivial to generate all the toolchains in this file via a
# `generate_toolchains` target.
pw_target_toolchain_stm32f439zi_nucleo_list = [
  pw_target_toolchain_stm32f439zi_nucleo.debug,
  pw_target_toolchain_stm32f439zi_nucleo.speed_optimized,
  pw_target_toolchain_stm32f439zi_nucleo.size_optimized,
]
