# options and settings
PROJECT	= Versaloon

# 
# To select your board , set HW_BOARD to one of the below boards
# Available boards:
# NanoRelease1
# MiniRC2
# MiniRC3
# MiniRC4
# MiniRelease1
# ProRC1
# STBee_Mini
# STM8S_Discovery
# STM32VL_Discovery
#
HW_BOARD = MiniRelease1
#

#
include	../../board_defs.mk
#

#
# available OPT:
# 0 - 3: low optimization - high optimization
# s: size optimization
OPT	= s

# set to yes to include USB library
INCLUDE_USB_LIB = yes

# User source files/includes/macros
# add .c source files to USR_SRCS
# add .h header files to USR_INCS
# add pre-defines to USR_DEFS
# add library directory to USR_LIBS
USR_SRCS+= $(SRCDIR)/main.c $(SRCDIR)/HW/stm32f10x_it.c
USR_SRCS+= $(SRCDIR)/HW/HW.c
USR_INCS+= -I $(SRCDIR)/HW -I $(PRJDIR)/..
#USR_DEFS+= -DADD_USER_DEFINES_HERE
#USR_LIBS+= -L./

# myString
USR_SRCS+= $(SRCDIR)/HW/Port/GCC/myString.c
USR_INCS+= -I $(SRCDIR)/HW/Port/GCC

# USB
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB/usb_desc.c $(SRCDIR)/USB_TO_XXX/USB/usb_endp.c
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB/usb_istr.c $(SRCDIR)/USB_TO_XXX/USB/usb_prop.c
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB/usb_pwr.c
USR_INCS+= -I $(SRCDIR)/USB_TO_XXX/USB

# Mass
USR_SRCS+= $(SRCDIR)/HW/Mass/mass_mal.c $(SRCDIR)/HW/Mass/memory.c $(SRCDIR)/HW/Mass/scsi_data.c
USR_SRCS+= $(SRCDIR)/HW/Mass/usb_scsi.c $(SRCDIR)/HW/Mass/usb_bot.c
USR_INCS+= -I $(SRCDIR)/HW/Mass

# Tools
USR_SRCS+= $(SRCDIR)/Tools/fifo/fifo.c
USR_INCS+= -I $(SRCDIR)/Tools/fifo

#GPIO
USR_SRCS+= $(SRCDIR)/Interfaces/GPIO/GPIO.c
USR_INCS+= -I $(SRCDIR)/Interfaces/GPIO

#USART
USR_SRCS+= $(SRCDIR)/Interfaces/USART/USART.c
USR_INCS+= -I $(SRCDIR)/Interfaces/USART

#SPI
USR_SRCS+= $(SRCDIR)/Interfaces/SPI/SPI.c
USR_INCS+= -I $(SRCDIR)/Interfaces/SPI

# JTAG
USR_SRCS+= $(SRCDIR)/Interfaces/JTAG/JTAG_TAP.c
USR_INCS+= -I $(SRCDIR)/Interfaces/JTAG

# SWD
USR_SRCS+= $(SRCDIR)/Interfaces/SWD/SWD.c
USR_INCS+= -I $(SRCDIR)/Interfaces/SWD

# SWIM
USR_SRCS+= $(SRCDIR)/Interfaces/SWIM/SWIM.c
USR_INCS+= -I $(SRCDIR)/Interfaces/SWIM

# DUSI
USR_SRCS+= $(SRCDIR)/Interfaces/DUSI/DUSI.c
USR_INCS+= -I $(SRCDIR)/Interfaces/DUSI

# MicroWire
USR_SRCS+= $(SRCDIR)/Interfaces/MicroWire/MicroWire.c
USR_INCS+= -I $(SRCDIR)/Interfaces/MicroWire

# PowerExt
USR_SRCS+= $(SRCDIR)/Interfaces/PowerExt/PowerExt.c
USR_INCS+= -I $(SRCDIR)/Interfaces/PowerExt

# IIC
USR_SRCS+= $(SRCDIR)/Interfaces/IIC/IIC.c
USR_INCS+= -I $(SRCDIR)/Interfaces/IIC

#C2
USR_SRCS+= $(SRCDIR)/Interfaces/C2/C2.c
USR_INCS+= -I $(SRCDIR)/Interfaces/C2

#ISSP
USR_SRCS+= $(SRCDIR)/Interfaces/ISSP/ISSP.c
USR_INCS+= -I $(SRCDIR)/Interfaces/ISSP

#LPC_ICP
USR_SRCS+= $(SRCDIR)/Interfaces/LPC_ICP/LPC_ICP.c
USR_INCS+= -I $(SRCDIR)/Interfaces/LPC_ICP

#MSP430_JTAG
USR_SRCS+= $(SRCDIR)/Interfaces/MSP430_JTAG/MSP430_JTAG.c
USR_INCS+= -I $(SRCDIR)/Interfaces/MSP430_JTAG

#BDM
USR_SRCS+= $(SRCDIR)/Interfaces/BDM/BDM.c
USR_INCS+= -I $(SRCDIR)/Interfaces/BDM

#PWM
USR_SRCS+= $(SRCDIR)/Interfaces/PWM/PWM.c
USR_INCS+= -I $(SRCDIR)/Interfaces/PWM

#interfaces
USR_SRCS+= $(SRCDIR)/Interfaces/interfaces.c
USR_INCS+= -I $(SRCDIR)/Interfaces

# USB_TO_XXX
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB_TO_XXX.c $(SRCDIR)/USB_TO_XXX/USB_TO_USART.c
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB_TO_SPI.c $(SRCDIR)/USB_TO_XXX/USB_TO_IIC.c
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB_TO_GPIO.c $(SRCDIR)/USB_TO_XXX/USB_TO_PWM.c
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB_TO_ADC.c $(SRCDIR)/USB_TO_XXX/USB_TO_DAC.c
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB_TO_POWER.c $(SRCDIR)/USB_TO_XXX/USB_TO_C2.c
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB_TO_ISSP.c $(SRCDIR)/USB_TO_XXX/USB_TO_LPCICP.c
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB_TO_MSP430_JTAG.c $(SRCDIR)/USB_TO_XXX/USB_TO_JTAG_HL.c
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB_TO_SWD.c $(SRCDIR)/USB_TO_XXX/USB_TO_JTAG_LL.c
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB_TO_SWIM.c $(SRCDIR)/USB_TO_XXX/USB_TO_JTAG_RAW.c
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB_TO_BDM.c $(SRCDIR)/USB_TO_XXX/USB_TO_DUSI.c
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/USB_TO_MICROWIRE.c
USR_SRCS+= $(SRCDIR)/USB_TO_XXX/CommandProcessor.c
USR_INCS+= -I $(SRCDIR)/USB_TO_XXX


# directory define
PRJDIR	= ..
SRCDIR  = ../../..
OBJ_DIR = .
STM32_LIB_DIR = $(SRCDIR)/HW/STM32F10x_Lib


# LIBSTM32_LIB
ifeq ($(TARGET_STM32),LowDensity)
  LIBSTM32_ASM_SRCS = \
    $(STM32_LIB_DIR)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld.s
  LIBSTM32_DEFS = -DUSE_STDPERIPH_DRIVER -DSTM32F10X_LD
else
  ifeq ($(TARGET_STM32),LowDensityValueLine)
    LIBSTM32_ASM_SRCS = \
      $(STM32_LIB_DIR)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld_vl.s
    LIBSTM32_DEFS = -DUSE_STDPERIPH_DRIVER -DSTM32F10X_LD_VL
  else
    ifeq ($(TARGET_STM32),MediumDensity)
	  LIBSTM32_ASM_SRCS = \
        $(STM32_LIB_DIR)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md.s
      LIBSTM32_DEFS = -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD
	else
	  ifeq ($(TARGET_STM32),MediumDensityValueLine)
	    LIBSTM32_ASM_SRCS = \
          $(STM32_LIB_DIR)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_md_vl.s
        LIBSTM32_DEFS = -DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD_VL
	  else
	    ifeq ($(TARGET_STM32),HighDensity)
		  LIBSTM32_ASM_SRCS = \
            $(STM32_LIB_DIR)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_hd.s
          LIBSTM32_DEFS = -DUSE_STDPERIPH_DRIVER -DSTM32F10X_HD
		else
		  ifeq ($(TARGET_STM32),ConnectivityLine)
		    LIBSTM32_ASM_SRCS = \
              $(STM32_LIB_DIR)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_cl.s
            LIBSTM32_DEFS = -DUSE_STDPERIPH_DRIVER -DSTM32F10X_CL
		  else
		    Invalid STM32 Target
		  endif
		endif
	  endif
	endif
  endif
endif
LIBSTM32_SRCS = \
  $(STM32_LIB_DIR)/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c \
  $(STM32_LIB_DIR)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_adc.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_bkp.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_can.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_cec.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_crc.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dac.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dbgmcu.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_dma.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_exti.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_flash.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_fsmc.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_i2c.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_iwdg.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_pwr.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rtc.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_sdio.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_spi.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_tim.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c \
  $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_wwdg.c
LIBSTM32_INCS = \
  -I $(STM32_LIB_DIR)/Libraries/STM32F10x_StdPeriph_Driver/inc \
  -I $(STM32_LIB_DIR)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x \
  -I $(STM32_LIB_DIR)/Libraries/CMSIS/CM3/CoreSupport

# LIBSTM32_USB_LIB
ifeq (${INCLUDE_USB_LIB},yes)
  LIBSTM32_SRCS+= \
    $(STM32_LIB_DIR)/Libraries/STM32_USB-FS-Device_Driver/src/usb_core.c \
	$(STM32_LIB_DIR)/Libraries/STM32_USB-FS-Device_Driver/src/usb_init.c \
	$(STM32_LIB_DIR)/Libraries/STM32_USB-FS-Device_Driver/src/usb_int.c \
	$(STM32_LIB_DIR)/Libraries/STM32_USB-FS-Device_Driver/src/usb_mem.c \
	$(STM32_LIB_DIR)/Libraries/STM32_USB-FS-Device_Driver/src/usb_regs.c \
	$(STM32_LIB_DIR)/Libraries/STM32_USB-FS-Device_Driver/src/usb_sil.c \
	$(STM32_LIB_DIR)/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_cal.c \
	$(STM32_LIB_DIR)/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_dev.c \
	$(STM32_LIB_DIR)/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_int.c \
	$(STM32_LIB_DIR)/Libraries/STM32_USB-FS-Device_Driver/src/otgd_fs_pcd.c
  LIBSTM32_INCS+= \
    -I $(STM32_LIB_DIR)/Libraries/STM32_USB-FS-Device_Driver/inc
endif


LIBSTM32_OBJS = $(addprefix $(OBJ_DIR)/, $(notdir $(LIBSTM32_SRCS:.c=.o)))
USR_OBJS = $(addprefix $(OBJ_DIR)/, $(notdir $(USR_SRCS:.c=.o)))
ASM_SRCS = $(LIBSTM32_ASM_SRCS)
ASM_OBJS = $(addprefix $(OBJ_DIR)/, $(notdir $(LIBSTM32_ASM_SRCS:.s=.o)))


TCHAIN = arm-none-eabi

INCLUDE_DIRS = -I $(PRJDIR) -I $(SRCDIR) $(LIBSTM32_INCS) $(USR_INCS)
COMPILE_OPTS = -mcpu=cortex-m3 -mthumb -mfpu=vfp 
COMPILE_OPTS+= -nostartfiles -fno-common -fomit-frame-pointer -Wall -g -O$(OPT)
LIBRARY_DIRS = $(USR_LIBS)
PREDEFINES   = $(LIBSTM32_DEFS) $(USR_DEFS)

CC = $(TCHAIN)-gcc
CFLAGS = $(COMPILE_OPTS) $(INCLUDE_DIRS) $(PREDEFINES)

CXX = $(TCHAIN)-g++
CXXFLAGS = $(COMPILE_OPTS) $(INCLUDE_DIRS) $(PREDEFINES)

AS = $(TCHAIN)-gcc
ASFLAGS = $(COMPILE_OPTS) -c

LD = $(TCHAIN)-gcc
LDFLAGS = -Wl,--gc-sections,-Map=$(PROJECT).map,-cref,-u,Reset_Handler $(INCLUDE_DIRS) $(LIBRARY_DIRS) -T $(LD_FILE)

OBJCP = $(TCHAIN)-objcopy

AR = $(TCHAIN)-ar
ARFLAGS = cr

MAIN_OUT = $(PROJECT)_GCC
MAIN_OUT_ELF = $(MAIN_OUT).elf
MAIN_OUT_BIN = $(MAIN_OUT).bin
MAIN_OUT_HEX = $(MAIN_OUT).hex

MAIN_OUT_PROG = $(MAIN_OUT_HEX)

STR_DIV	= ------------------------------------------------------------

# all

all: start gcc-info $(MAIN_OUT_ELF) $(MAIN_OUT_PROG) size flash end

# misc

start:
	@echo Start Compiling Project $(PROJECT)
	@echo User Files:
	@echo $(USR_OBJS)
	@echo STM32 Library Files:
	@echo $(LIBSTM32_OBJS)

end:
	@echo $(STR_DIV)
	@echo bye!!

gcc-info:
	@echo $(STR_DIV)
	@echo gcc version is
	@$(CC) --version
	@echo $(STR_DIV)

# main

$(MAIN_OUT_ELF): $(ASM_OBJS) $(USR_OBJS) $(LIBSTM32_OBJS)
	$(LD) $(LDFLAGS) $(ASM_OBJS) $(LIBSTM32_OBJS) $(USR_OBJS) --output $@

$(MAIN_OUT_BIN): $(MAIN_OUT_ELF)
	$(OBJCP) -O binary $< $@

$(MAIN_OUT_HEX): $(MAIN_OUT_ELF)
	$(OBJCP) -O ihex $< $@

size: $(MAIN_OUT_ELF)
	@echo $(STR_DIV)
	size $(MAIN_OUT_ELF)

flash: $(MAIN_OUT_PROG)
#	@echo $(STR_DIV)
#	vsprog -sstm32 -G -mj -I $(MAIN_OUT_HEX) -oe -owf -ovf

$(ASM_OBJS): $(ASM_SRCS)
	$(CC) -c $(CFLAGS) $^

$(LIBSTM32_OBJS): $(LIBSTM32_SRCS)
	$(CC) -c $(CFLAGS) $^

$(USR_OBJS): $(USR_SRCS)
	$(CC) -c $(CFLAGS) $^

clean:
	-rm $(USR_OBJS) $(PROJECT).map $(ASM_OBJS) $(LIBSTM32_OBJS) $(MAIN_OUT_ELF) $(MAIN_OUT_PROG)
