# Copyright 2019 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.

# Target configuration for the STM32f429I-DISC1 development board.
#
# TODO(amontanez): This target configuration treats
# pw_sys_io_baremetal_stm32f429 as if it were a platform. This is for
# testing/development and should eventually point to something more
# sophisticated.

import("$dir_pigweed/pw_vars_default.gni")

declare_args() {
  # Specifies the toolchain to use for this build.
  pw_target_toolchain = "$dir_pw_toolchain:arm_gcc_cortex_m4f_og"

  # Experimental! Enable the pw_target_runner for distributed testing.
  pw_use_test_server = false
}

# Use the logging main.
pw_unit_test_main = "$dir_pw_unit_test:logging_main"

# Expose the tool to use for preprocessing linker scripts.
# TODO(pwbug/53): Temporary, will be removed when proper linker script support
# is added to GN.
pw_cc_command = "arm-none-eabi-gcc"

# Executable wrapper that includes some baremetal startup code.
template("stm32f429i_executable") {
  target("executable", target_name) {
    forward_variables_from(invoker, "*")
    if (!defined(deps)) {
      deps = []
    }
    deps += [ dir_pw_sys_io_baremetal_stm32f429 ]
  }
}

# Configuration options for Pigweed executable targets.
pw_executable_config.target_type = "stm32f429i_executable"

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

if (pw_use_test_server) {
  pw_automatic_test_runner =
      get_path_info("py/stm32f429i_disc1_utils/unit_test_client.py", "abspath")
}

# Facade backends
dir_pw_assert_backend = dir_pw_assert_basic
dir_pw_boot_backend = dir_pw_boot_armv7m
dir_pw_cpu_exception_backend = dir_pw_cpu_exception_armv7m
dir_pw_log_backend = dir_pw_log_basic
dir_pw_sys_io_backend = dir_pw_sys_io_baremetal_stm32f429

pw_boot_armv7m_config.defines += [
  "PW_BOOT_FLASH_BEGIN=0x08000200",
  "PW_BOOT_FLASH_SIZE=512K",
  "PW_BOOT_HEAP_SIZE=0",
  "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",
]
