mirror of
https://github.com/retroSoC/retroSoC.git
synced 2026-11-04 22:32:36 +00:00
Remove one final LF from four Make files to satisfy the existing mbake 1.4.6 configuration. Preserve all other bytes and keep the independent P10 implementation out of this formatting commit. Final-worktree validation confirms identical configuration and command expansion for five firmware variants, including the Mini lint dry-run. Format, software policy and host checks pass. The existing editorconfig newline discrepancy remains a separate policy issue.
310 lines
13 KiB
Makefile
310 lines
13 KiB
Makefile
# Software SDK and application build
|
|
CROSS ?= riscv32-unknown-elf-
|
|
|
|
CP = $(CROSS)cpp
|
|
CC = $(CROSS)gcc
|
|
OBJC = $(CROSS)objcopy
|
|
DUMP = $(CROSS)objdump
|
|
|
|
GCC_FLAGS := -std=gnu11 -Wall -Wextra \
|
|
-Wl,-Bstatic,-T,$(LINK_TYPE).lds,--strip-debug,--gc-sections $(if $(filter APP,$(SW_OPT)),-O3,-$(SW_OPT)) \
|
|
-ffreestanding -nostdlib -ffunction-sections -fdata-sections
|
|
SW_WARN_FLAGS := -Wformat=2 -Wshadow -Wstrict-prototypes -Wmissing-prototypes \
|
|
-Wcast-align -Werror=implicit-function-declaration \
|
|
-Werror=return-type -Werror=incompatible-pointer-types \
|
|
-Werror=int-conversion -Werror=format
|
|
|
|
ifeq ($(filter $(SW_OPT),APP O2 O3 Os),)
|
|
$(error SW_OPT must be APP, O2, O3 or Os)
|
|
endif
|
|
ifeq ($(filter $(SW_LTO),NO YES),)
|
|
$(error SW_LTO must be NO or YES)
|
|
endif
|
|
ifeq ($(filter $(SW_ISA_PROFILE),COMPAT TINY_PERF),)
|
|
$(error SW_ISA_PROFILE must be COMPAT or TINY_PERF)
|
|
endif
|
|
ifeq ($(SW_ISA_PROFILE),TINY_PERF)
|
|
ifneq ($(SOC)/$(ISA)/$(HAVE_CSR),TINY/RV32IM/YES)
|
|
$(error TINY_PERF requires SOC=TINY ISA=RV32IM HAVE_CSR=YES)
|
|
endif
|
|
endif
|
|
ifeq ($(SW_LTO),YES)
|
|
GCC_FLAGS += -flto -fno-builtin
|
|
GCC_FLAGS += -Wl,--undefined=memset,--undefined=memcpy,--undefined=memmove
|
|
GCC_FLAGS += -Wl,--undefined=__clzsi2,--undefined=__divdi3
|
|
GCC_FLAGS += -Wl,--undefined=__ffssi2,--undefined=__udivdi3,--undefined=__umoddi3
|
|
endif
|
|
|
|
ifeq ($(ISA),RV32E)
|
|
ISA_FLAGS := -mabi=ilp32e
|
|
else
|
|
ISA_FLAGS := -mabi=ilp32
|
|
endif
|
|
|
|
ifeq ($(ISA),RV32E)
|
|
ifeq ($(HAVE_CSR),YES)
|
|
ISA_FLAGS += -march=rv32e_zicsr
|
|
else
|
|
ISA_FLAGS += -march=rv32e
|
|
endif
|
|
else ifeq ($(ISA),RV32I)
|
|
ifeq ($(HAVE_CSR),YES)
|
|
ISA_FLAGS += -march=rv32i_zicsr
|
|
else
|
|
ISA_FLAGS += -march=rv32i
|
|
endif
|
|
else ifeq ($(ISA),RV32IM)
|
|
ifeq ($(HAVE_CSR),YES)
|
|
ISA_FLAGS += -march=rv32im_zicsr
|
|
else
|
|
ISA_FLAGS += -march=rv32im
|
|
endif
|
|
endif
|
|
|
|
ifeq ($(SW_ISA_PROFILE),TINY_PERF)
|
|
ISA_FLAGS := -march=rv32imc_zicsr_zifencei_zba_zbb_zbc_zbkb_zbkx_zbs -mabi=ilp32
|
|
endif
|
|
ifeq ($(LINK_TYPE),ld2_tiny_banked)
|
|
ifneq ($(SOC),TINY)
|
|
$(error ld2_tiny_banked requires SOC=TINY)
|
|
endif
|
|
DEF_VAL += -DRS_TINY_BANKED
|
|
endif
|
|
DEF_VAL += -DAPP_$(APP)
|
|
ifeq ($(APU_ENABLE_P7),YES)
|
|
DEF_VAL += -DRS_APU_RELEASE_P7
|
|
endif
|
|
DEF_VAL += -DCOMPILER_NAME='"$(CC)"'
|
|
DEF_VAL += -DCOMPILER_CFLAGS='"$(GCC_FLAGS) $(SW_WARN_FLAGS)"'
|
|
DEF_VAL += -DCOMPILER_ISA='"$(ISA_FLAGS)"'
|
|
DEF_VAL += -DRS_SOC_MGMT_JTAG_IDCODE=0x$(JTAG_IDCODE)U
|
|
DEF_VAL += -DRS_CPU_CLOCK_HZ=$(MGMT_CPU_CLK_HZ)U
|
|
DEF_VAL += -DRS_PCLK_CLOCK_HZ=$(PCLK_CLK_HZ)U
|
|
DEF_VAL += -DRS_CLINT_TIMEBASE_HZ=$(CLINT_TIMEBASE_HZ)U
|
|
DEF_VAL += -DRS_RTC_CLOCK_HZ=$(AUD_CLK_HZ)U
|
|
ifeq ($(HAVE_CSR),YES)
|
|
DEF_VAL += -DCSR_ENABLE
|
|
endif
|
|
ifeq ($(NPU_P5_ACCEPTANCE),YES)
|
|
DEF_VAL += -DRS_NPU_P5_ACCEPTANCE
|
|
endif
|
|
ifeq ($(NPU_P6_ACCEPTANCE),YES)
|
|
DEF_VAL += -DRS_NPU_P6_ACCEPTANCE
|
|
endif
|
|
|
|
CFLAGS := $(GCC_FLAGS) $(SW_WARN_FLAGS) $(ISA_FLAGS) $(DEF_VAL)
|
|
|
|
CRT_SRCS := $(ROOT_PATH)/crt/arch/riscv/startup.S \
|
|
$(ROOT_PATH)/crt/arch/riscv/libgcc/clzsi2.c \
|
|
$(ROOT_PATH)/crt/arch/riscv/libgcc/divdi3.c \
|
|
$(ROOT_PATH)/crt/arch/riscv/libgcc/ffssi2.c \
|
|
$(ROOT_PATH)/crt/arch/riscv/libgcc/udivdi3.c \
|
|
$(ROOT_PATH)/crt/arch/riscv/libgcc/umoddi3.c \
|
|
$(ROOT_PATH)/crt/src/lib/stdlib.c \
|
|
$(ROOT_PATH)/crt/src/lib/string.c \
|
|
$(ROOT_PATH)/crt/src/lib/console.c \
|
|
$(ROOT_PATH)/crt/src/lib/printf.c \
|
|
$(ROOT_PATH)/rtl/managed/clusterip/archinfo/sw/src/archinfo.c \
|
|
$(ROOT_PATH)/rtl/managed/clusterip/crc/sw/src/crc.c \
|
|
$(ROOT_PATH)/rtl/managed/clusterip/rng/sw/src/rng.c \
|
|
$(ROOT_PATH)/rtl/managed/clusterip/rtc/sw/src/rtc.c \
|
|
$(ROOT_PATH)/rtl/managed/clusterip/wdg/sw/src/wdg.c \
|
|
$(ROOT_PATH)/rtl/managed/clusterip/pwm/sw/src/pwm.c \
|
|
$(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/src/ps2.c \
|
|
$(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/src/ps2_keyboard.c \
|
|
$(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/src/ps2_mouse.c \
|
|
$(ROOT_PATH)/crt/src/core/archinfo.c \
|
|
$(ROOT_PATH)/crt/src/service/bench.c \
|
|
$(ROOT_PATH)/crt/src/service/booter.c \
|
|
$(ROOT_PATH)/crt/src/service/test.c \
|
|
$(ROOT_PATH)/crt/src/hal/clint.c \
|
|
$(ROOT_PATH)/crt/src/hal/clock.c \
|
|
$(ROOT_PATH)/crt/src/hal/sysctrl.c \
|
|
$(ROOT_PATH)/crt/src/hal/rcu.c \
|
|
$(ROOT_PATH)/crt/src/hal/uart_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/uart.c \
|
|
$(ROOT_PATH)/crt/src/hal/gpio_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/gpio.c \
|
|
$(ROOT_PATH)/crt/src/hal/hp_mailbox.c \
|
|
$(ROOT_PATH)/crt/src/hal/timer_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/timer.c \
|
|
$(ROOT_PATH)/crt/src/hal/pwm.c \
|
|
$(ROOT_PATH)/crt/src/hal/rtc.c \
|
|
$(ROOT_PATH)/crt/src/hal/watchdog.c \
|
|
$(ROOT_PATH)/crt/src/hal/crc.c \
|
|
$(ROOT_PATH)/crt/src/hal/rng.c \
|
|
$(ROOT_PATH)/crt/src/hal/ps2.c \
|
|
$(ROOT_PATH)/crt/src/hal/i2c_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/i2c.c \
|
|
$(ROOT_PATH)/crt/src/hal/i2s_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/i2s.c \
|
|
$(ROOT_PATH)/crt/src/hal/ws2812_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/ws2812.c \
|
|
$(ROOT_PATH)/crt/src/hal/dma_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/dma.c \
|
|
$(ROOT_PATH)/crt/src/hal/crypto.c \
|
|
$(ROOT_PATH)/crt/src/hal/crypto_lifecycle.c \
|
|
$(ROOT_PATH)/crt/src/hal/apu.c \
|
|
$(ROOT_PATH)/crt/src/hal/ga2d_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/ga2d.c \
|
|
$(ROOT_PATH)/crt/src/hal/npu.c \
|
|
$(ROOT_PATH)/crt/src/hal/jpeg_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/jpeg.c \
|
|
$(ROOT_PATH)/crt/src/hal/dvp.c \
|
|
$(ROOT_PATH)/crt/src/hal/perf.c \
|
|
$(ROOT_PATH)/crt/src/hal/lcd.c \
|
|
$(ROOT_PATH)/crt/src/hal/onchip_sram.c \
|
|
$(ROOT_PATH)/crt/src/hal/memory.c \
|
|
$(ROOT_PATH)/crt/src/hal/psram_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/psram.c \
|
|
$(ROOT_PATH)/crt/src/hal/opipsram_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/opipsram.c \
|
|
$(ROOT_PATH)/crt/src/hal/sdram_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/sdram.c \
|
|
$(ROOT_PATH)/crt/src/hal/sdio_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/sdio.c \
|
|
$(ROOT_PATH)/crt/src/hal/usb2_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/usb2.c \
|
|
$(ROOT_PATH)/crt/src/hal/spisd_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/spisd.c \
|
|
$(ROOT_PATH)/crt/src/hal/xpi.c \
|
|
$(ROOT_PATH)/crt/src/hal/xpi_psram_math.c \
|
|
$(ROOT_PATH)/crt/src/hal/xpi_psram.c \
|
|
$(ROOT_PATH)/crt/src/hal/fabric_monitor.c \
|
|
$(ROOT_PATH)/crt/src/hal/resource.c \
|
|
$(ROOT_PATH)/crt/src/hal/extension.c \
|
|
$(ROOT_PATH)/crt/src/hal/user_ip.c \
|
|
$(ROOT_PATH)/crt/src/hal/user_core.c
|
|
|
|
ifeq ($(SOC),TINY)
|
|
DEF_VAL += -DRS_SOC_TINY
|
|
CFLAGS += -DRS_SOC_TINY
|
|
TINY_CRT_NAMES := startup.S clzsi2.c divdi3.c ffssi2.c udivdi3.c umoddi3.c \
|
|
stdlib.c string.c console.c printf.c archinfo.c clint.c uart_math.c uart.c \
|
|
gpio_math.c gpio.c timer_math.c timer.c pwm.c rtc.c wdg.c watchdog.c i2c_math.c i2c.c \
|
|
dma_math.c dma.c onchip_sram.c xpi.c xpi_psram.c xpi_psram_math.c rng.c crc.c ws2812_math.c ws2812.c \
|
|
crypto.c crypto_lifecycle.c i2s_math.c i2s.c dvp.c sdio_math.c sdio.c rcu.c
|
|
CRT_SRCS := $(foreach source,$(CRT_SRCS),$(if $(filter $(notdir $(source)),$(TINY_CRT_NAMES)),$(source)))
|
|
CRT_SRCS += $(ROOT_PATH)/crt/src/hal/sysctrl.c
|
|
endif
|
|
|
|
ifeq ($(HAVE_CSR),YES)
|
|
CRT_SRCS += $(ROOT_PATH)/crt/arch/riscv/system_irq.S
|
|
CRT_SRCS += $(ROOT_PATH)/crt/src/core/system_irq_handler.c
|
|
CRT_SRCS += $(ROOT_PATH)/crt/src/core/irq.c
|
|
endif
|
|
|
|
CRT_SRCS += $(ROOT_PATH)/crt/src/core/irq_nocsr.c
|
|
|
|
APP_SRCS :=
|
|
APP_INC_DIRS :=
|
|
APP_CFLAGS :=
|
|
APP_CRT_SRCS :=
|
|
APP_MK := $(ROOT_PATH)/app/apps/$(APP)/$(if $(filter TINY,$(SOC)),tiny.mk,app.mk)
|
|
|
|
ifeq ($(wildcard $(APP_MK)),)
|
|
$(error Application profile not found: $(APP_MK))
|
|
endif
|
|
include $(APP_MK)
|
|
|
|
ifneq ($(strip $(APP_CRT_SRCS)),)
|
|
CRT_SRCS := $(APP_CRT_SRCS)
|
|
endif
|
|
|
|
ifneq ($(SW_OPT),APP)
|
|
APP_CFLAGS := $(filter-out -O0 -O1 -O2 -O3 -Os -Og -Oz,$(APP_CFLAGS))
|
|
endif
|
|
CFLAGS += $(APP_CFLAGS)
|
|
CFLAGS += -Wl,-Map,$(SW_BUILD_DIR)/$(FIRMWARE_NAME).map
|
|
ifneq ($(SW_ISA_PROFILE)/$(SW_OPT)/$(SW_LTO),COMPAT/APP/NO)
|
|
CFLAGS += -fstack-usage
|
|
endif
|
|
APP_INC_DIRS += $(MPW_OUTPUT_DIR)
|
|
|
|
ifneq ($(filter RV32E RV32I,$(ISA)),)
|
|
CRT_SRCS += $(ROOT_PATH)/crt/arch/riscv/libgcc/div.S
|
|
CRT_SRCS += $(ROOT_PATH)/crt/arch/riscv/libgcc/muldi3.S
|
|
CRT_SRCS += $(ROOT_PATH)/crt/arch/riscv/libgcc/mulsi3.c
|
|
endif
|
|
|
|
INC_PATH := -I$(SW_BUILD_DIR)/include \
|
|
-I$(MEMORY_MAP_C_DIR) \
|
|
-I$(SOC_TOPOLOGY_INCLUDE_DIR) \
|
|
-I$(USER_EXTENSIONS_DIR)/include \
|
|
-I$(ARCHINFO_METADATA_DIR) \
|
|
-I$(ROOT_PATH)/rtl/managed/clusterip/archinfo/sw/include \
|
|
-I$(ROOT_PATH)/rtl/managed/clusterip/crc/sw/include \
|
|
-I$(ROOT_PATH)/rtl/managed/clusterip/rng/sw/include \
|
|
-I$(ROOT_PATH)/rtl/managed/clusterip/rtc/sw/include \
|
|
-I$(ROOT_PATH)/rtl/managed/clusterip/wdg/sw/include \
|
|
-I$(ROOT_PATH)/rtl/managed/clusterip/pwm/sw/include \
|
|
-I$(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/include \
|
|
-I$(ROOT_PATH)/crt/include \
|
|
$(addprefix -I,$(APP_INC_DIRS))
|
|
SRC_PATH := $(CRT_SRCS) $(APP_SRCS)
|
|
LDS_PATH := $(ROOT_PATH)/crt/linker/$(LINK_TYPE).lds
|
|
MEMORY_REGIONS_LD := $(MEMORY_MAP_LINKER_DIR)/memory_regions.ld
|
|
VERSION_HEADER := $(SW_BUILD_DIR)/include/socver.h
|
|
CRYPTO_CONSTANTS_HEADER := $(SW_BUILD_DIR)/include/crypto_constants.h
|
|
FIRMWARE_ELF := $(SW_BUILD_DIR)/firmware
|
|
ASM_FIRMWARE_NAME ?= retrosoc_asm
|
|
SW_HEADERS := $(shell find $(ROOT_PATH)/crt/include $(ROOT_PATH)/app -type f \
|
|
\( -name '*.h' -o -name '*.hpp' \) 2>/dev/null)
|
|
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/archinfo/sw/include \
|
|
-type f -name '*.h' 2>/dev/null)
|
|
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/crc/sw/include \
|
|
-type f -name '*.h' 2>/dev/null)
|
|
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/rng/sw/include \
|
|
-type f -name '*.h' 2>/dev/null)
|
|
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/rtc/sw/include \
|
|
-type f -name '*.h' 2>/dev/null)
|
|
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/wdg/sw/include \
|
|
-type f -name '*.h' 2>/dev/null)
|
|
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/pwm/sw/include \
|
|
-type f -name '*.h' 2>/dev/null)
|
|
SW_HEADERS += $(shell find $(ROOT_PATH)/rtl/managed/clusterip/ps2/sw/include \
|
|
-type f -name '*.h' 2>/dev/null)
|
|
|
|
$(VERSION_HEADER): FORCE_VERSION $(ROOT_PATH)/crt/ver.py $(ROOT_PATH)/crt/ver.tmpl
|
|
@mkdir -p $(dir $@)
|
|
python3 $(ROOT_PATH)/crt/ver.py --root $(ROOT_PATH) --output $@
|
|
|
|
FORCE_VERSION:
|
|
|
|
upd_ver_info: $(VERSION_HEADER)
|
|
|
|
ifeq ($(SOC),TINY)
|
|
asm: tiny-boot-image
|
|
cp $(SW_BUILD_DIR)/tiny_boot.hex $(SW_BUILD_DIR)/$(ASM_FIRMWARE_NAME).hex
|
|
cp $(SW_BUILD_DIR)/tiny_boot.bin $(SW_BUILD_DIR)/$(ASM_FIRMWARE_NAME).bin
|
|
else
|
|
asm: $(MPW_VARIANT_DEP) $(MEMORY_MAP_STAMP)
|
|
@mkdir -p $(SW_BUILD_DIR)/asm
|
|
$(MAKE) -C $(ROOT_PATH)/app/asm OUT_DIR=$(SW_BUILD_DIR)/asm \
|
|
GENERATED_INCLUDE=$(MEMORY_MAP_C_DIR)
|
|
cp $(SW_BUILD_DIR)/asm/hello-asm.flash $(SW_BUILD_DIR)/$(ASM_FIRMWARE_NAME).hex
|
|
cp $(SW_BUILD_DIR)/asm/hello-asm.bin $(SW_BUILD_DIR)/$(ASM_FIRMWARE_NAME).bin
|
|
cp $(SW_BUILD_DIR)/asm/hello-asm.txt $(SW_BUILD_DIR)/$(ASM_FIRMWARE_NAME)_all.txt
|
|
|
|
endif
|
|
|
|
$(CRYPTO_CONSTANTS_HEADER): $(ROOT_PATH)/scripts/crypto_constants.py $(ROOT_PATH)/scripts/data/crypto_constants.json
|
|
$(PYTHON) $(ROOT_PATH)/scripts/crypto_constants.py --root $(ROOT_PATH) --output $(SW_BUILD_DIR)/include
|
|
|
|
CRYPTO_CONSTANTS_DEP := $(CRYPTO_CONSTANTS_HEADER)
|
|
|
|
$(FIRMWARE_ELF): $(MPW_VARIANT_DEP) $(MEMORY_MAP_STAMP) $(SOC_TOPOLOGY_STAMP) $(SOC_IRQ_METADATA) $(USER_EXTENSIONS_STAMP) $(ARCHINFO_METADATA_STAMP) $(VERSION_HEADER) $(CRYPTO_CONSTANTS_DEP) $(SRC_PATH) $(SW_HEADERS) $(LDS_PATH) \
|
|
$(ROOT_PATH)/rtl/mk/software.mk $(APP_MK)
|
|
@mkdir -p $(SW_BUILD_DIR)
|
|
cd $(SW_BUILD_DIR) && $(CP) -P -o $(LINK_TYPE).lds $(LDS_PATH)
|
|
cp $(MEMORY_REGIONS_LD) $(SW_BUILD_DIR)/memory_regions.ld
|
|
cd $(SW_BUILD_DIR) && $(CC) $(CFLAGS) $(INC_PATH) -o $(@F) $(SRC_PATH)
|
|
cd $(SW_BUILD_DIR) && $(OBJC) -O verilog $(@F) $(FIRMWARE_NAME).hex
|
|
cd $(SW_BUILD_DIR) && $(OBJC) -O binary $(@F) $(FIRMWARE_NAME).bin
|
|
cd $(SW_BUILD_DIR) && $(DUMP) -d $(@F) > $(FIRMWARE_NAME).txt
|
|
|
|
firmware: $(FIRMWARE_ELF)
|
|
|
|
firmware asm: | manifest
|
|
|
|
.PHONY: FORCE_VERSION |