# --- START OF CONFIG ---------------------------------------------------
# Edit the following variables for your own needs

# toolchain configuration
PREFIX  ?= arm-none-eabi-
CC       = $(PREFIX)gcc
LD       = $(PREFIX)gcc
OBJCOPY  = $(PREFIX)objcopy
OBJDUMP  = $(PREFIX)objdump
GDB      = $(PREFIX)gdb
SIZE     = $(PREFIX)size

OOCD = openocd
OOCD_CFG = ./oocd/lnsc-2420.cfg

TOOLCHAIN_DIR ?= /usr/arm-none-eabi
OPENCM3_DIR ?= ./libopencm3

# default build configuration
# "make BUILD=release" does a release build
BUILD:=debug

# basic build flags configuration
CFLAGS+=-Wall -std=c99 -pedantic -Wextra -Wimplicit-function-declaration \
        -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes \
        -Wundef -Wshadow \
        -fno-common -ffunction-sections -fdata-sections -mcpu=cortex-m0 -mthumb \
        -mfloat-abi=soft -MD -DSTM32F0

LDFLAGS+=--static \
         -L$(OPENCM3_DIR)/lib \
         -nostartfiles -Wl,--gc-sections \
         -mthumb -mcpu=cortex-m0 -mthumb -mfloat-abi=soft

# the LD script (RAM-only does not work because the code is too large)
#LDFLAGS+=-Tldscripts/lnsc-2420-$(BUILD).ld
LDFLAGS+=-Tldscripts/lnsc-2420-release.ld

# Flags for libopencm3
CFLAGS+=-I$(OPENCM3_DIR)/include
LDFLAGS+=-L$(OPENCM3_DIR)/lib -lopencm3_stm32f0

# Flags for fxplib
CFLAGS+=-Ifxplib/include -DPOINTPOS=16
LDFLAGS+=-Lfxplib/lib/$(BUILD) -lfxp_stm32f0

# generic linking
LDFLAGS+=-Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group

# build type specific flags
CFLAGS_debug=-O0 -ggdb -DDEBUG
LDFLAGS_debug=

CFLAGS_release=-Os -ggdb
LDFLAGS_release=

# target configuration
TARGET := lnsc-2420
VERSION := 0.0.0
VCSVERSION := $(shell git rev-parse --short HEAD)

# source files for the project
SOURCE := $(shell find src/ -name '*.c')
INCLUDES := $(shell find src/ -name '*.h')

# additional dependencies for build (proper targets must be specified by user)
DEPS := build_libfxp

# default target
all: $(TARGET)

# user-specific targets
export CFLAGS
export BUILD
export PREFIX
export POSTFIX = stm32f0
build_libfxp:
	cd fxplib && $(MAKE)

# --- END OF CONFIG -----------------------------------------------------

OBJ1=$(patsubst %.c, %.o, $(SOURCE))
OBJ=$(patsubst src/%, obj/$(BUILD)/%, $(OBJ1))

VERSIONSTR="\"$(VERSION)-$(VCSVERSION)\""

CFLAGS+=-DVERSION=$(VERSIONSTR)

TARGET_BASE := bin/$(BUILD)/$(TARGET)

CFLAGS+=$(CFLAGS_$(BUILD))
LDFLAGS+=$(LDFLAGS_$(BUILD))

.PHONY show_cflags:
	@echo --- Build parameters:  ------------------------------------------
	@echo CFLAGS\=$(CFLAGS)
	@echo LDFLAGS\=$(LDFLAGS)
	@echo SOURCE\=$(SOURCE)
	@echo -----------------------------------------------------------------

$(TARGET): show_cflags $(TARGET_BASE).elf $(TARGET_BASE).hex \
	         $(TARGET_BASE).lss $(TARGET_BASE).bin
	@$(SIZE) $(TARGET_BASE).elf
	@echo ">>> $(BUILD) build complete."

$(TARGET_BASE).elf: $(DEPS) $(OBJ) $(INCLUDES) Makefile
	@echo Linking $@ ...
	@mkdir -p $(shell dirname $@)
	@$(LD) -o $(TARGET_BASE).elf $(OBJ) $(LDFLAGS)

$(TARGET_BASE).hex: $(TARGET_BASE).elf
	@echo "Generating $@ ..."
	@$(OBJCOPY) -Oihex $< $@

$(TARGET_BASE).bin: $(TARGET_BASE).elf
	@echo "Generating $@ ..."
	@$(OBJCOPY) -Obinary $< $@

$(TARGET_BASE).lss: $(TARGET_BASE).elf
	@echo "Generating $@ ..."
	@$(OBJDUMP) -S $< > $@

obj/$(BUILD)/%.o: src/%.c $(INCLUDES) Makefile
	@echo "Compiling $< ..."
	@mkdir -p $(shell dirname $@)
	@$(CC) -c $(CFLAGS) -o $@ $<

clean:
	rm -f $(TARGET_BASE).elf
	rm -f $(TARGET_BASE).hex
	rm -f $(TARGET_BASE).lss
	rm -f $(TARGET_BASE).bin
	rm -f $(OBJ)

program: program_jlink

reset: reset_jlink

/tmp/jlink_prog_script: Makefile
	echo "Device STM32F030C8" > $@
	echo "connect" >> $@
	echo "S" >> $@
	echo "4000" >> $@
	echo "loadfile $(TARGET_BASE).hex" >> $@
	echo "r" >> $@
	echo "g" >> $@
	echo "exit" >> $@

/tmp/jlink_rst_script: Makefile
	echo "Device STM32F030C8" > $@
	echo "connect" >> $@
	echo "S" >> $@
	echo "4000" >> $@
	echo "r" >> $@
	echo "g" >> $@
	echo "exit" >> $@

program_jlink: /tmp/jlink_prog_script $(TARGET_BASE).hex
	JLinkExe </tmp/jlink_prog_script

reset_jlink: /tmp/jlink_rst_script
	JLinkExe </tmp/jlink_rst_script

program_release: $(TARGET_BASE).hex
	$(OOCD) -f $(OOCD_CFG) \
		-c "init" \
		-c "reset halt" \
		-c "flash write_image erase $(TARGET_BASE).hex" \
		-c "resume 0x08000000" \
		-c "shutdown"

program_debug: $(TARGET_BASE).hex
	$(OOCD) -f $(OOCD_CFG) \
		-c "init" \
		-c "reset halt" \
		-c "load_image $(TARGET_BASE).hex" \
		-c "resume `arm-none-eabi-readelf -h bin/debug/$(TARGET).elf | awk '/Entry/{print $$4;}'`" \
		-c "shutdown"

debug: $(TARGET_BASE).hex
	JLinkGDBServerCLExe -device STM32F030K6 -if SWD