e7332b0584
Adds support for 3 Cortex-M boards, selectable via "BOARD" in the Makefile: - microbit, Cortex-M0 via nRF51822 - netduino2, Cortex-M3 via STM32F205 - mps2-an385, Cortex-M3 via FPGA netduino2 is the default board because it's supported by older qemu versions (down to at least 2.5.0).
124 lines
3.0 KiB
Makefile
124 lines
3.0 KiB
Makefile
include ../../py/mkenv.mk
|
|
-include mpconfigport.mk
|
|
|
|
# qstr definitions (must come before including py.mk)
|
|
QSTR_DEFS = qstrdefsport.h
|
|
|
|
# include py core make definitions
|
|
include $(TOP)/py/py.mk
|
|
|
|
BOARD ?= netduino2
|
|
|
|
ifeq ($(BOARD),netduino2)
|
|
CFLAGS += -mthumb -mcpu=cortex-m3 -mfloat-abi=soft
|
|
CFLAGS += -DQEMU_SOC_STM32
|
|
LDSCRIPT = stm32.ld
|
|
endif
|
|
|
|
ifeq ($(BOARD),microbit)
|
|
CFLAGS += -mthumb -mcpu=cortex-m0 -mfloat-abi=soft
|
|
CFLAGS += -DQEMU_SOC_NRF51
|
|
LDSCRIPT = nrf51.ld
|
|
QEMU_EXTRA = -global nrf51-soc.flash-size=1048576 -global nrf51-soc.sram-size=262144
|
|
endif
|
|
|
|
ifeq ($(BOARD),mps2-an385)
|
|
CFLAGS += -mthumb -mcpu=cortex-m3 -mfloat-abi=soft
|
|
CFLAGS += -DQEMU_SOC_MPS2
|
|
LDSCRIPT = mps2.ld
|
|
endif
|
|
|
|
CROSS_COMPILE = arm-none-eabi-
|
|
|
|
TINYTEST = $(TOP)/lib/tinytest
|
|
|
|
INC += -I.
|
|
INC += -I$(TOP)
|
|
INC += -I$(BUILD)
|
|
INC += -I$(TINYTEST)
|
|
|
|
CFLAGS += $(INC) -Wall -Wpointer-arith -Werror -std=gnu99 $(COPT) \
|
|
-ffunction-sections -fdata-sections
|
|
|
|
#Debugging/Optimization
|
|
ifeq ($(DEBUG), 1)
|
|
CFLAGS += -g -DPENDSV_DEBUG
|
|
COPT = -O0
|
|
else
|
|
COPT += -Os -DNDEBUG
|
|
endif
|
|
|
|
## With CoudeSourcery it's actually a little different, you just need `-T generic-m-hosted.ld`.
|
|
## Although for some reason `$(LD)` will not find that linker script, it works with `$(CC)`.
|
|
## It turns out that this is specific to CoudeSourcery, and ARM version of GCC ships something
|
|
## else instead and according to the following files, this is what we need to pass to `$(CC).
|
|
## - gcc-arm-none-eabi-4_8-2014q1/share/gcc-arm-none-eabi/samples/src/makefile.conf
|
|
## - gcc-arm-none-eabi-4_8-2014q1/share/gcc-arm-none-eabi/samples/src/qemu/Makefile
|
|
LDFLAGS= -T $(LDSCRIPT) --gc-sections -Map=$(@:.elf=.map)
|
|
LIBS = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
|
|
|
|
SRC_COMMON_C = \
|
|
startup.c \
|
|
uart.c \
|
|
moduos.c \
|
|
modmachine.c \
|
|
|
|
SRC_RUN_C = \
|
|
main.c \
|
|
|
|
SRC_TEST_C = \
|
|
test_main.c \
|
|
|
|
LIB_SRC_C += $(addprefix lib/,\
|
|
libc/string0.c \
|
|
libm/math.c \
|
|
libm/fmodf.c \
|
|
libm/nearbyintf.c \
|
|
libm/ef_sqrt.c \
|
|
libm/kf_rem_pio2.c \
|
|
libm/kf_sin.c \
|
|
libm/kf_cos.c \
|
|
libm/kf_tan.c \
|
|
libm/ef_rem_pio2.c \
|
|
libm/sf_sin.c \
|
|
libm/sf_cos.c \
|
|
libm/sf_tan.c \
|
|
libm/sf_frexp.c \
|
|
libm/sf_modf.c \
|
|
libm/sf_ldexp.c \
|
|
libm/asinfacosf.c \
|
|
libm/atanf.c \
|
|
libm/atan2f.c \
|
|
utils/sys_stdio_mphal.c \
|
|
)
|
|
|
|
OBJ_COMMON =
|
|
OBJ_COMMON += $(PY_O)
|
|
OBJ_COMMON += $(addprefix $(BUILD)/, $(SRC_COMMON_C:.c=.o))
|
|
OBJ_COMMON += $(addprefix $(BUILD)/, $(LIB_SRC_C:.c=.o))
|
|
|
|
OBJ_RUN =
|
|
OBJ_RUN += $(addprefix $(BUILD)/, $(SRC_RUN_C:.c=.o))
|
|
|
|
OBJ_TEST =
|
|
OBJ_TEST += $(addprefix $(BUILD)/, $(SRC_TEST_C:.c=.o))
|
|
OBJ_TEST += $(BUILD)/tinytest.o
|
|
|
|
# All object files, needed to get dependencies correct
|
|
OBJ = $(OBJ_COMMON) $(OBJ_RUN) $(OBJ_TEST)
|
|
|
|
# List of sources for qstr extraction
|
|
SRC_QSTR += $(SRC_COMMON_C) $(SRC_RUN_C) $(LIB_SRC_C)
|
|
|
|
all: run
|
|
|
|
run: $(BUILD)/firmware.elf
|
|
qemu-system-arm -machine $(BOARD) $(QEMU_EXTRA) -nographic -monitor null -semihosting -kernel $<
|
|
|
|
## `$(LD)` doesn't seem to like `--specs` for some reason, but we can just use `$(CC)` here.
|
|
$(BUILD)/firmware.elf: $(OBJ_COMMON) $(OBJ_RUN)
|
|
$(Q)$(LD) $(LDFLAGS) -o $@ $^ $(LIBS)
|
|
$(Q)$(SIZE) $@
|
|
|
|
include $(TOP)/py/mkrules.mk
|