MCU = attiny45
MCUP = t45
FORMAT = ihex
TARGET = main
OPT = s
SRC = main.c

CFLAGS = -g -O$(OPT) \
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
-Wall -Wstrict-prototypes -DF_CPU=128000 -std=gnu99 \
-Wa,-adhlns=$(<:.c=.lst) \
$(patsubst %,-I%,$(EXTRAINCDIRS))

ASFLAGS = -Wa,-adhlns=$(<:.S=.lst),-gstabs 
LDFLAGS = -Wl,-Map=$(TARGET).map,--cref -lm

AVRDUDE_PROG = stk500v2
AVRDUDE_PORT = /dev/ttyACM0
AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
AVRDUDE_FLAGS = -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROG) -p $(MCUP)

SHELL = sh
CC = avr-gcc
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
AVRDUDE = avrdude
REMOVE = rm -f
COPY = cp

HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) -A $(TARGET).elf

OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) 
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)

all: begin $(TARGET).elf $(TARGET).hex

# FLASH es EEPROM egetes
# Program the device.  
program: $(TARGET).hex $(TARGET).eep
	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)

# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
	$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)

# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
	$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@

# Compile: create object files from C source files.
%.o : %.c
	$(CC) -c $(ALL_CFLAGS) $< -o $@

load: 	$(TARGET).hex
	avrdude -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROG) -p $(MCUP) -U flash:w:$(TARGET).hex

# Fuse high byte:
# 0xdf = 1 1 0 1   1 1 1 1 <-- BODLEVEL0 (BOD level is disabled)
#        ^ ^ ^ ^   ^ ^ ^------ BODLEVEL1
#        | | | |   | +-------- BODLEVEL2
#        | | | |   + --------- EESAVE (don't preserve EEPROM over chip erase)
#        | | | +-------------- WDTON (WDT if disabled)
#        | | +---------------- SPIEN (allow serial programming)
#        | +------------------ DWEN (DebugWire is disabled)
#        +-------------------- RSTDISBL (reset pin is enabled)
# Fuse low byte:
# 0xe4 = 1 1 1 0   0 1 0 0
#        ^ ^ \ /   \--+--/
#        | |  |       +------- CKSEL 3..0 (internal RC oscillator)
#        | |  +--------------- SUT 1..0 (crystal osc, BOD enabled)
#        | +------------------ CKOUT (Clock output is disabled)
#        +-------------------- CLKDIV8 (Divide clock/8 is enabled)

readfuse:
	avrdude -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROG) -p $(MCUP) -U hfuse:r:high.txt:h -U lfuse:r:low.txt:h

writefuse:
	avrdude -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROG) -p $(MCUP) -U hfuse:w:0xdf:m -U lfuse:w:0xe4:m

# Target: clean project.
clean:
	$(REMOVE) $(TARGET).hex
	$(REMOVE) $(TARGET).eep
	$(REMOVE) $(TARGET).obj
	$(REMOVE) $(TARGET).cof
	$(REMOVE) $(TARGET).elf
	$(REMOVE) $(TARGET).map
	$(REMOVE) $(TARGET).obj
	$(REMOVE) $(TARGET).a90
	$(REMOVE) $(TARGET).sym
	$(REMOVE) $(TARGET).lnk
	$(REMOVE) $(TARGET).lss
	$(REMOVE) $(OBJ)
	$(REMOVE) $(LST)
	$(REMOVE) $(SRC:.c=.s)
	$(REMOVE) $(SRC:.c=.d)
	$(REMOVE) *.bak

.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \
 clean clean_list program

