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