# Copyright 2011 Olivier Gillet. # # Author: Olivier Gillet (ol.gillet@gmail.com) # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see . include avrlibx/config.mk BUILD_ROOT = build/ BUILD_DIR = $(BUILD_ROOT)$(TARGET)/ MCU = atxmega$(MCU_NAME) DMCU = atxmega$(MCU_NAME) MCU_DEFINE = ATXMEGA$(MCU_NAME) VPATH = $(PACKAGES) CC_FILES = $(notdir $(wildcard $(patsubst %,%/*.cc,$(PACKAGES)))) C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(PACKAGES)))) AS_FILES = $(notdir $(wildcard $(patsubst %,%/*.S,$(PACKAGES)))) OBJ_FILES = $(CC_FILES:.cc=.o) $(C_FILES:.c=.o) $(AS_FILES:.S=.o) OBJS = $(patsubst %,$(BUILD_DIR)%,$(OBJ_FILES)) DEPS = $(OBJS:.o=.d) TARGET_BIN = $(BUILD_DIR)$(TARGET).bin TARGET_ELF = $(BUILD_DIR)$(TARGET).elf TARGET_HEX = $(BUILD_DIR)$(TARGET).hex TARGET_SIZE = $(BUILD_DIR)$(TARGET).size TARGETS = $(BUILD_DIR)$(TARGET).* DEP_FILE = $(BUILD_DIR)depends.mk CC = $(AVRLIBX_TOOLS_PATH)avr-gcc CXX = $(AVRLIBX_TOOLS_PATH)avr-g++ OBJCOPY = $(AVRLIBX_TOOLS_PATH)avr-objcopy OBJDUMP = $(AVRLIBX_TOOLS_PATH)avr-objdump AR = $(AVRLIBX_TOOLS_PATH)avr-ar SIZE = $(AVRLIBX_TOOLS_PATH)avr-size NM = $(AVRLIBX_TOOLS_PATH)avr-nm AVRDUDE = $(AVRDUDE_PATH)avrdude REMOVE = rm -f CAT = cat CPPFLAGS = -mmcu=$(MCU) -I. \ -g -Os -w -Wall \ -D__PROG_TYPES_COMPAT__ \ -DF_CPU=$(F_CPU) \ -fdata-sections \ -ffunction-sections \ -fno-move-loop-invariants \ $(EXTRA_DEFINES) \ $(MMC_CONFIG) \ -D$(MCU_DEFINE) \ -mcall-prologues CXXFLAGS = -fno-exceptions ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp LDFLAGS = -mmcu=$(MCU) -lm -Os -Wl,--gc-sections$(EXTRA_LD_FLAGS) # ------------------------------------------------------------------------------ # Source compiling # ------------------------------------------------------------------------------ $(BUILD_DIR)%.o: %.cc $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ $(BUILD_DIR)%.o: %.c $(CC) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ $(BUILD_DIR)%.o: %.s $(CC) -c $(CPPFLAGS) $(ASFLAGS) $< -o $@ $(BUILD_DIR)%.d: %.cc $(CXX) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o) $(BUILD_DIR)%.d: %.c $(CC) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o) $(BUILD_DIR)%.d: %.S $(CC) -MM $(CPPFLAGS) $(ASFLAGS) $< -MF $@ -MT $(@:.d=.o) # ------------------------------------------------------------------------------ # Object file conversion # ------------------------------------------------------------------------------ $(BUILD_DIR)%.hex: $(BUILD_DIR)%.elf $(OBJCOPY) -O ihex -R .eeprom $< $@ $(BUILD_DIR)%.bin: $(BUILD_DIR)%.elf $(OBJCOPY) -O binary -R .eeprom $< $@ $(BUILD_DIR)%.eep: $(BUILD_DIR)%.elf -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 -O ihex $< $@ $(BUILD_DIR)%.lss: $(BUILD_DIR)%.elf $(OBJDUMP) -h -S $< > $@ $(BUILD_DIR)%.sym: $(BUILD_DIR)%.elf $(NM) -n $< > $@ # ------------------------------------------------------------------------------ # AVRDude # ------------------------------------------------------------------------------ AVRDUDE_COM_OPTS = -V -p $(DMCU) AVRDUDE_ISP_OPTS = -c $(PROGRAMMER) -P $(PROGRAMMER_PORT) # ------------------------------------------------------------------------------ # Main targets # ------------------------------------------------------------------------------ all: $(BUILD_DIR) $(TARGET_HEX) $(BUILD_DIR): mkdir -p $(BUILD_DIR) $(TARGET_ELF): $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) $(SYS_OBJS) -lc $(DEP_FILE): $(BUILD_DIR) $(DEPS) cat $(DEPS) > $(DEP_FILE) bin: $(TARGET_BIN) upload: $(TARGET_HEX) $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \ -U flash:w:$(TARGET_HEX):i upload_boot: $(TARGET_BIN) $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \ -U boot:w:$(TARGET_BIN) clean: $(REMOVE) $(OBJS) $(TARGETS) $(DEP_FILE) $(DEPS) depends: $(DEPS) cat $(DEPS) > $(DEP_FILE) $(TARGET_SIZE): $(TARGET_ELF) $(SIZE) $(TARGET_ELF) > $(TARGET_SIZE) $(BUILD_DIR)$(TARGET).top_symbols: $(TARGET_ELF) $(NM) $(TARGET_ELF) --size-sort -C -f bsd -r > $@ size: $(TARGET_SIZE) cat $(TARGET_SIZE) | awk '{ print $$1+$$2 }' | tail -n1 | figlet | cowsay -n -f moose ramsize: $(TARGET_SIZE) cat $(TARGET_SIZE) | awk '{ print $$2+$$3 }' | tail -n1 | figlet | cowsay -n -f small size_report: build/$(TARGET)/$(TARGET).lss build/$(TARGET)/$(TARGET).top_symbols .PHONY: all clean depends upload include $(DEP_FILE) # ------------------------------------------------------------------------------ # Midi files for firmware update # ------------------------------------------------------------------------------ HEX2SYSEX = python avrlibx/tools/hex2sysex/hex2sysex.py $(BUILD_DIR)%.syx: $(BUILD_DIR)%.hex $(HEX2SYSEX) $(SYSEX_FLAGS) --syx -o $@ $< syx: $(BUILD_DIR)$(TARGET).syx # ------------------------------------------------------------------------------ # Resources # ------------------------------------------------------------------------------ RESOURCE_COMPILER = avrlibx/tools/resources_compiler.py resources: $(wildcard $(RESOURCES)/*.py) python $(RESOURCE_COMPILER) $(RESOURCES)/resources.py # ------------------------------------------------------------------------------ # Set fuses # ------------------------------------------------------------------------------ terminal: $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -e -tuF fuses: $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -e -u \ -U fuse0:w:0x$(FUSE0):m \ -U fuse1:w:0x$(FUSE1):m \ -U fuse2:w:0x$(FUSE2):m \ -U fuse4:w:0x$(FUSE4):m \ -U fuse5:w:0x$(FUSE5):m \ -U lock:w:0x$(LOCK):m