--- /dev/null
+MCU := atmega328p
+CLOCK := 16000000
+CC := avr-gcc
+CFLAGS := -Wall -Os -ffunction-sections -fdata-sections -mmcu=$(MCU) -DF_CPU=$(CLOCK) $(patsubst %,-D%,$(FEATURES)) -I../common
+LDFLAGS := -Os -Wl,--gc-sections -mmcu=$(MCU)
+AVRDUDE := avrdude
+OBJCOPY := avr-objcopy
+ifeq ($(MCU),atmega168)
+BAUD := 19200
+else
+BAUD := 57600
+endif
+
+VPATH := ../common
+
+help:
+ @echo "Targets:"
+ @echo " %.hex: Build firmware from %.c"
+ @echo " upload-%: Upload firmware to AVR"
+ @echo " clean: Clean all built files"
+ @echo
+ @echo "Variables:"
+ @echo " MCU: Microcontroller type"
+ @echo " Arduino Duemilanove = atmega328p (default)"
+ @echo " Arduino Mini = atmega168"
+
+%.hex: %.elf
+ $(OBJCOPY) -O ihex $< $@
+
+%.elf: %.o
+ $(CC) $(LDFLAGS) -o $@ $^
+
+%.o: %.c
+ $(CC) -c $(CFLAGS) -o $@ $<
+
+upload-%: %.hex
+ $(AVRDUDE) -p$(MCU) -carduino -P/dev/ttyUSB0 -b$(BAUD) -D -Uflash:w:$<:i
+
+clean:
+ $(RM) *.hex
+ $(RM) *.elf
+ $(RM) *.o