mirror of
https://github.com/micropython/micropython.git
synced 2025-12-16 09:50:15 +01:00
Some checks failed
JavaScript code lint and formatting with Biome / eslint (push) Has been cancelled
Check code formatting / code-formatting (push) Has been cancelled
Check spelling with codespell / codespell (push) Has been cancelled
Build docs / build (push) Has been cancelled
Check examples / embedding (push) Has been cancelled
Package mpremote / build (push) Has been cancelled
.mpy file format and tools / test (push) Has been cancelled
Build ports metadata / build (push) Has been cancelled
alif port / build_alif (alif_ae3_build) (push) Has been cancelled
cc3200 port / build (push) Has been cancelled
esp32 port / build_idf (esp32_build_c2_c6) (push) Has been cancelled
esp32 port / build_idf (esp32_build_cmod_spiram_s2) (push) Has been cancelled
esp32 port / build_idf (esp32_build_s3_c3) (push) Has been cancelled
esp8266 port / build (push) Has been cancelled
mimxrt port / build (push) Has been cancelled
nrf port / build (push) Has been cancelled
powerpc port / build (push) Has been cancelled
qemu port / build_and_test_arm (bigendian) (push) Has been cancelled
qemu port / build_and_test_arm (sabrelite) (push) Has been cancelled
qemu port / build_and_test_arm (thumb_hardfp) (push) Has been cancelled
qemu port / build_and_test_arm (thumb_softfp) (push) Has been cancelled
qemu port / build_and_test_rv32 (push) Has been cancelled
qemu port / build_and_test_rv64 (push) Has been cancelled
renesas-ra port / build_renesas_ra_board (push) Has been cancelled
rp2 port / build (push) Has been cancelled
samd port / build (push) Has been cancelled
stm32 port / build_stm32 (stm32_misc_build) (push) Has been cancelled
stm32 port / build_stm32 (stm32_nucleo_build) (push) Has been cancelled
stm32 port / build_stm32 (stm32_pyb_build) (push) Has been cancelled
unix port / minimal (push) Has been cancelled
unix port / reproducible (push) Has been cancelled
unix port / standard (push) Has been cancelled
unix port / standard_v2 (push) Has been cancelled
unix port / coverage (push) Has been cancelled
unix port / coverage_32bit (push) Has been cancelled
unix port / nanbox (push) Has been cancelled
unix port / longlong (push) Has been cancelled
unix port / float (push) Has been cancelled
unix port / gil_enabled (push) Has been cancelled
unix port / stackless_clang (push) Has been cancelled
unix port / float_clang (push) Has been cancelled
unix port / settrace_stackless (push) Has been cancelled
unix port / macos (push) Has been cancelled
unix port / qemu_mips (push) Has been cancelled
unix port / qemu_arm (push) Has been cancelled
unix port / qemu_riscv64 (push) Has been cancelled
unix port / sanitize_address (push) Has been cancelled
unix port / sanitize_undefined (push) Has been cancelled
webassembly port / build (push) Has been cancelled
windows port / build-vs (Debug, x64, dev, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Debug, x64, dev, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Debug, x86, dev, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Debug, x86, dev, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Release, x64, dev, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Release, x64, dev, 2019, [16, 17)) (push) Has been cancelled
windows port / build-vs (Release, x64, dev, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Release, x64, standard, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Release, x64, standard, 2019, [16, 17)) (push) Has been cancelled
windows port / build-vs (Release, x64, standard, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Release, x86, dev, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Release, x86, dev, 2019, [16, 17)) (push) Has been cancelled
windows port / build-vs (Release, x86, dev, 2022, [17, 18)) (push) Has been cancelled
windows port / build-vs (Release, x86, standard, 2017, [15, 16)) (push) Has been cancelled
windows port / build-vs (Release, x86, standard, 2019, [16, 17)) (push) Has been cancelled
windows port / build-vs (Release, x86, standard, 2022, [17, 18)) (push) Has been cancelled
windows port / build-mingw (i686, mingw32, dev) (push) Has been cancelled
windows port / build-mingw (i686, mingw32, standard) (push) Has been cancelled
windows port / build-mingw (x86_64, mingw64, dev) (push) Has been cancelled
windows port / build-mingw (x86_64, mingw64, standard) (push) Has been cancelled
windows port / cross-build-on-linux (push) Has been cancelled
zephyr port / build (push) Has been cancelled
Python code lint and formatting with ruff / ruff (push) Has been cancelled
This adds a QEMU-based bare metal RISC-V 64 bits port. For the time being only QEMU's "virt" 64 bits board is supported, using the lp64 ABI and the RV64IMC architecture. The port's README is also updated to keep track of these changes. Signed-off-by: Alessandro Gatti <a.gatti@frob.it>
276 lines
7.6 KiB
Makefile
276 lines
7.6 KiB
Makefile
################################################################################
|
|
# Initial setup of Makefile environment
|
|
|
|
BOARD ?= MPS2_AN385
|
|
BOARD_DIR ?= boards/$(BOARD)
|
|
|
|
ifeq ($(wildcard $(BOARD_DIR)/.),)
|
|
$(error Invalid BOARD specified: $(BOARD_DIR))
|
|
endif
|
|
|
|
# Make the build directory reflect the board.
|
|
BUILD ?= build-$(BOARD)
|
|
|
|
include ../../py/mkenv.mk
|
|
-include mpconfigport.mk
|
|
|
|
# Include board specific .mk file.
|
|
include $(BOARD_DIR)/mpconfigboard.mk
|
|
|
|
# qstr definitions (must come before including py.mk)
|
|
QSTR_DEFS = qstrdefsport.h
|
|
|
|
# MicroPython feature configurations
|
|
MICROPY_ROM_TEXT_COMPRESSION ?= 1
|
|
|
|
ifeq ($(QEMU_ARCH),arm)
|
|
MICROPY_HEAP_SIZE ?= 143360
|
|
ifeq ($(BOARD),MICROBIT)
|
|
FROZEN_MANIFEST ?= "require('unittest'); freeze('test-frzmpy', ('frozen_const.py'))"
|
|
else
|
|
FROZEN_MANIFEST ?= "require('unittest'); freeze('test-frzmpy', ('frozen_asm_thumb.py', 'frozen_const.py', 'frozen_viper.py', 'native_frozen_align.py'))"
|
|
endif
|
|
endif
|
|
ifeq ($(QEMU_ARCH),riscv32)
|
|
MICROPY_HEAP_SIZE ?= 143360
|
|
FROZEN_MANIFEST ?= "require('unittest'); freeze('test-frzmpy', ('frozen_asm_rv32.py', 'frozen_const.py', 'frozen_viper.py', 'native_frozen_align.py'))"
|
|
endif
|
|
ifeq ($(QEMU_ARCH),riscv64)
|
|
MICROPY_HEAP_SIZE ?= 204800
|
|
FROZEN_MANIFEST ?= "require('unittest'); freeze('test-frzmpy', ('frozen_const.py',))"
|
|
endif
|
|
|
|
MICROPY_FLOAT_IMPL ?= float
|
|
|
|
# include py core make definitions
|
|
include $(TOP)/py/py.mk
|
|
include $(TOP)/extmod/extmod.mk
|
|
|
|
GIT_SUBMODULES += lib/berkeley-db-1.xx
|
|
|
|
CFLAGS += -DMICROPY_HEAP_SIZE=$(MICROPY_HEAP_SIZE)
|
|
|
|
ifeq ($(MICROPY_FLOAT_IMPL),double)
|
|
CFLAGS += -DMICROPY_FLOAT_IMPL=MICROPY_FLOAT_IMPL_DOUBLE
|
|
else ifeq ($(MICROPY_FLOAT_IMPL),float)
|
|
CFLAGS += -DMICROPY_FLOAT_IMPL=MICROPY_FLOAT_IMPL_FLOAT -fsingle-precision-constant
|
|
else
|
|
CFLAGS += -DMICROPY_FLOAT_IMPL=MICROPY_FLOAT_IMPL_NONE
|
|
endif
|
|
|
|
ifeq ($(SUPPORTS_HARDWARE_FP_SINGLE),1)
|
|
CFLAGS += -DMICROPY_HW_FPU=1
|
|
else ifeq ($(SUPPORTS_HARDWARE_FP_DOUBLE),1)
|
|
CFLAGS += -DMICROPY_HW_FPU=1
|
|
endif
|
|
|
|
################################################################################
|
|
# ARM specific settings
|
|
|
|
ifeq ($(QEMU_ARCH),arm)
|
|
|
|
CROSS_COMPILE ?= arm-none-eabi-
|
|
|
|
LDFLAGS += -nostdlib
|
|
LIBS = $(shell $(CC) $(CFLAGS) -print-libgcc-file-name)
|
|
|
|
SRC_C += \
|
|
mcu/arm/errorhandler.c \
|
|
mcu/arm/startup.c \
|
|
shared/runtime/semihosting_arm.c \
|
|
|
|
endif
|
|
|
|
################################################################################
|
|
# RISC-V 32-bit specific settings
|
|
|
|
ifeq ($(QEMU_ARCH),riscv32)
|
|
|
|
CROSS_COMPILE ?= riscv64-unknown-elf-
|
|
|
|
GCC_VERSION = $(word 1, $(subst ., , $(shell $(CC) -dumpversion)))
|
|
|
|
RV32_ABI = ilp32
|
|
|
|
QEMU_ARGS += -bios none
|
|
|
|
# GCC 10 and lower do not recognise the Zicsr extension in the architecture name.
|
|
ifeq ($(shell test $(GCC_VERSION) -le 10; echo $$?),0)
|
|
RV32_ARCH ?= rv32imac
|
|
else
|
|
# Recent GCC versions explicitly require to declare extensions.
|
|
RV32_ARCH ?= rv32imac_zicsr
|
|
endif
|
|
|
|
AFLAGS += -mabi=$(RV32_ABI) -march=$(RV32_ARCH)
|
|
CFLAGS += $(AFLAGS)
|
|
LDFLAGS += -mabi=$(RV32_ABI) -march=$(RV32_ARCH) -Wl,-EL
|
|
|
|
SRC_C += \
|
|
mcu/rv32/interrupts.c \
|
|
mcu/rv32/startup.c \
|
|
|
|
SRC_BOARD_O += mcu/rv32/entrypoint.o
|
|
|
|
endif
|
|
|
|
################################################################################
|
|
# RISC-V 64-bit specific settings
|
|
|
|
ifeq ($(QEMU_ARCH),riscv64)
|
|
|
|
CROSS_COMPILE ?= riscv64-unknown-elf-
|
|
|
|
GCC_VERSION = $(word 1, $(subst ., , $(shell $(CC) -dumpversion)))
|
|
|
|
RV64_ABI = lp64
|
|
|
|
QEMU_ARGS += -bios none
|
|
|
|
# GCC 10 and lower do not recognise the Zicsr extension in the architecture name.
|
|
ifeq ($(shell test $(GCC_VERSION) -le 10; echo $$?),0)
|
|
RV64_ARCH ?= rv64imac
|
|
else
|
|
# Recent GCC versions explicitly require to declare extensions.
|
|
RV64_ARCH ?= rv64imac_zicsr
|
|
endif
|
|
|
|
AFLAGS += -mabi=$(RV64_ABI) -march=$(RV64_ARCH)
|
|
CFLAGS += $(AFLAGS) -mcmodel=medany
|
|
LDFLAGS += -mabi=$(RV64_ABI) -march=$(RV64_ARCH) -Wl,-EL -mcmodel=medany
|
|
|
|
SRC_C += \
|
|
mcu/rv64/interrupts.c \
|
|
mcu/rv64/startup.c \
|
|
|
|
SRC_BOARD_O += mcu/rv64/entrypoint.o
|
|
|
|
endif
|
|
|
|
################################################################################
|
|
# Project specific settings and compiler/linker flags
|
|
|
|
QEMU_SYSTEM = qemu-system-$(QEMU_ARCH)
|
|
QEMU_ARGS += -machine $(QEMU_MACHINE) -nographic -monitor null -semihosting
|
|
QEMU_ARGS += $(QEMU_EXTRA)
|
|
|
|
# Specifying QEMU_DEBUG=1 will block qemu until a debugger is connected.
|
|
ifeq ($(QEMU_DEBUG),1)
|
|
QEMU_DEBUG_ARGS ?= -s
|
|
QEMU_ARGS += -S $(QEMU_DEBUG_ARGS) $(QEMU_DEBUG_EXTRA)
|
|
endif
|
|
|
|
INC += -I.
|
|
INC += -I$(TOP)
|
|
INC += -I$(BUILD)
|
|
|
|
CFLAGS += -DMICROPY_HW_BOARD_NAME='"$(QEMU_MACHINE)"'
|
|
CFLAGS += $(INC) -Wall -Wpointer-arith -Wdouble-promotion -Wfloat-conversion -Werror -std=gnu99 $(COPT) \
|
|
-ffunction-sections -fdata-sections
|
|
CFLAGS += $(CFLAGS_EXTRA)
|
|
|
|
LDFLAGS += -T $(LDSCRIPT) -Wl,--gc-sections -Wl,-Map=$(@:.elf=.map)
|
|
|
|
# Debugging/Optimization
|
|
ifeq ($(DEBUG), 1)
|
|
CFLAGS += -g
|
|
COPT = -O0
|
|
else
|
|
COPT += -Os -DNDEBUG
|
|
endif
|
|
|
|
# If Picolibc is available then select it explicitly. Ubuntu 22.04 ships its
|
|
# bare metal RISC-V toolchain with Picolibc rather than Newlib, and the default
|
|
# is "nosys" so a value must be provided. To avoid having per-distro
|
|
# workarounds, always select Picolibc if available.
|
|
PICOLIBC_SPECS = $(shell $(CC) --print-file-name=picolibc.specs)
|
|
ifeq ($(PICOLIBC_SPECS),picolibc.specs)
|
|
# Picolibc was not found.
|
|
else
|
|
$(info picolibc used $(PICOLIBC_SPECS))
|
|
SPECS_FRAGMENT = --specs=$(PICOLIBC_SPECS)
|
|
CFLAGS += $(SPECS_FRAGMENT)
|
|
LDFLAGS += $(SPECS_FRAGMENT)
|
|
endif
|
|
|
|
RUN_TESTS_FULL_ARGS = -t execpty:"$(QEMU_SYSTEM) $(QEMU_ARGS) -serial pty -kernel ../ports/qemu/$<" $(RUN_TESTS_ARGS)
|
|
|
|
################################################################################
|
|
# Source files and libraries
|
|
|
|
SRC_C += \
|
|
main.c \
|
|
uart.c \
|
|
mphalport.c \
|
|
shared/libc/string0.c \
|
|
shared/readline/readline.c \
|
|
shared/runtime/interrupt_char.c \
|
|
shared/runtime/pyexec.c \
|
|
shared/runtime/stdout_helpers.c \
|
|
shared/runtime/sys_stdio_mphal.c \
|
|
|
|
ifeq ($(MICROPY_FLOAT_IMPL),double)
|
|
LIBM_SRC_C += $(SRC_LIB_LIBM_DBL_C)
|
|
ifeq ($(SUPPORTS_HARDWARE_FP_DOUBLE),1)
|
|
LIBM_SRC_C += $(SRC_LIB_LIBM_DBL_SQRT_HW_C)
|
|
else
|
|
LIBM_SRC_C += $(SRC_LIB_LIBM_DBL_SQRT_SW_C)
|
|
endif
|
|
else
|
|
LIBM_SRC_C += $(SRC_LIB_LIBM_C)
|
|
ifeq ($(SUPPORTS_HARDWARE_FP_SINGLE),1)
|
|
LIBM_SRC_C += $(SRC_LIB_LIBM_SQRT_HW_C)
|
|
else
|
|
LIBM_SRC_C += $(SRC_LIB_LIBM_SQRT_SW_C)
|
|
endif
|
|
endif
|
|
|
|
OBJ += $(PY_O)
|
|
OBJ += $(addprefix $(BUILD)/, $(SRC_C:.c=.o))
|
|
OBJ += $(addprefix $(BUILD)/, $(SRC_BOARD_O))
|
|
OBJ += $(addprefix $(BUILD)/, $(LIBM_SRC_C:.c=.o))
|
|
|
|
# List of sources for qstr extraction
|
|
SRC_QSTR += $(SRC_C) $(LIBM_SRC_C)
|
|
|
|
################################################################################
|
|
# Main targets
|
|
|
|
all: $(BUILD)/firmware.elf
|
|
|
|
.PHONY: repl
|
|
repl: $(BUILD)/firmware.elf
|
|
$(ECHO) "Use machine.reset() to exit"
|
|
$(QEMU_SYSTEM) $(QEMU_ARGS) -serial mon:stdio -kernel $<
|
|
|
|
.PHONY: run
|
|
run: $(BUILD)/firmware.elf
|
|
$(QEMU_SYSTEM) $(QEMU_ARGS) -serial pty -kernel $<
|
|
|
|
.PHONY: test
|
|
test: $(BUILD)/firmware.elf
|
|
cd $(TOP)/tests && ./run-tests.py $(RUN_TESTS_FULL_ARGS) $(RUN_TESTS_EXTRA)
|
|
|
|
.PHONY: test_full
|
|
test_full: $(BUILD)/firmware.elf
|
|
cd $(TOP)/tests && ./run-tests.py $(RUN_TESTS_FULL_ARGS)
|
|
cd $(TOP)/tests && ./run-tests.py $(RUN_TESTS_FULL_ARGS) --via-mpy
|
|
cd $(TOP)/tests && ./run-tests.py $(RUN_TESTS_FULL_ARGS) --via-mpy --emit native
|
|
|
|
.PHONY: test_natmod
|
|
test_natmod: $(BUILD)/firmware.elf
|
|
$(eval DIRNAME=ports/$(notdir $(CURDIR)))
|
|
cd $(TOP)/tests && \
|
|
for natmod in btree deflate framebuf heapq random_basic re; do \
|
|
./run-natmodtests.py -t execpty:"$(QEMU_SYSTEM) $(QEMU_ARGS) -serial pty -kernel ../$(DIRNAME)/$<" $(RUN_TESTS_EXTRA) extmod/$$natmod*.py; \
|
|
done
|
|
|
|
$(BUILD)/firmware.elf: $(LDSCRIPT) $(OBJ)
|
|
$(Q)$(CC) $(LDFLAGS) -o $@ $(OBJ) $(LIBS)
|
|
$(Q)$(SIZE) $@
|
|
|
|
################################################################################
|
|
# Remaining make rules
|
|
|
|
include $(TOP)/py/mkrules.mk
|