You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

200 lines
6.2KB

  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. include avrlibx/config.mk
  16. BUILD_ROOT = build/
  17. BUILD_DIR = $(BUILD_ROOT)$(TARGET)/
  18. MCU = atxmega$(MCU_NAME)
  19. DMCU = atxmega$(MCU_NAME)
  20. MCU_DEFINE = ATXMEGA$(MCU_NAME)
  21. VPATH = $(PACKAGES)
  22. CC_FILES = $(notdir $(wildcard $(patsubst %,%/*.cc,$(PACKAGES))))
  23. C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(PACKAGES))))
  24. AS_FILES = $(notdir $(wildcard $(patsubst %,%/*.S,$(PACKAGES))))
  25. OBJ_FILES = $(CC_FILES:.cc=.o) $(C_FILES:.c=.o) $(AS_FILES:.S=.o)
  26. OBJS = $(patsubst %,$(BUILD_DIR)%,$(OBJ_FILES))
  27. DEPS = $(OBJS:.o=.d)
  28. TARGET_BIN = $(BUILD_DIR)$(TARGET).bin
  29. TARGET_ELF = $(BUILD_DIR)$(TARGET).elf
  30. TARGET_HEX = $(BUILD_DIR)$(TARGET).hex
  31. TARGET_SIZE = $(BUILD_DIR)$(TARGET).size
  32. TARGETS = $(BUILD_DIR)$(TARGET).*
  33. DEP_FILE = $(BUILD_DIR)depends.mk
  34. CC = $(AVRLIBX_TOOLS_PATH)avr-gcc
  35. CXX = $(AVRLIBX_TOOLS_PATH)avr-g++
  36. OBJCOPY = $(AVRLIBX_TOOLS_PATH)avr-objcopy
  37. OBJDUMP = $(AVRLIBX_TOOLS_PATH)avr-objdump
  38. AR = $(AVRLIBX_TOOLS_PATH)avr-ar
  39. SIZE = $(AVRLIBX_TOOLS_PATH)avr-size
  40. NM = $(AVRLIBX_TOOLS_PATH)avr-nm
  41. AVRDUDE = $(AVRDUDE_PATH)avrdude
  42. REMOVE = rm -f
  43. CAT = cat
  44. CPPFLAGS = -mmcu=$(MCU) -I. \
  45. -g -Os -w -Wall \
  46. -D__PROG_TYPES_COMPAT__ \
  47. -DF_CPU=$(F_CPU) \
  48. -fdata-sections \
  49. -ffunction-sections \
  50. -fno-move-loop-invariants \
  51. $(EXTRA_DEFINES) \
  52. $(MMC_CONFIG) \
  53. -D$(MCU_DEFINE) \
  54. -mcall-prologues
  55. CXXFLAGS = -fno-exceptions
  56. ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp
  57. LDFLAGS = -mmcu=$(MCU) -lm -Os -Wl,--gc-sections$(EXTRA_LD_FLAGS)
  58. # ------------------------------------------------------------------------------
  59. # Source compiling
  60. # ------------------------------------------------------------------------------
  61. $(BUILD_DIR)%.o: %.cc
  62. $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
  63. $(BUILD_DIR)%.o: %.c
  64. $(CC) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
  65. $(BUILD_DIR)%.o: %.s
  66. $(CC) -c $(CPPFLAGS) $(ASFLAGS) $< -o $@
  67. $(BUILD_DIR)%.d: %.cc
  68. $(CXX) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o)
  69. $(BUILD_DIR)%.d: %.c
  70. $(CC) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o)
  71. $(BUILD_DIR)%.d: %.S
  72. $(CC) -MM $(CPPFLAGS) $(ASFLAGS) $< -MF $@ -MT $(@:.d=.o)
  73. # ------------------------------------------------------------------------------
  74. # Object file conversion
  75. # ------------------------------------------------------------------------------
  76. $(BUILD_DIR)%.hex: $(BUILD_DIR)%.elf
  77. $(OBJCOPY) -O ihex -R .eeprom $< $@
  78. $(BUILD_DIR)%.bin: $(BUILD_DIR)%.elf
  79. $(OBJCOPY) -O binary -R .eeprom $< $@
  80. $(BUILD_DIR)%.eep: $(BUILD_DIR)%.elf
  81. -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
  82. --change-section-lma .eeprom=0 -O ihex $< $@
  83. $(BUILD_DIR)%.lss: $(BUILD_DIR)%.elf
  84. $(OBJDUMP) -h -S $< > $@
  85. $(BUILD_DIR)%.sym: $(BUILD_DIR)%.elf
  86. $(NM) -n $< > $@
  87. # ------------------------------------------------------------------------------
  88. # AVRDude
  89. # ------------------------------------------------------------------------------
  90. AVRDUDE_COM_OPTS = -V -p $(DMCU)
  91. AVRDUDE_ISP_OPTS = -c $(PROGRAMMER) -P $(PROGRAMMER_PORT)
  92. # ------------------------------------------------------------------------------
  93. # Main targets
  94. # ------------------------------------------------------------------------------
  95. all: $(BUILD_DIR) $(TARGET_HEX)
  96. $(BUILD_DIR):
  97. mkdir -p $(BUILD_DIR)
  98. $(TARGET_ELF): $(OBJS)
  99. $(CC) $(LDFLAGS) -o $@ $(OBJS) $(SYS_OBJS) -lc
  100. $(DEP_FILE): $(BUILD_DIR) $(DEPS)
  101. cat $(DEPS) > $(DEP_FILE)
  102. bin: $(TARGET_BIN)
  103. upload: $(TARGET_HEX)
  104. $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \
  105. -U flash:w:$(TARGET_HEX):i
  106. upload_boot: $(TARGET_BIN)
  107. $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \
  108. -U boot:w:$(TARGET_BIN)
  109. clean:
  110. $(REMOVE) $(OBJS) $(TARGETS) $(DEP_FILE) $(DEPS)
  111. depends: $(DEPS)
  112. cat $(DEPS) > $(DEP_FILE)
  113. $(TARGET_SIZE): $(TARGET_ELF)
  114. $(SIZE) $(TARGET_ELF) > $(TARGET_SIZE)
  115. $(BUILD_DIR)$(TARGET).top_symbols: $(TARGET_ELF)
  116. $(NM) $(TARGET_ELF) --size-sort -C -f bsd -r > $@
  117. size: $(TARGET_SIZE)
  118. cat $(TARGET_SIZE) | awk '{ print $$1+$$2 }' | tail -n1 | figlet | cowsay -n -f moose
  119. ramsize: $(TARGET_SIZE)
  120. cat $(TARGET_SIZE) | awk '{ print $$2+$$3 }' | tail -n1 | figlet | cowsay -n -f small
  121. size_report: build/$(TARGET)/$(TARGET).lss build/$(TARGET)/$(TARGET).top_symbols
  122. .PHONY: all clean depends upload
  123. include $(DEP_FILE)
  124. # ------------------------------------------------------------------------------
  125. # Midi files for firmware update
  126. # ------------------------------------------------------------------------------
  127. HEX2SYSEX = python avrlibx/tools/hex2sysex/hex2sysex.py
  128. $(BUILD_DIR)%.syx: $(BUILD_DIR)%.hex
  129. $(HEX2SYSEX) $(SYSEX_FLAGS) --syx -o $@ $<
  130. syx: $(BUILD_DIR)$(TARGET).syx
  131. # ------------------------------------------------------------------------------
  132. # Resources
  133. # ------------------------------------------------------------------------------
  134. RESOURCE_COMPILER = avrlibx/tools/resources_compiler.py
  135. resources: $(wildcard $(RESOURCES)/*.py)
  136. python $(RESOURCE_COMPILER) $(RESOURCES)/resources.py
  137. # ------------------------------------------------------------------------------
  138. # Set fuses
  139. # ------------------------------------------------------------------------------
  140. terminal:
  141. $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -e -tuF
  142. fuses:
  143. $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -e -u \
  144. -U fuse0:w:0x$(FUSE0):m \
  145. -U fuse1:w:0x$(FUSE1):m \
  146. -U fuse2:w:0x$(FUSE2):m \
  147. -U fuse4:w:0x$(FUSE4):m \
  148. -U fuse5:w:0x$(FUSE5):m \
  149. -U lock:w:0x$(LOCK):m