1 # Hey Emacs, this is a -*- makefile -*-
2 ##############################################################################
3 # Architecture or project specific options
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
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
19 # Architecture or project specific options
20 ##############################################################################
22 ##############################################################################
23 # Project, sources and paths
26 # Imported source files and paths
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
40 # HAL-OSAL files (optional).
41 include $(CHIBIOS
)/os
/hal
/hal.mk
43 ifeq ("$(PLATFORM_NAME)","")
44 PLATFORM_NAME
= platform
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
51 include $(PLATFORM_MK
)
54 ifdef STM32_BOOTLOADER_ADDRESS
55 OPT_DEFS
+= -DSTM32_BOOTLOADER_ADDRESS
=$(STM32_BOOTLOADER_ADDRESS
)
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
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
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
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
122 # Other files (optional).
123 include $(CHIBIOS
)/os
/hal
/lib
/streams
/streams.mk
125 RULESPATH
= $(CHIBIOS
)/os
/common
/ports
/ARMCMx
/compilers
/GCC
126 ifeq ("$(wildcard $(RULESPATH)/rules.mk)","")
127 RULESPATH
= $(CHIBIOS
)/os
/common
/startup
/ARMCMx
/compilers
/GCC
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
147 LDSCRIPT
= $(STARTUPLD
)/$(MCU_LDSCRIPT
).
ld
150 CHIBISRC
= $(STARTUPSRC
) \
158 $(CHIBIOS
)/os
/various
/syscalls.c
160 # Ensure the ASM files are not subjected to LTO -- it'll strip out interrupt handlers otherwise.
161 QUANTUM_LIB_SRC
+= $(STARTUPASM
) $(PORTASM
) $(OSALASM
)
163 CHIBISRC
:= $(patsubst $(TOP_DIR
)/%,%,$(CHIBISRC
))
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
)
172 ##############################################################################
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
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
194 # Project, sources and paths
195 ##############################################################################
198 ##############################################################################
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
)
209 BIN
= $(OBJCOPY
) -O binary
211 COMMON_VPATH
+= $(DRIVER_PATH
)/chibios
213 THUMBFLAGS
= -DTHUMB_PRESENT
-mno-thumb-interwork
-DTHUMB_NO_INTERWORKING
-mthumb
-DTHUMB
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
)
223 CFLAGS
+= $(COMPILEFLAGS
)
225 ASFLAGS
+= $(THUMBFLAGS
)
227 CXXFLAGS
+= $(COMPILEFLAGS
)
228 CXXFLAGS
+= -fno-rtti
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
238 OPT_DEFS
+= -DPROTOCOL_CHIBIOS
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
243 MCUFLAGS
= -mcpu
=$(MCU
)
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
250 # FPU-related options
254 ifneq ($(USE_FPU
),no
)
255 OPT
+= $(USE_FPU_OPT
)
256 OPT_DEFS
+= -DCORTEX_USE_FPU
=TRUE
258 OPT_DEFS
+= -DCORTEX_USE_FPU
=FALSE
264 ifneq ("$(SERIAL)","")
265 DFU_ARGS
+= -S
$(SERIAL
)
270 # List any extra directories to look for libraries here.
271 EXTRALIBDIRS
= $(RULESPATH
)/ld
274 ST_LINK_CLI ?
= st-link_cli
277 until
$(DFU_UTIL
) -l | grep
-q
"Found DFU"; do\
278 printf
"$(MSG_BOOTLOADER_NOT_FOUND)" ;\
281 $(DFU_UTIL
) $(DFU_ARGS
) -D
$(BUILD_DIR
)/$(TARGET
).bin
284 dfu-util
: $(BUILD_DIR
)/$(TARGET
).bin cpfirmware sizeafter
285 $(call EXEC_DFU_UTIL
)
288 dfu-util-wait
: dfu-util
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
296 ifneq (,$(filter $(MAKECMDGOALS
),dfu-util-split-right
))
297 OPT_DEFS
+= -DINIT_EE_HANDS_RIGHT
300 dfu-util-split-left
: dfu-util
302 dfu-util-split-right
: dfu-util
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
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
314 TEENSY_LOADER_CLI ?
= teensy_loader_cli
319 $(TEENSY_LOADER_CLI
) -mmcu
=$(MCU_LDSCRIPT
) -w
-v
$(BUILD_DIR
)/$(TARGET
).hex
322 teensy
: $(BUILD_DIR
)/$(TARGET
).hex cpfirmware sizeafter
325 bin
: $(BUILD_DIR
)/$(TARGET
).bin sizeafter
326 $(COPY
) $(BUILD_DIR
)/$(TARGET
).bin
$(TARGET
).bin
;
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
)
334 else ifeq ($(strip $(MCU_FAMILY
)),STM32
)
335 $(call EXEC_DFU_UTIL
)
337 $(PRINT_OK
); $(SILENT
) || printf
"$(MSG_FLASH_BOOTLOADER)"