PROGRAM = i2c_sniffer
PORT = /dev/ttyUSB*
UPLOAD_RATE = 19200
AVRDUDE_PROGRAMMER = stk500v1
MCU = atmega324p
F_CPU = 20000000L
SERIAL_BAUD = 115200L

##############################################################################

OUT_BIN_DIR = bin/
SRC = main.c
FORMAT = ihex
SERIAL_OUT = serial_out.txt

# Compiler Options.
OPT = -Os -mcall-prologues
CDEFS = -DF_CPU=$(F_CPU) -DSERIAL_BAUD=$(SERIAL_BAUD)
CSTANDARD = -std=gnu99
#CDEBUG = -g$(DEBUG)
CWARN = -Wall -Wstrict-prototypes
#CTUNING = -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CFLAGS = $(CDEBUG) $(CDEFS) $(CINCS) $(OPT) $(CWARN) $(CSTANDARD)
LDFLAGS = -lm

# Programming support using avrdude. Settings and variables.
AVRDUDE_PORT = $(PORT)
AVRDUDE_WRITE_FLASH = -U flash:w:$(OUT_BIN_DIR)$(PROGRAM).hex
AVRDUDE_FLAGS = -V -F \
-p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) \
-b $(UPLOAD_RATE)

# Program settings
CC = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
AR  = avr-ar
SIZE = avr-size
NM = avr-nm
AVRDUDE = avrdude
MKDIR = mkdir
REMOVE = rm -rf

# Define all object files.
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) 

# Define all listing files.
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)

# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. $(ASFLAGS)

##############################################################################

.PHONY: mkbindir clean serial

# Default target.
all: hex disasm stats

mkbindir:
	@if [ ! -d $(OUT_BIN_DIR) ]; then $(MKDIR) $(OUT_BIN_DIR); fi

hex: mkbindir $(PROGRAM).hex

disasm: mkbindir $(PROGRAM).elf
	$(OBJDUMP) -S $(OUT_BIN_DIR)$(PROGRAM).elf > $(OUT_BIN_DIR)$(PROGRAM).S

stats: $(PROGRAM).elf
	$(OBJDUMP) -h $(OUT_BIN_DIR)$(PROGRAM).elf
	$(SIZE) $(OUT_BIN_DIR)$(PROGRAM).elf
	
serial:
	stty -F $(PORT) cs8 $(SERIAL_BAUD) ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts
	tail -f $(PORT) | tee $(SERIAL_OUT)
	
%.elf: main.c
	$(CC) $(ALL_CFLAGS) -o $(OUT_BIN_DIR)$@ main.c $(LDFLAGS)

%.hex: %.elf
	$(OBJCOPY) -O $(FORMAT) $(OUT_BIN_DIR)$< $(OUT_BIN_DIR)$@
	
# Program the device.  
upload: $(PROGRAM).hex
	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH)

# Target: clean project.
clean:
	$(REMOVE) $(OUT_BIN_DIR)

