# Donghui OTA Build System
# ==========================
# Targets:
#   make bootloader     - Build bootloader binary
#   make app_a          - Build App A firmware (0x08008000)
#   make app_b          - Build App B firmware (0x08044000)
#   make encrypt        - Encrypt firmware for OTA
#   make all            - Build everything
#   make clean          - Clean build artifacts

# Toolchain
TOOLCHAIN ?= arm-none-eabi-
CC   = $(TOOLCHAIN)gcc
AS   = $(TOOLCHAIN)gcc -x assembler-with-cpp
LD   = $(TOOLCHAIN)gcc
OBJCOPY = $(TOOLCHAIN)objcopy
SIZE = $(TOOLCHAIN)size

# Common flags
CPU_FLAGS = -mcpu=cortex-m4 -mthumb -mfloat-abi=soft
DEFINES = -DSTM32G474xx -DUSE_HAL_DRIVER
INCLUDES = -I../fw_bootloader/inc -I../fw_app/inc

CFLAGS = $(CPU_FLAGS) $(DEFINES) $(INCLUDES) \
         -Os -g -Wall -Wextra -Werror=implicit-function-declaration \
         -ffunction-sections -fdata-sections -std=c99

LDFLAGS = $(CPU_FLAGS) -T -Wl,--gc-sections -Wl,--print-gc-sections
ASFLAGS = $(CPU_FLAGS) -g -c

# Source files
BOOTLOADER_SRC = \
    ../fw_bootloader/src/startup_bootloader.s \
    ../fw_bootloader/src/bootloader.c \
    ../fw_bootloader/src/crypto.c \
    ../fw_bootloader/src/spi_flash.c

BOOTLOADER_LD = ../fw_bootloader/bootloader.ld

APP_SRC = \
    startup_app.s \
    main.c \
    ../fw_app/src/ota_agent.c \
    ../fw_app/src/at_driver.c \
    ../fw_bootloader/src/crypto.c \
    ../fw_bootloader/src/spi_flash.c

APP_LD = ../fw_app/app.ld

# ==================== Tools ====================

PYTHON = python3
ENCRYPT_TOOL = ../tools/encrypt_tool.py
KEY_DIR = ../tools/keys

# ==================== Build Rules ====================

.PHONY: all bootloader app_a app_b encrypt clean

all: bootloader app_a app_b encrypt

# ---- Bootloader ----
bootloader: fw_bootloader/build/bootloader.hex fw_bootloader/build/bootloader.bin

fw_bootloader/build/bootloader.elf: $(BOOTLOADER_SRC) $(BOOTLOADER_LD)
	@mkdir -p fw_bootloader/build
	$(CC) $(CFLAGS) $(BOOTLOADER_SRC) -T $(BOOTLOADER_LD) -o $@ $(LDFLAGS)
	$(SIZE) $@

fw_bootloader/build/bootloader.hex: fw_bootloader/build/bootloader.elf
	$(OBJCOPY) -O ihex $< $@

fw_bootloader/build/bootloader.bin: fw_bootloader/build/bootloader.elf
	$(OBJCOPY) -O binary $< $@

# ---- App A ----
app_a: fw_app/build/app_a.bin
APP_BASE = 0x08008000

fw_app/build/app_a.elf: $(APP_SRC) $(APP_LD)
	@mkdir -p fw_app/build
	$(CC) $(CFLAGS) -D__APP_BASE__=$(APP_BASE) $(APP_SRC) \
	    -T $(APP_LD) -o $@ $(LDFLAGS)
	$(SIZE) $@

fw_app/build/app_a.hex: fw_app/build/app_a.elf
	$(OBJCOPY) -O ihex $< $@

fw_app/build/app_a.bin: fw_app/build/app_a.elf
	$(OBJCOPY) -O binary $< $@

# ---- App B ----
app_b: fw_app/build/app_b.bin

fw_app/build/app_b.elf: $(APP_SRC) $(APP_LD)
	@mkdir -p fw_app/build
	$(CC) $(CFLAGS) -D__APP_BASE__=0x08044000 $(APP_SRC) \
	    -T $(APP_LD) -o $@ $(LDFLAGS)
	$(SIZE) $@

fw_app/build/app_b.bin: fw_app/build/app_b.elf
	$(OBJCOPY) -O binary $< $@

# ---- Encrypt ----
encrypt: fw_app/build/firmware.enc fw_app/build/firmware.ota

fw_app/build/firmware.enc: fw_app/build/app_a.bin
	$(PYTHON) $(ENCRYPT_TOOL) encrypt -i $< -o $@ -k $(KEY_DIR)

fw_app/build/firmware.ota: fw_app/build/app_a.bin
	$(PYTHON) $(ENCRYPT_TOOL) pack -i $< -o $@ -k $(KEY_DIR)

# ---- Keys ----
keys:
	$(PYTHON) $(ENCRYPT_TOOL) keygen -o $(KEY_DIR)

# ---- Clean ----
clean:
	rm -rf fw_bootloader/build
	rm -rf fw_app/build
