###############################################################################
# PROJECT     : Embedded Wizard Application Demo
###############################################################################
export MAKEFLAGS += --silent

###############################################################################
# GENERAL PROJECT CONFIGURATION
###############################################################################
APP_FILE                      = EmbeddedWizard-IMXRT1064-EVK

FREE_RTOS                     ?= 1
# REMARK: Set the macro FREE_RTOS to 1 to build an Embedded Wizard project
# based on FreeRTOS.


###############################################################################
# GENERAL SETTINGS & PATHS
###############################################################################
EMWI_APP_PATH     = ../../GeneratedCode

SRC_PATH          = ../../Source
EMWI_BSP_PATH     = ../../../TargetSpecific

OBJ_PATH          = ./Obj
BIN_PATH          = ./Bin

SDK_PATH          = ../../../ThirdParty/MCUXpressoSDK
DEVICE_PATH       = $(SDK_PATH)/devices/MIMXRT1064
XIP_PATH          = $(SDK_PATH)/boards/evkmimxrt1064/xip
FREE_RTOS_PATH    = $(SDK_PATH)/rtos/amazon-freertos/lib
STARTUP           = ./startup_MIMXRT1064.S
LINK_SCRIPT       = ./MIMXRT1064xxxxx_flexspi_nor.ld

ifeq ($(FREE_RTOS),1)
FREE_RTOS_SOURCE_PATH =                                                        \
         $(FREE_RTOS_PATH)/FreeRTOS                                            \
         $(FREE_RTOS_PATH)/FreeRTOS/portable/MemMang                           \
         $(FREE_RTOS_PATH)/FreeRTOS/portable/GCC/ARM_CM4F
endif

###############################################################################
# Include standard rules and utilities
# Include Embedded Wizard configuration and list of generated source code
###############################################################################
include ./utilities.mk
include ./rules.mk

ifeq (,$(wildcard $(EMWI_APP_PATH)/ewfiles.inc))
  $(error ERROR: $n$nThe file '(EMWI_APP_PATH)/ewfiles.inc' is missing!\
    $nPlease open Embedded Wizard project and generate code before calling make!)
endif

include $(EMWI_APP_PATH)/ewfiles.inc

EMWI_RTE_PATH     = ../../../PlatformPackage/RTE
EMWI_GFX_PATH     = ../../../PlatformPackage/$(EMWI_COLOR_FORMAT)

ifeq (,$(wildcard $(EMWI_GFX_PATH)/ewgfx.inc))
  $(error ERROR: $n$nThe requested color format $(EMWI_COLOR_FORMAT) is not supported for this platform!\
    $nPlease open Embedded Wizard project, select one of the supported color formats and generate code again)
endif

include $(EMWI_GFX_PATH)/ewgfx.inc
include $(EMWI_RTE_PATH)/ewrte.inc

###############################################################################
# Standard directories for C files
###############################################################################
vpath %.c           $(SRC_PATH)                                                \
                    $(SRC_PATH)/MCO                                            \
                    $(EMWI_APP_PATH)                                           \
                    $(EMWI_RTE_PATH)                                           \
                    $(EMWI_GFX_PATH)                                           \
                    $(EMWI_BSP_PATH)                                           \
                    $(EMWI_BSP_PATH)/Drivers                                   \
                    $(XIP_PATH)                                                \
                    $(DEVICE_PATH)                                             \
                    $(DEVICE_PATH)/drivers                                     \
                    $(DEVICE_PATH)/xip                                         \
                    $(DEVICE_PATH)/utilities                                   \
                    $(DEVICE_PATH)/utilities/debug_console                     \
                    $(DEVICE_PATH)/utilities/str                               \
                    $(SDK_PATH)/components/serial_manager                      \
                    $(SDK_PATH)/components/uart                                \
                    $(SDK_PATH)/mco                                            \
                    $(SDK_PATH)/mco_config                                     \
                    $(SDK_PATH)/mco_config/EDS                                 \
                    $(SDK_PATH)/mcolibs                                        \
                    $(FREE_RTOS_SOURCE_PATH)


##############################################################################
# EMBEDDED WIZARD - APPLICATION DEMO
###############################################################################
APP_C =                                                                        \
                    main.c                                                     \
                    ewmain.c                                                   \
                    DeviceDriver.c                                             \
					canmain.c                                                  \
                    mco_libcb.c                                                \
                    mcohw_com_generic.c                                        \
                    mcohw_nvol_sim.c                                           \
                    semihost_hardfault.c                                       \
                    user_IMXRT.c                                               \

# automatically compile all files generated by Embedded Wizard
APP_EMWI_C =        $(EMWIFILES)

# compile all files for the Embedded Wizard Runtime Environment (RTE)
RTE_EMWI_C =        $(EMWI_RTE_FILES)

# compile all files for the Embedded Wizard Graphics Engine (GFX)
GFX_EMWI_C =        $(EMWI_GFX_FILES)

BOARD_CONFIG_C =                                                               \
                    ew_bsp_system.c                                            \
                    ew_bsp_clock.c                                             \
                    ew_bsp_event.c                                             \
                    ew_bsp_display.c                                           \
                    ew_bsp_graphics.c                                          \
                    ew_bsp_touch.c                                             \
                    ew_bsp_console.c                                           \
                    ew_bsp_inout.c                                             \
                    system_MIMXRT1064.c                                        \
                    board.c                                                    \
                    clock_config.c                                             \
                    fsl_ft5406_rt.c                                            \
                    pin_mux.c                                                  \
                    user_cbdata.c                                              \
                    user_od.c                                                  \


BSP_C =                                                                        \
                    fsl_assert.c                                               \
                    fsl_clock.c                                                \
                    fsl_common.c                                               \
                    fsl_debug_console.c                                        \
                    fsl_elcdif.c                                               \
                    fsl_gpio.c                                                 \
                    fsl_lpi2c.c                                                \
                    fsl_lpuart.c                                               \
                    fsl_pxp.c                                                  \
                    fsl_str.c                                                  \
                    fsl_snvs_hp.c                                              \
					fsl_flexcan.c                                              \
                    serial_manager.c                                           \
                    serial_port_uart.c                                         \
                    lpuart_adapter.c

XIP_C =             evkmimxrt1064_flexspi_nor_config.c                         \
                    evkmimxrt1064_sdram_ini_dcd.c                              \
                    fsl_flexspi_nor_boot.c                                     \

FREE_RTOS_C =                                                                  \
                    list.c                                                     \
                    queue.c                                                    \
                    tasks.c                                                    \
                    timers.c                                                   \
                    heap_4.c                                                   \
                    port.c                                                     \

###############################################################################
# LIBRARIES
###############################################################################
LIBS := m                                                                      \
        c                                                                      \
        nosys                                                                  \
        $(EMWI_RTE_LIB)                                                        \
        $(EMWI_GFX_LIB)                                                        \
        MCO_IMXRT_SDK_2                                                        \

###############################################################################
# INCLUDES
###############################################################################
INCLUDES =                                                                     \
            -I$(SRC_PATH)                                                      \
			-I$(SRC_PATH)/MCO                                                  \
            -I$(EMWI_BSP_PATH)                                                 \
            -I$(EMWI_BSP_PATH)/Drivers                                         \
            -I$(EMWI_APP_PATH)                                                 \
            -I$(EMWI_RTE_PATH)                                                 \
            -I$(EMWI_GFX_PATH)                                                 \
            -I$(SDK_PATH)/CMSIS/Include                                        \
            -I$(DEVICE_PATH)                                                   \
            -I$(DEVICE_PATH)/drivers                                           \
            -I$(DEVICE_PATH)/utilities                                         \
            -I$(DEVICE_PATH)/utilities/str                                     \
            -I$(DEVICE_PATH)/utilities/debug_console                           \
            -I$(SDK_PATH)/components/serial_manager                            \
            -I$(SDK_PATH)/components/uart                                      \
            -I$(SDK_PATH)/mco                                                  \
            -I$(SDK_PATH)/mco_config                                           \
            -I$(SDK_PATH)/mco_config/EDS                                       \
            -I$(SDK_PATH)/mcolibs                                              \

ifeq ($(FREE_RTOS),1)
INCLUDES +=                                                                    \
            -I$(FREE_RTOS_PATH)/FreeRTOS/portable/GCC/ARM_CM4F                 \
            -I$(FREE_RTOS_PATH)/include                                        \
            -I$(FREE_RTOS_PATH)/include/private
endif

###############################################################################
# DEFINES
###############################################################################
CFLAGS  = -O2 -Wall -mcpu=cortex-m7 -mthumb                                    \
          -mthumb-interwork -mfpu=fpv5-d16 -mfloat-abi=hard                    \
          -ffunction-sections -fdata-sections                                  \
          -ffreestanding                                                       \
          -fno-builtin                                                         \
          -fno-common                                                          \
          -DNDEBUG                                                             \
          -DSKIP_SYSCLK_INIT                                                   \
          -DCPU_MIMXRT1064DVL6A                                                \
		  -DFLEXCAN_WAIT_TIMEOUT=1000                                          \
          -DXIP_EXTERNAL_FLASH=1                                               \
          -DXIP_BOOT_HEADER_ENABLE=1                                           \
          -DXIP_BOOT_HEADER_DCD_ENABLE=1                                       \
          -DEW_FRAME_BUFFER_COLOR_FORMAT=EW_FRAME_BUFFER_COLOR_FORMAT_$(EMWI_COLOR_FORMAT) \
          -DEW_SURFACE_ROTATION=$(EMWI_SURFACE_ROTATION)                       \
          -DEW_USE_FREE_RTOS=$(FREE_RTOS)                                      \

###############################################################################
# OBJECTS
###############################################################################
APP_OBJ           := $(foreach file,$(APP_C),             $(OBJ_PATH)/$(strip $(basename $(file))).o)
APP_EMWI_OBJ      := $(foreach file,$(APP_EMWI_C),        $(OBJ_PATH)/$(strip $(basename $(file))).o)
RTE_EMWI_OBJ      := $(foreach file,$(RTE_EMWI_C),        $(OBJ_PATH)/$(strip $(basename $(file))).o)
GFX_EMWI_OBJ      := $(foreach file,$(GFX_EMWI_C),        $(OBJ_PATH)/$(strip $(basename $(file))).o)
BOARD_CONFIG_OBJ  := $(foreach file,$(BOARD_CONFIG_C),    $(OBJ_PATH)/$(strip $(basename $(file))).o)
BSP_OBJ           := $(foreach file,$(BSP_C),             $(OBJ_PATH)/$(strip $(basename $(file))).o)
XIP_OBJ           := $(foreach file,$(XIP_C),             $(OBJ_PATH)/$(strip $(basename $(file))).o)

ifeq ($(FREE_RTOS),1)
FREE_RTOS_OBJ     := $(foreach file,$(FREE_RTOS_C),       $(OBJ_PATH)/$(strip $(basename $(file))).o)
endif

OBJS := $(APP_OBJ) $(APP_EMWI_OBJ) $(RTE_EMWI_OBJ) $(GFX_EMWI_OBJ) $(BOARD_CONFIG_OBJ) $(BSP_OBJ) $(XIP_OBJ) $(FREE_RTOS_OBJ)

MAPFILE   = -Wl,-Map=$(BIN_PATH)/$(APP_FILE).map

LINKING   = $(LD) -mcpu=cortex-m7 -mlittle-endian -mthumb -mthumb-interwork    \
            -mfpu=fpv5-d16 -mfloat-abi=hard -Wl,--gc-sections                  \
            $(MAPFILE)                                                         \
            $(STARTUP)                                                         \
            $(OBJS)                                                            \
            $(addprefix -L,$(EMWI_RTE_PATH))                                   \
            $(addprefix -L,$(EMWI_GFX_PATH))                                   \
            $(addprefix -L,$(SDK_PATH)/mcolibs)                                \
            $(addprefix -l,$(LIBS))                                            \
            -T $(LINK_SCRIPT)                                                  \
            -o $(BIN_PATH)/$(APP_FILE).elf


TRANSLATE = $(OBJCOPY) -O binary $(BIN_PATH)/$(APP_FILE).elf $(BIN_PATH)/$(APP_FILE).bin

PRINT_SIZE  = $(SIZE) $(BIN_PATH)/$(APP_FILE).elf

FLASHING  = $(REDLINK_UTILLITY) --flash-load $(BIN_PATH)/$(APP_FILE).elf  \
            --vendor NXP -x . -p MIMXRT1064xxxxA  --flash-dir . -g

RESET     = $(REDLINK_UTILLITY) --reset hard --vendor NXP -x . -p MIMXRT1064xxxxA


###############################################################################
# RULES
###############################################################################
$(APP_FILE): precompile $(OBJS)
	@echo Linking $(APP_FILE)
	@echo $(LINKING)
	$(LINKING)
	@echo Memory Usage:
	$(PRINT_SIZE)
	$(TRANSLATE)
	@echo $(APP_FILE) successfully built !!

install: $(APP_FILE)
	@echo Flashing $(APP_FILE) ...
	-$(FLASHING)
	@echo $(APP_FILE) successfully flashed !!
	@echo Resetting target ...
	-$(RESET)

projectecho:
	@echo -------------------------------------------------
	@echo Creating $(APP_FILE)
	@echo -------------------------------------------------
	@echo Compiler Options: $(CFLAGS)

createdirs:
	@echo -------------------------------------------------
	@echo Creating object and binary directories
	-$(MKDIR) $(OBJ_PATH)
	-$(MKDIR) $(BIN_PATH)
	@echo -------------------------------------------------

precompile: projectecho createdirs ;


.PHONY: clean
clean:
	@echo Cleaning $(OBJ_PATH) and $(BIN_PATH)
	-$(RM) $(OBJ_PATH)
	-$(RM) $(BIN_PATH)


include $(wildcard $(patsubst %,%.d,$(basename $(OBJS))))
