#-------------------------------------------------------------------------------
#		User-modifiable options
#-------------------------------------------------------------------------------

# SERIAL NUMBER OF THE DONGLE
ORDER_NUMBER = 0x00000001
# SET STARTING READER ID
START_READER_ID = 0x00000600
# SET LICENSE COUNT
START_LICENSE_COUNT	= 500

# Coding
# idt = iDTRONIC
CODING = idt

# LICENSE DONGLE
APPLICATION = IDT_LICENSE_DONGLE

# SET SECURITY BIT 
SECURITY_BIT = 1

READER_TYPE = 0xFFFFFFFF
HARDWARE_VERSION = 0x00000001
SOFTWARE_VERSION = 0x00000001

# USE EEPROM
# NO:  0
# YES: 1
EEPROM = 0

# Trace level used for compilation
# (can be overriden by adding TRACE_LEVEL=#number to the command-line)
# TRACE_LEVEL_DEBUG      5
# TRACE_LEVEL_INFO       4
# TRACE_LEVEL_WARNING    3
# TRACE_LEVEL_ERROR      2
# TRACE_LEVEL_FATAL      1
# TRACE_LEVEL_NO_TRACE   0
TRACE_LEVEL = 0

# Chip & board used for compilation
# (can be overriden by adding CHIP=chip and BOARD=board to the command-line)
CHIP  = at91sam7s256
BOARD = at91sam7s-ek

CHIPSHORT  = SAM7S
BOARDSHORT = SAM7S-EK

# Optimization level, put in comment for debugging: http://www.network-theory.co.uk/docs/gccintro/gccintro_49.html
#OPTIMIZATION = -Os

# AT91 library directory
AT91LIB = src/at91lib

ifeq ($(SECURITY_BIT), 1)
	SEC = SECURE
endif
ifeq ($(SECURITY_BIT), 0)
	SEC = NOT_SECURE
endif

ifeq ($(EEPROM), 1)
	EEP_MEMORY = EEPROM
endif
ifeq ($(EEPROM), 0)
	EEP_MEMORY = NO_EEPROM
endif

# Output file basename
OUTPUT = $(APPLICATION)-NR_$(ORDER_NUMBER)-ID_$(START_READER_ID)-COUNT_$(START_LICENSE_COUNT)-$(SEC)-$(EEP_MEMORY)

# Compile for all memories available on the board (this sets $(MEMORIES))
include $(AT91LIB)/boards/$(BOARD)/board.mak

# Output directories
BIN = bin
OBJ = $(BIN)/obj

#-------------------------------------------------------------------------------
#		Defaults
#-------------------------------------------------------------------------------

ifndef EEPROM
	EEPROM = 0
endif

APP_DEFINES = -DCODING_$(CODING)

APP_DEFINES += -DORDER_NUMBER=$(ORDER_NUMBER)
APP_DEFINES += -DREADER_TYPE=$(READER_TYPE)
APP_DEFINES += -DHARDWARE_VERSION=$(HARDWARE_VERSION)
APP_DEFINES += -DSOFTWARE_VERSION=$(SOFTWARE_VERSION)

APP_DEFINES += -DSTART_READER_ID=$(START_READER_ID)
APP_DEFINES += -DSTART_LICENSE_COUNT=$(START_LICENSE_COUNT)

APP_DEFINES += -DSECURITY_BIT=$(SECURITY_BIT)
APP_DEFINES += -DEEPROM=$(EEPROM)

#-------------------------------------------------------------------------------
#		Tools
#-------------------------------------------------------------------------------

# Tool suffix when cross-compiling
CROSS = arm-elf-

# Compilation tools
CC = $(CROSS)gcc
SIZE = $(CROSS)size
STRIP = $(CROSS)strip
OBJCOPY = $(CROSS)objcopy

# Flags
INCLUDES = -I$(AT91LIB)/boards/$(BOARD) -I$(AT91LIB)/peripherals -I$(AT91LIB)/usb
INCLUDES += -I$(AT91LIB)/components -I$(AT91LIB) 
INCLUDES += -Isrc 



CFLAGS = -Wall -mlong-calls -ffunction-sections 
#-mthumb
CFLAGS += -g $(OPTIMIZATION) $(INCLUDES) -D$(CHIP) -D$(BOARDSHORT) -DTRACE_LEVEL=$(TRACE_LEVEL) $(APP_DEFINES)
ASFLAGS = -g $(OPTIMIZATION) $(INCLUDES) -D$(CHIP) -D__ASSEMBLY__
LDFLAGS = -g $(OPTIMIZATION) -nostartfiles -Wl,--gc-sections

#-------------------------------------------------------------------------------
#		Files
#-------------------------------------------------------------------------------

# Directories where source files can be found
PERIPH 	= $(AT91LIB)/peripherals
BOARDS 	= $(AT91LIB)/boards
UTILITY = $(AT91LIB)/utility
USB		= $(AT91LIB)/usb
MEMORY 	= $(AT91LIB)/memories
DRIVERS	= $(AT91LIB)/drivers

VPATH += $(UTILITY)
VPATH += $(PERIPH)/dbgu 
VPATH += $(PERIPH)/pio
VPATH += $(PERIPH)/pit
VPATH += $(PERIPH)/aic
VPATH += $(PERIPH)/usart
VPATH += $(PERIPH)/pmc
VPATH += $(PERIPH)/rstc
VPATH += $(PERIPH)/efc 
VPATH += $(PERIPH)/tc
VPATH += $(PERIPH)/twi
VPATH += $(DRIVERS)/twi
VPATH += $(BOARDS)/$(BOARD) $(BOARDS)/$(BOARD)/$(CHIP)

VPATH += $(MEMORY)/flash

VPATH += $(USB)/common/core
VPATH += $(USB)/common/cdc
VPATH += $(USB)/common/hid
VPATH += $(USB)/device/core
VPATH += $(USB)/device/cdc-serial
VPATH += $(USB)/device/hid-transfer

VPATH += src
VPATH += src/hal
VPATH += src/hal/flags
VPATH += src/hal/comm/cdc
VPATH += src/core/crypt
VPATH += src/core/licenseMgr
VPATH += src/core/protocol
VPATH += src/core/random
VPATH += src/core/report
VPATH += src/core/ringBuffer
VPATH += src/core/store

# Objects built from C source files
C_OBJECTS = main.o
C_OBJECTS += stdio.o
C_OBJECTS += dbgu.o pio.o aic.o pmc.o led.o pio_it.o
C_OBJECTS += board_memories.o board_lowlevel.o
C_OBJECTS += rand.o math.o

C_OBJECTS += readerHostProtocol.o
C_OBJECTS += readerHostProtocolComm.o
C_OBJECTS += readerHostProtocolImpl.o

C_OBJECTS += aes256.o
C_OBJECTS += licenseMgr.o
C_OBJECTS += licenseProtocol.o
C_OBJECTS += random.o
C_OBJECTS += report.o
C_OBJECTS += buffer.o
C_OBJECTS += store.o

C_OBJECTS += flags.o

C_OBJECTS += flashd_efc.o efc.o

C_OBJECTS += commCDC.o
C_OBJECTS += CDCDSerialDriver.o CDCDSerialDriverDescriptors.o
C_OBJECTS += CDCSetControlLineStateRequest.o CDCLineCoding.o
C_OBJECTS += USBD_OTGHS.o USBD_UDP.o USBD_UDPHS.o USBDDriver.o
C_OBJECTS += USBDCallbacks_Initialized.o
C_OBJECTS += USBDCallbacks_Reset.o
C_OBJECTS += USBDCallbacks_Resumed.o
C_OBJECTS += USBDCallbacks_Suspended.o
C_OBJECTS += USBDDriverCb_CfgChanged.o
C_OBJECTS += USBDDriverCb_IfSettingChanged.o
C_OBJECTS += USBSetAddressRequest.o USBGenericDescriptor.o USBInterfaceRequest.o
C_OBJECTS += USBGenericRequest.o USBGetDescriptorRequest.o 
C_OBJECTS += USBSetConfigurationRequest.o USBFeatureRequest.o
C_OBJECTS += USBEndpointDescriptor.o USBConfigurationDescriptor.o

ifeq ($(EEPROM),1)
	C_OBJECTS += twi.o twid.o eeprom.o
endif

# Objects built from Assembly source files
ASM_OBJECTS = board_cstartup.o

# Append OBJ and BIN directories to output filename
OUTPUT := $(BIN)/$(OUTPUT)

#-------------------------------------------------------------------------------
#		Rules
#-------------------------------------------------------------------------------

all: start $(BIN) $(OBJ) $(MEMORIES) end

$(BIN) $(OBJ):
	mkdir $@

define RULES
C_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(C_OBJECTS))
ASM_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(ASM_OBJECTS))

$(1): $$(ASM_OBJECTS_$(1)) $$(C_OBJECTS_$(1))
	@echo -------------------------------------------------------
	$(CC) $(LDFLAGS) -T"$(AT91LIB)/boards/$(BOARD)/$(CHIP)/$$@.lds" -o $(OUTPUT)-$$@.elf $$^
	@echo
	$(OBJCOPY) -O binary $(OUTPUT)-$$@.elf $(OUTPUT)-$$@.bin
	@echo
	$(SIZE) -d $$^ $(OUTPUT)-$$@.elf
	@echo -------------------------------------------------------
	@echo 

$$(C_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.c Makefile
	@echo Building $$<
	$(CC) $(CFLAGS) -D$(1) -c -o $$@ $$<
	@echo
	
$$(ASM_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.S Makefile
	@echo Building $$<
	$(CC) $(ASFLAGS) -D$(1) -c -o $$@ $$<
	@echo 
	
endef

$(foreach MEMORY, $(MEMORIES), $(eval $(call RULES,$(MEMORY))))

start:
	@echo -------------------------------------------------------
	@echo --- Starting build for $(OUTPUT)
	@echo 
	
end:
	@echo
	@echo --- Build for $(OUTPUT) OK
	@echo -------------------------------------------------------

clean:
	-rm -f $(OBJ)/*.o $(BIN)/*.bin $(BIN)/*.elf
