#########################################################################
# Makefile for NativeSample_TestEvent
# To build
# - Change TARGET_ROOT
# - Change NETMF_PK_ROOT
# - Change Toolchain path
# To change memory location
# - Change LDSCRIPT
TARGET	= NativeSample_TestEvent
TARGET_ROOT = C:/MicroFrameworkPK_v4_2_NativeSamples/NativeSamples/TestEvent
NETMF_PK_ROOT = C:/MicroFrameworkPK_v4_2_NativeSamples
SOLUTION_NAME = WXMP3PLCD_FM3
PLATFORM_NAME = PLATFORM_ARM_WXMP3PLCD_FM3
PROCESSOR_NAME = PLATFORM_ARM_FM3
TARGET_LOCATION = TARGETLOCATION_FLASH
CPUFLAG = cortex-m3 -mthumb
ENDIAN = LITTLE_ENDIAN
VERSION_MAJOR = 4
VERSION_MINOR = 2
VERSION_BUILD = 0
VERSION_REVISION = 0
EnableUSB = 1
#EnableLCD_DST2401PH = 1

#########################################################################
# toolchain path
CC = C:/CodeSourcery/arm-2010q1-188/bin/arm-none-eabi-gcc
LD = C:/CodeSourcery/arm-2010q1-188/bin/arm-none-eabi-ld
AS = C:/CodeSourcery/arm-2010q1-188/bin/arm-none-eabi-as
OBJCOPY = C:/CodeSourcery/arm-2010q1-188/bin/arm-none-eabi-objcopy
OBJDUMP = C:/CodeSourcery/arm-2010q1-188/bin/arm-none-eabi-objdump
SIZE = C:/CodeSourcery/arm-2010q1-188/bin/arm-none-eabi-size
NM = C:/CodeSourcery/arm-2010q1-188/bin/arm-none-eabi-nm
REMOVE = C:/CodeSourcery/arm-2010q1-188/bin/cs-rm -f
GCCLIB1 = C:/CodeSourcery/arm-2010q1-188/arm-none-eabi/lib/thumb2
GCCLIB2 = C:/CodeSourcery/arm-2010q1-188/lib/gcc/arm-none-eabi/4.4.1/thumb2

#########################################################################
# C flags
CFLAGS	= -ffunction-sections -fomit-frame-pointer -fdollars-in-identifiers -fshort-wchar -fno-exceptions  -funsigned-char
CFLAGS += -mcpu=$(CPUFLAG)
CFLAGS += -D$(PLATFORM_NAME) -D$(PROCESSOR_NAME) -D$(ENDIAN) -D$(TARGET_LOCATION)
CFLAGS += -DVERSION_MAJOR=$(VERSION_MAJOR) -DVERSION_MINOR=$(VERSION_MINOR) -DVERSION_BUILD=$(VERSION_BUILD) -DVERSION_REVISION=$(VERSION_REVISION)

#########################################################################
# CPP flags
CPPFLAGS = -Wno-invalid-offsetof -Wno-attributes 
CPPFLAGS += -ffunction-sections -fomit-frame-pointer -fdollars-in-identifiers -fshort-wchar -fno-exceptions  -funsigned-char
CPPFLAGS += -mcpu=$(CPUFLAG)
CPPFLAGS += -D$(PLATFORM_NAME) -D$(PROCESSOR_NAME) -D$(ENDIAN) -D$(TARGET_LOCATION)
CPPFLAGS += -DVERSION_MAJOR=$(VERSION_MAJOR) -DVERSION_MINOR=$(VERSION_MINOR) -DVERSION_BUILD=$(VERSION_BUILD) -DVERSION_REVISION=$(VERSION_REVISION)

#########################################################################
# library configuration
LIBS	= -lc
LIBS	+= -lgcc
LDSCRIPT = NativeSample_scatterfile.ldf
LDFLAG = --no-wchar-size-warning

#########################################################################
OUTDIR	= ./out

#########################################################################
# directories for source files 
SRCDIRS	= .
SRCDRIS += $(TARGET_ROOT)
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Drivers/Display/stubs
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Drivers/Display/autoLCD/
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Drivers/Display/TextFonts/Font8x15
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Drivers/FS/FAT
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Drivers/Stubs/Processor/stubs_cache
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Drivers/Stubs/Processor/stubs_EBIU
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Drivers/Stubs/Processor/stubs_WATCHDOG
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Drivers/Stubs/Processor/stubs_USB
SRCDIRS += $(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3/DeviceCode/CortexM3/GlobalLock/GNU_S
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3/DeviceCode/FM3_Bootstrap
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3/DeviceCode/FM3_FLASH
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3/DeviceCode/FM3_GPIO
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3/DeviceCode/FM3_INTC
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3/DeviceCode/FM3_Power
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3/DeviceCode/FM3_SPI
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3/DeviceCode/FM3_Time
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3/DeviceCode/FM3_USART
ifdef EnableUSB
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3/DeviceCode/FM3_USB
endif
SRCDIRS += $(NETMF_PK_ROOT)/DeviceCode/Initialization
SRCDIRS += $(NETMF_PK_ROOT)/DeviceCode/pal/AsyncProcCall
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/BlockStorage
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/COM
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/COM/usart
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/COM/sockets/stubs
ifdef EnableUSB
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/COM/usb
else
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/COM/usb/stubs
endif
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/configuration
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/events
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/fs
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/heap
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/SimpleHeap
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/SimpleHeap_config
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/time
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/tinycrt
SRCDIRS	+= $(NETMF_PK_ROOT)/DeviceCode/pal/watchdog/stubs
SRCDIRS	+= $(NETMF_PK_ROOT)/Solutions/$(SOLUTION_NAME)/NativeSample
SRCDIRS	+= $(NETMF_PK_ROOT)/Solutions/$(SOLUTION_NAME)/DeviceCode/Blockstorage/addDevices
SRCDIRS	+= $(NETMF_PK_ROOT)/Solutions/$(SOLUTION_NAME)/DeviceCode/Blockstorage/InternalFlash
SRCDIRS	+= $(NETMF_PK_ROOT)/Solutions/$(SOLUTION_NAME)/DeviceCode/DebuggerPort
SRCDIRS	+= $(NETMF_PK_ROOT)/Solutions/$(SOLUTION_NAME)/DeviceCode/Display
SRCDIRS	+= $(NETMF_PK_ROOT)/Solutions/$(SOLUTION_NAME)/DeviceCode/FS
SRCDIRS	+= $(NETMF_PK_ROOT)/Solutions/$(SOLUTION_NAME)/DeviceCode/Init
SRCDIRS	+= $(NETMF_PK_ROOT)/Solutions/$(SOLUTION_NAME)/DeviceCode/USB
SRCDIRS	+= $(NETMF_PK_ROOT)/Support/crc
ASMDIRS	= $(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3/DeviceCode/CortexM3/TinyHal/GNU_S/

#########################################################################
# directories for include files 
INCS	= -I$(TARGET_ROOT)
INCS	+= -I$(NETMF_PK_ROOT)/CLR/Include
INCS	+= -I$(NETMF_PK_ROOT)/DeviceCode
INCS	+= -I$(NETMF_PK_ROOT)/DeviceCode/Drivers/Display/autoLCD/
INCS	+= -I$(NETMF_PK_ROOT)/DeviceCode/Include
INCS    += -I$(NETMF_PK_ROOT)/DeviceCode/Initialization
INCS	+= -I$(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3
INCS	+= -I$(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3/DeviceCode/
INCS	+= -I$(NETMF_PK_ROOT)/DeviceCode/Targets/Native/FM3/DeviceCode/FM3_FLASH
INCS	+= -I$(NETMF_PK_ROOT)/Solutions/$(SOLUTION_NAME)
INCS	+= -I$(NETMF_PK_ROOT)/Solutions/$(SOLUTION_NAME)/DeviceCode/Init
#INCS	+= -I$(NETMF_PK_ROOT)/Solutions/$(SOLUTION_NAME)/NativeSample
INCS	+= -I$(NETMF_PK_ROOT)/Support/Include
VPATH	= $(SRCDIRS) $(ASMDIRS) $(OUTDIR)

#########################################################################
# source file names
CSRCS	= 
CPPSRCS	= NativeSample_TestEvent.cpp
CPPSRCS += tinyhal_modified.cpp
ifdef EnableLCD_DST2401PH
CPPSRCS += autoLCD_driver.cpp
CPPSRCS += autoLCD_functions.cpp
CPPSRCS += font8x15.cpp
else
CPPSRCS += stubs_config.cpp
CPPSRCS += stubs_functions.cpp
endif
CPPSRCS	+= FAT_File.cpp
CPPSRCS	+= FAT_FileHandle.cpp
CPPSRCS	+= FAT_FS.cpp
CPPSRCS	+= FAT_FS_Utility.cpp
CPPSRCS	+= FAT_LogicDisk.cpp
CPPSRCS	+= FAT_MemoryManager.cpp
CPPSRCS	+= FAT_SectorCache.cpp
CPPSRCS	+= fs.cpp
CPPSRCS	+= stubs_functions_cache.cpp
CPPSRCS	+= stubs_functions_EBIU.cpp
CPPSRCS += stubs_functions_WATCHDOG.cpp
#ifndef EnableUSB
#CPPSRCS	+= stubs_functions_USB.cpp
#endif
CPPSRCS += SmartPtr_cortex.cpp
CPPSRCS += Aborts.cpp
CPPSRCS += FM3_bootstrap.cpp
CPPSRCS += FM3_Flash_driver.cpp
CPPSRCS += FM3_GPIO_functions.cpp
CPPSRCS += FM3_intc_functions.cpp
CPPSRCS += FM3_Power_functions.cpp
CPPSRCS += FM3_SPI_functions.cpp
CPPSRCS += FM3_time_functions.cpp
CPPSRCS += FM3_usart_functions.cpp
ifdef EnableUSB
CPPSRCS += FM3_usb_functions.cpp
CPPSRCS += FM3_usb_hw.cpp
CPPSRCS += debug_sci.cpp
CPPSRCS += debug_printf.cpp
endif
CPPSRCS += OEM_Model_SKU_NetworkID.cpp
CPPSRCS	+= Completions.cpp
CPPSRCS	+= Continuations.cpp
CPPSRCS += blockstoragelist.cpp
CPPSRCS	+= ComDirector.cpp
CPPSRCS	+= usart.cpp
CPPSRCS	+= sockets_stubs.cpp
ifdef EnableUSB
CPPSRCS	+= usb.cpp
else
CPPSRCS	+= usb_config.cpp
CPPSRCS	+= usb_stubs.cpp
endif
CPPSRCS += ConfigHelper.cpp
CPPSRCS	+= events.cpp
CPPSRCS	+= fs_pal.cpp
CPPSRCS += heap.cpp
CPPSRCS += SimpleHeap.cpp
CPPSRCS += SimpleHeap_config.cpp
CPPSRCS	+= time_driver.cpp
CPPSRCS	+= time_functions.cpp
CPPSRCS	+= tinycrt.cpp
CPPSRCS	+= Watchdog_stubs.cpp
CPPSRCS += Bl_addDevices.cpp
CPPSRCS += InternalFlash_Bl_Config.cpp
ifdef EnableLCD_DST2401PH
CPPSRCS += Display_DST2401PH_config.cpp
CPPSRCS += Display_DST2401PH_functions.cpp
endif
CPPSRCS += DebuggerPort_SSL.cpp
CPPSRCS += FS_config.cpp
CPPSRCS += IO_Init.cpp
ifdef EnableUSB
CPPSRCS += usb_config.cpp
endif
CPPSRCS += CRC.cpp
ASMSRCS = FirstEntry.s
ASMSRCS	+= IDelayLoop.s
ASMSRCS	+= VectorsHandlers.s

#########################################################################
# object files
OBJS	= $(CSRCS:%.c=%.o) $(CPPSRCS:%.cpp=%.o)
ASMOBJS	= $(ASMSRCS:%.s=%.o) 
OBJSDIR	= $(addprefix $(OUTDIR)/, $(OBJS))
ASMOBJSDIR	= $(addprefix $(OUTDIR)/, $(ASMOBJS))

#########################################################################
# make rules

all: $(ASMOBJS) $(OBJS) $(LDSCRIPT)
	$(LD) $(LDFLAG) -Map $(OUTDIR)/$(TARGET).map -T $(LDSCRIPT) $(ASMOBJSDIR) $(OBJSDIR) -L$(GCCLIB1) -L$(GCCLIB2) $(LIBS) -o $(OUTDIR)/$(TARGET).elf
	$(OBJCOPY) -S -j ER_FLASH -j ER_RAM_RO -j ER_RAM_RW -O srec --gap-fill 0 --srec-forceS3 $(OUTDIR)/$(TARGET).elf $(OUTDIR)/$(TARGET).srec
	$(OBJCOPY) -S -j ER_FLASH -j ER_RAM_RO -j ER_RAM_RW -O ihex --gap-fill 0 $(OUTDIR)/$(TARGET).elf $(OUTDIR)/$(TARGET).ihex
#	$(OBJCOPY) -O binary $(OUTDIR)/$(TARGET).elf $(OUTDIR)/$(TARGET).bin
#	$(OBJDUMP) -D $(OUTDIR)/$(TARGET).elf > $(OUTDIR)/$(TARGET).txt	

.c.o:
	$(CC) $(CFLAGS) -g -c $(INCS) $< -o $(OUTDIR)/$@

.cpp.o:
	$(CC) $(CPPFLAGS) -g -c $(INCS) $< -o $(OUTDIR)/$@

.s.o: 
	$(AS) $< -g -o $(OUTDIR)/$@

clean:
	rm $(OUTDIR)/*.o $(OUTDIR)/$(TARGET).elf $(OUTDIR)/$(TARGET).map $(OUTDIR)/$(TARGET).srec $(OUTDIR)/$(TARGET).ihex
#	rm $(OUTDIR)/*.o $(OUTDIR)/$(TARGET).elf $(OUTDIR)/$(TARGET).map $(OUTDIR)/$(TARGET).bin $(OUTDIR)/$(TARGET).txt
