diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..81db34d --- /dev/null +++ b/Makefile @@ -0,0 +1,27 @@ +# Project makefile (depends on firmware/Makefile) +# =============================================== +FIRMWARE_DIR = firmware + +.PHONY: all clean build firmware firmware-clean firmware-build firmware-flash + + +# Default target (build firmware) +all: firmware + +# Shortcuts +clean: firmware-clean +build: firmware-build + + +# Firmware +# -------- +firmware: firmware-build + +firmware-clean: + make -C $(FIRMWARE_DIR) clean + +firmware-build: + make -C $(FIRMWARE_DIR) build + +firmware-flash: + make -C $(FIRMWARE_DIR) flash diff --git a/firmware/Makefile b/firmware/Makefile index ee9c4a0..b04be63 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -1,10 +1,10 @@ -################ -# CONFIGURATION -################ +# Makefile for the EEPROM programmer microcontroller firmware +# =========================================================== # Compiler and tools CC = avr-gcc OBJCOPY = avr-objcopy +AVRDUDE = avrdude # Compiler and linker flags CFLAGS = -Wall -std=c11 -Os @@ -14,63 +14,62 @@ LDFLAGS = GCC_MCU = atmega16a AVRDUDE_PARTNO = m16 AVRDUDE_PROGRAMMER = usbtiny +AVRDUDE_CMD = $(AVRDUDE) -p $(AVRDUDE_PARTNO) -c $(AVRDUDE_PROGRAMMER) -# Make target and object files -TARGET = build/eepprog -OBJECTS = build/main.o build/uart.o build/eeprom.o build/protocol.o -HEADERS = src/config.h src/BitIO.h src/uart.h src/eeprom.h src/protocol.h +# Directories +SOURCE_DIR = src +BUILD_DIR = build + +# Make targets and object files +SOURCE_FILES = $(wildcard $(SOURCE_DIR)/*.c) +HEADER_FILES = $(wildcard $(SOURCE_DIR)/*.h) +OBJECT_FILES = $(patsubst $(SOURCE_DIR)/%.c,$(BUILD_DIR)/%.o,$(SOURCE_FILES)) + +TARGET_NAME = eepprog +TARGET_ELF = $(BUILD_DIR)/$(TARGET_NAME).elf +TARGET_HEX = $(BUILD_DIR)/$(TARGET_NAME).hex + +.PHONY: all clean build flash writeflash readfuse writefuse # Default target (build hex file) -all: hex +all: build -################ -# BUILD TARGETS -################ - -# Shortcuts for build targets -hex: $(TARGET).hex -elf: $(TARGET).elf - -# Convert elf binary to ihex format -$(TARGET).hex: $(TARGET).elf - $(OBJCOPY) -O ihex $(TARGET).elf $(TARGET).hex - -# Elf binary -$(TARGET).elf: $(OBJECTS) - $(CC) -mmcu=$(GCC_MCU) $(LDFLAGS) -o $(TARGET).elf $(OBJECTS) - -# Object files -build/%.o: src/%.c $(HEADERS) - @mkdir -p build/ - $(CC) -mmcu=$(GCC_MCU) $(CFLAGS) -c -o $@ $< - - -############## -# PROGRAMMING -############## - -# Program controller -program: writeflash - -writeflash: $(TARGET).hex - sudo avrdude -p $(AVRDUDE_PARTNO) -c $(AVRDUDE_PROGRAMMER) -U flash:w:$(TARGET).hex - -readfuse: - sudo avrdude -p $(AVRDUDE_PARTNO) -c $(AVRDUDE_PROGRAMMER) -U lfuse:r:m -U hfuse:r:m - -writefuse: - sudo avrdude -p $(AVRDUDE_PARTNO) -c $(AVRDUDE_PROGRAMMER) -U lfuse:w:0xef:m -U hfuse:w:0xd9:m - - -################ -# OTHER TARGETS -################ +# General +# ------- # Clean generated files clean: - rm -f $(OBJECTS) $(TARGET).elf $(TARGET).hex + rm -rf $(BUILD_DIR) -.PHONY: all hex elf program writeflash clean +# Build firmware +# -------------- +build: $(TARGET_HEX) +# Compile C code to object files +$(BUILD_DIR)/%.o: $(SOURCE_DIR)/%.c $(HEADER_FILES) + @mkdir -p $(BUILD_DIR) + $(CC) -mmcu=$(GCC_MCU) $(CFLAGS) -c -o $@ $< + +# Link object files to ELF binary +$(TARGET_ELF): $(OBJECT_FILES) + $(CC) -mmcu=$(GCC_MCU) $(LDFLAGS) -o $(TARGET_ELF) $(OBJECT_FILES) + +# Convert ELF binary to ihex format (which can be flashed to the microcontroller) +$(TARGET_HEX): $(TARGET_ELF) + $(OBJCOPY) -O ihex $(TARGET_ELF) $(TARGET_HEX) + + +# Flash firmware +# -------------- +flash: writeflash + +writeflash: $(TARGET_HEX) + $(AVRDUDE_CMD) -U flash:w:$(TARGET_HEX) + +readfuse: + $(AVRDUDE_CMD) -U lfuse:r:m -U hfuse:r:m + +writefuse: + $(AVRDUDE_CMD) -U lfuse:w:0xef:m -U hfuse:w:0xd9:m