# Minimal Makefile for STM32F407 SPI test with SEGGER RTT
#
# Toolchain: arm-none-eabi-gcc
#
# Uses:
#  - standalone stm32f4xx-hal-driver repository
#  - CMSIS device pack for STM32F4
#  - CMSIS Core
#  - SEGGER RTT

HAL_REPO            ?= stm32f4xx-hal-driver
CMSIS_CORE_REPO     ?= cmsis_core
CMSIS_DEVICE_F4_REPO ?= cmsis_device_f4

HAL_DIR    := $(HAL_REPO)
CMSIS_CORE := $(CMSIS_CORE_REPO)/CMSIS/Core
CMSIS_DEV  := $(CMSIS_DEVICE_F4_REPO)

CC      := arm-none-eabi-gcc
AS      := arm-none-eabi-gcc
OBJCOPY := arm-none-eabi-objcopy
SIZE    := arm-none-eabi-size

TARGET  := bootloader
BUILD   := build

APP_OBJDIR   := $(BUILD)/app
RTT_OBJDIR   := $(BUILD)/rtt
HAL_OBJDIR   := $(BUILD)/hal
CMSIS_OBJDIR := $(BUILD)/cmsis

CFLAGS := -mcpu=cortex-m4 \
          -mthumb \
          -O0 \
          -g3 \
          -ffunction-sections \
          -fdata-sections \
          -Wall \
          -Wextra \
          -Wno-unused-parameter \
          -std=gnu11 \
          -DSTM32F407xx \
          -DUSE_HAL_DRIVER \
	  -DUSER_VECT_TAB_ADDRESS \
	  -DVECT_TAB_SRAM

INCLUDES := -Iinclude \
            -Iinc \
            -Ihal_conf \
            -IRTT \
            -I$(HAL_DIR)/Inc \
            -I$(CMSIS_CORE)/Include \
            -I$(CMSIS_DEV)/Include

LDSCRIPT := STM32F417IG_SRAM.ld

LDFLAGS := -T$(LDSCRIPT) \
           -Wl,--gc-sections \
           --specs=nosys.specs


# --------------------------------------------------------------------------
# Sources
# --------------------------------------------------------------------------

APP_SRCS_C := \
	src/main.c \
	src/common.c \
	src/spi_transport_backend.c

RTT_SRCS_C := \
	RTT/SEGGER_RTT.c \
	RTT/SEGGER_RTT_printf.c

HAL_SRCS_C := \
	$(HAL_DIR)/Src/stm32f4xx_hal.c \
	$(HAL_DIR)/Src/stm32f4xx_hal_gpio.c \
	$(HAL_DIR)/Src/stm32f4xx_hal_dma.c \
        $(HAL_DIR)/Src/stm32f4xx_hal_spi.c \
	$(HAL_DIR)/Src/stm32f4xx_hal_flash.c \
	$(HAL_DIR)/Src/stm32f4xx_hal_flash_ex.c \
	$(HAL_DIR)/Src/stm32f4xx_hal_cortex.c \
	$(HAL_DIR)/Src/stm32f4xx_hal_rcc.c

CMSIS_SRCS_C := \
	$(CMSIS_DEV)/Source/Templates/system_stm32f4xx.c

SRCS_S := \
	src/startup_stm32f40_41xxx.s


# --------------------------------------------------------------------------
# Object files
# --------------------------------------------------------------------------

APP_OBJS := \
	$(patsubst src/%.c,$(APP_OBJDIR)/%.o,$(APP_SRCS_C))

RTT_OBJS := \
	$(patsubst RTT/%.c,$(RTT_OBJDIR)/%.o,$(RTT_SRCS_C))

HAL_OBJS := $(addprefix $(HAL_OBJDIR)/,$(notdir $(HAL_SRCS_C:.c=.o)))

CMSIS_OBJS := \
	$(addprefix $(CMSIS_OBJDIR)/,$(notdir $(CMSIS_SRCS_C:.c=.o)))

STARTUP_OBJS := \
	$(patsubst %.s,$(BUILD)/%.o,$(SRCS_S))

OBJS := \
	$(APP_OBJS) \
	$(RTT_OBJS) \
	$(HAL_OBJS) \
	$(CMSIS_OBJS) \
	$(STARTUP_OBJS)

DEPS := $(OBJS:.o=.d)


# --------------------------------------------------------------------------
# Targets
# --------------------------------------------------------------------------

.PHONY: all clean size

all: $(BUILD)/$(TARGET).elf \
     $(BUILD)/$(TARGET).bin \
     size


# --------------------------------------------------------------------------
# Application
# --------------------------------------------------------------------------

$(APP_OBJDIR)/%.o: src/%.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -c $< -o $@


# --------------------------------------------------------------------------
# SEGGER RTT
# --------------------------------------------------------------------------

$(RTT_OBJDIR)/%.o: RTT/%.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -c $< -o $@


# --------------------------------------------------------------------------
# HAL
# --------------------------------------------------------------------------

$(HAL_OBJDIR)/%.o: $(HAL_DIR)/Src/%.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -c $< -o $@


# --------------------------------------------------------------------------
# CMSIS
# --------------------------------------------------------------------------

$(CMSIS_OBJDIR)/%.o: $(CMSIS_DEV)/Source/Templates/%.c
	@mkdir -p $(dir $@)
	$(CC) $(CFLAGS) $(INCLUDES) -MMD -MP -c $< -o $@


# --------------------------------------------------------------------------
# Startup
# --------------------------------------------------------------------------

$(BUILD)/%.o: %.s
	@mkdir -p $(dir $@)
	$(AS) $(CFLAGS) -c $< -o $@


# --------------------------------------------------------------------------
# Link
# --------------------------------------------------------------------------

$(BUILD)/$(TARGET).elf: $(OBJS)
	$(CC) $(CFLAGS) $(OBJS) $(LDFLAGS) -o $@


# --------------------------------------------------------------------------
# Binary
# --------------------------------------------------------------------------

$(BUILD)/$(TARGET).bin: $(BUILD)/$(TARGET).elf
	$(OBJCOPY) -O binary $< $@


# --------------------------------------------------------------------------
# Size
# --------------------------------------------------------------------------

size: $(BUILD)/$(TARGET).elf
	$(SIZE) $<


# --------------------------------------------------------------------------
# Clean
# --------------------------------------------------------------------------

clean:
	rm -rf $(BUILD)


# --------------------------------------------------------------------------
# Dependencies
# --------------------------------------------------------------------------

-include $(DEPS)
