2026-05-15 14:15:17 +03:00

104 lines
3.1 KiB
Makefile

TARGET=firmware
# === Directories path =============================================================================
SRC_DIR=./src
OBJ_DIR=./obj
ASM_DIR=./asm
OUT_DIR=./build
# ==================================================================================================
# === Device configuration =========================================================================
MCU=atmega8a
FUSE_HIGH=0xd9
FUSE_LOW=0xff
# ==================================================================================================
# === Toolchain ====================================================================================
OBJCOPY=avr-objcopy
OBJDUMP=avr-objdump
SIZE=avr-size
CC=avr-gcc
# ==================================================================================================
# === Programmer options ===========================================================================
# MPLAB SNAP: snap_jtag (or isp)
# USBtiny: usbtiny
AVRDUDE_DEVICE=m8a
AVRDUDE_PROGRAMMER=snap_isp
AVRDUDE_SPEED=128kHz
AVRDUDE_FLAGS=-c $(AVRDUDE_PROGRAMMER) -p $(AVRDUDE_DEVICE) -B $(AVRDUDE_SPEED)
# ==================================================================================================
# === Compiler options =============================================================================
CC_FLAGS=-Wall -Wextra
ifeq ($(DEBUG), true)
CC_FLAGS+=-ggdb -Og
CC_FLAGS+=-Wl,-Map=$(OUT_DIR)/$(TARGET).map
CC_FLAGS+=-DDEBUG_BUILD=TRUE
else
CC_FLAGS+=-Os
endif
CC_FLAGS+=-mmcu=$(MCU)
CC_FLAGS+=-std=c11
# ==================================================================================================
OBJS=$(subst $(SRC_DIR),$(OBJ_DIR),$(patsubst %.c,%.o,$(wildcard $(SRC_DIR)/*.c)))
ASMS=$(subst $(SRC_DIR),$(ASM_DIR),$(patsubst %.c,%.S,$(wildcard $(SRC_DIR)/*.c)))
.PHONY: all asms hex clean size prog_flash prog_test prog_read_eep prog_read_fuses prog_flash_fuses
all: hex size
hex: $(OUT_DIR)/$(TARGET).hex
asms: $(ASMS)
prog_flash:
avrdude $(AVRDUDE_FLAGS) -V -U flash:w:"$(OUT_DIR)/$(TARGET).hex":i
prog_test:
avrdude $(AVRDUDE_FLAGS)
prog_read_eep:
avrdude $(AVRDUDE_FLAGS) -U eeprom:r:"$(OUT_DIR)/eeprom.hex":i
prog_read_fuses:
avrdude $(AVRDUDE_FLAGS) -U hfuse:r:"$(OUT_DIR)/h_fuse.hex":h -U lfuse:r:"$(OUT_DIR)/l_fuse.hex":h
prog_flash_fuses:
avrdude $(AVRDUDE_FLAGS) -U hfuse:w:$(FUSE_HIGH):m -U lfuse:w:$(FUSE_LOW):m
$(OUT_DIR)/$(TARGET).hex: $(OUT_DIR)/$(TARGET).elf $(OUT_DIR)/$(TARGET).S
$(OBJCOPY) -R .eeprom -R .fuse -R .lock -R .signature -O ihex $< $@
$(OUT_DIR)/$(TARGET).elf: $(OBJS) | $(OUT_DIR)
$(CC) $(CC_FLAGS) $^ -o $@
$(OUT_DIR)/$(TARGET).S: $(OBJS) | $(OUT_DIR)
$(OBJDUMP) -D $(OUT_DIR)/$(TARGET).elf > $@
## Compile to object files
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(SRC_DIR)/%.h | $(OBJ_DIR)
$(CC) $(CC_FLAGS) -c $(SRC_DIR)/$(patsubst %.o,%.c, $(notdir $@)) -o $@
## Compile to assembler files (optional)
$(ASM_DIR)/%.S: $(SRC_DIR)/%.c $(SRC_DIR)/%.h | $(ASM_DIR)
$(CC) -S -fverbose-asm $(CC_FLAGS) -c $(SRC_DIR)/$(patsubst %.S,%.c, $(notdir $@)) -o $@
$(OUT_DIR):
mkdir $@
$(OBJ_DIR):
mkdir $@
$(ASM_DIR):
mkdir $@
clean:
rm -rf $(OBJ_DIR)
rm -rf $(OUT_DIR)
rm -rf $(ASM_DIR)
size: $(OUT_DIR)/$(TARGET).elf
$(SIZE) --mcu=$(MCU) --format=avr $<