
PROJ_NAME= spi_ethernet
SRCS = $(PROJ_NAME).c ftoa.c usart.c lcd.c i2c.c
SRCS += etherShield/enc28j60.c etherShield/ip_arp_udp_tcp.c etherShield/dnslkup.c etherShield/websrv_help_functions.c
SRCS += stubs.c  lib/system_stm32f4xx.c
LDSCRIPT = stm32_flash.ld
XTAL = 8000000ULL 
PLL_M = 8
PLL_N = 336
PLL_P = 2
PLL_Q = 7
###################################################

#@@@@@support different optimizations for different files!
PREFIX=arm-none-eabi
CC=$(PREFIX)-gcc
CXX = $(PREFIX)-g++
OBJCOPY=$(PREFIX)-objcopy --strip-unneeded
OBJDUMP=$(PREFIX)-objdump
NM = $(PREFIX)-nm
LINKER = $(CC)
#LINKER = $(CXX)

#-O2 and sometimes even -O1 crashes with hard floats!!!
CFLAGS  = -g -O1 -D ARM_SOURCE4 -Wall -T$(LDSCRIPT) 
CFLAGS += -mlittle-endian -mthumb -mcpu=cortex-m4 -mthumb-interwork
CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
CFLAGS += -fsingle-precision-constant
CFLAGS += -D XTAL=$(XTAL) -D PLL_M=$(PLL_M) -D PLL_N=$(PLL_N) -D PLL_P=$(PLL_P) -D PLL_Q=$(PLL_Q)

CXXFLAGS = CFLAGS

LDFLAGS = -Wl,-Map=$(PROJ_NAME).map,--cref
AS = $(CC) $(CFLAGS)  -c

###################################################

vpath %.c src
vpath %.a lib

ROOT=$(shell pwd)

CFLAGS += -Iinc -Ilib -Ilib/inc 
CFLAGS += -Ilib/inc/core -Ilib/inc/peripherals 

OBJS = $(SRCS:.c=.o) lib/startup_stm32f4xx.o
ASMS = $(SRCS:.c=.s)

###################################################

.c.s:
%.s : %.c
	$(CC) $(CFLAGS) -S $< -o $*.s

.c.ch:
%.ch : %.c
	$(CC) $(CFLAGS) -E $< -o $*.ch


.PHONY: lib proj flash ram

all: lib proj

tar:
	make clean
	tar -hzvcf stm32f4_discovery.tar.gz Makefile *.c *.h *.ld *.cc lib etherShield

ram: $(PROJ_NAME).elf
	st-util&
	echo target remote localhost:4242
	echo load 
	echo c
	arm-none-eabi-gdb $(PROJ_NAME).elf

flash: $(PROJ_NAME).bin
	st-flash write $(PROJ_NAME).bin 0x8000000

#flash via serial system bootloader
PORTCONTROLTTY=/dev/ttyUSB1
PROGTTY=/dev/ttyUSB0
#flashing cable: FT2232H
#ttyUSB0 = TX,RX for bootloader
#ttyUSB1 = BOOT=DTR, RESET=RTS
#connector 5-PIN: 1=boot0, 2=reset, 3=GND, 4=TX(STMUSART1=PA9), 5=RX(STMUSART1=PA10)
#If USART1 is used to connect to the bootloader: the USART3_RX (PC11 and
#PB11), CAN2_RX (PB05), OTG_FS_DM (PA11) and OTG_FS_DP (PA12) pins
#have to be kept at a high or low level and must not be left floating during the
#detection phase.


upload: $(PROJ_NAME).hex
#	portcontrol -D $(PORTCONTROLTTY) -d .01 -W 310
	stm32flash -b 115200 -w $(PROJ_NAME).hex -v -g 0x0 $(PROGTTY)
#	portcontrol -D $(PORTCONTROLTTY) -d .01 -W 2

lib:
	echo CFLAGS=$(CFLAGS) >lib/Makefile.tmp
	$(MAKE) -C lib

proj: 	$(PROJ_NAME).elf

$(PROJ_NAME).elf: $(OBJS) $(LDSCRIPT)
	$(LINKER) $(CFLAGS) $(LDFLAGS) $(OBJS) -o $@ -Llib  -lstm32f4 -lgcc -lm -lc
	$(OBJCOPY) -O ihex $(PROJ_NAME).elf $(PROJ_NAME).hex

$(PROJ_NAME).bin:	$(PROJ_NAME).elf
	$(OBJCOPY) -O binary $(PROJ_NAME).elf $(PROJ_NAME).bin

$(PROJ_NAME).asm:	$(PROJ_NAME).elf
	$(OBJDUMP) -d  $(PROJ_NAME).elf > $(PROJ_NAME).asm

$(PROJ_NAME).nm:	$(PROJ_NAME).elf
	$(NM) -C -S $(PROJ_NAME).elf > $(PROJ_NAME).nm
	
clean:
	rm -f  *.elf *.bin *.map *.asm *.nm *.hex *.ch *.[ao] */*.[ao] */*/*.[ao] 
