##########################################################
# Compilation flags for different boards, default compiles 
# for packet IAD 
#
# packet IAD:
#       $ make CFLAGS=-DCONFIG_PACKET_IAD
# Router:
#       $ make CFLAGS=-DCONFIG_ROUTER
#
###########################################################
EEPROM_VERSION = 1
BUILD_DIR := build
ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)

# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})

# Verify if it was successful.
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq ($(BUILD_DIR),)

OBJTREE         := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE         := $(CURDIR)
TOPDIR          := $(SRCTREE)
LNDIR           := $(OBJTREE)

MKCONFIG	:= $(SRCTREE)/mkconfig

ifneq ($(OBJTREE),$(SRCTREE))
obj := $(OBJTREE)/
src := $(SRCTREE)/
else
obj :=
src :=
endif


# load ARCH, BOARD, and CPU configuration
include $(OBJTREE)/../include/config.mk
export  ARCH CPU BOARD VENDOR SOC

#############################
CROSS_COMPILE = arm-openwrt-linux-uclibc-
#############################

## Include the make variables (CC, etc...)
AS      = $(CROSS_COMPILE)as
LD      = $(CROSS_COMPILE)ld
CC      = $(CROSS_COMPILE)gcc
CPP     = $(CC) -E
AR      = $(CROSS_COMPILE)ar
NM      = $(CROSS_COMPILE)nm
STRIP   = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB  = $(CROSS_COMPILE)RANLIB
############################
ARFLAGS = crv
PLATFORM_RELFLAGS =
PLATFORM_LDFLAGS  =
PLATFORM_CPPFLAGS =
ifeq ($(BOARD),packet-iad)
PLATFORM_CPPFLAGS += -DCONFIG_PACKET_IAD
endif
ifeq ($(BOARD),router)
PLATFORM_CPPFLAGS += -DCONFIG_ROUTER
endif
ifeq ($(BOARD),ferouter)
PLATFORM_CPPFLAGS += -DCONFIG_FEROUTER
endif
ifeq ($(BOARD),c1kevm)
PLATFORM_CPPFLAGS += -DCONFIG_C1KEVM
endif
ifeq ($(BOARD),c1kmfcn-evm)
PLATFORM_CPPFLAGS += -DCONFIG_C1KMFCN_EVM
endif
ifeq ($(BOARD),c1km83240)
PLATFORM_CPPFLAGS += -DCONFIG_C1KM83240
endif
ifeq ($(BOARD),c1kasic)
PLATFORM_CPPFLAGS += -DCONFIG_C1KASIC
endif
PLATFORM_CPPFLAGS += -DCONFIG_ARM -D__ARM__
PLATFORM_CPPFLAGS += -march=armv6j
ifdef BE8_MODE
PLATFORM_CPPFLAGS += -mbig-endian -D__ARMEB__
PLATFORM_LDFLAGS += --be8 -EB
PLATFORM_RELFLAGS += -mbig-endian -O4 -DBE8_MODE
endif
PLATFORM_CPPFLAGS +=$(call cc-option,-mapcs-32,-mabi=apcs-gnu)
PLATFORM_RELFLAGS += -fno-strict-aliasing  -fno-common -ffixed-r8
PLATFORM_RELFLAGS +=$(call cc-option,-mshort-load-bytes,$(call cc-option,-malignment-traps,))
DBGFLAGS= -g # -DDEBUG
OPTFLAGS= -Os #-fomit-frame-pointer
RELFLAGS= $(PLATFORM_RELFLAGS)
OBJCFLAGS += --gap-fill=0xff
LDSCRIPT := $(TOPDIR)/eeprom.lds

gccincdir := $(shell $(CC) -print-file-name=include)

CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS)         \
	-D__KERNEL__
CPPFLAGS += -I$(TOPDIR)/include
CPPFLAGS += -fno-builtin -ffreestanding -nostdinc       \
	-isystem $(gccincdir) -pipe $(PLATFORM_CPPFLAGS)

CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes
AFLAGS_DEBUG :=
AFLAGS := $(AFLAGS_DEBUG) -D__ASSEMBLY__ $(CPPFLAGS)
LDFLAGS += -Bstatic -T $(LDSCRIPT)  $(PLATFORM_LDFLAGS)

########################################################################
SOBJ  = start.o 
COBJS = board.o bsp.o nand_hw.o nand.o nand_base.o nand_ids.o nand_ecc.o nand_bbt.o nand_util.o serial.o training.o mdma.o
SRCS    := $(COBJS:.o=.c)
LIBS  = libnand.a
LIBS := $(addprefix $(obj),$(LIBS))
.PHONY : $(LIBS)

# Add GCC lib
PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc

__SOBJ := $(subst $(obj),,$(SOBJ))
__LIBS := $(subst $(obj),,$(LIBS))

#########################################################################
#unconfig:
#	@rm -f $(obj)include/config.h $(obj)include/config.mk
#
#########################################################################
ALL = config $(obj)eeprom.bin $(obj)System.map

all:		$(ALL)

unconfig:
	@rm -f $(obj)../include/config.h $(obj)../include/config.mk \
		$(obj)../board/*/config.tmp $(obj)../board/*/*/config.tmp

router_config: unconfig
	ln -s $(obj)../header100.bin $(obj)../header.bin
	@$(MKCONFIG) -a router arm arm1136 router mindspeed comcerto

packet-iad_config: unconfig
	ln -s $(obj)../header100.bin $(obj)../header.bin
	@$(MKCONFIG) -a packet-iad arm arm1136 packet-iad mindspeed comcerto
	
ferouter_config: unconfig
	ln -s $(obj)../header100.bin $(obj)../header.bin
	@$(MKCONFIG) -a ferouter arm arm1136 ferouter mindspeed comcerto

_c1kevm_config:
	ln -s $(obj)../header1000.bin $(obj)../header.bin
	@$(MKCONFIG) -a c1kevm arm arm1136 c1kevm mindspeed comcerto

_c1kmfcn-evm_config:
	ln -s $(obj)../header1000.bin $(obj)../header.bin
	@$(MKCONFIG) -a c1kmfcn-evm arm arm1136 c1kmfcn-evm mindspeed comcerto

_c1km83240_config:
	ln -s $(obj)../header1000.bin $(obj)../header.bin
	@$(MKCONFIG) -a c1km83240 arm arm1136 c1km83240 mindspeed comcerto

c1kasic_config:
	ln -s $(obj)../header1000.bin $(obj)../header.bin
	@$(MKCONFIG) -a c1kasic arm arm1136 c1kasic mindspeed comcerto

eb:
	@mkdir -p $(obj)../include
	@echo "#define BE8_MODE 1" >> $(obj)../include/config.h ;
	@echo "... configured for c1kevm-eb";
	@echo "BE8_MODE = y" >> $(obj)../include/config.mk ;

M83263G:
	echo "#include <configs/m8326XG.h>" >> $(obj)../include/config.h;
	echo "#define COMCERTO_PART_NO \"M83263G\"" >> $(obj)../include/config.h;

M83262G:
	echo "#include <configs/m8326XG.h>" >> $(obj)../include/config.h;
	echo "#define COMCERTO_PART_NO \"M83262G\"" >> $(obj)../include/config.h;

M83261G:
	echo "#include <configs/m8326XG.h>" >> $(obj)../include/config.h;
	echo "#define COMCERTO_PART_NO \"M83261G\"" >> $(obj)../include/config.h;

M83160G:
	echo "#include <configs/m8324XG.h>" >> $(obj)../include/config.h;
	echo "#define CFG_CLK CFG_CLK_600_165_330" >> $(obj)../include/config.h;
	echo "#define COMCERTO_PART_NO \"M83160G\"" >> $(obj)../include/config.h;

M83252G:
	echo "#include <configs/m8325XG.h>" >> $(obj)../include/config.h;
	echo "#define COMCERTO_PART_NO \"M83252G\"" >> $(obj)../include/config.h;

M83251G:
	echo "#include <configs/m8325XG.h>" >> $(obj)../include/config.h;
	echo "#define COMCERTO_PART_NO \"M83251G\"" >> $(obj)../include/config.h;

M83242G:
	echo "#include <configs/m8324XG.h>" >> $(obj)../include/config.h;
	echo "#define CFG_CLK CFG_CLK_450_165_330" >> $(obj)../include/config.h;
	echo "#define COMCERTO_PART_NO \"M83242G\"" >> $(obj)../include/config.h;

M83241G:
	echo "#include <configs/m8324XG.h>" >> $(obj)../include/config.h;
	echo "#define CFG_CLK CFG_CLK_450_165_330" >> $(obj)../include/config.h;
	echo "#define COMCERTO_PART_NO \"M83241G\"" >> $(obj)../include/config.h;

M83240G:
	echo "#include <configs/m8324XG.h>" >> $(obj)../include/config.h;
	echo "#define CFG_CLK CFG_CLK_400_165_330" >> $(obj)../include/config.h;
	echo "#define COMCERTO_PART_NO \"M83240G\"" >> $(obj)../include/config.h;

c1kevm_config: unconfig M83263G _c1kevm_config
c1kevm-M83263G_config: unconfig M83263G _c1kevm_config
c1kevm-M83262G_config: unconfig M83262G _c1kevm_config
c1kevm-M83261G_config: unconfig M83261G _c1kevm_config
c1kevm-M83160G_config: unconfig M83160G _c1kevm_config
c1kevm-M83252G_config: unconfig M83252G _c1kevm_config
c1kevm-M83251G_config: unconfig M83251G _c1kevm_config
c1kevm-M83242G_config: unconfig M83242G _c1kevm_config
c1kevm-M83241G_config: unconfig M83241G _c1kevm_config
c1kevm-M83240G_config: unconfig M83240G _c1kevm_config

c1kevm-eb_config: unconfig M83263G _c1kevm_config eb
c1kevm-M83263G-eb_config: unconfig M83263G _c1kevm_config eb
c1kevm-M83262G-eb_config: unconfig M83262G _c1kevm_config eb
c1kevm-M83261G-eb_config: unconfig M83261G _c1kevm_config eb
c1kevm-M83160G-eb_config: unconfig M83160G _c1kevm_config eb
c1kevm-M83252G-eb_config: unconfig M83252G _c1kevm_config eb
c1kevm-M83251G-eb_config: unconfig M83251G _c1kevm_config eb
c1kevm-M83242G-eb_config: unconfig M83242G _c1kevm_config eb
c1kevm-M83241G-eb_config: unconfig M83241G _c1kevm_config eb
c1kevm-M83240G-eb_config: unconfig M83240G _c1kevm_config eb

c1kmfcn-evm_config: unconfig M83263G _c1kmfcn-evm_config
c1kmfcn-evm-M83263G_config: unconfig M83263G _c1kmfcn-evm_config
c1kmfcn-evm-M83262G_config: unconfig M83262G _c1kmfcn-evm_config
c1kmfcn-evm-M83261G_config: unconfig M83261G _c1kmfcn-evm_config
c1kmfcn-evm-M83160G_config: unconfig M83160G _c1kmfcn-evm_config
c1kmfcn-evm-M83252G_config: unconfig M83252G _c1kmfcn-evm_config
c1kmfcn-evm-M83251G_config: unconfig M83251G _c1kmfcn-evm_config
c1kmfcn-evm-M83242G_config: unconfig M83242G _c1kmfcn-evm_config
c1kmfcn-evm-M83241G_config: unconfig M83241G _c1kmfcn-evm_config
c1kmfcn-evm-M83240G_config: unconfig M83240G _c1kmfcn-evm_config

c1kmfcn-evm-eb_config: unconfig M83263G _c1kmfcn-evm_config eb
c1kmfcn-evm-M83263G-eb_config: unconfig M83263G _c1kmfcn-evm_config eb
c1kmfcn-evm-M83262G-eb_config: unconfig M83262G _c1kmfcn-evm_config eb
c1kmfcn-evm-M83261G-eb_config: unconfig M83261G _c1kmfcn-evm_config eb
c1kmfcn-evm-M83160G-eb_config: unconfig M83160G _c1kmfcn-evm_config eb
c1kmfcn-evm-M83252G-eb_config: unconfig M83252G _c1kmfcn-evm_config eb
c1kmfcn-evm-M83251G-eb_config: unconfig M83251G _c1kmfcn-evm_config eb
c1kmfcn-evm-M83242G-eb_config: unconfig M83242G _c1kmfcn-evm_config eb
c1kmfcn-evm-M83241G-eb_config: unconfig M83241G _c1kmfcn-evm_config eb
c1kmfcn-evm-M83240G-eb_config: unconfig M83240G _c1kmfcn-evm_config eb

c1km83240_config: unconfig M83240G _c1km83240_config
c1km83240-M83160G_config: unconfig M83160G _c1km83240_config
c1km83240-M83240G_config: unconfig M83240G _c1km83240_config

c1km83240-eb_config: unconfig M83240G _c1km83240_config eb
c1km83240-M83160G-eb_config: unconfig M83160G _c1km83240_config eb
c1km83240-M83240G-eb_config: unconfig M83240G _c1km83240_config eb

$(obj)eeprom.bin:       $(obj)eeprom
		$(OBJCOPY) ${OBJCFLAGS} -O binary $< $(LNDIR)/image.bin && \
		cat $(TOPDIR)/header.bin $(LNDIR)/image.bin > $@

$(obj)eeprom:           $(LIBS) $(SOBJ) $(LDSCRIPT)
			cd $(LNDIR) && $(LD) $(LDFLAGS) $(__SOBJ) \
				--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
				-Map eeprom.map -o eeprom && \
			mv $(TOPDIR)/*.o $(BUILD_DIR)

$(LIBS):	$(COBJS)
	$(AR) $(ARFLAGS) $@ $(COBJS)		

$(SOBJ):    start.S
	$(CC) $(AFLAGS) -c -o $(BUILD_DIR)/$@ $<

config:
	ln -f -s $(TOPDIR)/include/asm-arm $(TOPDIR)/include/asm
	ln -f -s $(TOPDIR)/include/asm/arch-comcerto $(TOPDIR)/include/asm-arm/arch 
	ln -f -s $(TOPDIR)/include/asm/proc-armv $(TOPDIR)/include/asm-arm/proc

$(obj)System.map:       $(obj)eeprom
		@$(NM) $< | \
		grep -v '\(compiled\)\|\(\.o$$\)\|\( [aUw] \)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)' | \
		sort > $(obj)System.map

clean:
	rm -fr $(TOPDIR)/include/asm/arch
	rm -fr $(TOPDIR)/include/asm/proc
	rm -fr $(TOPDIR)/include/asm
	rm -fr $(TOPDIR)/include/asm-arm/asm-arm
	rm -fr $(TOPDIR)/include/asm-arm/arch-comcerto/arch-comcerto
	rm -fr $(TOPDIR)/include/asm-arm/proc-armv/proc-armv
	rm -f $(TOPDIR)/header.bin
	rm -f $(TOPDIR)/*.o
	rm -fr $(BUILD_DIR)
