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.

307 lines
9.6KB

  1. # Copyright 2009 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. AVRLIB_TOOLS_PATH ?= /usr/local/CrossPack-AVR/bin/
  16. BUILD_ROOT = build/
  17. BUILD_DIR = $(BUILD_ROOT)$(TARGET)/
  18. PROGRAMMER ?= avrispmkII
  19. PROGRAMMER_PORT ?= usb
  20. AVRDUDE_ERASE ?= no
  21. AVRDUDE_LOCK ?= yes
  22. ifeq ($(FAMILY),tiny)
  23. MCU = attiny$(MCU_NAME)
  24. DMCU = t$(MCU_NAME)
  25. MCU_DEFINE = ATTINY$(MCU_NAME)
  26. else
  27. ifeq ($(MCU_NAME),atmega2560)
  28. MCU=atmega2560
  29. DMCU=atmega2560
  30. MCU_DEFINE=ATMEGA2560
  31. else
  32. ifeq ($(FAMILY),mega)
  33. MCU = atmega$(MCU_NAME)
  34. DMCU = atmega$(MCU_NAME)
  35. MCU_DEFINE = ATMEGA$(MCU_NAME)
  36. else
  37. MCU = atmega$(MCU_NAME)p
  38. DMCU = m$(MCU_NAME)p
  39. MCU_DEFINE = ATMEGA$(MCU_NAME)P
  40. endif
  41. endif
  42. endif
  43. F_CPU ?= 20000000
  44. VPATH = $(PACKAGES)
  45. CC_FILES = $(notdir $(wildcard $(patsubst %,%/*.cc,$(PACKAGES))))
  46. C_FILES = $(notdir $(wildcard $(patsubst %,%/*.c,$(PACKAGES))))
  47. AS_FILES = $(notdir $(wildcard $(patsubst %,%/*.s,$(PACKAGES))))
  48. OBJ_FILES = $(CC_FILES:.cc=.o) $(C_FILES:.c=.o) $(AS_FILES:.s=.o)
  49. OBJS = $(patsubst %,$(BUILD_DIR)%,$(OBJ_FILES))
  50. DEPS = $(OBJS:.o=.d)
  51. TARGET_BIN = $(BUILD_DIR)$(TARGET).bin
  52. TARGET_ELF = $(BUILD_DIR)$(TARGET).elf
  53. TARGET_HEX = $(BUILD_DIR)$(TARGET).hex
  54. TARGETS = $(BUILD_DIR)$(TARGET).*
  55. DEP_FILE = $(BUILD_DIR)depends.mk
  56. CC = $(AVRLIB_TOOLS_PATH)avr-gcc
  57. CXX = $(AVRLIB_TOOLS_PATH)avr-g++
  58. OBJCOPY = $(AVRLIB_TOOLS_PATH)avr-objcopy
  59. OBJDUMP = $(AVRLIB_TOOLS_PATH)avr-objdump
  60. AR = $(AVRLIB_TOOLS_PATH)avr-ar
  61. SIZE = $(AVRLIB_TOOLS_PATH)avr-size
  62. NM = $(AVRLIB_TOOLS_PATH)avr-nm
  63. AVRDUDE = $(AVRLIB_TOOLS_PATH)avrdude
  64. REMOVE = rm -f
  65. CAT = cat
  66. CPPFLAGS = -mmcu=$(MCU) -I. \
  67. -g -Os -w -Wall \
  68. -DF_CPU=$(F_CPU) \
  69. -D__PROG_TYPES_COMPAT__ \
  70. -fdata-sections \
  71. -ffunction-sections \
  72. -fshort-enums \
  73. -fno-move-loop-invariants \
  74. $(EXTRA_DEFINES) \
  75. $(MMC_CONFIG) \
  76. -D$(MCU_DEFINE) \
  77. -DSERIAL_RX_0 \
  78. -mcall-prologues
  79. CXXFLAGS = -fno-exceptions
  80. ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp
  81. LDFLAGS = -mmcu=$(MCU) -lm -Os -Wl,--gc-sections$(EXTRA_LD_FLAGS)
  82. # ------------------------------------------------------------------------------
  83. # Source compiling
  84. # ------------------------------------------------------------------------------
  85. $(BUILD_DIR)%.o: %.cc
  86. $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
  87. $(BUILD_DIR)%.o: %.c
  88. $(CC) -c $(CPPFLAGS) $(CXXFLAGS) $< -o $@
  89. $(BUILD_DIR)%.o: %.s
  90. $(CC) -c $(CPPFLAGS) $(ASFLAGS) $< -o $@
  91. $(BUILD_DIR)%.d: %.cc
  92. $(CXX) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o)
  93. $(BUILD_DIR)%.d: %.c
  94. $(CC) -MM $(CPPFLAGS) $(CXXFLAGS) $< -MF $@ -MT $(@:.d=.o)
  95. $(BUILD_DIR)%.d: %.s
  96. $(CC) -MM $(CPPFLAGS) $(ASFLAGS) $< -MF $@ -MT $(@:.d=.o)
  97. # ------------------------------------------------------------------------------
  98. # Object file conversion
  99. # ------------------------------------------------------------------------------
  100. $(BUILD_DIR)%.hex: $(BUILD_DIR)%.elf
  101. $(OBJCOPY) -O ihex -R .eeprom $< $@
  102. $(BUILD_DIR)%.bin: $(BUILD_DIR)%.elf
  103. $(OBJCOPY) -O binary -R .eeprom $< $@
  104. $(BUILD_DIR)%.eep: $(BUILD_DIR)%.elf
  105. -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
  106. --change-section-lma .eeprom=0 -O ihex $< $@
  107. $(BUILD_DIR)%.lss: $(BUILD_DIR)%.elf
  108. $(OBJDUMP) -h -S $< > $@
  109. $(BUILD_DIR)%.sym: $(BUILD_DIR)%.elf
  110. $(NM) -n $< > $@
  111. # ------------------------------------------------------------------------------
  112. # AVRDude
  113. # ------------------------------------------------------------------------------
  114. AVRDUDE_COM_OPTS = -V -p $(DMCU)
  115. AVRDUDE_ISP_OPTS = -c $(PROGRAMMER) -P $(PROGRAMMER_PORT)
  116. ifeq ($(AVRDUDE_LOCK),no)
  117. AVRDUDE_LOCK_OPTS =
  118. else
  119. AVRDUDE_LOCK_OPTS ?= -U lock:w:0x$(LOCK):m
  120. endif
  121. ifeq ($(AVRDUDE_ERASE),no)
  122. AVRDUDE_ERASE_OPTS =
  123. else
  124. AVRDUDE_ERASE_OPTS ?= -D
  125. endif
  126. # ------------------------------------------------------------------------------
  127. # Main targets
  128. # ------------------------------------------------------------------------------
  129. all: $(BUILD_DIR) $(TARGET_HEX)
  130. $(BUILD_DIR):
  131. mkdir -p $(BUILD_DIR)
  132. $(TARGET_ELF): $(OBJS)
  133. $(CC) $(LDFLAGS) -o $@ $(OBJS) $(SYS_OBJS) -lc
  134. $(DEP_FILE): $(BUILD_DIR) $(DEPS)
  135. cat $(DEPS) > $(DEP_FILE)
  136. bin: $(TARGET_BIN)
  137. upload: $(TARGET_HEX)
  138. $(AVRDUDE) $(AVRDUDE_ERASE_OPTS) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \
  139. -B 1 -U flash:w:$(TARGET_HEX):i $(AVRDUDE_LOCK_OPTS)
  140. slow_upload: $(TARGET_HEX)
  141. $(AVRDUDE) $(AVRDUDE_ERASE_OPTS) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \
  142. -B 4 -U flash:w:$(TARGET_HEX):i $(AVRDUDE_LOCK_OPTS)
  143. clean:
  144. $(REMOVE) $(OBJS) $(TARGETS) $(DEP_FILE) $(DEPS)
  145. depends: $(DEPS)
  146. cat $(DEPS) > $(DEP_FILE)
  147. $(TARGET).size: $(TARGET_ELF)
  148. $(SIZE) $(TARGET_ELF) > $(TARGET).size
  149. $(BUILD_DIR)$(TARGET).top_symbols: $(TARGET_ELF)
  150. $(NM) $(TARGET_ELF) --size-sort -C -f bsd -r > $@
  151. size: $(TARGET).size
  152. cat $(TARGET).size | awk '{ print $$1+$$2 }' | tail -n1 | figlet | cowsay -n -f moose
  153. ramsize: $(TARGET).size
  154. cat $(TARGET).size | awk '{ print $$2+$$3 }' | tail -n1 | figlet | cowsay -n -f small
  155. size_report: build/$(TARGET)/$(TARGET).lss build/$(TARGET)/$(TARGET).top_symbols
  156. .PHONY: all clean depends upload
  157. include $(DEP_FILE)
  158. # ------------------------------------------------------------------------------
  159. # Midi files for firmware update
  160. # ------------------------------------------------------------------------------
  161. HEX2SYSEX = python tools/hex2sysex/hex2sysex.py
  162. $(BUILD_DIR)%.mid: $(BUILD_DIR)%.hex
  163. $(HEX2SYSEX) $(SYSEX_FLAGS) -o $@ $<
  164. $(BUILD_DIR)%.syx: $(BUILD_DIR)%.hex
  165. $(HEX2SYSEX) $(SYSEX_FLAGS) --syx -o $@ $<
  166. $(BUILD_DIR)%_old_bootloader.mid: $(BUILD_DIR)%.hex
  167. $(HEX2SYSEX) $(SYSEX_FLAGS) --obsolete_manufacturer_id -o $@ $<
  168. $(BUILD_DIR)%_old_bootloader.syx: $(BUILD_DIR)%.hex
  169. $(HEX2SYSEX) $(SYSEX_FLAGS) --obsolete_manufacturer_id --syx -o $@ $<
  170. midi: $(BUILD_DIR)$(TARGET).mid
  171. syx: $(BUILD_DIR)$(TARGET).syx
  172. old_midi: $(BUILD_DIR)$(TARGET)_old_bootloader.mid
  173. old_syx: $(BUILD_DIR)$(TARGET)_old_bootloader.syx
  174. # ------------------------------------------------------------------------------
  175. # EEPROM image write
  176. # ------------------------------------------------------------------------------
  177. GOLDEN_EEPROM_FILE = $(TARGET)/data/$(TARGET)_eeprom_golden.hex
  178. GOLDEN_FLASH_FILE = $(TARGET)/data/$(TARGET)_flash_golden.hex
  179. eeprom_backup:
  180. $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \
  181. -U eeprom:r:$(GOLDEN_EEPROM_FILE):i
  182. eeprom_restore:
  183. $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \
  184. -U eeprom:w:$(GOLDEN_EEPROM_FILE):i -U lock:w:0x$(LOCK):m
  185. flash_backup:
  186. $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \
  187. -U flash:r:$(GOLDEN_FLASH_FILE):i
  188. flash_restore:
  189. $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) \
  190. -U flash:w:$(GOLDEN_FLASH_FILE):i -U lock:w:0x$(LOCK):m
  191. # ------------------------------------------------------------------------------
  192. # Resources
  193. # ------------------------------------------------------------------------------
  194. RESOURCE_COMPILER = avrlib/tools/resources_compiler.py
  195. resources: $(wildcard $(RESOURCES)/*.py)
  196. python $(RESOURCE_COMPILER) $(RESOURCES)/resources.py
  197. # ------------------------------------------------------------------------------
  198. # Publish a firmware version on the website
  199. # ------------------------------------------------------------------------------
  200. REMOTE_HOST = mutable-instruments.net
  201. REMOTE_USER = mutable
  202. REMOTE_PATH = public_html/static/firmware
  203. publish: syx midi
  204. scp $(BUILD_DIR)$(TARGET).mid $(REMOTE_USER)@$(REMOTE_HOST):$(REMOTE_PATH)/$(TARGET)_$(VERSION).mid
  205. scp $(BUILD_DIR)$(TARGET).hex $(REMOTE_USER)@$(REMOTE_HOST):$(REMOTE_PATH)//$(TARGET)_$(VERSION).hex
  206. scp $(BUILD_DIR)$(TARGET).syx $(REMOTE_USER)@$(REMOTE_HOST):$(REMOTE_PATH)//$(TARGET)_$(VERSION).syx
  207. publish_old: old_midi old_syx
  208. scp $(BUILD_DIR)$(TARGET)_old_bootloader.mid $(REMOTE_USER)@$(REMOTE_HOST):$(REMOTE_PATH)/$(TARGET)_$(VERSION).mid
  209. scp $(BUILD_DIR)$(TARGET).hex $(REMOTE_USER)@$(REMOTE_HOST):$(REMOTE_PATH)//$(TARGET)_$(VERSION).hex
  210. scp $(BUILD_DIR)$(TARGET)_old_bootloader.syx $(REMOTE_USER)@$(REMOTE_HOST):$(REMOTE_PATH)//$(TARGET)_$(VERSION).syx
  211. # ------------------------------------------------------------------------------
  212. # Set fuses
  213. # ------------------------------------------------------------------------------
  214. terminal:
  215. $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -e -tuF
  216. fuses:
  217. $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -B 10 -e -u \
  218. -U efuse:w:0x$(EFUSE):m \
  219. -U hfuse:w:0x$(HFUSE):m \
  220. -U lfuse:w:0x$(LFUSE):m \
  221. -U lock:w:0x$(LOCK):m
  222. # ------------------------------------------------------------------------------
  223. # Program (fuses + firmware) a blank chip
  224. # ------------------------------------------------------------------------------
  225. bootstrap: bake
  226. bake: $(FIRMWARE)
  227. $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -B 10 -e -u \
  228. -U efuse:w:0x$(EFUSE):m \
  229. -U hfuse:w:0x$(HFUSE):m \
  230. -U lfuse:w:0x$(LFUSE):m \
  231. -U lock:w:0x$(LOCK):m
  232. $(AVRDUDE) $(AVRDUDE_COM_OPTS) $(AVRDUDE_ISP_OPTS) -B 1 \
  233. -U flash:w:$(TARGET_HEX):i -U lock:w:0x$(LOCK):m