##/*-------------------------------------------------------------------
##		Created by REALTEK  
##--------------------------------------------------------------------*/


CROSS=mips-linux-

OUTDIR	= ./Output

CC	= $(CROSS)gcc

AS	= $(CROSS)as

AR	= $(CROSS)ar crs

LD	= $(CROSS)ld

#OBJCOPY = $(CROSS)objcopy
OBJCOPY = objcopy

OBJDUMP	= $(CROSS)objdump

IMG2BIN	= $(CROSS)img2bin

NM	= $(CROSS)nm

RM	= rm


TOOLCFLAGS	=

TOOLLDFLAGS	= -n

OPT	=  -G 0

TEXT	=

INCLUDES	= -I. -I./include
CFLAGS	= -mips1 -g  -fomit-frame-pointer -nostdinc -fno-pic -mno-abicalls $(TOOLCFLAGS) $(OPT) $(INCLUDES) \
          -D__KERNEL__\
          -Dlinux\
          -O 

ifneq "$(strip $(JUMP_ADDR))" ""
CFLAGS += -DJUMP_ADDR=$(JUMP_ADDR)
endif

ifeq ($(RTL8186),1)
CFLAGS += -DRTL8186=1
endif


CFLAGSW = $(CFLAGS) -DWRAPPER -DRTL8186

LDFLAGS = -nostdlib  -T./ld.script  -EB   --static
WLDFLAGS = -nostdlib  -T./ldw.script  -EB   --static

ASFLAGS	=  -D__ASSEMBLY__  -x assembler-with-cpp -G 0

CRT	=

LIBS	=

.SUFFIXES : .s .S .c .o .out .nm .img .sr .sre .text .bin .scr

#wboot(wrapped) means boot code will be wrapped in this code
all:
	@echo "No rules to make target. You should choose:"
	@echo "make { boot | wboot }  boot for general, wboot for wrapped boot code"

.PHONY: banner
banner:	cr-output
	@echo  \#define BOOT_CODE_TIME \"`date "+%Y.%m.%d-%H:%M%z"`\" > ./banner/mk_time	 	
	
cr-output:
	@if [ ! -d Output ]; then \
	mkdir Output; \
	fi


wboot: banner $(OUTDIR)/wboot.out
	$(NM)	./Output/wboot.out | sort > ./Output/wboot.nm
	#$(OBJCOPY) -g -Obinary ./Output/wboot.out ./Output/boot.img
	mips-linux-objdump -h -S ./Output/wboot.out > ./Output/wboot.text


#all :	"$(OUTDIR)" boot.out
boot: banner $(OUTDIR)/boot.out
	$(NM)	./Output/boot.out | sort > ./Output/boot.nm
	$(OBJCOPY) -g -Obinary ./Output/boot.out ./Output/boot.img
	mips-linux-objdump -h -S ./Output/boot.out > ./Output/boot.text
#david
	cp ./Output/boot.img ../btcode/boot.img -f

#"$(OUTDIR)" :

##########################head.o must be the first.
OBJFILES	= ./Output/head.o ./Output/eth_tftpd.o ./Output/irq.o ./Output/inthandler.o ./Output/setup.o ./Output/main.o  ./Output/traps.o ./Output/vsprintf.o $(OUTDIR)/init.o $(OUTDIR)/string.o  $(OUTDIR)/strtol.o $(OUTDIR)/strtoul.o $(OUTDIR)/ctool.o $(OUTDIR)/misc.o $(OUTDIR)/flash.o $(OUTDIR)/ctype.o 

ifeq ($(RTL8186),1)
OBJFILES += ./Output/ethInt_8186.o
else
OBJFILES += ./Output/ethInt_8181.o
endif

##Assembly file######################################################
$(OUTDIR)/inthandler.o: ./init/inthandler.S 
	$(CC) -c $(CFLAGS) $(ASFLAGS) -o $(OUTDIR)/inthandler.o ./init/inthandler.S
$(OUTDIR)/head.o: ./arch/mips/kernel/head.S 
	$(CC) -c $(CFLAGS) $(ASFLAGS) -o $(OUTDIR)/head.o ./arch/mips/kernel/head.S
#####################################################################
##C file#############################################################
$(OUTDIR)/irq.o: ./init/irq.c 
	$(CC) -c $(CFLAGS) -o $(OUTDIR)/irq.o ./init/irq.c

#$(OUTDIR)/time.o: ./init/time.c 
#	$(CC) -c $(CFLAGS) -o $(OUTDIR)/time.o ./init/time.c

$(OUTDIR)/eth_tftpd.o: ./init/eth_tftpd.c 
	$(CC) -c $(CFLAGS) -o $(OUTDIR)/eth_tftpd.o ./init/eth_tftpd.c

$(OUTDIR)/ethInt_8181.o: ./init/ethInt_8181.c 
	$(CC) -c $(CFLAGS) -o $(OUTDIR)/ethInt_8181.o ./init/ethInt_8181.c

$(OUTDIR)/ethInt_8186.o: ./init/ethInt_8186.c 
	$(CC) -c $(CFLAGS) -o $(OUTDIR)/ethInt_8186.o ./init/ethInt_8186.c
#$(OUTDIR)/sdram.o: ./init/sdram.c 
#	$(CC) -c $(CFLAGS) -o $(OUTDIR)/sdram.o ./init/sdram.c
#####################################################################

$(OUTDIR)/setup.o: ./arch/mips/kernel/setup.c 
	$(CC) -c $(CFLAGS) -o $(OUTDIR)/setup.o ./arch/mips/kernel/setup.c

$(OUTDIR)/main.o: ./init/main.c 
	$(CC) -c $(CFLAGS) -o $(OUTDIR)/main.o ./init/main.c

$(OUTDIR)/traps.o: ./arch/mips/kernel/traps.c 
	$(CC) -c $(CFLAGS) -o $(OUTDIR)/traps.o ./arch/mips/kernel/traps.c

$(OUTDIR)/vsprintf.o: ./io/vsprintf.c 
	$(CC) -c $(CFLAGS)  -o $(OUTDIR)/vsprintf.o ./io/vsprintf.c

$(OUTDIR)/init.o: ./io/init.c 
	$(CC) -c $(CFLAGS)  -o $(OUTDIR)/init.o ./io/init.c

$(OUTDIR)/string.o: ./io/string.c 
	$(CC) -c $(CFLAGS)  -o $(OUTDIR)/string.o ./io/string.c

$(OUTDIR)/strtol.o: ./io/strtol.c 
	$(CC) -c $(CFLAGS)  -o $(OUTDIR)/strtol.o ./io/strtol.c

$(OUTDIR)/strtoul.o: ./io/strtoul.c 
	$(CC) -c $(CFLAGS) -o $(OUTDIR)/strtoul.o ./io/strtoul.c

$(OUTDIR)/ctool.o: ./io/ctool.c 
	$(CC) -c $(CFLAGS) -o $(OUTDIR)/ctool.o ./io/ctool.c

$(OUTDIR)/misc.o: ./io/misc.c 
	$(CC) -c $(CFLAGS) -o $(OUTDIR)/misc.o ./io/misc.c

$(OUTDIR)/monitor.o: ./monitor/monitor.c 
	$(CC) -c $(CFLAGS) -o $(OUTDIR)/monitor.o ./monitor/monitor.c

$(OUTDIR)/wmonitor.o: ./monitor/monitor.c 
	$(CC) -c $(CFLAGSW) -o $(OUTDIR)/wmonitor.o ./monitor/monitor.c

$(OUTDIR)/flash.o: ./flash/flash.c 
	$(CC) -c $(CFLAGS)  -o $(OUTDIR)/flash.o ./flash/flash.c
$(OUTDIR)/nand.o: ./nand/nand.c 
	$(CC) -c $(CFLAGS)  -o $(OUTDIR)/nand.o ./nand/nand.c
$(OUTDIR)/ctype.o: ./io/ctype.c 
	$(CC) -c $(CFLAGS) -o $(OUTDIR)/ctype.o ./io/ctype.c

$(OUTDIR)/boot.out :	 $(OBJFILES) $(OUTDIR)/monitor.o
	$(LD) $(LDFLAGS) $(OBJFILES) $(OUTDIR)/monitor.o $(LIBS) -o $(OUTDIR)/boot.out

$(OUTDIR)/temp.o: temp.c
	$(CC) -c $(CFLAGS) -o $(OUTDIR)/temp.o temp.c
	mips-linux-objcopy --add-section .btimg=$(OUTDIR)/boot $(OUTDIR)/temp.o

$(OUTDIR)/wboot.out :	  $(OBJFILES) $(OUTDIR)/temp.o $(OUTDIR)/wmonitor.o 
	$(LD) $(WLDFLAGS) $(OBJFILES) $(OUTDIR)/temp.o $(OUTDIR)/wmonitor.o $(LIBS) -o $(OUTDIR)/wboot.out

compile :	 $(OBJFILES)

.scr.bin:
	$(IMG2BIN) "$(OUTDIR)\$<" "$(OUTDIR)\$@"

.s.out:
	$(CC) $(CFLAGS) $(ASFLAGS) $(LDFLAGS) -o "$(OUTDIR)\$@" $<

.S.out:
	$(CC) $(CFLAGS) $(LDFLAGS) -o "$(OUTDIR)\$@" $< $(LIBS)

.c.out:
	$(CC) $(CFLAGS) $(LDFLAGS) -o "$(OUTDIR)\$@" $< $(LIBS)

.s.o:
	$(CC) -c $(CFLAGS) $(ASFLAGS) -o "$(OUTDIR)\$@" $<

.S.o:
	$(CC) -c $(CFLAGS) -o "$(OUTDIR)\$@" $<

.c.o:
	$(CC) -c $(CFLAGS) -o "$(OUTDIR)\$@" $<

.cpp.o:
	$(CC) -c $(CFLAGS) -o "$(OUTDIR)\$@" $<

.out.nm:
	$(NM) -B -n "$(OUTDIR)\$<" > "$(OUTDIR)\$@"

.out.img:
	$(OBJCOPY) -O binary "$(OUTDIR)\$<" "$(OUTDIR)\$@"

.out.text:
	$(OBJDUMP) -h -S -l --show-raw-insn "$(OUTDIR)\$<" > "$(OUTDIR)\$@"

.img.bin:
	$(IMG2BIN) "$(OUTDIR)\$<" "$(OUTDIR)\$@"

clean :
	$(RM) -f $(OBJFILES)
	$(RM) -f $(OUTDIR)/boot.out $(OUTDIR)/boot.text $(OUTDIR)/boot.nm $(OUTDIR)/boot.img
	$(RM) -f $(OUTDIR)/boot.cdb $(OUTDIR)/monitor.o $(OUTDIR)/wmonitor.o $(OUTDIR)/wboot.*
	$(RM) -f $(OUTDIR)/ethInt*.o $(OUTDIR)/temp.o


