chibios.mk 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. # Hey Emacs, this is a -*- makefile -*-
  2. ##############################################################################
  3. # Architecture or project specific options
  4. #
  5. # Stack size to be allocated to the Cortex-M process stack. This stack is
  6. # the stack used by the main() thread.
  7. ifeq ($(USE_PROCESS_STACKSIZE),)
  8. USE_PROCESS_STACKSIZE = 0x800
  9. endif
  10. # Stack size to the allocated to the Cortex-M main/exceptions stack. This
  11. # stack is used for processing interrupts and exceptions.
  12. ifeq ($(USE_EXCEPTIONS_STACKSIZE),)
  13. USE_EXCEPTIONS_STACKSIZE = 0x400
  14. endif
  15. #
  16. # Architecture or project specific options
  17. ##############################################################################
  18. ##############################################################################
  19. # Project, sources and paths
  20. #
  21. # Imported source files and paths
  22. CHIBIOS = $(TOP_DIR)/lib/chibios
  23. CHIBIOS_CONTRIB = $(TOP_DIR)/lib/chibios-contrib
  24. # Startup files. Try a few different locations, for compability with old versions and
  25. # for things hardware in the contrib repository
  26. STARTUP_MK = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/startup_$(MCU_STARTUP).mk
  27. ifeq ("$(wildcard $(STARTUP_MK))","")
  28. STARTUP_MK = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_$(MCU_STARTUP).mk
  29. ifeq ("$(wildcard $(STARTUP_MK))","")
  30. STARTUP_MK = $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_$(MCU_STARTUP).mk
  31. endif
  32. endif
  33. include $(STARTUP_MK)
  34. # HAL-OSAL files (optional).
  35. include $(CHIBIOS)/os/hal/hal.mk
  36. ifeq ("$(PLATFORM_NAME)","")
  37. PLATFORM_NAME = platform
  38. endif
  39. PLATFORM_MK = $(CHIBIOS)/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)/$(PLATFORM_NAME).mk
  40. ifeq ("$(wildcard $(PLATFORM_MK))","")
  41. PLATFORM_MK = $(CHIBIOS_CONTRIB)/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)/$(PLATFORM_NAME).mk
  42. endif
  43. include $(PLATFORM_MK)
  44. BOARD_MK :=
  45. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/boards/$(BOARD)/board.mk)","")
  46. BOARD_PATH = $(KEYBOARD_PATH_5)
  47. BOARD_MK += $(KEYBOARD_PATH_5)/boards/$(BOARD)/board.mk
  48. else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/boards/$(BOARD)/board.mk)","")
  49. BOARD_PATH = $(KEYBOARD_PATH_4)
  50. BOARD_MK += $(KEYBOARD_PATH_4)/boards/$(BOARD)/board.mk
  51. else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/boards/$(BOARD)/board.mk)","")
  52. BOARD_PATH = $(KEYBOARD_PATH_3)
  53. BOARD_MK += $(KEYBOARD_PATH_3)/boards/$(BOARD)/board.mk
  54. else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/boards/$(BOARD)/board.mk)","")
  55. BOARD_PATH = $(KEYBOARD_PATH_2)
  56. BOARD_MK += $(KEYBOARD_PATH_2)/boards/$(BOARD)/board.mk
  57. else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/boards/$(BOARD)/board.mk)","")
  58. BOARD_PATH = $(KEYBOARD_PATH_1)
  59. BOARD_MK += $(KEYBOARD_PATH_1)/boards/$(BOARD)/board.mk
  60. else ifneq ("$(wildcard $(TOP_DIR)/drivers/boards/$(BOARD)/board.mk)","")
  61. BOARD_PATH = $(TOP_DIR)/drivers
  62. BOARD_MK += $(TOP_DIR)/drivers/boards/$(BOARD)/board.mk
  63. endif
  64. ifeq ("$(wildcard $(BOARD_MK))","")
  65. BOARD_MK = $(CHIBIOS)/os/hal/boards/$(BOARD)/board.mk
  66. ifeq ("$(wildcard $(BOARD_MK))","")
  67. BOARD_MK = $(CHIBIOS_CONTRIB)/os/hal/boards/$(BOARD)/board.mk
  68. endif
  69. endif
  70. include $(BOARD_MK)
  71. include $(CHIBIOS)/os/hal/osal/rt/osal.mk
  72. # RTOS files (optional).
  73. include $(CHIBIOS)/os/rt/rt.mk
  74. # Compability with old version
  75. PORT_V = $(CHIBIOS)/os/rt/ports/ARMCMx/compilers/GCC/mk/port_v$(ARMV)m.mk
  76. ifeq ("$(wildcard $(PORT_V))","")
  77. PORT_V = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v$(ARMV)m.mk
  78. endif
  79. include $(PORT_V)
  80. # Other files (optional).
  81. include $(CHIBIOS)/os/hal/lib/streams/streams.mk
  82. RULESPATH = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC
  83. ifeq ("$(wildcard $(RULESPATH)/rules.mk)","")
  84. RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC
  85. endif
  86. # Define linker script file here
  87. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/ld/$(MCU_LDSCRIPT).ld)","")
  88. LDSCRIPT = $(KEYBOARD_PATH_5)/ld/$(MCU_LDSCRIPT).ld
  89. else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/ld/$(MCU_LDSCRIPT).ld)","")
  90. LDSCRIPT = $(KEYBOARD_PATH_4)/ld/$(MCU_LDSCRIPT).ld
  91. else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/ld/$(MCU_LDSCRIPT).ld)","")
  92. LDSCRIPT = $(KEYBOARD_PATH_3)/ld/$(MCU_LDSCRIPT).ld
  93. else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/ld/$(MCU_LDSCRIPT).ld)","")
  94. LDSCRIPT = $(KEYBOARD_PATH_2)/ld/$(MCU_LDSCRIPT).ld
  95. else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/ld/$(MCU_LDSCRIPT).ld)","")
  96. LDSCRIPT = $(KEYBOARD_PATH_1)/ld/$(MCU_LDSCRIPT).ld
  97. else
  98. LDSCRIPT = $(STARTUPLD)/$(MCU_LDSCRIPT).ld
  99. endif
  100. CHIBISRC = $(STARTUPSRC) \
  101. $(KERNSRC) \
  102. $(PORTSRC) \
  103. $(OSALSRC) \
  104. $(HALSRC) \
  105. $(PLATFORMSRC) \
  106. $(BOARDSRC) \
  107. $(STREAMSSRC) \
  108. $(STARTUPASM) \
  109. $(PORTASM) \
  110. $(OSALASM)
  111. CHIBISRC := $(patsubst $(TOP_DIR)/%,%,$(CHIBISRC))
  112. EXTRAINCDIRS += $(CHIBIOS)/os/license \
  113. $(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \
  114. $(HALINC) $(PLATFORMINC) $(BOARDINC) $(TESTINC) \
  115. $(STREAMSINC) $(CHIBIOS)/os/various $(COMMON_VPATH)
  116. #
  117. # Project, sources and paths
  118. ##############################################################################
  119. ##############################################################################
  120. # Compiler settings
  121. #
  122. CC = arm-none-eabi-gcc
  123. OBJCOPY = arm-none-eabi-objcopy
  124. OBJDUMP = arm-none-eabi-objdump
  125. SIZE = arm-none-eabi-size
  126. AR = arm-none-eabi-ar
  127. NM = arm-none-eabi-nm
  128. HEX = $(OBJCOPY) -O $(FORMAT)
  129. EEP =
  130. BIN = $(OBJCOPY) -O binary
  131. COMMON_VPATH += $(DRIVER_PATH)/arm
  132. THUMBFLAGS = -DTHUMB_PRESENT -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -mthumb -DTHUMB
  133. COMPILEFLAGS += -fomit-frame-pointer
  134. COMPILEFLAGS += -falign-functions=16
  135. COMPILEFLAGS += -ffunction-sections
  136. COMPILEFLAGS += -fdata-sections
  137. COMPILEFLAGS += -fno-common
  138. COMPILEFLAGS += -fshort-wchar
  139. COMPILEFLAGS += $(THUMBFLAGS)
  140. CFLAGS += $(COMPILEFLAGS)
  141. ASFLAGS += $(THUMBFLAGS)
  142. CPPFLAGS += $(COMPILEFLAGS)
  143. CPPFLAGS += -fno-rtti
  144. LDFLAGS +=-Wl,--gc-sections
  145. LDFLAGS +=-Wl,--no-wchar-size-warning
  146. LDFLAGS += -mno-thumb-interwork -mthumb
  147. LDSYMBOLS =,--defsym=__process_stack_size__=$(USE_PROCESS_STACKSIZE)
  148. LDSYMBOLS :=$(LDSYMBOLS),--defsym=__main_stack_size__=$(USE_EXCEPTIONS_STACKSIZE)
  149. LDFLAGS += -Wl,--script=$(LDSCRIPT)$(LDSYMBOLS)
  150. OPT_DEFS += -DPROTOCOL_CHIBIOS
  151. MCUFLAGS = -mcpu=$(MCU)
  152. # FPU options default (Cortex-M4 and Cortex-M7 single precision).
  153. ifeq ($(USE_FPU_OPT),)
  154. USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -fsingle-precision-constant
  155. endif
  156. # FPU-related options
  157. ifeq ($(USE_FPU),)
  158. USE_FPU = no
  159. endif
  160. ifneq ($(USE_FPU),no)
  161. OPT += $(USE_FPU_OPT)
  162. OPT_DEFS += -DCORTEX_USE_FPU=TRUE
  163. else
  164. OPT_DEFS += -DCORTEX_USE_FPU=FALSE
  165. endif
  166. DEBUG = gdb
  167. DFU_ARGS ?=
  168. ifneq ("$(SERIAL)","")
  169. DFU_ARGS += -S $(SERIAL)
  170. endif
  171. ST_LINK_ARGS ?=
  172. # List any extra directories to look for libraries here.
  173. EXTRALIBDIRS = $(RULESPATH)/ld
  174. DFU_UTIL ?= dfu-util
  175. ST_LINK_CLI ?= st-link_cli
  176. # Generate a .qmk for the QMK-FF
  177. qmk: $(BUILD_DIR)/$(TARGET).bin
  178. zip $(TARGET).qmk -FSrj $(KEYMAP_PATH)/*
  179. zip $(TARGET).qmk -u $<
  180. printf "@ $<\n@=firmware.bin\n" | zipnote -w $(TARGET).qmk
  181. printf "{\n \"generated\": \"%s\"\n}" "$$(date)" > $(BUILD_DIR)/$(TARGET).json
  182. if [ -f $(KEYBOARD_PATH_5)/info.json ]; then \
  183. jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_5)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
  184. fi
  185. if [ -f $(KEYBOARD_PATH_4)/info.json ]; then \
  186. jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_4)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
  187. fi
  188. if [ -f $(KEYBOARD_PATH_3)/info.json ]; then \
  189. jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_3)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
  190. fi
  191. if [ -f $(KEYBOARD_PATH_2)/info.json ]; then \
  192. jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_2)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
  193. fi
  194. if [ -f $(KEYBOARD_PATH_1)/info.json ]; then \
  195. jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_1)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
  196. fi
  197. zip $(TARGET).qmk -urj $(BUILD_DIR)/$(TARGET).json
  198. printf "@ $(TARGET).json\n@=info.json\n" | zipnote -w $(TARGET).qmk
  199. define EXEC_DFU_UTIL
  200. until $(DFU_UTIL) -l | grep -q "Found DFU"; do\
  201. echo "Error: Bootloader not found. Trying again in 5s." ;\
  202. sleep 5 ;\
  203. done
  204. $(DFU_UTIL) $(DFU_ARGS) -D $(BUILD_DIR)/$(TARGET).bin
  205. endef
  206. dfu-util: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter
  207. $(call EXEC_DFU_UTIL)
  208. # Legacy alias
  209. dfu-util-wait: dfu-util
  210. st-link-cli: $(BUILD_DIR)/$(TARGET).hex sizeafter
  211. $(ST_LINK_CLI) $(ST_LINK_ARGS) -q -c SWD -p $(BUILD_DIR)/$(TARGET).hex -Rst
  212. # Autodetect teensy loader
  213. ifndef TEENSY_LOADER_CLI
  214. ifneq (, $(shell which teensy-loader-cli 2>/dev/null))
  215. TEENSY_LOADER_CLI ?= teensy-loader-cli
  216. else
  217. TEENSY_LOADER_CLI ?= teensy_loader_cli
  218. endif
  219. endif
  220. define EXEC_TEENSY
  221. $(TEENSY_LOADER_CLI) -mmcu=$(MCU_LDSCRIPT) -w -v $(BUILD_DIR)/$(TARGET).hex
  222. endef
  223. teensy: $(BUILD_DIR)/$(TARGET).hex cpfirmware sizeafter
  224. $(call EXEC_TEENSY)
  225. bin: $(BUILD_DIR)/$(TARGET).bin sizeafter
  226. $(COPY) $(BUILD_DIR)/$(TARGET).bin $(TARGET).bin;
  227. flash: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter
  228. ifeq ($(strip $(BOOTLOADER)),dfu)
  229. $(call EXEC_DFU_UTIL)
  230. else ifeq ($(strip $(MCU_FAMILY)),KINETIS)
  231. $(call EXEC_TEENSY)
  232. else ifeq ($(strip $(MCU_FAMILY)),STM32)
  233. $(call EXEC_DFU_UTIL)
  234. else
  235. $(PRINT_OK); $(SILENT) || printf "$(MSG_FLASH_BOOTLOADER)"
  236. endif