# Copyright 2022 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_third_party/stm32cube/stm32cube.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 = "stm32f429i_executable"

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

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

  #TODO: Fix test server: likely have to fork stm32f429i-disc1 implementation
  # if (pw_use_test_server) {
  #   _test_runner_script = "py/stm32f429i_disc1_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_cortex_m:armv7m"

  pw_chrono_SYSTEM_CLOCK_BACKEND = "$dir_pw_chrono_freertos:system_clock"
  pw_sync_MUTEX_BACKEND = "$dir_pw_sync_freertos:mutex"
  pw_sync_INTERRUPT_SPIN_LOCK_BACKEND =
      "$dir_pw_sync_freertos:interrupt_spin_lock"
  pw_sync_COUNTING_SEMAPHORE_BACKEND =
      "$dir_pw_sync_freertos:counting_semaphore"

  ### 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_log_BACKEND = dir_pw_log_basic
  pw_sys_io_BACKEND = dir_pw_sys_io_stm32cube
  pw_sys_io_stm32cube_CONFIG = "$dir_pigweed_experimental/targets/stm32f429i_disc1_stm32cube:module_config_overrides"

  pw_third_party_freertos_CONFIG = "$dir_pigweed_experimental/targets/stm32f429i_disc1_stm32cube:stm32f4xx_freertos_config"
  pw_third_party_freertos_PORT =
      "$dir_pigweed_experimental/third_party/freertos:arm_cm4f_freertos_port"

  #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_display_DISPLAY_RESIZE = 1

  pw_boot_cortex_m_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",
  ]

  pw_build_LINK_DEPS = [
    "$dir_pw_assert:impl",
    "$dir_pw_log:impl",
    "$dir_pw_toolchain/arm_gcc:arm_none_eabi_gcc_support",
  ]

  current_cpu = "arm"
  current_os = ""

  pw_board_led_BACKEND = dir_pw_board_led_stm32cube
  pw_board_led_stm32cube_gpio_port = "G"
  pw_board_led_stm32cube_gpio_pin = "13"
  app_common_BACKEND =
      "$dir_pigweed_experimental/applications/app_common_impl:stm32cube"
  pw_app_common_DISPLAY_WIDTH = "320"
  pw_app_common_DISPLAY_HEIGHT = "240"
  pw_app_common_STM32_DISPLAY_CS_PORT = "C"
  pw_app_common_DISPLAY_CS_GPIO = "2"
  pw_app_common_STM32_DISPLAY_DC_PORT = "D"
  pw_app_common_DISPLAY_DC_GPIO = "13"
  pw_app_common_DISPLAY_RESET_GPIO = "-1"

  # TODO: https://pwbug.dev/331975034 - Use pw_system for this target toolchain
  # to re-enable display demos.
  # pw_display_driver_ili9341_MADCTL = "0xA8"  # BGR + rotate 90 (MY|MV).

  pw_spin_delay_BACKEND = dir_pw_spin_delay_stm32cube

  dir_pw_third_party_stm32cube = dir_pw_third_party_stm32cube_f4
  pw_third_party_stm32cube_PRODUCT = "STM32F429xx"
  pw_third_party_stm32cube_CONFIG = "$dir_pigweed_experimental/targets/stm32f429i_disc1_stm32cube:stm32f4xx_hal_config"
  pw_third_party_stm32cube_CORE_INIT = ""
}

_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_stm32f429i_disc1 = {
  _excluded_members = [
    "defaults",
    "name",
  ]

  debug = {
    name = "stm32f429i_disc1_stm32cube_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 = "stm32f429i_disc1_stm32cube_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 = "stm32f429i_disc1_stm32cube_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_stm32f429i_disc1_list = [
  pw_target_toolchain_stm32f429i_disc1.debug,
  pw_target_toolchain_stm32f429i_disc1.speed_optimized,
  pw_target_toolchain_stm32f429i_disc1.size_optimized,
]
