TOP_DIR       := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
TOOLCHAIN_DIR ?= $(TOP_DIR)vendor/libopencm3

PREFIX ?= arm-none-eabi-
CC      = $(PREFIX)gcc
LD      = $(PREFIX)gcc
OBJCOPY = $(PREFIX)objcopy
OBJDUMP = $(PREFIX)objdump
AR      = $(PREFIX)ar
FLASH   = st-flash
OPENOCD = openocd

OPTFLAGS ?= -O3
DBGFLAGS ?= -g -DNDEBUG

CFLAGS   += $(OPTFLAGS) \
            $(DBGFLAGS) \
            -std=gnu99 \
            -W \
            -Wall \
            -Wextra \
            -Wimplicit-function-declaration \
            -Wredundant-decls \
            -Wstrict-prototypes \
            -Wundef \
            -Wshadow \
            -Wpointer-arith \
            -Wformat \
            -Wreturn-type \
            -Wsign-compare \
            -Wmultichar \
            -Wformat-nonliteral \
            -Winit-self \
            -Wuninitialized \
            -Wformat-security \
            -Werror \
            -fno-common \
            -fno-exceptions \
            -fvisibility=internal \
            -ffunction-sections \
            -fdata-sections \
            -fstack-protector-all \
            -mcpu=cortex-m3 \
            -mthumb \
            -msoft-float \
            -DSTM32F2 \
            -I$(TOOLCHAIN_DIR)/include \
            -I$(TOP_DIR) \
            -I$(TOP_DIR)gen \
            -I$(TOP_DIR)vendor/trezor-crypto \
            -I$(TOP_DIR)vendor/trezor-crypto/aes \
            -I$(TOP_DIR)vendor/trezor-crypto/ed25519-donna \
            -I$(TOP_DIR)vendor/trezor-qrenc

ifdef APPVER
CFLAGS   += -DAPPVER=$(APPVER)
LDSCRIPT  = $(TOP_DIR)/memory_app_$(APPVER).ld
else
LDSCRIPT  = $(TOP_DIR)/memory.ld
endif

ifeq ($(MEMORY_PROTECT), 0)
CFLAGS += -DMEMORY_PROTECT=0
else
CFLAGS += -DMEMORY_PROTECT=1
endif

ifeq ($(DEBUG_RNG), 1)
CFLAGS += -DDEBUG_RNG=1
else
CFLAGS += -DDEBUG_RNG=0
endif

LDFLAGS  += --static \
            -Wl,--start-group \
            -lc \
            -lgcc \
            -lnosys \
            -Wl,--end-group \
            -L$(TOP_DIR) \
            -L$(TOOLCHAIN_DIR)/lib \
            -L$(TOOLCHAIN_DIR)/lib/stm32/f2 \
            -T$(LDSCRIPT) \
            -nostartfiles \
            -Wl,--gc-sections \
            -mcpu=cortex-m3 \
            -mthumb \
            -msoft-float

all: $(NAME).bin

flash: $(NAME).bin
	$(FLASH) write $(NAME).bin 0x8000000

flash2: $(NAME).hex
	$(OPENOCD) -f board/stm32f4discovery.cfg \
		-c "init" \
		-c "reset init" \
		-c "stm32f2x mass_erase 0" \
		-c "flash write_image $(NAME).hex" \
		-c "reset" \
		-c "shutdown"

upload: sign
	trezorctl firmware_update -f $(NAME).bin

sign: $(NAME).bin
	../bootloader/firmware_sign.py -f $(NAME).bin

release: $(NAME).bin
	../bootloader/firmware_sign.py -f $(NAME).bin
	cp $(NAME).bin $(NAME)-$(APPVER).bin
	chmod -x $(NAME)-$(APPVER).bin
	xxd -p $(NAME)-$(APPVER).bin | tr -d '\n' > $(NAME)-$(APPVER).bin.hex

$(NAME).bin: $(NAME).elf
	$(OBJCOPY) -Obinary $(NAME).elf $(NAME).bin

$(NAME).hex: $(NAME).elf
	$(OBJCOPY) -Oihex $(NAME).elf $(NAME).hex

$(NAME).srec: $(NAME).elf
	$(OBJCOPY) -Osrec $(NAME).elf $(NAME).srec

$(NAME).list: $(NAME).elf
	$(OBJDUMP) -S $(NAME).elf > $(NAME).list

$(NAME).elf: $(OBJS) $(LDSCRIPT) $(TOOLCHAIN_DIR)/lib/libopencm3_stm32f2.a $(TOP_DIR)/libtrezor.a
	$(LD) -o $(NAME).elf $(OBJS) -ltrezor -lopencm3_stm32f2 $(LDFLAGS)

%.o: %.c Makefile
	$(CC) $(CFLAGS) -MMD -o $@ -c $<

%.small.o: %.c Makefile
	$(CC) $(CFLAGS) -MMD -o $@ -c $<

clean:
	rm -f $(OBJS)
	rm -f *.a
	rm -f *.bin
	rm -f *.d
	rm -f *.elf
	rm -f *.hex
	rm -f *.list
	rm -f *.log
	rm -f *.srec

-include $(OBJS:.o=.d)