
CC = avr-gcc
OBJCOPY=avr-objcopy
OBJDUMP = avr-objdump
MCU = at90usb646
MCU_FREQ = 16000000
F_CPU = 16000000
F_CLOCK = 16000000
TARGET = ghetto_drum
LUFA_DIR=.

# CDEFS largely needed for LUFA
#CDEFS = -DF_CPU=$(MCU_FREQ)UL
#CDEFS += -DUSB_DEVICE_ONLY -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED)"
#CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DNO_STREAM_CALLBACKS

CDEFS  = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD)
CDEFS += -DUSE_NONSTANDARD_DESCRIPTOR_NAMES -DUSB_DEVICE_ONLY
CDEFS += -DFIXED_CONTROL_ENDPOINT_SIZE=8 
CDEFS += -DUSE_SINGLE_DEVICE_CONFIGURATION
CDEFS += -DUSE_FLASH_DESCRIPTORS
CDEFS += -DUSE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"

CFLAGS=-g $(CDEFS) -Os -mmcu=$(MCU) -Wall \
	-I$(LUFA_DIR) \
	-std=gnu99 \
	-funsigned-char -funsigned-bitfields -ffunction-sections -fpack-struct -fshort-enums \
	-finline-limit=20 -Wstrict-prototypes -Wundef

LUFA_SRC = $(LUFA_DIR)/LUFA/Drivers/USB/LowLevel/LowLevel.c         \
	$(LUFA_DIR)/LUFA/Drivers/USB/LowLevel/Endpoint.c         \
	$(LUFA_DIR)/LUFA/Drivers/USB/LowLevel/DevChapter9.c      \
	$(LUFA_DIR)/LUFA/Drivers/USB/HighLevel/USBTask.c         \
	$(LUFA_DIR)/LUFA/Drivers/USB/HighLevel/USBInterrupt.c    \
	$(LUFA_DIR)/LUFA/Drivers/USB/Class/Device/MIDI.c \
	$(LUFA_DIR)/LUFA/Drivers/USB/HighLevel/Events.c          
	#$(LUFA_DIR)/LUFA/Drivers/USB/HighLevel/StdDescriptors.c  

OBJS = ghetto_drum.o midi.o usb_midi_descriptors.o
OBJS += $(LUFA_SRC:%.c=./%.o)
OBJ_OUT_FORMAT = ihex

all: ghetto_drum.hex

# Compilation step
%.o: %.c %.h
	$(CC) $(CFLAGS) -c $< -o $@

# Linker step
ghetto_drum.elf: $(OBJS)
	$(CC) $(CFLAGS) -Wl,-Map,ghetto_drum.map -o $@ $^

%.hex: %.elf
	$(OBJCOPY) -j .text -j .data -O ihex $< $@

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

# Create list file
 %.lst: %.o
	$(OBJDUMP) -h -S $< > $@

clean:
	rm -f *.o *.elf *.hex *.s *.map *.lst
	#-rm $(LUFA_SRC:%.c=./%.o) > /dev/null 2>&1
	-rm $(LUFA_SRC:%.c=./%.o) 

program: $(TARGET).hex
	@echo Trying to program your silly device...
	@teensy_loader_cli -mmcu=${MCU} -v -w ${TARGET}.hex

