# 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_build/linker_script.gni")
import("$dir_pw_build/target_types.gni")
import("$dir_pw_docgen/docs.gni")
import("$dir_pw_malloc/backend.gni")
import("$dir_pw_third_party/mcuxpresso/mcuxpresso.gni")
import("$dir_pw_toolchain/generate_toolchain.gni")
import("target_toolchains.gni")

generate_toolchains("target_toolchains") {
  toolchains = toolchains_list
}

declare_args() {
  # When compiling with an MCUXpresso SDK, this variable is set to the path of
  # the SDK installation.
  pw_MIMXRT595_EVK_SDK = ""

  # When compiling with an MCUXpresso SDK, this variable is set to the path of
  # the manifest file within the SDK installation.
  pw_target_mimxrt595_evk_MANIFEST = ""

  # This list should contain the necessary defines for setting linker script
  # memory regions. While we don't directly use the pw_boot_cortex_m linker
  # script, these are deliberately matching to make being able to later easier.
  pw_target_mimxrt595_evk_LINK_CONFIG_DEFINES = []
}

dir_board_files = get_path_info(
        "${pw_MIMXRT595_EVK_SDK}/boards/evkmimxrt595/driver_examples/lcdif/rgb565",
        "abspath")

config("config_public_includes") {
  include_dirs = [ "$dir_board_files" ]
  visibility = [ ":*" ]
}

config("pw_malloc_active") {
  if (pw_malloc_BACKEND != "") {
    defines = [ "PW_MALLOC_ACTIVE=1" ]
  }
}

config("disable_warnings") {
  cflags = [
    "-Wno-cast-qual",
    "-Wno-redundant-decls",
    "-Wno-undef",
    "-Wno-unused-parameter",
    "-Wno-unused-variable",
  ]
  visibility = [ ":*" ]
}

config("freestanding") {
  cflags = [
    "-ffreestanding",
    "-fno-builtin",
  ]
  asmflags = cflags
  ldflags = cflags
  visibility = [ ":*" ]
}

config("sdk_defines") {
  defines = [
    "CPU_MIMXRT595SFFOC_cm33",
    "DEBUG_CONSOLE_TRANSFER_NON_BLOCKING",
    "SDK_DEBUGCONSOLE=1",
  ]
  visibility = [ ":*" ]
}

if (current_toolchain != default_toolchain) {
  pw_linker_script("flash_linker_script") {
    defines = pw_target_mimxrt595_evk_LINK_CONFIG_DEFINES
    linker_script = "$dir_pigweed/targets/mimxrt595_evk/mimxrt595_flash.ld"
  }
}

if (pw_third_party_mcuxpresso_SDK != "") {
  # Startup and vector table for NXP MIMXRT595-EVK.
  pw_source_set("boot") {
    public_configs = [ ":pw_malloc_active" ]
    deps = [
      ":mimxrt595_config",
      "$dir_pw_boot",
      "$dir_pw_boot_cortex_m",
      "$dir_pw_preprocessor",
      "$dir_pw_sys_io_mcuxpresso",
      pw_third_party_mcuxpresso_SDK,
    ]
    if (pw_malloc_BACKEND != "") {
      deps += [ "$dir_pw_malloc" ]
    }
    sources = [
      "$dir_pigweed/targets/mimxrt595_evk/vector_table.c",
      "boot.cc",
    ]
  }

  pw_mcuxpresso_sdk("mimxrt595_sdk") {
    manifest = pw_target_mimxrt595_evk_MANIFEST
    include = [
      "component.serial_manager_uart.MIMXRT595S",
      "component.serial_manager.MIMXRT595S",
      "component.usart_adapter.MIMXRT595S",
      "device.MIMXRT595S_startup.MIMXRT595S",
      "driver.dc-fb-common.MIMXRT595S",
      "driver.dc-fb-dsi-cmd.MIMXRT595S",
      "driver.display-rm67162.MIMXRT595S",
      "platform.drivers.cache_cache64.MIMXRT595S",
      "platform.drivers.clock.MIMXRT595S",
      "platform.drivers.common.MIMXRT595S",
      "platform.drivers.flash_config.evkmimxrt595.MIMXRT595S",
      "platform.drivers.flexcomm_usart.MIMXRT595S",
      "platform.drivers.flexspi.MIMXRT595S",
      "platform.drivers.inputmux.MIMXRT595S",
      "platform.drivers.lpc_gpio.MIMXRT595S",
      "platform.drivers.lpc_iopctl.MIMXRT595S",
      "platform.drivers.lpc_smartdma.MIMXRT595S",
      "platform.drivers.mipi_dsi_smartdma.MIMXRT595S",
      "platform.drivers.power.MIMXRT595S",
      "platform.drivers.reset.MIMXRT595S",
      "platform.drivers.utick.MIMXRT595S",
      "platform.utilities.assert.MIMXRT595S",
      "utility.debug_console.MIMXRT595S",
    ]
    exclude = [ "device.MIMXRT595S_startup.MIMXRT595S" ]

    public_configs = [
      ":disable_warnings",
      ":freestanding",
      ":sdk_defines",
    ]
    public_deps = [ ":mimxrt595_config" ]
    allow_circular_includes_from = [ ":mimxrt595_config" ]
  }
}

config("config_public_defines") {
  defines = [
    "CPU_MIMXRT595SFFOC_cm33",
    "FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE=1",
    "SDK_DEBUGCONSOLE=1",
  ]
  visibility = [ ":*" ]
}

pw_source_set("mimxrt595_config") {
  public_configs = [
    ":config_public_defines",
    ":config_public_includes",
    ":disable_warnings",
    ":mimxrt595_sdk__defines",
    ":mimxrt595_sdk__includes",
  ]
  public = [
    "$dir_board_files/board.h",
    "$dir_board_files/clock_config.h",
    "$dir_board_files/pin_mux.h",
  ]
  sources = [
    "$dir_board_files/board.c",
    "$dir_board_files/clock_config.c",
    "$dir_board_files/pin_mux.c",
  ]
}

pw_doc_group("target_docs") {
  sources = [ "target_docs.rst" ]
}
