##############################################
# 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.bsp

#################################
# 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

CPPFLAGS = -P -C 

# NETOS setup
NETOS_LIBPATH= $(BASEDIR)/lib/arm9/$(ENDIANDIR)/$(TOOLSET)
NETOS_BSPLIBPATH=$(NETOS_LIBPATH)/bsp/$(PLATFORM)
NETOS_LIBS= -L $(BOOTLOADER_LIBPATH) -L $(NETOS_LIBPATH) -L $(NETOS_BSPLIBPATH) -lbsp
BOOTLOADER_LIBPATH= ./../libs/$(TOOLSET)/$(PLATFORM)
NETOS_STARTFILE=./../libs/crt0.o
CLIB= -L ./../libs -lc -lgcc -lm
NETOS_BIN=$(BASEDIR)/bin
COMPRESS=$(NETOS_BIN)/compress
BIN2OBJ=$(NETOS_BIN)/bin2obj
# BOOTHDR=$(NETOS_BIN)/boothdr
BOOTHDR=$(NETOS_BIN)/imagehdr
CHECKSIZE=$(NETOS_BIN)/checksize
ifneq ($(findstring $(PROCESSOR), "ns9215 ns9210"),)
SPIHDRTYPE=SPI9215
#SPIBOOTHDR=$(NETOS_BIN)/spiboothdr_9215
else
SPIHDRTYPE=SPI
#SPIBOOTHDR=$(NETOS_BIN)/spiboothdr
endif
OBJDIR=objs/$(TOOLSET)/$(PLATFORM)

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

# debug flag
DEBUG_FLAG= -g

# base compiler options
ifeq '$(TOOLSET)' 'arm'
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
else
BASECFLAG=-mbig-endian $(CPU_FLAG) $(CPU_ARCH)
endif

# defines/undefines
ifeq '$(TOOLSET)' 'arm'
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
DEF= -D__GNU__ -DNETOS_GNU_TOOLS -DNET_OS -DNET_WORKS -D_POSIX_SOURCE -DIAM_ENABLED -DBOOT_LOADER $(CHIP_DEFINES)
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
CCFLAGS=$(DEBUG_FLAG) $(BASECFLAG) $(DEF) $(OPTIMIZE)

# search path for source header file
INC  = -I. -I$(BASEDIR)/h -I$(BASEDIR)/h/arm9 -I./.. -I../../h -I../net 
INC += -I$(BASEDIR)/h/shared
INC += -I$(BASEDIR)/h/idigi
INC += -I$(BASEDIR)/h/threadx -I$(BASEDIR)/h/tcpip
INC += -I$(BASEDIR)/h/wln -I$(BASEDIR)/h/wpa -I$(BASEDIR)/h/wps
ifeq "$(PLATFORM_INC)" ""
INC += -I$(PLATFORMS_DIR)/$(PLATFORM) 
else
INC += $(PLATFORM_INC)
endif

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=$(CPU_FLAG) --apcs /adsabi
else
ASFLAG=$(CPU_FLAG) --no_depend_system_headers
endif
else
ASFLAG= -EB $(CPU_FLAG) -mfpu=softfpa
endif

#Source paths
BLROM_DIR=.
BOOTLOADER_DIR=./..
NET_DIR=$(BOOTLOADER_DIR)/net
BSP_DIR=./../../common
BSP_DEVICES=./../../devices
BSP_CUSTOMIZE_DIR=./../../customize
COMMON_GPIO=$(BSP_DEVICES)/common/gpio
COMMON_NVRAM=$(BSP_DEVICES)/common/nvram

#list of libraries needed
BL_LIBS = $(NETOS_BSPLIBPATH)/libbsp.a \
            $(NETOS_LIBPATH)/libflash.a \
            $(NETOS_LIBPATH)/libsflash.a \
            $(NETOS_LIBPATH)/libposix.a 

ifeq '$(TOOLSET)' 'arm'
BL_LIBS += $(BOOTLOADER_LIBPATH)/libnet.a
endif

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

# directory to store obj files
OBJS=./objs/$(TOOLSET)/$(PLATFORM)

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

RAMOBJS=./../spiBootRamImage

# objects to be linked
ifeq '$(TOOLSET)' 'arm'
OBJECTS=$(OBJS)/rommain.o\
    $(OBJDIR)/narmnvrm.o\
	$(OBJS)/Spi_blram.o\
	$(OBJS)/nainet.o\
	$(OBJS)/gnuCode.o\
	$(BSPOBJS)/memtest.o\
	$(OBJS)/nawait.o\
	$(OBJS)/appconf_api.o\
	$(OBJS)/errhndlr.o\
	$(OBJS)/nagpio.o
else
OBJECTS=$(OBJS)/rommain.o\
    $(OBJDIR)/narmnvrm.o\
	$(OBJS)/Spi_blram.o\
	$(OBJS)/reset.o\
	$(OBJS)/nainet.o\
	$(OBJS)/gnuCode.o\
	$(BSPOBJS)/memtest.o\
	$(OBJS)/nawait.o\
	$(OBJS)/appconf_api.o\
	$(OBJS)/errhndlr.o\
	$(OBJS)/nagpio.o
endif

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

# list of C files used to generate dependencies
CFILES=$(BLROM_DIR)/rommain.c\
    $(COMMON_NVRAM)/narmnvrm.c\
	$(BOOTLOADER_DIR)/nainet.c\
	$(BOOTLOADER_DIR)/nawait.c\
	$(BOOTLOADER_DIR)/gnuCode.c\
	$(BSP_DIR)/appconf_api.c\
	$(BSP_CUSTOMIZE_DIR)/errhndlr.c\
	$(COMMON_GPIO)/nagpio.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)/spi_blrom.txt
#LINK_CMD_SOURCE=./../../init/$(CPU)/blrom.ldr
LINK_CUSTOMIZE=$(PLATFORMS_DIR)/$(PLATFORM)/customize.ldr
else
LINK_CMD=./spi_blrom.ld
LINK_CMD_SOURCE=./../../init/$(CPU)/spi_blrom.ldr
LINK_CUSTOMIZE=$(PLATFORMS_DIR)/$(PLATFORM)/customize.ldr
endif

# Header config file
HEADER_CONFIG=config

#spi boot header
SPI_INIT_SETTINGS=$(PLATFORMS_DIR)/$(PLATFORM)/init_settings.h

# make file
MAKEFILE=Makefile

# output file name(s)
ifeq '$(TOOLSET)' 'arm'
DEBUG_VERSION=rom.axf
else
DEBUG_VERSION=rom.elf
endif

ROM_IMAGE=temp_rom.bin
ROM_IMAGE_WITH_SPIBOOT_HEADER=$(PLATFORMS_DIR)/$(PLATFORM)/spi_rom.bin
SYMFILE=rom.sym
MAPFILE=rom.map
DEPEND=depend.mk


# goal(s)
all: $(OBJDIR) $(ROM_IMAGE) $(ROM_IMAGE_WITH_SPIBOOT_HEADER)

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

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

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

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

$(OBJS)/%.o: %.s
	@echo Assembling $<
	$(AS) $(ASFLAG) $(ASDEF) $< -o $@

ifeq '$(TOOLSET)' 'arm'
$(DEBUG_VERSION): $(OBJECTS) $(MAKEFILE) 
	$(LD) $(LINKOPT) -o $(DEBUG_VERSION) $(OBJECTS) $(NETOS_CUST_OBJS) $(PLATFORMS_DIR)/$(PLATFORM)/symbols_rom.txt \
	$(BL_LIBS) --map --symbols --list $(MAPFILE) --symdefs $(SYMFILE)
		
TEMP_ROM_IMAGE = temp_rom.bin
BIG2LITTLE = $(NETOS_BIN)/big2little 
$(ROM_IMAGE): $(DEBUG_VERSION) $(NETOS_BSPLIBPATH)/libbsp.a
	$(FE) --bin $(DEBUG_VERSION) --output $(ROM_IMAGE)
#	$(FE) --bin $(DEBUG_VERSION) --output $(TEMP_ROM_IMAGE)
#	$(BIG2LITTLE) $(TEMP_ROM_IMAGE) $(ROM_IMAGE) 
#	$(RM) $(TEMP_ROM_IMAGE)
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)
	$(NM) -n $(DEBUG_VERSION) > $(SYMFILE)

$(ROM_IMAGE): $(DEBUG_VERSION)
	$(OBJCOPY) -Obinary $(DEBUG_VERSION) $(ROM_IMAGE)

$(ROM_IMAGE_WITH_SPIBOOT_HEADER): $(DEBUG_VERSION)
#	$(SPIBOOTHDR) $(SPI_INIT_SETTINGS) $(ROM_IMAGE) $(ROM_IMAGE_WITH_SPIBOOT_HEADER)
	$(BOOTHDR) $(SPIHDRTYPE) NULL $(SPI_INIT_SETTINGS) $(ROM_IMAGE) $(ROM_IMAGE_WITH_SPIBOOT_HEADER)
	$(CHECKSIZE) $(LINKER_FILE) $(ROM_IMAGE_WITH_SPIBOOT_HEADER) SPI_BOOTLOADER_SIZE


$(LINK_CMD): $(LINK_CMD_SOURCE) $(LINK_CUSTOMIZE)
	$(LS_CPP) $(LINK_CMD_SOURCE) $(LINK_CMD)
endif


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

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


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

-include $(DEPEND)

