|
| 1 | +# This file is part of the CircuitPython project: https://circuitpython.org |
| 2 | +# |
| 3 | +# SPDX-FileCopyrightText: Copyright (c) 2020 Scott Shawcroft for Adafruit Industries |
| 4 | +# |
| 5 | +# SPDX-License-Identifier: MIT |
| 6 | + |
| 7 | +# Includes mpconfigboard.mk & mpconfigport.mk, |
| 8 | +# along with numerous other shared environment makefiles. |
| 9 | +include ../../py/circuitpy_mkenv.mk |
| 10 | + |
| 11 | +CROSS_COMPILE = arm-none-eabi- |
| 12 | + |
| 13 | +# MCU_SERIES e.g. "max32" |
| 14 | +# MCU_VARIANT e.g. "max32690" |
| 15 | +# defined in mpconfigboard.mk |
| 16 | +MCU_SERIES_LOWER := $(shell echo $(MCU_SERIES) | tr '[:upper:]' '[:lower:]') |
| 17 | +MCU_SERIES_UPPER := $(shell echo $(MCU_SERIES) | tr '[:lower:]' '[:upper:]') |
| 18 | +MCU_VARIANT_LOWER := $(shell echo $(MCU_VARIANT) | tr '[:upper:]' '[:lower:]') |
| 19 | +MCU_VARIANT_UPPER := $(shell echo $(MCU_VARIANT) | tr '[:lower:]' '[:upper:]') |
| 20 | + |
| 21 | +# ******************************************************************************* |
| 22 | +#### MSDK INCLUDES #### |
| 23 | +# Necessary for msdk makefiles |
| 24 | +TARGET := $(MCU_VARIANT_UPPER) |
| 25 | +TARGET_UC := $(MCU_VARIANT_UPPER) |
| 26 | +TARGET_LC := $(MCU_VARIANT_LOWER) |
| 27 | + |
| 28 | +MSDK_ROOT = ./msdk |
| 29 | +MSDK_LIBS = $(MSDK_ROOT)/Libraries |
| 30 | +CMSIS_ROOT = $(MSDK_LIBS)/CMSIS |
| 31 | +ADI_PERIPH = $(MSDK_ROOT)/Libraries/PeriphDrivers |
| 32 | +ADI_MISC_DRIVERS_DIR ?= $(MSDK_LIBS)/MiscDrivers |
| 33 | +ADI_BOARD_DIR = $(MSDK_LIBS)/Boards/$(MCU_VARIANT_UPPER)/$(BOARD) |
| 34 | + |
| 35 | +# For debugging the build |
| 36 | +ifneq ($(BUILD_VERBOSE),"") |
| 37 | +$(info MSDK_ROOT is $(MSDK_ROOT)) |
| 38 | +$(info MSDK_LIBS is $(MSDK_LIBS)) |
| 39 | +$(info CMSIS_ROOT is $(CMSIS_ROOT)) |
| 40 | +$(info ADI_PERIPH is $(ADI_PERIPH)) |
| 41 | +$(info ADI_MISC_DRIVERS_DIR is $(ADI_MISC_DRIVERS_DIR)) |
| 42 | +$(info ADI_BOARD_DIR is $(ADI_BOARD_DIR)) |
| 43 | +$(info MAXIM_PATH is $(MAXIM_PATH)) |
| 44 | +endif |
| 45 | + |
| 46 | +# ----------------- |
| 47 | +# Sources & Include |
| 48 | +# ----------------- |
| 49 | +# Define max32 die type for PeriphDriver Includes |
| 50 | +# default to me18 for max32690 |
| 51 | +# more info: |
| 52 | +# https://analogdevicesinc.github.io/msdk//USERGUIDE/#die-types-to-part-numbers |
| 53 | +ifeq ($(MCU_VARIANT_LOWER), "max32690") |
| 54 | +DIE_TYPE=me18 |
| 55 | +else |
| 56 | +DIE_TYPE=me18 |
| 57 | +endif |
| 58 | + |
| 59 | +PERIPH_SRC = $(ADI_PERIPH)/Source |
| 60 | + |
| 61 | +INC += -I. |
| 62 | +INC += -I../.. |
| 63 | +INC += -I$(BUILD) |
| 64 | +INC += -I$(BUILD)/genhdr |
| 65 | +INC += -I./../../lib/cmsis/inc |
| 66 | +INC += -I./boards/ |
| 67 | +INC += -I./boards/$(BOARD) |
| 68 | +INC += -I./peripherals/ |
| 69 | +INC += -I../../lib/mp-readline |
| 70 | + |
| 71 | +INC += \ |
| 72 | + -I$(TOP)/$(BOARD_PATH) \ |
| 73 | + -I$(TOP)/lib/cmsis/inc \ |
| 74 | + -I$(CMSIS_ROOT)/Include \ |
| 75 | + -I$(CMSIS_ROOT)/Device/Maxim/$(MCU_VARIANT_UPPER)/Include \ |
| 76 | + -I$(ADI_PERIPH)/Include/$(MCU_VARIANT_UPPER) \ |
| 77 | + -I$(PERIPH_SRC)/SYS \ |
| 78 | + -I$(PERIPH_SRC)/GPIO \ |
| 79 | + -I$(PERIPH_SRC)/CTB \ |
| 80 | + -I$(PERIPH_SRC)/ICC \ |
| 81 | + -I$(PERIPH_SRC)/FLC \ |
| 82 | + -I$(PERIPH_SRC)/UART \ |
| 83 | + |
| 84 | +INC += -I$(CMSIS_ROOT)/Device/Maxim/$(MCU_VARIANT_UPPER)/Source/GCC |
| 85 | + |
| 86 | +SRC_MAX32 += \ |
| 87 | + $(CMSIS_ROOT)/Device/Maxim/$(MCU_VARIANT_UPPER)/Source/heap.c \ |
| 88 | + $(CMSIS_ROOT)/Device/Maxim/$(MCU_VARIANT_UPPER)/Source/system_$(MCU_VARIANT_LOWER).c \ |
| 89 | + $(PERIPH_SRC)/SYS/mxc_assert.c \ |
| 90 | + $(PERIPH_SRC)/SYS/mxc_delay.c \ |
| 91 | + $(PERIPH_SRC)/SYS/mxc_lock.c \ |
| 92 | + $(PERIPH_SRC)/SYS/nvic_table.c \ |
| 93 | + $(PERIPH_SRC)/SYS/pins_$(DIE_TYPE).c \ |
| 94 | + $(PERIPH_SRC)/SYS/sys_$(DIE_TYPE).c \ |
| 95 | + $(PERIPH_SRC)/CTB/ctb_$(DIE_TYPE).c \ |
| 96 | + $(PERIPH_SRC)/CTB/ctb_reva.c \ |
| 97 | + $(PERIPH_SRC)/CTB/ctb_common.c \ |
| 98 | + $(PERIPH_SRC)/FLC/flc_common.c \ |
| 99 | + $(PERIPH_SRC)/FLC/flc_$(DIE_TYPE).c \ |
| 100 | + $(PERIPH_SRC)/FLC/flc_reva.c \ |
| 101 | + $(PERIPH_SRC)/GPIO/gpio_common.c \ |
| 102 | + $(PERIPH_SRC)/GPIO/gpio_$(DIE_TYPE).c \ |
| 103 | + $(PERIPH_SRC)/GPIO/gpio_reva.c \ |
| 104 | + $(PERIPH_SRC)/ICC/icc_$(DIE_TYPE).c \ |
| 105 | + $(PERIPH_SRC)/ICC/icc_reva.c \ |
| 106 | + $(PERIPH_SRC)/UART/uart_common.c \ |
| 107 | + $(PERIPH_SRC)/UART/uart_$(DIE_TYPE).c \ |
| 108 | + $(PERIPH_SRC)/UART/uart_revb.c \ |
| 109 | + |
| 110 | +SRC_C += $(SRC_MAX32) \ |
| 111 | + boards/$(BOARD)/board.c \ |
| 112 | + boards/$(BOARD)/pins.c \ |
| 113 | + peripherals/$(MCU_VARIANT_LOWER)/pins.c \ |
| 114 | + |
| 115 | +# ******************************************************************************* |
| 116 | +### Compiler & Linker Flags ### |
| 117 | +COMPILER ?= GCC |
| 118 | + |
| 119 | +ifeq ($(COMPILER), GCC) |
| 120 | + |
| 121 | +STARTUPFILE = $(CMSIS_ROOT)/Device/Maxim/$(MCU_VARIANT_UPPER)/Source/GCC/startup_$(MCU_VARIANT_LOWER).s |
| 122 | +# STARTUPFILE = $(ADI_BOARD_DIR)/Source/startup_$(MCU_VARIANT_LOWER).s |
| 123 | + |
| 124 | +# CircuitPython custom linkerfile (necessary for build steps & filesystems) |
| 125 | +LINKERFILE = linking/$(MCU_VARIANT_LOWER)_cktpy.ld |
| 126 | +LDFLAGS += -nostartfiles -specs=nosys.specs -specs=nano.specs |
| 127 | +endif |
| 128 | + |
| 129 | +SRC_S += supervisor/cpu.s \ |
| 130 | + $(STARTUPFILE) |
| 131 | + |
| 132 | +# Needed to compile some MAX32 headers |
| 133 | +CFLAGS += -D$(MCU_VARIANT_UPPER) \ |
| 134 | + -DTARGET_REV=0x4131 \ |
| 135 | + -DTARGET=$(MCU_VARIANT_UPPER) \ |
| 136 | + -DIAR_PRAGMAS=0 \ |
| 137 | + # -DFLASH_ORIGIN=0x10000000 \ |
| 138 | + # -DFLASH_SIZE=0x340000 \ |
| 139 | + # -DSRAM_ORIGIN=0x20000000 \ |
| 140 | + # -DSRAM_SIZE=0x100000 \ |
| 141 | +
|
| 142 | +CPU_CORE=cortex-m4 |
| 143 | +CFLAGS += -mthumb -mcpu=$(CPU_CORE) -mfloat-abi=hard -mfpu=fpv4-sp-d16 |
| 144 | + |
| 145 | +# NOTE: Start with DEBUG ONLY settings for now |
| 146 | +ifeq ($(DEBUG),) |
| 147 | +DEBUG ?= 1 |
| 148 | +endif |
| 149 | + |
| 150 | +ifeq ($(DEBUG),1) |
| 151 | +CFLAGS += -ggdb3 |
| 152 | +COPT = -Og |
| 153 | +else |
| 154 | +COPT += -O2 |
| 155 | +endif |
| 156 | + |
| 157 | + |
| 158 | +# TinyUSB CFLAGS |
| 159 | +CFLAGS += \ |
| 160 | + -DCFG_TUSB_MCU=OPT_MCU_$(MCU_VARIANT_UPPER) \ |
| 161 | + -DBOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED \ |
| 162 | + |
| 163 | +# TODO: Add for TinyUSB once our PR goes through for MAX32 devices |
| 164 | +# Add TinyUSB |
| 165 | +# INC += -I../../lib/tinyusb/src |
| 166 | +# INC += -I../../supervisor/shared/usb |
| 167 | +# SRC_C += lib/tinyusb/src/portable/mentor/musb/dcd_musb.c |
| 168 | + |
| 169 | +SRC_C += \ |
| 170 | + boards/$(BOARD)/board.c \ |
| 171 | + background.c \ |
| 172 | + mphalport.c \ |
| 173 | + |
| 174 | +CFLAGS += $(INC) -Werror -Wall -std=gnu11 -nostartfiles $(BASE_CFLAGS) $(COPT) |
| 175 | + |
| 176 | +# Suppress some warnings for MSDK |
| 177 | +CFLAGS += -Wno-error=unused-parameter \ |
| 178 | + -Wno-error=old-style-declaration \ |
| 179 | + -Wno-error=sign-compare \ |
| 180 | + -Wno-error=strict-prototypes \ |
| 181 | + -Wno-error=cast-qual \ |
| 182 | + -Wno-unused-variable \ |
| 183 | + -Wno-lto-type-mismatch \ |
| 184 | + -Wno-cast-align \ |
| 185 | + -Wno-nested-externs \ |
| 186 | + -Wno-sign-compare |
| 187 | + |
| 188 | +LDFLAGS += $(CFLAGS) -Wl,-nostdlib -Wl,-T,$(LINKERFILE) -Wl,-Map=$@.map -Wl,-cref -Wl,-gc-sections |
| 189 | +LIBS := -lgcc -lc |
| 190 | + |
| 191 | +# If not using CKTPY mathlib, use toolchain mathlib |
| 192 | +ifndef INTERNAL_LIBM |
| 193 | +LIBS += -lm |
| 194 | +endif |
| 195 | + |
| 196 | +# ******************************************************************************* |
| 197 | +### PORT-DEFINED BUILD RULES ### |
| 198 | +# This section attempts to build the Python core, the supervisor, and any |
| 199 | +# port-provided source code. |
| 200 | +# |
| 201 | +# QSTR sources are provided for the initial build step, which generates |
| 202 | +# Python constants to represent C data which gets passed into the GC. |
| 203 | + |
| 204 | +SRC_COMMON_HAL_EXPANDED = $(addprefix shared-bindings/, $(SRC_COMMON_HAL)) \ |
| 205 | + $(addprefix shared-bindings/, $(SRC_BINDINGS_ENUMS)) \ |
| 206 | + $(addprefix common-hal/, $(SRC_COMMON_HAL)) |
| 207 | + |
| 208 | +SRC_SHARED_MODULE_EXPANDED = $(addprefix shared-bindings/, $(SRC_SHARED_MODULE)) \ |
| 209 | + $(addprefix shared-module/, $(SRC_SHARED_MODULE)) \ |
| 210 | + $(addprefix shared-module/, $(SRC_SHARED_MODULE_INTERNAL)) |
| 211 | + |
| 212 | +# There are duplicates between SRC_COMMON_HAL_EXPANDED and SRC_SHARED_MODULE_EXPANDED, |
| 213 | +# because a few modules have files both in common-hal/ and shared-module/. |
| 214 | +# Doing a $(sort ...) removes duplicates as part of sorting. |
| 215 | +SRC_COMMON_HAL_SHARED_MODULE_EXPANDED = $(sort $(SRC_COMMON_HAL_EXPANDED) $(SRC_SHARED_MODULE_EXPANDED)) |
| 216 | + |
| 217 | +# OBJ includes |
| 218 | +OBJ += $(PY_O) $(SUPERVISOR_O) $(addprefix $(BUILD)/, $(SRC_C:.c=.o)) |
| 219 | +OBJ += $(addprefix $(BUILD)/, $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED:.c=.o)) |
| 220 | +ifeq ($(INTERNAL_LIBM),1) |
| 221 | +OBJ += $(addprefix $(BUILD)/, $(SRC_LIBM:.c=.o)) |
| 222 | +endif |
| 223 | +OBJ += $(addprefix $(BUILD)/, $(SRC_CIRCUITPY_COMMON:.c=.o)) |
| 224 | +OBJ += $(addprefix $(BUILD)/, $(SRC_S:.s=.o)) |
| 225 | +OBJ += $(addprefix $(BUILD)/, $(SRC_MOD:.c=.o)) |
| 226 | + |
| 227 | +# List of sources for qstr extraction |
| 228 | +SRC_QSTR += $(SRC_C) $(SRC_SUPERVISOR) $(SRC_CIRCUITPY_COMMON) \ |
| 229 | + $(SRC_COMMON_HAL_SHARED_MODULE_EXPANDED) $(SRC_MOD) |
| 230 | +# Sources that only hold QSTRs after pre-processing. |
| 231 | +SRC_QSTR_PREPROCESSOR += |
| 232 | + |
| 233 | +# Default build target |
| 234 | +all: $(BUILD)/firmware.elf |
| 235 | + |
| 236 | +clean-max32: |
| 237 | + rm -rf build-* |
| 238 | + |
| 239 | +# Optional flash option when running within an installed MSDK to use OpenOCD |
| 240 | +# Mainline OpenOCD does not yet have the MAX32's flash algorithm integrated. |
| 241 | +# If the MSDK is installed, flash-msdk can be run to utilize the the modified |
| 242 | +# openocd with the algorithms |
| 243 | +MAXIM_PATH := $(subst \,/,$(MAXIM_PATH)) |
| 244 | +flash-msdk: |
| 245 | + $(MAXIM_PATH)/Tools/OpenOCD/openocd -s $(MAXIM_PATH)/Tools/OpenOCD/scripts \ |
| 246 | + -f interface/cmsis-dap.cfg -f target/$(MCU_VARIANT_LOWER).cfg \ |
| 247 | + -c "program $(BUILD)/$(PROJECT).elf verify; init; reset; exit" |
| 248 | + |
| 249 | +# flash target using JLink |
| 250 | +JLINK_DEVICE = $(MCU_VARIANT_LOWER) |
| 251 | +flash: flash-jlink |
| 252 | + |
| 253 | +$(BUILD)/firmware.elf: $(OBJ) $(LINKERFILE) |
| 254 | + $(STEPECHO) "LINK $@" |
| 255 | + $(Q)echo $(OBJ) > $(BUILD)/firmware.objs |
| 256 | + $(Q)$(CC) -o $@ $(LDFLAGS) @$(BUILD)/firmware.objs -Wl,--print-memory-usage -Wl,--start-group $(LIBS) -Wl,--end-group |
| 257 | + $(Q)$(SIZE) $@ | $(PYTHON) $(TOP)/tools/build_memory_info.py $(LINKERFILE) $(BUILD) |
| 258 | + |
| 259 | +# ******************************************************************************* |
| 260 | +### CKTPY BUILD RULES ### |
| 261 | +include $(TOP)/py/mkrules.mk |
0 commit comments