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
27 CHIBIOS
= $(TOP_DIR
)/lib
/chibios
28 CHIBIOS_CONTRIB
= $(TOP_DIR
)/lib
/chibios-contrib
29 # Startup files. Try a few different locations, for compability with old versions and
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
39 # HAL-OSAL files (optional).
40 include $(CHIBIOS
)/os
/hal
/hal.mk
42 ifeq ("$(PLATFORM_NAME)","")
43 PLATFORM_NAME
= platform
46 PLATFORM_MK
= $(CHIBIOS
)/os
/hal
/ports
/$(MCU_FAMILY
)/$(MCU_SERIES
)/$(PLATFORM_NAME
).mk
47 ifeq ("$(wildcard $(PLATFORM_MK))","")
48 PLATFORM_MK
= $(CHIBIOS_CONTRIB
)/os
/hal
/ports
/$(MCU_FAMILY
)/$(MCU_SERIES
)/$(PLATFORM_NAME
).mk
50 include $(PLATFORM_MK
)
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
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
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
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
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
93 # Other files (optional).
94 include $(CHIBIOS
)/os
/hal
/lib
/streams
/streams.mk
96 RULESPATH
= $(CHIBIOS
)/os
/common
/ports
/ARMCMx
/compilers
/GCC
97 ifeq ("$(wildcard $(RULESPATH)/rules.mk)","")
98 RULESPATH
= $(CHIBIOS
)/os
/common
/startup
/ARMCMx
/compilers
/GCC
101 # Define linker script file here
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
112 else ifneq ("$(wildcard $(TOP_DIR)/drivers/boards/ld/$(MCU_LDSCRIPT).ld)","")
113 LDSCRIPT
= $(TOP_DIR
)/drivers
/boards
/ld/$(MCU_LDSCRIPT
).
ld
114 else ifneq ("$(wildcard $(STARTUPLD_CONTRIB)/$(MCU_LDSCRIPT).ld)","")
115 LDSCRIPT
= $(STARTUPLD_CONTRIB
)/$(MCU_LDSCRIPT
).
ld
116 USE_CHIBIOS_CONTRIB
= yes
118 LDSCRIPT
= $(STARTUPLD
)/$(MCU_LDSCRIPT
).
ld
121 CHIBISRC
= $(STARTUPSRC
) \
129 $(CHIBIOS
)/os
/various
/syscalls.c
131 # Ensure the ASM files are not subjected to LTO -- it'll strip out interrupt handlers otherwise.
132 QUANTUM_LIB_SRC
+= $(STARTUPASM
) $(PORTASM
) $(OSALASM
)
134 CHIBISRC
:= $(patsubst $(TOP_DIR
)/%,%,$(CHIBISRC
))
136 EXTRAINCDIRS
+= $(CHIBIOS
)/os
/license
$(CHIBIOS
)/os
/oslib
/include \
137 $(STARTUPINC
) $(KERNINC
) $(PORTINC
) $(OSALINC
) \
138 $(HALINC
) $(PLATFORMINC
) $(BOARDINC
) $(TESTINC
) \
139 $(STREAMSINC
) $(CHIBIOS
)/os
/various
$(COMMON_VPATH
)
143 ##############################################################################
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
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
165 # Project, sources and paths
166 ##############################################################################
169 ##############################################################################
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
)
180 BIN
= $(OBJCOPY
) -O binary
182 COMMON_VPATH
+= $(DRIVER_PATH
)/chibios
184 THUMBFLAGS
= -DTHUMB_PRESENT
-mno-thumb-interwork
-DTHUMB_NO_INTERWORKING
-mthumb
-DTHUMB
186 COMPILEFLAGS
+= -fomit-frame-pointer
187 COMPILEFLAGS
+= -falign-functions
=16
188 COMPILEFLAGS
+= -ffunction-sections
189 COMPILEFLAGS
+= -fdata-sections
190 COMPILEFLAGS
+= -fno-common
191 COMPILEFLAGS
+= -fshort-wchar
192 COMPILEFLAGS
+= $(THUMBFLAGS
)
194 CFLAGS
+= $(COMPILEFLAGS
)
196 ASFLAGS
+= $(THUMBFLAGS
)
198 CXXFLAGS
+= $(COMPILEFLAGS
)
199 CXXFLAGS
+= -fno-rtti
201 LDFLAGS
+=-Wl
,--gc-sections
202 LDFLAGS
+=-Wl
,--no-wchar-size-warning
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
)
207 LDFLAGS
+= --specs
=nano.specs
209 OPT_DEFS
+= -DPROTOCOL_CHIBIOS
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
214 MCUFLAGS
= -mcpu
=$(MCU
)
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
221 # FPU-related options
225 ifneq ($(USE_FPU
),no
)
226 OPT
+= $(USE_FPU_OPT
)
227 OPT_DEFS
+= -DCORTEX_USE_FPU
=TRUE
229 OPT_DEFS
+= -DCORTEX_USE_FPU
=FALSE
235 ifneq ("$(SERIAL)","")
236 DFU_ARGS
+= -S
$(SERIAL
)
241 # List any extra directories to look for libraries here.
242 EXTRALIBDIRS
= $(RULESPATH
)/ld
245 ST_LINK_CLI ?
= st-link_cli
248 until
$(DFU_UTIL
) -l | grep
-q
"Found DFU"; do\
249 printf
"$(MSG_BOOTLOADER_NOT_FOUND)" ;\
252 $(DFU_UTIL
) $(DFU_ARGS
) -D
$(BUILD_DIR
)/$(TARGET
).bin
255 dfu-util
: $(BUILD_DIR
)/$(TARGET
).bin cpfirmware sizeafter
256 $(call EXEC_DFU_UTIL
)
259 dfu-util-wait
: dfu-util
261 # TODO: Remove once ARM has a way to configure EECONFIG_HANDEDNESS
262 # within the emulated eeprom via dfu-util or another tool
263 ifneq (,$(filter $(MAKECMDGOALS
),dfu-util-split-left
))
264 OPT_DEFS
+= -DINIT_EE_HANDS_LEFT
267 ifneq (,$(filter $(MAKECMDGOALS
),dfu-util-split-right
))
268 OPT_DEFS
+= -DINIT_EE_HANDS_RIGHT
271 dfu-util-split-left
: dfu-util
273 dfu-util-split-right
: dfu-util
276 st-link-cli
: $(BUILD_DIR
)/$(TARGET
).hex sizeafter
277 $(ST_LINK_CLI
) $(ST_LINK_ARGS
) -q
-c SWD
-p
$(BUILD_DIR
)/$(TARGET
).hex
-Rst
280 # Autodetect teensy loader
281 ifndef TEENSY_LOADER_CLI
282 ifneq (, $(shell which teensy-loader-cli
2>/dev
/null
))
283 TEENSY_LOADER_CLI ?
= teensy-loader-cli
285 TEENSY_LOADER_CLI ?
= teensy_loader_cli
290 $(TEENSY_LOADER_CLI
) -mmcu
=$(MCU_LDSCRIPT
) -w
-v
$(BUILD_DIR
)/$(TARGET
).hex
293 teensy
: $(BUILD_DIR
)/$(TARGET
).hex cpfirmware sizeafter
296 bin
: $(BUILD_DIR
)/$(TARGET
).bin sizeafter
297 $(COPY
) $(BUILD_DIR
)/$(TARGET
).bin
$(TARGET
).bin
;
300 flash
: $(BUILD_DIR
)/$(TARGET
).bin cpfirmware sizeafter
301 ifeq ($(strip $(BOOTLOADER
)),dfu
)
302 $(call EXEC_DFU_UTIL
)
303 else ifeq ($(strip $(MCU_FAMILY
)),KINETIS
)
305 else ifeq ($(strip $(MCU_FAMILY
)),STM32
)
306 $(call EXEC_DFU_UTIL
)
308 $(PRINT_OK
); $(SILENT
) || printf
"$(MSG_FLASH_BOOTLOADER)"