1# Copyright 2011 Olivier Gillet. 2# 3# Author: Olivier Gillet (ol.gillet@gmail.com) 4# 5# This program is free software: you can redistribute it and/or modify 6# it under the terms of the GNU General Public License as published by 7# the Free Software Foundation, either version 3 of the License, or 8# (at your option) any later version. 9# This program is distributed in the hope that it will be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12# GNU General Public License for more details. 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16include avrlibx/config.mk 17 18BUILD_ROOT = build/ 19BUILD_DIR = $(BUILD_ROOT)$(TARGET)/ 20 21MCU = atxmega$(MCU_NAME) 22DMCU = atxmega$(MCU_NAME) 23MCU_DEFINE = ATXMEGA$(MCU_NAME) 24 25VPATH = $(PACKAGES) 26CC_FILES = $(notdir $(wildcard $(patsubst %,%/*.cc,$(PACKAGES)))) 27C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(PACKAGES)))) 28AS_FILES = $(notdir $(wildcard $(patsubst %,%/*.S,$(PACKAGES)))) 29OBJ_FILES = $(CC_FILES:.cc=.o) $(C_FILES:.c=.o) $(AS_FILES:.S=.o) 30OBJS = $(patsubst %,$(BUILD_DIR)%,$(OBJ_FILES)) 31DEPS = $(OBJS:.o=.d) 32 33TARGET_BIN = $(BUILD_DIR)$(TARGET).bin 34TARGET_ELF = $(BUILD_DIR)$(TARGET).elf 35TARGET_HEX = $(BUILD_DIR)$(TARGET).hex 36TARGET_SIZE = $(BUILD_DIR)$(TARGET).size 37TARGETS = $(BUILD_DIR)$(TARGET).* 38DEP_FILE = $(BUILD_DIR)depends.mk 39 40CC = $(AVRLIBX_TOOLS_PATH)avr-gcc 41CXX = $(AVRLIBX_TOOLS_PATH)avr-g++ 42OBJCOPY = $(AVRLIBX_TOOLS_PATH)avr-objcopy 43OBJDUMP = $(AVRLIBX_TOOLS_PATH)avr-objdump 44AR = $(AVRLIBX_TOOLS_PATH)avr-ar 45SIZE = $(AVRLIBX_TOOLS_PATH)avr-size 46NM = $(AVRLIBX_TOOLS_PATH)avr-nm 47AVRDUDE = $(AVRDUDE_PATH)avrdude 48REMOVE = rm -f 49CAT = cat 50 51CPPFLAGS = -mmcu=$(MCU) -I. \ 52 -g -Os -w -Wall \ 53 -D__PROG_TYPES_COMPAT__ \ 54 -DF_CPU=$(F_CPU) \ 55 -fdata-sections \ 56 -ffunction-sections \ 57 -fno-move-loop-invariants \ 58 $(EXTRA_DEFINES) \ 59 $(MMC_CONFIG) \ 60 -D$(MCU_DEFINE) \ 61 -mcall-prologues 62CXXFLAGS = -fno-exceptions 63ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp 64LDFLAGS = -mmcu=$(MCU) -lm -Os -Wl,--gc-sections$(EXTRA_LD_FLAGS) 65 66# ------------------------------------------------------------------------------ 67# Source compiling 68# ------------------------------------------------------------------------------ 69 70$(BUILD_DIR)%.o: %.cc 71 $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ 72 73$(BUILD_DIR)%.o: %.c 74 $(CC) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@ 75 76$(BUILD_DIR)%.o: %.s 77 $(CC) -c $(CPPFLAGS) $(ASFLAGS) $< -o $@ 78 79$(BUILD_DIR)%.d: %.cc 80 $(CXX) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o) 81 82$(BUILD_DIR)%.d: %.c 83 $(CC) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o) 84 85$(BUILD_DIR)%.d: %.S 86 $(CC) -MM $(CPPFLAGS) $(ASFLAGS) $< -MF $@ -MT $(@:.d=.o) 87 88 89# ------------------------------------------------------------------------------ 90# Object file conversion 91# ------------------------------------------------------------------------------ 92 93$(BUILD_DIR)%.hex: $(BUILD_DIR)%.elf 94 $(OBJCOPY) -O ihex -R .eeprom $< $@ 95 96$(BUILD_DIR)%.bin: $(BUILD_DIR)%.elf 97 $(OBJCOPY) -O binary -R .eeprom $< $@ 98 99$(BUILD_DIR)%.eep: $(BUILD_DIR)%.elf 100 -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ 101 --change-section-lma .eeprom=0 -O ihex $< $@ 102 103$(BUILD_DIR)%.lss: $(BUILD_DIR)%.elf 104 $(OBJDUMP) -h -S $< > $@ 105 106$(BUILD_DIR)%.sym: $(BUILD_DIR)%.elf 107 $(NM) -n $< > $@ 108 109# ------------------------------------------------------------------------------ 110# AVRDude 111# ------------------------------------------------------------------------------ 112 113AVRDUDE_COM_OPTS = -V -p $(DMCU) 114AVRDUDE_ISP_OPTS = -c $(PROGRAMMER) -P $(PROGRAMMER_PORT) 115 116# ------------------------------------------------------------------------------ 117# Main targets 118# ------------------------------------------------------------------------------ 119 120all: $(BUILD_DIR) $(TARGET_HEX) 121 122$(BUILD_DIR): 123 mkdir -p $(BUILD_DIR) 124 125$(TARGET_ELF): $(OBJS) 126 $(CC) $(LDFLAGS) -o $@ $(OBJS) $(SYS_OBJS) -lc 127 128$(DEP_FILE): $(BUILD_DIR) $(DEPS) 129 cat $(DEPS) > $(DEP_FILE) 130 131bin: $(TARGET_BIN) 132 133upload: $(TARGET_HEX) 134 $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \ 135 -U flash:w:$(TARGET_HEX):i 136 137upload_boot: $(TARGET_BIN) 138 $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \ 139 -U boot:w:$(TARGET_BIN) 140 141clean: 142 $(REMOVE) $(OBJS) $(TARGETS) $(DEP_FILE) $(DEPS) 143 144depends: $(DEPS) 145 cat $(DEPS) > $(DEP_FILE) 146 147$(TARGET_SIZE): $(TARGET_ELF) 148 $(SIZE) $(TARGET_ELF) > $(TARGET_SIZE) 149 150$(BUILD_DIR)$(TARGET).top_symbols: $(TARGET_ELF) 151 $(NM) $(TARGET_ELF) --size-sort -C -f bsd -r > $@ 152 153size: $(TARGET_SIZE) 154 cat $(TARGET_SIZE) | awk '{ print $$1+$$2 }' | tail -n1 | figlet | cowsay -n -f moose 155 156ramsize: $(TARGET_SIZE) 157 cat $(TARGET_SIZE) | awk '{ print $$2+$$3 }' | tail -n1 | figlet | cowsay -n -f small 158 159size_report: build/$(TARGET)/$(TARGET).lss build/$(TARGET)/$(TARGET).top_symbols 160 161.PHONY: all clean depends upload 162 163include $(DEP_FILE) 164 165# ------------------------------------------------------------------------------ 166# Midi files for firmware update 167# ------------------------------------------------------------------------------ 168 169HEX2SYSEX = python avrlibx/tools/hex2sysex/hex2sysex.py 170 171$(BUILD_DIR)%.syx: $(BUILD_DIR)%.hex 172 $(HEX2SYSEX) $(SYSEX_FLAGS) --syx -o $@ $< 173 174syx: $(BUILD_DIR)$(TARGET).syx 175 176# ------------------------------------------------------------------------------ 177# Resources 178# ------------------------------------------------------------------------------ 179 180RESOURCE_COMPILER = avrlibx/tools/resources_compiler.py 181 182resources: $(wildcard $(RESOURCES)/*.py) 183 python $(RESOURCE_COMPILER) $(RESOURCES)/resources.py 184 185# ------------------------------------------------------------------------------ 186# Set fuses 187# ------------------------------------------------------------------------------ 188 189terminal: 190 $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -e -tuF 191 192fuses: 193 $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -e -u \ 194 -U fuse0:w:0x$(FUSE0):m \ 195 -U fuse1:w:0x$(FUSE1):m \ 196 -U fuse2:w:0x$(FUSE2):m \ 197 -U fuse4:w:0x$(FUSE4):m \ 198 -U fuse5:w:0x$(FUSE5):m \ 199 -U lock:w:0x$(LOCK):m 200