#
#  Copyright (c) 2012-2015 Texas Instruments Incorporated - http://www.ti.com
#  All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions
#  are met:
#
#  *  Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#
#  *  Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
#  *  Neither the name of Texas Instruments Incorporated nor the names of
#     its contributors may be used to endorse or promote products derived
#     from this software without specific prior written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
#  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
#  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
#  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
#  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
#  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
#  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
#  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
#  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
#  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#

#
#  ======== makefile ========
#

EXBASE = ..
include $(EXBASE)/products.mak

srcs = ncx_main_dsp.c ncx_tidsp_icss_emac.c 

objs = $(addprefix bin/$(PROFILE)/obj/,$(patsubst %.c,%.oe66,$(srcs)))
CONFIG = bin/$(PROFILE)/configuro

PKGPATH := $(BIOS_INSTALL_DIR)/packages
PKGPATH := $(PKGPATH)+$(IPC_INSTALL_DIR)/packages
PKGPATH := $(PKGPATH)+$(XDC_INSTALL_DIR)/packages
PKGPATH := $(PKGPATH)+$(PDK_INSTALL_DIR)/packages


# Firmware
PDK_PKG_PATH		:= $(PDK_INSTALL_DIR)/packages
FW_BIN_PATH = $(PDK_PKG_PATH)/ti/drv/icss_emac/firmware/icss_dualemac/bin/am572x/c66x
FW_LIB_REV1_PRU0 = $(FW_BIN_PATH)/REV1/icss_dualemac_PRU0.bin
FW_LIB_REV1_PRU1 = $(FW_BIN_PATH)/REV1/icss_dualemac_PRU1.bin
FW_LIB_REV2_PRU0 = $(FW_BIN_PATH)/REV2/icss_dualemac_PRU0.bin
FW_LIB_REV2_PRU1 = $(FW_BIN_PATH)/REV2/icss_dualemac_PRU1.bin
FW_LNK_CMD_REV1  = $(PDK_PKG_PATH)/ti/build/pruss/lnk_c66_m4_REV1.cmd
FW_LNK_CMD_REV2  = $(PDK_PKG_PATH)/ti/build/pruss/lnk_c66_m4_REV2.cmd

FW_LNKS			 := $(FW_LIB_REV1_PRU0) 
FW_LNKS			 := $(FW_LNKS) $(FW_LIB_REV1_PRU1)
FW_LNKS			 := $(FW_LNKS) $(FW_LIB_REV2_PRU0) 
FW_LNKS			 := $(FW_LNKS) $(FW_LIB_REV2_PRU1)
FW_LNKS			 := $(FW_LNKS) $(FW_LNK_CMD_REV1) 
FW_LNKS			 := $(FW_LNKS) $(FW_LNK_CMD_REV2)

-include $(addprefix bin/$(PROFILE)/obj/,$(patsubst %.c,%.oe66.dep,$(srcs)))

.PRECIOUS: %/compiler.opt %/linker.cmd

all: release


debug:
	$(MAKE) PROFILE=debug PROCLIST="$(PROCLIST)" server_dsp1.x

release:
	$(MAKE) PROFILE=release PROCLIST="$(PROCLIST)" server_dsp1.x

server_dsp1.x: bin/$(PROFILE)/server_dsp1.xe66
bin/$(PROFILE)/server_dsp1.xe66: $(objs) $(libs) $(FW_LNKS) $(CONFIG)/linker.cmd
	@$(ECHO) "#"
	@$(ECHO) "# Making $@ ..."
	$(LD) $(LDFLAGS) -o $@ $(objs) \
            $(addprefix -l ,$(libs)) $(FW_LNKS) $(CONFIG)/linker.cmd $(LDLIBS)

bin/$(PROFILE)/obj/%.oe66: %.c $(CONFIG)/compiler.opt
	@$(ECHO) "#"
	@$(ECHO) "# Making $@ ..."
	$(CC) $(CPPFLAGS) $(CFLAGS) --define=SOC_AM572x --define=idkAM572x --output_file=$@ -fc $<

%/linker.cmd %/compiler.opt: $(CONFIG)/.config ;
$(CONFIG)/.config: ncx_dsp.cfg ncx_config.bld
	@$(ECHO) "#"
	@$(ECHO) "# Making $@ ..."
	$(XDC_INSTALL_DIR)/xs --xdcpath="$(subst +,;,$(PKGPATH))" \
            xdc.tools.configuro -o $(CONFIG) \
            -t ti.targets.elf.C66 \
            -c $(ti.targets.elf.C66) \
            -p ti.platforms.evmDRA7XX:dsp1 \
            -b ncx_config.bld -r $(PROFILE) \
            ncx_dsp.cfg
	@$(ECHO) "" > $@

install:
	@$(ECHO) "#"
	@$(ECHO) "# Making $@ ..."
	@$(MKDIR) $(EXEC_DIR)/debug
	$(CP) bin/debug/server_dsp1.xe66 $(EXEC_DIR)/debug
	@$(MKDIR) $(EXEC_DIR)/release
	$(CP) bin/release/server_dsp1.xe66 $(EXEC_DIR)/release

install_rov:
	@$(ECHO) "#"
	@$(ECHO) "# Making $@ ..."
	@$(MKDIR) $(EXEC_DIR)/debug
	$(CP) bin/debug/configuro/package/cfg/Dsp1_pe66.rov.xs $(EXEC_DIR)/debug
	@$(MKDIR) $(EXEC_DIR)/release
	$(CP) bin/release/configuro/package/cfg/Dsp1_pe66.rov.xs $(EXEC_DIR)/release

help:
	@$(ECHO) "make                   # build executable"
	@$(ECHO) "make clean             # clean everything"

clean::
	$(RMDIR) bin

#  ======== install validation ========
ifeq (install,$(MAKECMDGOALS))
ifeq (,$(EXEC_DIR))
$(error must specify EXEC_DIR)
endif
endif

#  ======== toolchain macros ========
CGTOOLS = $(ti.targets.elf.C66)

CC = $(CGTOOLS)/bin/cl6x -c
LD = $(CGTOOLS)/bin/cl6x -z

CPPFLAGS =
CFLAGS = -qq -pdsw225 -ppd=$@.dep -ppa $(CCPROFILE_$(PROFILE)) -@$(CONFIG)/compiler.opt -I.

# entry point is set to an aligned address so that IPC can load the slave
LDFLAGS = -w -q -u _c_int00 -c -m $(@D)/obj/$(@F).map
LDLIBS = -l $(CGTOOLS)/lib/libc.a

CCPROFILE_debug = -D_DEBUG_=1 --symdebug:dwarf
CCPROFILE_release = -O2

#  ======== standard macros ========
ifneq (,$(wildcard $(XDC_INSTALL_DIR)/xdc.exe))
    # use these on Windows
    CP      = $(XDC_INSTALL_DIR)/bin/cp
    ECHO    = $(XDC_INSTALL_DIR)/bin/echo
    MKDIR   = $(XDC_INSTALL_DIR)/bin/mkdir -p
    RM      = $(XDC_INSTALL_DIR)/bin/rm -f
    RMDIR   = $(XDC_INSTALL_DIR)/bin/rm -rf
else
    # use these on Linux
    CP      = cp
    ECHO    = echo
    MKDIR   = mkdir -p
    RM      = rm -f
    RMDIR   = rm -rf
endif

#  ======== create output directories ========
ifneq (clean,$(MAKECMDGOALS))
ifneq (,$(PROFILE))
ifeq (,$(wildcard bin/$(PROFILE)/obj))
    $(shell $(MKDIR) -p bin/$(PROFILE)/obj)
endif
endif
endif
