chibios.mk 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  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. OPT_OS = chibios
  23. CHIBIOS = $(TOP_DIR)/lib/chibios
  24. CHIBIOS_CONTRIB = $(TOP_DIR)/lib/chibios-contrib
  25. # Startup files. Try a few different locations, for compability with old versions and
  26. # for things hardware in the contrib repository
  27. STARTUP_MK = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/startup_$(MCU_STARTUP).mk
  28. ifeq ("$(wildcard $(STARTUP_MK))","")
  29. STARTUP_MK = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_$(MCU_STARTUP).mk
  30. ifeq ("$(wildcard $(STARTUP_MK))","")
  31. STARTUP_MK = $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/compilers/GCC/mk/startup_$(MCU_STARTUP).mk
  32. endif
  33. endif
  34. include $(STARTUP_MK)
  35. # HAL-OSAL files (optional).
  36. include $(CHIBIOS)/os/hal/hal.mk
  37. ifeq ("$(PLATFORM_NAME)","")
  38. PLATFORM_NAME = platform
  39. endif
  40. PLATFORM_MK = $(CHIBIOS)/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)/$(PLATFORM_NAME).mk
  41. ifeq ("$(wildcard $(PLATFORM_MK))","")
  42. PLATFORM_MK = $(CHIBIOS_CONTRIB)/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)/$(PLATFORM_NAME).mk
  43. endif
  44. include $(PLATFORM_MK)
  45. # Bootloader address
  46. ifdef STM32_BOOTLOADER_ADDRESS
  47. OPT_DEFS += -DSTM32_BOOTLOADER_ADDRESS=$(STM32_BOOTLOADER_ADDRESS)
  48. endif
  49. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/bootloader_defs.h)","")
  50. OPT_DEFS += -include $(KEYBOARD_PATH_5)/bootloader_defs.h
  51. else ifneq ("$(wildcard $(KEYBOARD_PATH_5)/boards/$(BOARD)/bootloader_defs.h)","")
  52. OPT_DEFS += -include $(KEYBOARD_PATH_5)/boards/$(BOARD)/bootloader_defs.h
  53. else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/bootloader_defs.h)","")
  54. OPT_DEFS += -include $(KEYBOARD_PATH_4)/bootloader_defs.h
  55. else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/boards/$(BOARD)/bootloader_defs.h)","")
  56. OPT_DEFS += -include $(KEYBOARD_PATH_4)/boards/$(BOARD)/bootloader_defs.h
  57. else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/bootloader_defs.h)","")
  58. OPT_DEFS += -include $(KEYBOARD_PATH_3)/bootloader_defs.h
  59. else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/boards/$(BOARD)/bootloader_defs.h)","")
  60. OPT_DEFS += -include $(KEYBOARD_PATH_3)/boards/$(BOARD)/bootloader_defs.h
  61. else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/bootloader_defs.h)","")
  62. OPT_DEFS += -include $(KEYBOARD_PATH_2)/bootloader_defs.h
  63. else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/boards/$(BOARD)/bootloader_defs.h)","")
  64. OPT_DEFS += -include $(KEYBOARD_PATH_2)/boards/$(BOARD)/bootloader_defs.h
  65. else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/bootloader_defs.h)","")
  66. OPT_DEFS += -include $(KEYBOARD_PATH_1)/bootloader_defs.h
  67. else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/boards/$(BOARD)/bootloader_defs.h)","")
  68. OPT_DEFS += -include $(KEYBOARD_PATH_1)/boards/$(BOARD)/bootloader_defs.h
  69. else ifneq ("$(wildcard $(TOP_DIR)/drivers/boards/$(BOARD)/bootloader_defs.h)","")
  70. OPT_DEFS += -include $(TOP_DIR)/drivers/boards/$(BOARD)/bootloader_defs.h
  71. endif
  72. BOARD_MK :=
  73. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/boards/$(BOARD)/board.mk)","")
  74. BOARD_PATH = $(KEYBOARD_PATH_5)
  75. BOARD_MK += $(KEYBOARD_PATH_5)/boards/$(BOARD)/board.mk
  76. else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/boards/$(BOARD)/board.mk)","")
  77. BOARD_PATH = $(KEYBOARD_PATH_4)
  78. BOARD_MK += $(KEYBOARD_PATH_4)/boards/$(BOARD)/board.mk
  79. else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/boards/$(BOARD)/board.mk)","")
  80. BOARD_PATH = $(KEYBOARD_PATH_3)
  81. BOARD_MK += $(KEYBOARD_PATH_3)/boards/$(BOARD)/board.mk
  82. else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/boards/$(BOARD)/board.mk)","")
  83. BOARD_PATH = $(KEYBOARD_PATH_2)
  84. BOARD_MK += $(KEYBOARD_PATH_2)/boards/$(BOARD)/board.mk
  85. else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/boards/$(BOARD)/board.mk)","")
  86. BOARD_PATH = $(KEYBOARD_PATH_1)
  87. BOARD_MK += $(KEYBOARD_PATH_1)/boards/$(BOARD)/board.mk
  88. else ifneq ("$(wildcard $(TOP_DIR)/drivers/boards/$(BOARD)/board.mk)","")
  89. BOARD_PATH = $(TOP_DIR)/drivers
  90. BOARD_MK += $(TOP_DIR)/drivers/boards/$(BOARD)/board.mk
  91. endif
  92. ifeq ("$(wildcard $(BOARD_MK))","")
  93. BOARD_MK = $(CHIBIOS)/os/hal/boards/$(BOARD)/board.mk
  94. ifeq ("$(wildcard $(BOARD_MK))","")
  95. BOARD_MK = $(CHIBIOS_CONTRIB)/os/hal/boards/$(BOARD)/board.mk
  96. endif
  97. endif
  98. include $(BOARD_MK)
  99. -include $(CHIBIOS)/os/hal/osal/rt/osal.mk # ChibiOS <= 19.x
  100. -include $(CHIBIOS)/os/hal/osal/rt-nil/osal.mk # ChibiOS >= 20.x
  101. # RTOS files (optional).
  102. include $(CHIBIOS)/os/rt/rt.mk
  103. # Compability with old version
  104. PORT_V = $(CHIBIOS)/os/rt/ports/ARMCMx/compilers/GCC/mk/port_v$(ARMV)m.mk
  105. ifeq ("$(wildcard $(PORT_V))","")
  106. PORT_V = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v$(ARMV)m.mk
  107. endif
  108. include $(PORT_V)
  109. # Other files (optional).
  110. include $(CHIBIOS)/os/hal/lib/streams/streams.mk
  111. RULESPATH = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC
  112. ifeq ("$(wildcard $(RULESPATH)/rules.mk)","")
  113. RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC
  114. endif
  115. # Define linker script file here
  116. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/ld/$(MCU_LDSCRIPT).ld)","")
  117. LDSCRIPT = $(KEYBOARD_PATH_5)/ld/$(MCU_LDSCRIPT).ld
  118. else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/ld/$(MCU_LDSCRIPT).ld)","")
  119. LDSCRIPT = $(KEYBOARD_PATH_4)/ld/$(MCU_LDSCRIPT).ld
  120. else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/ld/$(MCU_LDSCRIPT).ld)","")
  121. LDSCRIPT = $(KEYBOARD_PATH_3)/ld/$(MCU_LDSCRIPT).ld
  122. else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/ld/$(MCU_LDSCRIPT).ld)","")
  123. LDSCRIPT = $(KEYBOARD_PATH_2)/ld/$(MCU_LDSCRIPT).ld
  124. else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/ld/$(MCU_LDSCRIPT).ld)","")
  125. LDSCRIPT = $(KEYBOARD_PATH_1)/ld/$(MCU_LDSCRIPT).ld
  126. else ifneq ("$(wildcard $(TOP_DIR)/drivers/boards/ld/$(MCU_LDSCRIPT).ld)","")
  127. LDSCRIPT = $(TOP_DIR)/drivers/boards/ld/$(MCU_LDSCRIPT).ld
  128. else ifneq ("$(wildcard $(STARTUPLD_CONTRIB)/$(MCU_LDSCRIPT).ld)","")
  129. LDSCRIPT = $(STARTUPLD_CONTRIB)/$(MCU_LDSCRIPT).ld
  130. USE_CHIBIOS_CONTRIB = yes
  131. else
  132. LDSCRIPT = $(STARTUPLD)/$(MCU_LDSCRIPT).ld
  133. endif
  134. CHIBISRC = $(STARTUPSRC) \
  135. $(KERNSRC) \
  136. $(PORTSRC) \
  137. $(OSALSRC) \
  138. $(HALSRC) \
  139. $(PLATFORMSRC) \
  140. $(BOARDSRC) \
  141. $(STREAMSSRC) \
  142. $(CHIBIOS)/os/various/syscalls.c
  143. # Ensure the ASM files are not subjected to LTO -- it'll strip out interrupt handlers otherwise.
  144. QUANTUM_LIB_SRC += $(STARTUPASM) $(PORTASM) $(OSALASM)
  145. CHIBISRC := $(patsubst $(TOP_DIR)/%,%,$(CHIBISRC))
  146. EXTRAINCDIRS += $(CHIBIOS)/os/license $(CHIBIOS)/os/oslib/include \
  147. $(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \
  148. $(HALINC) $(PLATFORMINC) $(BOARDINC) $(TESTINC) \
  149. $(STREAMSINC) $(CHIBIOS)/os/various $(COMMON_VPATH)
  150. #
  151. # ChibiOS-Contrib
  152. ##############################################################################
  153. # Work out if we're using ChibiOS-Contrib by checking if halconf_community.h exists
  154. ifneq ("$(wildcard $(KEYBOARD_PATH_5)/halconf_community.h)","")
  155. USE_CHIBIOS_CONTRIB = yes
  156. else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/halconf_community.h)","")
  157. USE_CHIBIOS_CONTRIB = yes
  158. else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/halconf_community.h)","")
  159. USE_CHIBIOS_CONTRIB = yes
  160. else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/halconf_community.h)","")
  161. USE_CHIBIOS_CONTRIB = yes
  162. else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/halconf_community.h)","")
  163. USE_CHIBIOS_CONTRIB = yes
  164. endif
  165. ifeq ($(strip $(USE_CHIBIOS_CONTRIB)),yes)
  166. include $(CHIBIOS_CONTRIB)/os/hal/hal.mk
  167. CHIBISRC += $(PLATFORMSRC_CONTRIB) $(HALSRC_CONTRIB)
  168. EXTRAINCDIRS += $(PLATFORMINC_CONTRIB) $(HALINC_CONTRIB) $(CHIBIOS_CONTRIB)/os/various
  169. endif
  170. #
  171. # Project, sources and paths
  172. ##############################################################################
  173. ##############################################################################
  174. # Compiler settings
  175. #
  176. CC = arm-none-eabi-gcc
  177. OBJCOPY = arm-none-eabi-objcopy
  178. OBJDUMP = arm-none-eabi-objdump
  179. SIZE = arm-none-eabi-size
  180. AR = arm-none-eabi-ar
  181. NM = arm-none-eabi-nm
  182. HEX = $(OBJCOPY) -O $(FORMAT)
  183. EEP =
  184. BIN = $(OBJCOPY) -O binary
  185. COMMON_VPATH += $(DRIVER_PATH)/chibios
  186. THUMBFLAGS = -DTHUMB_PRESENT -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -mthumb -DTHUMB
  187. COMPILEFLAGS += -fomit-frame-pointer
  188. COMPILEFLAGS += -falign-functions=16
  189. COMPILEFLAGS += -ffunction-sections
  190. COMPILEFLAGS += -fdata-sections
  191. COMPILEFLAGS += -fno-common
  192. COMPILEFLAGS += -fshort-wchar
  193. COMPILEFLAGS += $(THUMBFLAGS)
  194. CFLAGS += $(COMPILEFLAGS)
  195. ASFLAGS += $(THUMBFLAGS)
  196. CXXFLAGS += $(COMPILEFLAGS)
  197. CXXFLAGS += -fno-rtti
  198. LDFLAGS +=-Wl,--gc-sections
  199. LDFLAGS +=-Wl,--no-wchar-size-warning
  200. LDFLAGS += -mno-thumb-interwork -mthumb
  201. LDSYMBOLS =,--defsym=__process_stack_size__=$(USE_PROCESS_STACKSIZE)
  202. LDSYMBOLS :=$(LDSYMBOLS),--defsym=__main_stack_size__=$(USE_EXCEPTIONS_STACKSIZE)
  203. LDFLAGS += -Wl,--script=$(LDSCRIPT)$(LDSYMBOLS)
  204. LDFLAGS += --specs=nano.specs
  205. OPT_DEFS += -DPROTOCOL_CHIBIOS
  206. # Workaround to stop ChibiOS from complaining about new GCC -- it's been fixed for 7/8/9 already
  207. OPT_DEFS += -DPORT_IGNORE_GCC_VERSION_CHECK=1
  208. MCUFLAGS = -mcpu=$(MCU)
  209. # FPU options default (Cortex-M4 and Cortex-M7 single precision).
  210. ifeq ($(USE_FPU_OPT),)
  211. USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -fsingle-precision-constant
  212. endif
  213. # FPU-related options
  214. ifeq ($(USE_FPU),)
  215. USE_FPU = no
  216. endif
  217. ifneq ($(USE_FPU),no)
  218. OPT += $(USE_FPU_OPT)
  219. OPT_DEFS += -DCORTEX_USE_FPU=TRUE
  220. else
  221. OPT_DEFS += -DCORTEX_USE_FPU=FALSE
  222. endif
  223. DEBUG = gdb
  224. DFU_ARGS ?=
  225. ifneq ("$(SERIAL)","")
  226. DFU_ARGS += -S $(SERIAL)
  227. endif
  228. ST_LINK_ARGS ?=
  229. # List any extra directories to look for libraries here.
  230. EXTRALIBDIRS = $(RULESPATH)/ld
  231. DFU_UTIL ?= dfu-util
  232. ST_LINK_CLI ?= st-link_cli
  233. define EXEC_DFU_UTIL
  234. until $(DFU_UTIL) -l | grep -q "Found DFU"; do\
  235. printf "$(MSG_BOOTLOADER_NOT_FOUND)" ;\
  236. sleep 5 ;\
  237. done
  238. $(DFU_UTIL) $(DFU_ARGS) -D $(BUILD_DIR)/$(TARGET).bin
  239. endef
  240. dfu-util: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter
  241. $(call EXEC_DFU_UTIL)
  242. # Legacy alias
  243. dfu-util-wait: dfu-util
  244. # TODO: Remove once ARM has a way to configure EECONFIG_HANDEDNESS
  245. # within the emulated eeprom via dfu-util or another tool
  246. ifneq (,$(filter $(MAKECMDGOALS),dfu-util-split-left))
  247. OPT_DEFS += -DINIT_EE_HANDS_LEFT
  248. endif
  249. ifneq (,$(filter $(MAKECMDGOALS),dfu-util-split-right))
  250. OPT_DEFS += -DINIT_EE_HANDS_RIGHT
  251. endif
  252. dfu-util-split-left: dfu-util
  253. dfu-util-split-right: dfu-util
  254. st-link-cli: $(BUILD_DIR)/$(TARGET).hex sizeafter
  255. $(ST_LINK_CLI) $(ST_LINK_ARGS) -q -c SWD -p $(BUILD_DIR)/$(TARGET).hex -Rst
  256. # Autodetect teensy loader
  257. ifndef TEENSY_LOADER_CLI
  258. ifneq (, $(shell which teensy-loader-cli 2>/dev/null))
  259. TEENSY_LOADER_CLI ?= teensy-loader-cli
  260. else
  261. TEENSY_LOADER_CLI ?= teensy_loader_cli
  262. endif
  263. endif
  264. define EXEC_TEENSY
  265. $(TEENSY_LOADER_CLI) -mmcu=$(MCU_LDSCRIPT) -w -v $(BUILD_DIR)/$(TARGET).hex
  266. endef
  267. teensy: $(BUILD_DIR)/$(TARGET).hex cpfirmware sizeafter
  268. $(call EXEC_TEENSY)
  269. bin: $(BUILD_DIR)/$(TARGET).bin sizeafter
  270. $(COPY) $(BUILD_DIR)/$(TARGET).bin $(TARGET).bin;
  271. flash: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter
  272. ifeq ($(strip $(BOOTLOADER)),dfu)
  273. $(call EXEC_DFU_UTIL)
  274. else ifeq ($(strip $(MCU_FAMILY)),KINETIS)
  275. $(call EXEC_TEENSY)
  276. else ifeq ($(strip $(MCU_FAMILY)),STM32)
  277. $(call EXEC_DFU_UTIL)
  278. else
  279. $(PRINT_OK); $(SILENT) || printf "$(MSG_FLASH_BOOTLOADER)"
  280. endif