##############################################
# Root directory for netos.
#
ifeq "$(BASEDIR)" ""
BASEDIR=./../../../..
endif

##############################################
# Include GNU tools set up
#
include $(BASEDIR)/Makefile.tools

##############################################
# Include platform Makefile.bsp
#
ifeq "$(PLATFORMS_DIR)" ""
PLATFORMS_DIR=$(BASEDIR)/src/bsp/platforms
endif
include $(PLATFORMS_DIR)/$(PLATFORM)/Makefile.files

COPY =cp
CHMOD =chmod

#################################
# Rules for generating linker scripts
#
BIN = /bin

ifeq "$(LDRDIRS)" ""
LS_CPP = $(BIN)/cpp -I$(PLATFORMS_DIR)/$(PLATFORM) -P -C 
else
LS_CPP = $(BIN)/cpp $(LDRDIRS) -P -C 
endif

# NETOS setup
NETOS_LIBPATH    = $(BASEDIR)/lib/$(CPU)/$(ENDIANDIR)/$(TOOLSET)
NETOS_BSPLIBPATH =$(NETOS_LIBPATH)/bsp/$(PLATFORM)
BOOTLOADER_LIBPATH = ./../libs/$(TOOLSET)/$(PLATFORM)
BOOTLOADER_CLIBPATH = ./../libs

ifeq '$(TOOLSET)' 'arm'
NETOS_LIBS = $(BOOTLOADER_LIBPATH)  $(NETOS_LIBPATH)  $(NETOS_BSPLIBPATH)
else
NETOS_LIBS = -L $(BOOTLOADER_CLIBPATH) -L $(BOOTLOADER_LIBPATH) -L $(NETOS_LIBPATH) -L $(NETOS_BSPLIBPATH) 
endif

NETOS_STARTFILE =./../libs/crt0.o

ifeq '$(TOOLSET)' 'arm'
CLIB=
else
CLIB= -lc -lgcc -lm
endif

NETOS_BIN =$(BASEDIR)/bin
# COMPRESS  =$(NETOS_BIN)/compress
BIN2OBJ   =$(NETOS_BIN)/bin2obj
# BACKUPADDR=$(NETOS_BIN)/backupaddr
CHECKSIZE=$(NETOS_BIN)/checksize

ifeq '$(TOOLSET)' 'arm'
BIN2S     =tclsh ./armbin2s.tcl
else
BIN2S     =tclsh ./bin2s.tcl
endif

# BOOTHDR   =$(NETOS_BIN)/boothdr
BOOTHDR   =$(NETOS_BIN)/imagehdr
OBJDIR    =objs/$(TOOLSET)/$(PLATFORM)

BSPOBJS=./../../objs/$(ENDIANDIR)/$(TOOLSET)/$(PLATFORM)

BSPSRC=./../../init/$(CPU)

# debug flag
DEBUG_FLAG= -g

ifeq '$(TOOLSET)' 'arm'
# base compiler options
ifeq "$(RVDS_VER)" "3.0"
BASECFLAG=$(ENDIAN) $(CPU_FLAG) $(CPU_ARCH) --apcs /adsabi
else
BASECFLAG=$(ENDIAN) $(CPU_FLAG) $(CPU_ARCH) --no_depend_system_headers
endif

# defines/undefines
DEF= -DDOTNETMF -DIAM_ENABLED -DNETOS_ARM_TOOLS -DNET_OS -DNET_WORKS -D_POSIX_SOURCE -DBOOT_LOADER  $(CHIP_DEFINES) -D_LITTLE_ENDIAN -DTM_LITTLE_ENDIAN -DCLI_TRACE=0
ASDEF=-DNETOS_ARM_TOOLS=1 -DNET_OS=1 -DNET_WORKS=1 -D_POSIX_SOURCE=1
else
# base compiler options
BASECFLAG=-mbig-endian $(CPU_FLAG) $(CPU_ARCH)

# defines/undefines
DEF= -D__GNU__ -DNETOS_GNU_TOOLS -DNET_OS -DNET_WORKS -D_POSIX_SOURCE -DBOOT_LOADER  $(CHIP_DEFINES) -DIAM_ENABLED -DNET_OS_SPECIFIC
ASDEF=--defsym __GNU__=1 --defsym NETOS_GNU_TOOLS=1 --defsym NET_OS=1 --defsym NET_WORKS=1 --defsym _POSIX_SOURCE=1
endif

ifeq "$(STACK)" "treck"
DEF  += -DFUSION=0 -DTRECK=1 -DNETWORK_STACK=1
else
DEF  += -DFUSION=0 -DTRECK=1 -DNETWORK_STACK=0
endif



# optimization flag (optimize for size)
ifeq '$(TOOLSET)' 'arm'
OPTIMIZE=-O2
else
OPTIMIZE=-Os
endif


# final C compiler options
ifeq '$(TOOLSET)' 'arm'
CCFLAGS=$(DEBUG_FLAG) $(BASECFLAG) $(DEF) $(OPTIMIZE) $(LANGUAGE_FLAGS)
else
CCFLAGS=$(DEBUG_FLAG) $(BASECFLAG) $(DEF) $(OPTIMIZE)
endif

# search path for source header file
INC += -I. -I$(BASEDIR)/h -I$(BASEDIR)/h/arm9 -I$(BASEDIR)/h/module_info
INC += -I./.. -I../net -I$(BASEDIR)/h/threadx 
INC += -I$(BASEDIR)/h/tcpip
INC += -I$(BASEDIR)/h/wln
INC += -I$(BASEDIR)/h/wpa
INC += -I$(BASEDIR)/h/wps
INC += -I$(BASEDIR)/h/shared
INC += -I$(BASEDIR)/h/idigi
ifneq "$(PLATFORM_INC)" ""
INC += $(PLATFORM_INC) 
endif
INC += -I../../h -I../../devices/common/ethernet
INC += -I$(BASEDIR)/src/treck/include
INC += -I$(BASEDIR)/src/treck/source/ossupport/netos
INC += -I$(BASEDIR)/src/treck/source/ossupport

# assembler
ifeq '$(TOOLSET)' 'arm'
ifeq "$(RVDS_VER)" "3.0"
ASFLAG= -EB $(CPU_FLAG) -mfpu=softfpa --apcs /adsabi
else
ASFLAG= -EB $(CPU_FLAG) -mfpu=softfpa
endif
else
ASFLAG= -EB $(CPU_FLAG) -mfpu=softfpa
endif

#Source paths
BLRAM_DIR=.
BOOTLOADER_DIR=./..
BSP_DIR=./../../common
BSP_DEVICES=./../../devices
BSP_CUSTOMIZE_DIR=$(BASEDIR)/src/bsp/customize
COMMON_GPIO=$(BSP_DEVICES)/common/gpio
COMMON_NVRAM=$(BSP_DEVICES)/common/nvram
NET_DIR=$(BOOTLOADER_DIR)/net
# PLATFORM_DIR=./../../platforms/$(PLATFORM)

# $(NETOS_BSPLIBPATH)/libbsp.a 
#            $(NETOS_LIBPATH)/libsflash.a 
            
# list of libraries needed
ifeq '$(CPU)' 'arm9'
BL_LIBS =   $(NETOS_BSPLIBPATH)/libbsp.a \
            $(NETOS_LIBPATH)/libflash.a \
            $(NETOS_LIBPATH)/libsflash.a \
            $(NETOS_LIBPATH)/libposix.a \
            $(BOOTLOADER_LIBPATH)/libnet.a 
else
BL_LIBS = $(NETOS_BSPLIBPATH)/libbsp.a \
            $(NETOS_LIBPATH)/libflash.a \
            $(NETOS_LIBPATH)/libposix.a \
            $(BOOTLOADER_LIBPATH)/libnet.a 
endif

ifeq '$(TOOLSET)' 'arm'
BL_LIBS += $(NETOS_BSPLIBPATH)/reset.o
endif

# search path(s) for source file or library
VPATH= $(BLRAM_DIR):$(BOOTLOADER_DIR):$(NET_DIR):$(BSP_DIR):$(COMMON_GPIO):$(BSP_CUSTOMIZE_DIR):$(PLATFORM_SRC):$(COMMON_NVRAM)


# directory to store obj files

# objects to be linked
ifeq '$(TOOLSET)' 'arm'
OBJECTS=$(OBJDIR)/appconf_api.o\
	$(OBJDIR)/nagpio.o\
    $(OBJDIR)/narmnvrm.o\
	$(OBJDIR)/blApi.o\
	$(OBJDIR)/nainet.o\
	$(OBJDIR)/main.o\
	$(OBJDIR)/nawait.o\
	$(OBJDIR)/gnuCode.o \
	$(OBJDIR)/nainvalidate.o\
	$(OBJDIR)/errhndlr.o
else
OBJECTS=$(OBJDIR)/appconf_api.o\
	$(OBJDIR)/nagpio.o\
    $(OBJDIR)/narmnvrm.o\
	$(OBJDIR)/blApi.o\
	$(OBJDIR)/nainet.o\
	$(OBJDIR)/main.o\
	$(OBJDIR)/nawait.o\
	$(OBJDIR)/reset.o\
	$(OBJDIR)/gnuCode.o \
	$(OBJDIR)/nainvalidate.o\
	$(OBJDIR)/errhndlr.o
endif

ifeq '$(PLATFORM)' 'ns9750_a'
OBJECTS+=$(BSPOBJS)/memtest.o
endif

ifeq '$(PLATFORM)' 'ns9360_a_eng'
OBJECTS+=$(BSPOBJS)/memtest.o
endif

# List of C files used to generate dependencies
CFILES=$(BSP_DIR)/appconf_api.c\
	$(COMMON_GPIO)/nagpio.c\
    $(COMMON_NVRAM)/narmnvrm.c\
	$(BOOTLOADER_DIR)/blApi.c\
	$(BOOTLOADER_DIR)/nainet.c\
	$(BOOTLOADER_DIR)/spi_irq.c\
	$(BLRAM_DIR)/main.c\
	$(BOOTLOADER_DIR)/nawait.c\
	$(BOOTLOADER_DIR)/gnuCode.c \
	$(BLRAM_DIR)/nainvalidate.c	\
	$(BSP_CUSTOMIZE_DIR)/errhndlr.c

# linker options
ifeq '$(TOOLSET)' 'arm'
LINKOPT= --info totals --info unused --entry __vectors --scanlib --scatter $(LINK_CMD)
RAMLINKOPT= $(ENDIAN) -nostartfiles
else
LINKOPT= -mbig-endian -nostartfiles
RAMLINKOPT= -mbig-endian -nostartfiles
endif

# linker command file
ifeq '$(TOOLSET)' 'arm'
LINK_CMD=$(PLATFORMS_DIR)/$(PLATFORM)/blram.txt
else
LINK_CMD=$(PLATFORMS_DIR)/$(PLATFORM)/blram.ld
LINK_CMD_SOURCE=./../../init/$(CPU)/blram.ldr
endif

# Header config files for boothdr
#
# No need to set the address and size for bootloader.
# bootloader is desinged to use one of the variable defined in linker script.
SIZE_CONFIG_FILE=NULL

# Just specify compressed image for bootloader
CONTROL_CONFIG_FILE=BSP_APP_IMAGE_WITH_COMPRESSION
BOOTHDRTYPE=BOOT

LINKER_FILE=$(PLATFORMS_DIR)/$(PLATFORM)/customize.ldr

# Header config file
# HEADER_CONFIG=$(PLATFORMS_DIR)/$(PLATFORM)/blbootldr.dat

# Header config file 2
# HEADER_CONFIG2=$(PLATFORMS_DIR)/$(PLATFORM)/bootldr.dat

# output file name(s)
ifeq '$(TOOLSET)' 'arm'
DEBUG_VERSION=blram.axf
else
DEBUG_VERSION=blram.elf
endif
UNCOMPRESSED_IMAGE=blram.bin
COMPRESSED_IMAGE=blramzip.bin
IMAGE_WITH_HEADER=header.bin
READY_TO_LINK=blram.o
BIN_S_FILE=blram.s
MAKEFILE=Makefile
DEPEND=depend.mk

SYMFILE=blram.sym
MAPFILE=blram.map

# goal(s)
all: $(OBJDIR) $(READY_TO_LINK) $(OBJECTS) 

# generate dependencies
$(DEPEND): $(CFILES) $(MAKEFILE)
	$(CC) $(INC) $(CCFLAGS) -M $(CFILES) > $(DEPEND)

# rules begins
$(OBJDIR)/%.o: %.c
	@echo Compiling $< -o 
	$(CC) -c $(INC) $(CCFLAGS) $< -o $@

ifeq '$(TOOLSET)' 'arm'
# .arm files are preprocessed by the C compilier
$(OBJDIR)/%.s : %.arm
	$(CC) -c $(INC) $(CCFLAGS) -DASSEMBLY $< -o $(basename $@).s1
	armpre $(basename $@).s1 $@
	cp $@ $(basename $@).cpy

# .S files are preprocessed by the C compilier
$(OBJDIR)/%.s : %.S
	$(CC) -c $(INC) $(CCFLAGS) -DASSEMBLY $< -o $(basename $@).s1
	armpre $(basename $@).s1 $@
	cp $@ $(basename $@).cpy

$(OBJDIR)/%.o: %.s
	@echo Assemblig $< 
	$(AS) $(ASFLAG) $(CROSS_ASFLAGS) $(ASDEF) $< -o $@
else
$(OBJDIR)/%.o: %.s
	@echo Assemblig $< 
	$(AS) $(ASFLAG) $(ASDEF) $< -o $@
endif

ifeq '$(TOOLSET)' 'arm'
$(DEBUG_VERSION): $(OBJECTS) $(MAKEFILE) 
	$(LD) $(LINKOPT) -o $(DEBUG_VERSION) $(OBJECTS) \
	$(BL_LIBS) $(PLATFORMS_DIR)/$(PLATFORM)/symbols.txt --map --symbols --list $(MAPFILE) --symdefs $(SYMFILE)
else
$(DEBUG_VERSION): $(OBJECTS) $(LINK_CMD) $(MAKEFILE) $(NETOS_BSPLIBPATH)/libbsp.a
	$(CC) -o $(DEBUG_VERSION) $(OBJECTS) $(LINKOPT) -T $(LINK_CMD) $(NETOS_STARTFILE) \
	$(NETOS_LIBS) -Wl,--start-group $(BL_LIBS) $(CLIB) -Wl,--end-group -Wl,-y,malloc,-Map,$(MAPFILE),-y,customizeIamSetDhcpConfig,-y,customizeIamGetDefaultInterfaceConfig,-y,customizeIamGetAutoipConfig,-y,customizeIamGetDefaultEthernetConfig,-y,customizeIamFindUnusedInterfaceConfig,-y,customizeIamSetStaticConfig,-y,customizeIamSetAutoipConfig,-y,customizeIamGetDefaultConfig,-y,customizeIamSetInterfaceConfig,-y,customizeIamFindInterfaceConfig,-y,customizeIamGetConfig,-y,customizeIamGetDefaultWirelessConfig,-y,customizeIamGetStaticConfig,-y,customizeIamGetDhcpConfig
	$(NM) -n $(DEBUG_VERSION) > $(SYMFILE)
endif
 
$(READY_TO_LINK): $(DEBUG_VERSION) $(MAKEFILE) $(LINKER_FILE)
ifeq '$(TOOLSET)' 'arm'
	$(FE) --bin $(DEBUG_VERSION) --output $(UNCOMPRESSED_IMAGE)
else
	$(OBJCOPY) -Obinary $(DEBUG_VERSION) $(UNCOMPRESSED_IMAGE) 
endif
#	$(COMPRESS) $(UNCOMPRESSED_IMAGE) $(COMPRESSED_IMAGE)
#	$(BOOTHDR) $(HEADER_CONFIG) $(COMPRESSED_IMAGE) $(IMAGE_WITH_HEADER) $(BOARD_TYPE)
	$(BOOTHDR) $(BOOTHDRTYPE) $(SIZE_CONFIG_FILE) $(CONTROL_CONFIG_FILE) $(UNCOMPRESSED_IMAGE) $(IMAGE_WITH_HEADER) $(BOARD_TYPE)
	$(CHECKSIZE) $(LINKER_FILE) $(IMAGE_WITH_HEADER) BOOTLOADER_SIZE_IN_FLASH
	# Convert the image to .s file which gets linked in
	$(BIN2S) $(IMAGE_WITH_HEADER) $(BIN_S_FILE)
	$(RM) -f ../romImage/blram.s
	$(COPY) ./blram.s ../romImage/.
	$(CHMOD) 666 ../romImage/blram.s # Needed for a Win 7 permission problem.
#	$(RM) $(UNCOMPRESSED_IMAGE) $(IMAGE_WITH_HEADER) $(COMPRESSED_IMAGE)

ifeq '$(TOOLSET)' 'arm'
else
 $(LINK_CMD): $(LINK_CMD_SOURCE) 
	$(LS_CPP) $(LINK_CMD_SOURCE) $(LINK_CMD)
endif

# clean up
localclean:
ifeq '$(TOOLSET)' 'arm'
	rm -f $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.axf $(OBJDIR)/*.out $(OBJDIR)/*.lst\
	$(OBJDIR)/*.cmd ./*.x ./*.bin ./*.ldr ./*.ld ./*.dat ./*.sym ./*.map ./*.o $(READY_TO_LINK) $(DEBUG_VERSION) $(DEPEND)
else
	rm -f $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.elf $(OBJDIR)/*.out $(OBJDIR)/*.lst\
	$(OBJDIR)/*.cmd ./*.x ./*.bin ./*.ldr ./*.ld ./*.dat ./*.sym ./*.map ./*.o $(READY_TO_LINK) $(DEBUG_VERSION) $(DEPEND) $(LINK_CMD)
endif

# make object directory
.PHONY: $(OBJDIR)
$(OBJDIR):
	mkdir -p $(OBJDIR)


#  C include dependencies , added 04/23/02
ifeq '$(TOOLSET)' 'arm'
#$(OBJDIR)/reset.o: $(BSP_DIR)/reset.arm
else
$(OBJDIR)/reset.o: $(BSP_DIR)/reset.s
endif

-include $(DEPEND)
