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 $<