#
# Copyright 2018-2022 NXP
#
# SPDX-License-Identifier: Apache-2.0
#

if (CONFIG_DISPLAY)
message(WARNING "
CONFIG_DISPLAY: Running this firmware on a board without a display may damage the board
")
endif()

if(CONFIG_NXP_IMX_RT_BOOT_HEADER)
  zephyr_library()
  if(CONFIG_BOARD_MIMXRT1060_EVK)
    set(FLASH_CONF evkmimxrt1060_flexspi_nor_config.c)
    set(BOARD_NAME evkmimxrt1060)
  elseif(CONFIG_BOARD_MIMXRT1060_EVK_HYPERFLASH)
    # No flash configuration block exists for the RT1060 with HyperFlash in
    # the SDK, but we can reuse the block for the RT1050 as both boards use
    # the same HyperFlash chip
    set(FLASH_CONF evkbimxrt1050_flexspi_nor_config.c)
    set(BOARD_NAME evkbimxrt1050)
  elseif(CONFIG_BOARD_MIMXRT1060_EVKB)
    set(FLASH_CONF evkbmimxrt1060_flexspi_nor_config.c)
    set(BOARD_NAME evkbmimxrt1060)
  else()
    message(WARNING "It appears you are using the board definition for "
     "the MIMXRT1060-EVK, but targeting a custom board. You may need to "
     "update your flash configuration or device configuration data blocks")
    # Default EVK configuration uses qspi, so use that file
    set(FLASH_CONF evkbmimxrt1060_flexspi_nor_config.c)
    set(BOARD_NAME evkbmimxrt1060)
  endif()
  set(RT1060_BOARD_DIR
    "${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/boards/${BOARD_NAME}")
  if(CONFIG_BOOT_FLEXSPI_NOR)
    # Include flash configuration block for RT1060 EVK from NXP's HAL.
    # This configuration block may need modification if another flash chip is
    # used on your custom board. See NXP AN12238 for more information.
    zephyr_compile_definitions(XIP_BOOT_HEADER_ENABLE=1)
    zephyr_compile_definitions(BOARD_FLASH_SIZE=CONFIG_FLASH_SIZE*1024)
    zephyr_library_sources(${RT1060_BOARD_DIR}/xip/${FLASH_CONF})
    zephyr_library_include_directories(${RT1060_BOARD_DIR}/xip)
  endif()
  if(CONFIG_DEVICE_CONFIGURATION_DATA)
    # Include device configuration data block for RT1060 EVK from NXP's HAL.
    # This configuration block may need modification if another SDRAM chip
    # is used on your custom board.
    zephyr_compile_definitions(XIP_BOOT_HEADER_DCD_ENABLE=1)
    zephyr_library_sources(${RT1060_BOARD_DIR}/dcd.c)
  endif()
endif()
