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