Add 328P to mcu_selection.mk (#6682)
[jackhill/qmk/firmware.git] / tmk_core / chibios.mk
CommitLineData
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.
8ifeq ($(USE_PROCESS_STACKSIZE),)
63c16f4b 9 USE_PROCESS_STACKSIZE = 0x800
4d4f7684 10endif
11
12# Stack size to the allocated to the Cortex-M main/exceptions stack. This
13# stack is used for processing interrupts and exceptions.
14ifeq ($(USE_EXCEPTIONS_STACKSIZE),)
15 USE_EXCEPTIONS_STACKSIZE = 0x400
16endif
17
18#
19# Architecture or project specific options
20##############################################################################
21
22##############################################################################
23# Project, sources and paths
24#
25
26# Imported source files and paths
27CHIBIOS = $(TOP_DIR)/lib/chibios
28CHIBIOS_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
31STARTUP_MK = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/startup_$(MCU_STARTUP).mk
32ifeq ("$(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
37endif
38include $(STARTUP_MK)
39# HAL-OSAL files (optional).
40include $(CHIBIOS)/os/hal/hal.mk
41
68fad7b7
ST
42ifeq ("$(PLATFORM_NAME)","")
43 PLATFORM_NAME = platform
44endif
45
46PLATFORM_MK = $(CHIBIOS)/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)/$(PLATFORM_NAME).mk
4d4f7684 47ifeq ("$(wildcard $(PLATFORM_MK))","")
68fad7b7 48PLATFORM_MK = $(CHIBIOS_CONTRIB)/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)/$(PLATFORM_NAME).mk
4d4f7684 49endif
50include $(PLATFORM_MK)
51
52
510a8d33 53BOARD_MK :=
800ec55d
JH
54
55ifneq ("$(wildcard $(KEYBOARD_PATH_5)/boards/$(BOARD)/board.mk)","")
56 BOARD_PATH = $(KEYBOARD_PATH_5)
57 BOARD_MK += $(KEYBOARD_PATH_5)/boards/$(BOARD)/board.mk
58else 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
61else 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
64else 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
67else 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
70else 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
73endif
74
4d4f7684 75ifeq ("$(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
80endif
800ec55d 81
4d4f7684 82include $(BOARD_MK)
83include $(CHIBIOS)/os/hal/osal/rt/osal.mk
84# RTOS files (optional).
85include $(CHIBIOS)/os/rt/rt.mk
86# Compability with old version
87PORT_V = $(CHIBIOS)/os/rt/ports/ARMCMx/compilers/GCC/mk/port_v$(ARMV)m.mk
88ifeq ("$(wildcard $(PORT_V))","")
89PORT_V = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC/mk/port_v$(ARMV)m.mk
90endif
91include $(PORT_V)
92# Other files (optional).
93include $(CHIBIOS)/os/hal/lib/streams/streams.mk
94
95RULESPATH = $(CHIBIOS)/os/common/ports/ARMCMx/compilers/GCC
96ifeq ("$(wildcard $(RULESPATH)/rules.mk)","")
97RULESPATH = $(CHIBIOS)/os/common/startup/ARMCMx/compilers/GCC
98endif
99
100# Define linker script file here
800ec55d
JH
101ifneq ("$(wildcard $(KEYBOARD_PATH_5)/ld/$(MCU_LDSCRIPT).ld)","")
102 LDSCRIPT = $(KEYBOARD_PATH_5)/ld/$(MCU_LDSCRIPT).ld
103else ifneq ("$(wildcard $(KEYBOARD_PATH_4)/ld/$(MCU_LDSCRIPT).ld)","")
104 LDSCRIPT = $(KEYBOARD_PATH_4)/ld/$(MCU_LDSCRIPT).ld
105else ifneq ("$(wildcard $(KEYBOARD_PATH_3)/ld/$(MCU_LDSCRIPT).ld)","")
106 LDSCRIPT = $(KEYBOARD_PATH_3)/ld/$(MCU_LDSCRIPT).ld
107else ifneq ("$(wildcard $(KEYBOARD_PATH_2)/ld/$(MCU_LDSCRIPT).ld)","")
108 LDSCRIPT = $(KEYBOARD_PATH_2)/ld/$(MCU_LDSCRIPT).ld
109else ifneq ("$(wildcard $(KEYBOARD_PATH_1)/ld/$(MCU_LDSCRIPT).ld)","")
110 LDSCRIPT = $(KEYBOARD_PATH_1)/ld/$(MCU_LDSCRIPT).ld
4d4f7684 111else
800ec55d 112 LDSCRIPT = $(STARTUPLD)/$(MCU_LDSCRIPT).ld
4d4f7684 113endif
114
115CHIBISRC = $(STARTUPSRC) \
116 $(KERNSRC) \
117 $(PORTSRC) \
118 $(OSALSRC) \
119 $(HALSRC) \
120 $(PLATFORMSRC) \
121 $(BOARDSRC) \
122 $(STREAMSSRC) \
123 $(STARTUPASM) \
124 $(PORTASM) \
510a8d33 125 $(OSALASM)
4d4f7684 126
3aac4e95 127CHIBISRC := $(patsubst $(TOP_DIR)/%,%,$(CHIBISRC))
510a8d33 128
4d4f7684 129EXTRAINCDIRS += $(CHIBIOS)/os/license \
130 $(STARTUPINC) $(KERNINC) $(PORTINC) $(OSALINC) \
131 $(HALINC) $(PLATFORMINC) $(BOARDINC) $(TESTINC) \
ade22f8e 132 $(STREAMSINC) $(CHIBIOS)/os/various $(COMMON_VPATH)
4d4f7684 133
134#
135# Project, sources and paths
136##############################################################################
137
138
139##############################################################################
140# Compiler settings
141#
142CC = arm-none-eabi-gcc
143OBJCOPY = arm-none-eabi-objcopy
144OBJDUMP = arm-none-eabi-objdump
145SIZE = arm-none-eabi-size
146AR = arm-none-eabi-ar
147NM = arm-none-eabi-nm
148HEX = $(OBJCOPY) -O $(FORMAT)
510a8d33 149EEP =
f9a6e34c 150BIN = $(OBJCOPY) -O binary
4d4f7684 151
ade22f8e
JH
152COMMON_VPATH += $(DRIVER_PATH)/arm
153
510a8d33 154THUMBFLAGS = -DTHUMB_PRESENT -mno-thumb-interwork -DTHUMB_NO_INTERWORKING -mthumb -DTHUMB
4d4f7684 155
510a8d33 156COMPILEFLAGS += -fomit-frame-pointer
4d4f7684 157COMPILEFLAGS += -falign-functions=16
158COMPILEFLAGS += -ffunction-sections
159COMPILEFLAGS += -fdata-sections
160COMPILEFLAGS += -fno-common
53ff8a31 161COMPILEFLAGS += -fshort-wchar
510a8d33 162COMPILEFLAGS += $(THUMBFLAGS)
4d4f7684 163
164CFLAGS += $(COMPILEFLAGS)
165
166ASFLAGS += $(THUMBFLAGS)
167
168CPPFLAGS += $(COMPILEFLAGS)
169CPPFLAGS += -fno-rtti
170
171LDFLAGS +=-Wl,--gc-sections
53ff8a31 172LDFLAGS +=-Wl,--no-wchar-size-warning
4d4f7684 173LDFLAGS += -mno-thumb-interwork -mthumb
174LDSYMBOLS =,--defsym=__process_stack_size__=$(USE_PROCESS_STACKSIZE)
175LDSYMBOLS :=$(LDSYMBOLS),--defsym=__main_stack_size__=$(USE_EXCEPTIONS_STACKSIZE)
176LDFLAGS += -Wl,--script=$(LDSCRIPT)$(LDSYMBOLS)
177
178OPT_DEFS += -DPROTOCOL_CHIBIOS
179
180MCUFLAGS = -mcpu=$(MCU)
181
510a8d33
FS
182# FPU options default (Cortex-M4 and Cortex-M7 single precision).
183ifeq ($(USE_FPU_OPT),)
184 USE_FPU_OPT = -mfloat-abi=$(USE_FPU) -mfpu=fpv4-sp-d16 -fsingle-precision-constant
185endif
186
187# FPU-related options
188ifeq ($(USE_FPU),)
189 USE_FPU = no
190endif
191ifneq ($(USE_FPU),no)
192 OPT += $(USE_FPU_OPT)
193 OPT_DEFS += -DCORTEX_USE_FPU=TRUE
194else
195 OPT_DEFS += -DCORTEX_USE_FPU=FALSE
196endif
197
4d4f7684 198DEBUG = gdb
199
5fd68266 200DFU_ARGS ?=
515b4dd1
TJ
201ifneq ("$(SERIAL)","")
202 DFU_ARGS += -S $(SERIAL)
203endif
204
e2dee054
TU
205ST_LINK_ARGS ?=
206
4d4f7684 207# List any extra directories to look for libraries here.
f9a6e34c
FS
208EXTRALIBDIRS = $(RULESPATH)/ld
209
18b4d24c 210DFU_UTIL ?= dfu-util
e2dee054 211ST_LINK_CLI ?= st-link_cli
18b4d24c 212
fe56fffe
JH
213# Generate a .qmk for the QMK-FF
214qmk: $(BUILD_DIR)/$(TARGET).bin
215 zip $(TARGET).qmk -FSrj $(KEYMAP_PATH)/*
216 zip $(TARGET).qmk -u $<
217 printf "@ $<\n@=firmware.bin\n" | zipnote -w $(TARGET).qmk
218 printf "{\n \"generated\": \"%s\"\n}" "$$(date)" > $(BUILD_DIR)/$(TARGET).json
219 if [ -f $(KEYBOARD_PATH_5)/info.json ]; then \
220 jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_5)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
221 fi
222 if [ -f $(KEYBOARD_PATH_4)/info.json ]; then \
223 jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_4)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
224 fi
225 if [ -f $(KEYBOARD_PATH_3)/info.json ]; then \
226 jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_3)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
227 fi
228 if [ -f $(KEYBOARD_PATH_2)/info.json ]; then \
229 jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_2)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
230 fi
231 if [ -f $(KEYBOARD_PATH_1)/info.json ]; then \
232 jq -s '.[0] * .[1]' $(BUILD_DIR)/$(TARGET).json $(KEYBOARD_PATH_1)/info.json | ex -sc 'wq!$(BUILD_DIR)/$(TARGET).json' /dev/stdin; \
233 fi
234 zip $(TARGET).qmk -urj $(BUILD_DIR)/$(TARGET).json
235 printf "@ $(TARGET).json\n@=info.json\n" | zipnote -w $(TARGET).qmk
236
4003d077 237define EXEC_DFU_UTIL
ae44ec98
JC
238 until $(DFU_UTIL) -l | grep -q "Found DFU"; do\
239 echo "Error: Bootloader not found. Trying again in 5s." ;\
240 sleep 5 ;\
241 done
18b4d24c 242 $(DFU_UTIL) $(DFU_ARGS) -D $(BUILD_DIR)/$(TARGET).bin
4003d077 243endef
677b8976 244
4003d077
DJ
245dfu-util: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter
246 $(call EXEC_DFU_UTIL)
f16b5cc9 247
ae44ec98
JC
248# Legacy alias
249dfu-util-wait: dfu-util
f16b5cc9 250
e2dee054
TU
251st-link-cli: $(BUILD_DIR)/$(TARGET).hex sizeafter
252 $(ST_LINK_CLI) $(ST_LINK_ARGS) -q -c SWD -p $(BUILD_DIR)/$(TARGET).hex -Rst
253
2f7a57a6 254
255# Autodetect teensy loader
256ifndef TEENSY_LOADER_CLI
257 ifneq (, $(shell which teensy-loader-cli 2>/dev/null))
258 TEENSY_LOADER_CLI ?= teensy-loader-cli
259 else
260 TEENSY_LOADER_CLI ?= teensy_loader_cli
261 endif
262endif
263
4003d077 264define EXEC_TEENSY
2f7a57a6 265 $(TEENSY_LOADER_CLI) -mmcu=$(MCU_LDSCRIPT) -w -v $(BUILD_DIR)/$(TARGET).hex
4003d077
DJ
266endef
267
268teensy: $(BUILD_DIR)/$(TARGET).hex cpfirmware sizeafter
269 $(call EXEC_TEENSY)
2f7a57a6 270
677b8976 271bin: $(BUILD_DIR)/$(TARGET).bin sizeafter
4003d077
DJ
272 $(COPY) $(BUILD_DIR)/$(TARGET).bin $(TARGET).bin;
273
274
275flash: $(BUILD_DIR)/$(TARGET).bin cpfirmware sizeafter
276ifeq ($(strip $(BOOTLOADER)),dfu)
277 $(call EXEC_DFU_UTIL)
278else ifeq ($(strip $(MCU_FAMILY)),KINETIS)
279 $(call EXEC_TEENSY)
280else ifeq ($(strip $(MCU_FAMILY)),STM32)
281 $(call EXEC_DFU_UTIL)
282else
283 $(PRINT_OK); $(SILENT) || printf "$(MSG_FLASH_BOOTLOADER)"
284endif