avrmakelib.mk 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. ######################################################
  2. # AVR make library #
  3. # Copyright (c) 2015-2016 Michael Buesch <m@bues.ch> #
  4. # Version 1.2 #
  5. ######################################################
  6. ifeq ($(NAME),)
  7. $(error NAME not defined)
  8. endif
  9. ifeq ($(SRCS),)
  10. $(error SRCS not defined)
  11. endif
  12. ifeq ($(F_CPU),)
  13. $(error F_CPU not defined)
  14. endif
  15. ifeq ($(GCC_ARCH),)
  16. $(error GCC_ARCH not defined)
  17. endif
  18. ifeq ($(AVRDUDE_ARCH),)
  19. $(error AVRDUDE_ARCH not defined)
  20. endif
  21. BINEXT :=
  22. NODEPS :=
  23. # The toolchain definitions
  24. CC = avr-gcc$(BINEXT)
  25. OBJCOPY = avr-objcopy$(BINEXT)
  26. OBJDUMP = avr-objdump$(BINEXT)
  27. SIZE = avr-size$(BINEXT)
  28. MKDIR = mkdir$(BINEXT)
  29. MV = mv$(BINEXT)
  30. RM = rm$(BINEXT)
  31. CP = cp$(BINEXT)
  32. ECHO = echo$(BINEXT)
  33. GREP = grep$(BINEXT)
  34. TRUE = true$(BINEXT)
  35. TEST = test$(BINEXT)
  36. AVRDUDE = avrdude$(BINEXT)
  37. MYSMARTUSB = mysmartusb.py
  38. DOXYGEN = doxygen$(BINEXT)
  39. PYTHON3 = python3$(BINEXT)
  40. V := @ # Verbose build: make V=1
  41. O := s # Optimize flag
  42. Q := $(V:1=)
  43. QUIET_CC = $(Q:@=@$(ECHO) ' CC '$@;)$(CC)
  44. QUIET_DEPEND = $(Q:@=@$(ECHO) ' DEPEND '$@;)$(CC)
  45. QUIET_OBJCOPY = $(Q:@=@$(ECHO) ' OBJCOPY '$@;)$(OBJCOPY)
  46. QUIET_SIZE = $(Q:@=@$(ECHO) ' SIZE '$@;)$(SIZE)
  47. QUIET_PYTHON3 = $(Q:@=@$(ECHO) ' PY3-GEN '$@;)$(PYTHON3)
  48. FUNC_STACK_LIMIT ?= 128
  49. WARN_CFLAGS := -Wall -Wextra -Wno-unused-parameter -Wswitch-enum \
  50. -Wsuggest-attribute=noreturn \
  51. -Wundef -Wpointer-arith -Winline \
  52. $(if $(FUNC_STACK_LIMIT),-Wstack-usage=$(FUNC_STACK_LIMIT)) \
  53. -Wcast-qual -Wlogical-op -Wshadow \
  54. -Wconversion
  55. CFLAGS += -mmcu=$(GCC_ARCH) -std=gnu11 -g -O$(O) $(WARN_CFLAGS) \
  56. "-Dinline=inline __attribute__((__always_inline__))" \
  57. -fshort-enums -DF_CPU=$(F_CPU) \
  58. -mcall-prologues -mrelax -mstrict-X \
  59. -flto
  60. BIN := $(NAME).bin
  61. HEX := $(NAME).hex
  62. EEP := $(NAME).eep.hex
  63. .SUFFIXES:
  64. .DEFAULT_GOAL := all
  65. # Programmer parameters
  66. AVRDUDE_SPEED ?= 1
  67. AVRDUDE_SLOW_SPEED ?= 200
  68. ifeq ($(PROGRAMMER),mysmartusb)
  69. AVRDUDE_PROGRAMMER := avr910
  70. PROGPORT := /dev/ttyUSB0
  71. endif
  72. ifeq ($(PROGRAMMER),avrisp2)
  73. AVRDUDE_PROGRAMMER := avrisp2
  74. PROGPORT := usb
  75. endif
  76. ifeq ($(AVRDUDE_PROGRAMMER),)
  77. $(error Invalid PROGRAMMER specified)
  78. endif
  79. PROGRAMMER_CMD_PWRCYCLE := \
  80. $(if $(filter mysmartusb,$(PROGRAMMER)), \
  81. $(MYSMARTUSB) -p0 $(PROGPORT) && \
  82. sleep 1 && \
  83. $(MYSMARTUSB) -p1 $(PROGPORT) \
  84. )
  85. PROGRAMMER_CMD_PROG_ENTER := \
  86. $(if $(filter mysmartusb,$(PROGRAMMER)), \
  87. $(MYSMARTUSB) -mp $(PROGPORT) \
  88. )
  89. PROGRAMMER_CMD_PROG_LEAVE := \
  90. $(if $(filter mysmartusb,$(PROGRAMMER)), \
  91. $(MYSMARTUSB) -md $(PROGPORT) \
  92. )
  93. DEPS = $(sort $(patsubst %.c,dep/%.d,$(1)))
  94. OBJS = $(sort $(patsubst %.c,obj/%.o,$(1)))
  95. # Generate dependencies
  96. $(call DEPS,$(SRCS)): dep/%.d: %.c
  97. @$(MKDIR) -p $(dir $@)
  98. @$(MKDIR) -p obj
  99. $(QUIET_DEPEND) -o $@.tmp -MM -MG -MT "$@ $(patsubst dep/%.d,obj/%.o,$@)" $(CFLAGS) $<
  100. @$(MV) -f $@.tmp $@
  101. ifeq ($(NODEPS),)
  102. -include $(call DEPS,$(SRCS))
  103. endif
  104. # Generate object files
  105. $(call OBJS,$(SRCS)): obj/%.o: %.c
  106. @$(MKDIR) -p $(dir $@)
  107. $(QUIET_CC) -o $@ -c $(CFLAGS) $<
  108. all: $(HEX)
  109. %.s: %.c
  110. $(QUIET_CC) $(CFLAGS) -fno-lto -S $*.c
  111. $(BIN): $(call OBJS,$(SRCS))
  112. $(QUIET_CC) $(CFLAGS) -o $(BIN) -fwhole-program $(call OBJS,$(SRCS)) $(LDFLAGS)
  113. $(HEX): $(BIN)
  114. $(QUIET_OBJCOPY) -R.eeprom -O ihex $(BIN) $(HEX)
  115. @$(if $(filter .exe,$(BINEXT)),$(TRUE), \
  116. $(OBJDUMP) -h $(BIN) | $(GREP) -qe .eeprom && \
  117. $(OBJCOPY) -j.eeprom --set-section-flags=.eeprom="alloc,load" \
  118. --change-section-lma .eeprom=0 -O ihex $(BIN) $(EEP) \
  119. || $(TRUE))
  120. @$(ECHO)
  121. $(QUIET_SIZE) --format=SysV $(BIN)
  122. define _avrdude_interactive
  123. $(AVRDUDE) -B $(AVRDUDE_SPEED) -p $(AVRDUDE_ARCH) \
  124. -c $(AVRDUDE_PROGRAMMER) -P $(PROGPORT) -t
  125. endef
  126. define _avrdude_reset
  127. $(AVRDUDE) -B $(AVRDUDE_SLOW_SPEED) -p $(AVRDUDE_ARCH) \
  128. -c $(AVRDUDE_PROGRAMMER) -P $(PROGPORT) \
  129. -U signature:r:/dev/null:i -q -q
  130. endef
  131. define _avrdude_write_flash
  132. $(AVRDUDE) -B $(AVRDUDE_SPEED) -p $(AVRDUDE_ARCH) \
  133. -c $(AVRDUDE_PROGRAMMER) -P $(PROGPORT) \
  134. -U flash:w:$(HEX)
  135. endef
  136. define _avrdude_write_eeprom
  137. $(TEST) -r $(EEP) && ( \
  138. $(AVRDUDE) -B $(AVRDUDE_SPEED) -p $(AVRDUDE_ARCH) \
  139. -c $(AVRDUDE_PROGRAMMER) -P $(PROGPORT) \
  140. -U eeprom:w:$(EEP) \
  141. ) || $(TRUE)
  142. endef
  143. define _avrdude_write_fuse
  144. $(AVRDUDE) -B $(AVRDUDE_SLOW_SPEED) -p $(AVRDUDE_ARCH) \
  145. -c $(AVRDUDE_PROGRAMMER) -P $(PROGPORT) -q -q \
  146. -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m $(if $(EFUSE),-U efuse:w:$(EFUSE):m)
  147. endef
  148. write_flash: all
  149. $(call PROGRAMMER_CMD_PROG_ENTER)
  150. $(call _avrdude_write_flash)
  151. $(call PROGRAMMER_CMD_PWRCYCLE)
  152. $(call PROGRAMMER_CMD_PROG_LEAVE)
  153. writeflash: write_flash
  154. write_eeprom: all
  155. $(call PROGRAMMER_CMD_PROG_ENTER)
  156. $(call _avrdude_write_eeprom)
  157. $(call PROGRAMMER_CMD_PWRCYCLE)
  158. $(call PROGRAMMER_CMD_PROG_LEAVE)
  159. writeeeprom: write_eeprom
  160. write_mem: all
  161. $(call PROGRAMMER_CMD_PROG_ENTER)
  162. $(call _avrdude_write_flash)
  163. $(call _avrdude_write_eeprom)
  164. $(call PROGRAMMER_CMD_PWRCYCLE)
  165. $(call PROGRAMMER_CMD_PROG_LEAVE)
  166. writemem: write_mem
  167. install: write_mem
  168. write_fuse:
  169. $(call PROGRAMMER_CMD_PROG_ENTER)
  170. $(call _avrdude_write_fuse)
  171. $(call PROGRAMMER_CMD_PWRCYCLE)
  172. $(call PROGRAMMER_CMD_PROG_LEAVE)
  173. writefuse: write_fuse
  174. reset:
  175. $(call PROGRAMMER_CMD_PROG_ENTER)
  176. $(call _avrdude_reset)
  177. $(call PROGRAMMER_CMD_PWRCYCLE)
  178. avrdude:
  179. $(call PROGRAMMER_CMD_PROG_ENTER)
  180. $(call _avrdude_interactive)
  181. $(call PROGRAMMER_CMD_PWRCYCLE)
  182. $(call PROGRAMMER_CMD_PROG_LEAVE)
  183. doxygen:
  184. $(DOXYGEN) Doxyfile
  185. clean:
  186. -$(RM) -rf obj dep $(BIN) $(CLEAN_FILES)
  187. distclean: clean
  188. -$(RM) -f $(HEX) $(EEP) $(DISTCLEAN_FILES)
  189. -$(RM) -f $(if $(filter .exe,$(BINEXT)),$(patsubst %.c,%.s,$(SRCS)),*.s)