chibios.mk 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  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 ifneq ("$(wildcard $(TOP_DIR)/drivers/boards/ld/$(MCU_LDSCRIPT).ld)","")
  98. LDSCRIPT = $(TOP_DIR)/drivers/boards/ld/$(MCU_LDSCRIPT).ld
  99. else
  100. LDSCRIPT = $(STARTUPLD)/$(MCU_LDSCRIPT).ld
  101. endif
  102. CHIBISRC = $(STARTUPSRC) \
  103. $(KERNSRC) \
  104. $(PORTSRC) \
  105. $(OSALSRC) \
  106. $(HALSRC) \
  107. $(PLATFORMSRC) \
  108. $(BOARDSRC) \
  109. $(STREAMSSRC) \
  110. $(STARTUPASM) \
  111. $(PORTASM) \
  112. $(OSALASM)
  113. CHIBISRC := $(patsubst $(TOP_DIR)/%,%,$(CHIBISRC))
  114. EXTRAINCDIRS += $(CHIBIOS)/os/license \
  115. $(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \
  116. $(HALINC) $(PLATFORMINC) $(BOARDINC) $(TESTINC) \
  117. $(STREAMSINC) $(CHIBIOS)/os/various $(COMMON_VPATH)
  118. #
  119. # Project, sources and paths
  120. ##############################################################################
  121. ##############################################################################
  122. # Compiler settings
  123. #
  124. CC = arm-none-eabi-gcc
  125. OBJCOPY = arm-none-eabi-objcopy
  126. OBJDUMP = arm-none-eabi-objdump
  127. SIZE = arm-none-eabi-size
  128. AR = arm-none-eabi-ar
  129. NM = arm-none-eabi-nm
  130. HEX = $(OBJCOPY) -O $(FORMAT)
  131. EEP =
  132. BIN = $(OBJCOPY) -O binary
  133. COMMON_VPATH += $(DRIVER_PATH)/arm
  134. THUMBFLAGS = -DTHUMB_PRESENT -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -mthumb -DTHUMB
  135. COMPILEFLAGS += -fomit-frame-pointer
  136. COMPILEFLAGS += -falign-functions=16
  137. COMPILEFLAGS += -ffunction-sections
  138. COMPILEFLAGS += -fdata-sections
  139. COMPILEFLAGS += -fno-common
  140. COMPILEFLAGS += -fshort-wchar
  141. COMPILEFLAGS += $(THUMBFLAGS)
  142. CFLAGS += $(COMPILEFLAGS)
  143. ASFLAGS += $(THUMBFLAGS)
  144. CXXFLAGS += $(COMPILEFLAGS)
  145. CXXFLAGS += -fno-rtti
  146. LDFLAGS +=-Wl,--gc-sections
  147. LDFLAGS +=-Wl,--no-wchar-size-warning
  148. LDFLAGS += -mno-thumb-interwork -mthumb
  149. LDSYMBOLS =,--defsym=__process_stack_size__=$(USE_PROCESS_STACKSIZE)
  150. LDSYMBOLS :=$(LDSYMBOLS),--defsym=__main_stack_size__=$(USE_EXCEPTIONS_STACKSIZE)
  151. LDFLAGS += -Wl,--script=$(LDSCRIPT)$(LDSYMBOLS)
  152. OPT_DEFS += -DPROTOCOL_CHIBIOS
  153. MCUFLAGS = -mcpu=$(MCU)
  154. # FPU options default (Cortex-M4 and Cortex-M7 single precision).
  155. ifeq ($(USE_FPU_OPT),)
  156. USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -fsingle-precision-constant
  157. endif
  158. # FPU-related options
  159. ifeq ($(USE_FPU),)
  160. USE_FPU = no
  161. endif
  162. ifneq ($(USE_FPU),no)
  163. OPT += $(USE_FPU_OPT)
  164. OPT_DEFS += -DCORTEX_USE_FPU=TRUE
  165. else
  166. OPT_DEFS += -DCORTEX_USE_FPU=FALSE
  167. endif
  168. DEBUG = gdb
  169. DFU_ARGS ?=
  170. ifneq ("$(SERIAL)","")
  171. DFU_ARGS += -S $(SERIAL)
  172. endif
  173. ST_LINK_ARGS ?=
  174. # List any extra directories to look for libraries here.
  175. EXTRALIBDIRS = $(RULESPATH)/ld
  176. DFU_UTIL ?= dfu-util
  177. ST_LINK_CLI ?= st-link_cli
  178. # Generate a .qmk for the QMK-FF
  179. qmk: $(BUILD_DIR)/$(TARGET).bin
  180. zip $(TARGET).qmk -FSrj $(KEYMAP_PATH)/*
  181. zip $(TARGET).qmk -u $<
  182. printf "@ $<\n@=firmware.bin\n" | zipnote -w $(TARGET).qmk
  183. printf "{\n \"generated\": \"%s\"\n}" "$$(date)" > $(BUILD_DIR)/$(TARGET).json
  184. if [ -f $(KEYBOARD_PATH_5)/info.json ]; then \
  185. jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_5)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
  186. fi
  187. if [ -f $(KEYBOARD_PATH_4)/info.json ]; then \
  188. jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_4)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
  189. fi
  190. if [ -f $(KEYBOARD_PATH_3)/info.json ]; then \
  191. jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_3)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
  192. fi
  193. if [ -f $(KEYBOARD_PATH_2)/info.json ]; then \
  194. jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_2)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
  195. fi
  196. if [ -f $(KEYBOARD_PATH_1)/info.json ]; then \
  197. jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_1)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
  198. fi
  199. zip $(TARGET).qmk -urj $(BUILD_DIR)/$(TARGET).json
  200. printf "@ $(TARGET).json\n@=info.json\n" | zipnote -w $(TARGET).qmk
  201. define EXEC_DFU_UTIL
  202. until $(DFU_UTIL) -l | grep -q "Found DFU"; do\
  203. printf "$(MSG_BOOTLOADER_NOT_FOUND)" ;\
  204. sleep 5 ;\
  205. done
  206. $(DFU_UTIL) $(DFU_ARGS) -D $(BUILD_DIR)/$(TARGET).bin
  207. endef
  208. dfu-util: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter
  209. $(call EXEC_DFU_UTIL)
  210. # Legacy alias
  211. dfu-util-wait: dfu-util
  212. # TODO: Remove once ARM has a way to configure EECONFIG_HANDEDNESS
  213. # within the emulated eeprom via dfu-util or another tool
  214. ifneq (,$(filter $(MAKECMDGOALS),dfu-util-split-left))
  215. OPT_DEFS += -DINIT_EE_HANDS_LEFT
  216. endif
  217. ifneq (,$(filter $(MAKECMDGOALS),dfu-util-split-right))
  218. OPT_DEFS += -DINIT_EE_HANDS_RIGHT
  219. endif
  220. dfu-util-split-left: dfu-util
  221. dfu-util-split-right: dfu-util
  222. st-link-cli: $(BUILD_DIR)/$(TARGET).hex sizeafter
  223. $(ST_LINK_CLI) $(ST_LINK_ARGS) -q -c SWD -p $(BUILD_DIR)/$(TARGET).hex -Rst
  224. # Autodetect teensy loader
  225. ifndef TEENSY_LOADER_CLI
  226. ifneq (, $(shell which teensy-loader-cli 2>/dev/null))
  227. TEENSY_LOADER_CLI ?= teensy-loader-cli
  228. else
  229. TEENSY_LOADER_CLI ?= teensy_loader_cli
  230. endif
  231. endif
  232. define EXEC_TEENSY
  233. $(TEENSY_LOADER_CLI) -mmcu=$(MCU_LDSCRIPT) -w -v $(BUILD_DIR)/$(TARGET).hex
  234. endef
  235. teensy: $(BUILD_DIR)/$(TARGET).hex cpfirmware sizeafter
  236. $(call EXEC_TEENSY)
  237. bin: $(BUILD_DIR)/$(TARGET).bin sizeafter
  238. $(COPY) $(BUILD_DIR)/$(TARGET).bin $(TARGET).bin;
  239. flash: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter
  240. ifeq ($(strip $(BOOTLOADER)),dfu)
  241. $(call EXEC_DFU_UTIL)
  242. else ifeq ($(strip $(MCU_FAMILY)),KINETIS)
  243. $(call EXEC_TEENSY)
  244. else ifeq ($(strip $(MCU_FAMILY)),STM32)
  245. $(call EXEC_DFU_UTIL)
  246. else
  247. $(PRINT_OK); $(SILENT) || printf "$(MSG_FLASH_BOOTLOADER)"
  248. endif