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