2026-02-03 11:37:13 +08:00
|
|
|
# ------------------------------------------------
|
|
|
|
|
# Generic Makefile (based on gcc)
|
|
|
|
|
# Copyright (c) 2022, All Rights Reserved.
|
|
|
|
|
# @file Makefile
|
|
|
|
|
# @author Wei-Lun Hsu
|
|
|
|
|
# @version 1.0
|
|
|
|
|
# ------------------------------------------------
|
|
|
|
|
|
|
|
|
|
RED="\033[0;31m"
|
|
|
|
|
GREEN="\033[0;32m"
|
|
|
|
|
LIGHT_GREEN="\033[1;32m"
|
|
|
|
|
YELLOW="\033[0;33m"
|
|
|
|
|
LIGHT_YELLOW="\033[1;33m"
|
|
|
|
|
GREY="\033[0;37m"
|
|
|
|
|
BWHITE="\033[1;37m"
|
|
|
|
|
MAGENTA="\033[1;35m"
|
|
|
|
|
CYAN="\033[1;36m"
|
|
|
|
|
NC="\033[0m"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PHONY := all flash flash_nvr clean help
|
2026-03-20 14:48:24 +08:00
|
|
|
PHONY += gdb
|
2026-02-03 11:37:13 +08:00
|
|
|
PHONY += tags TAGS cscope gtags
|
|
|
|
|
PHONY += upload
|
|
|
|
|
######################################
|
|
|
|
|
# target
|
|
|
|
|
######################################
|
|
|
|
|
ifeq ("$(TARGET)","")
|
|
|
|
|
TARGET = Project
|
|
|
|
|
endif
|
|
|
|
|
|
2026-03-20 14:48:24 +08:00
|
|
|
SOC ?= pec930
|
2026-02-03 11:37:13 +08:00
|
|
|
|
|
|
|
|
ifeq (,$(filter $(MAKECMDGOALS),clean help))
|
|
|
|
|
|
2026-03-20 14:48:24 +08:00
|
|
|
ifeq ("$(SOC)","pec930")
|
|
|
|
|
SOC_DRIVER = PEC930
|
2026-02-03 11:37:13 +08:00
|
|
|
else
|
|
|
|
|
$(error "Unknown SoC, User MUST define 'SOC' name !")
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
srctree=$(shell pwd)
|
|
|
|
|
|
|
|
|
|
export SOC_CPU_NAME TARGET srctree SOC_DRIVER
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
######################################
|
|
|
|
|
# building variables
|
|
|
|
|
######################################
|
|
|
|
|
# debug build?
|
|
|
|
|
DEBUG = y
|
|
|
|
|
OPT =
|
|
|
|
|
ifeq ("$(D)","0")
|
|
|
|
|
DEBUG = n
|
2026-03-20 14:48:24 +08:00
|
|
|
OPT = -O2
|
2026-02-03 11:37:13 +08:00
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
V ?= $(VERBOSE)
|
|
|
|
|
ifeq ("$(V)","1")
|
|
|
|
|
Q =
|
|
|
|
|
else
|
|
|
|
|
Q = @
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
PLATFORM = $(shell uname -o)
|
|
|
|
|
ifeq ("$(findstring Linux, $(PLATFORM))","Linux")
|
|
|
|
|
ECHO = echo
|
|
|
|
|
TUI = -tui
|
|
|
|
|
else
|
|
|
|
|
ECHO = echo -e
|
|
|
|
|
TUI =
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
PYTHON := python3
|
|
|
|
|
PYTHON_VER := $(wordlist 2,4,$(subst ., ,$(shell $(PYTHON) --version 2>&1)))
|
|
|
|
|
PYTHON_VER := $(word 1,${PYTHON_VER})$(word 2,${PYTHON_VER})
|
|
|
|
|
|
|
|
|
|
export PLATFORM ECHO Q PYTHON PYTHON_VER TUI DEBUG OPT
|
|
|
|
|
#######################################
|
|
|
|
|
# paths
|
|
|
|
|
#######################################
|
|
|
|
|
ifeq ("$(O)","")
|
|
|
|
|
OUT = out
|
|
|
|
|
else
|
|
|
|
|
OUT = $(O)
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
ifeq ("$(P)","")
|
|
|
|
|
PROJ = Examples/template/demo_project
|
|
|
|
|
else
|
|
|
|
|
PROJ = $(P)
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
$(info Active SoC=$(SOC) @$(PROJ))
|
|
|
|
|
|
|
|
|
|
export OUT PROJ LIBBIN
|
|
|
|
|
#######################################
|
|
|
|
|
# binaries
|
|
|
|
|
#######################################
|
|
|
|
|
PREFIX = riscv64-unknown-elf-
|
|
|
|
|
|
|
|
|
|
ifdef GCC_PATH
|
|
|
|
|
CC = $(GCC_PATH)/$(PREFIX)gcc
|
|
|
|
|
AS = $(GCC_PATH)/$(PREFIX)gcc -x assembler-with-cpp
|
|
|
|
|
SZ = $(GCC_PATH)/$(PREFIX)size
|
|
|
|
|
GDB= $(GCC_PATH)/$(PREFIX)gdb
|
|
|
|
|
OBJCOPY = $(GCC_PATH)/$(PREFIX)objcopy
|
|
|
|
|
OBJDUMP = $(GCC_PATH)/$(PREFIX)objdump
|
|
|
|
|
else
|
|
|
|
|
CC = $(PREFIX)gcc
|
|
|
|
|
AS = $(PREFIX)gcc -x assembler-with-cpp
|
|
|
|
|
SZ = $(PREFIX)size
|
|
|
|
|
GDB= $(PREFIX)gdb
|
|
|
|
|
OBJCOPY = $(PREFIX)objcopy
|
|
|
|
|
OBJDUMP = $(PREFIX)objdump
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
HEX = $(OBJCOPY) -O ihex
|
|
|
|
|
BIN = $(OBJCOPY) -O binary -S
|
|
|
|
|
|
|
|
|
|
ifeq ("$(findstring Linux, $(PLATFORM))","Linux")
|
|
|
|
|
OPENOCD = openocd
|
|
|
|
|
else
|
|
|
|
|
OPENOCD = openocd.exe
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
OPENOCDCFG := $(srctree)/Tools/openocd/scripts/target/$(SOC)
|
|
|
|
|
#######################################
|
|
|
|
|
# CFLAGS
|
|
|
|
|
#######################################
|
|
|
|
|
# mcu
|
|
|
|
|
MCU =
|
|
|
|
|
|
|
|
|
|
# AS defines
|
|
|
|
|
AS_DEFS =
|
|
|
|
|
|
|
|
|
|
# C defines
|
|
|
|
|
C_DEFS =
|
|
|
|
|
|
|
|
|
|
# AS includes
|
|
|
|
|
AS_INCLUDES =
|
|
|
|
|
|
|
|
|
|
# C includes
|
|
|
|
|
C_INCLUDES =
|
|
|
|
|
|
|
|
|
|
ifeq ("$(DEBUG)","y")
|
|
|
|
|
OPT += -g -ggdb -gdwarf-2 -O0
|
|
|
|
|
else
|
|
|
|
|
CFLAGS += -DNDEBUG
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
ASFLAGS = $(MCU) $(OPT) -Wall -fdata-sections -ffunction-sections -fno-common
|
|
|
|
|
CFLAGS = $(MCU) $(OPT) -Wall -fdata-sections -ffunction-sections -fno-common
|
|
|
|
|
|
|
|
|
|
CFLAGS += -std=gnu99
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)"
|
|
|
|
|
|
|
|
|
|
export CFLAGS ASFLAGS C_INCLUDES AS_INCLUDES C_DEFS
|
|
|
|
|
#######################################
|
|
|
|
|
# LDFLAGS
|
|
|
|
|
#######################################
|
|
|
|
|
# link script
|
|
|
|
|
ifeq ("$(L)","")
|
|
|
|
|
LDSCRIPT = $(srctree)/Drivers/$(SOC_DRIVER)/gcc_flashxip.ld
|
|
|
|
|
else
|
|
|
|
|
LDSCRIPT = $(L)
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
# libraries
|
|
|
|
|
LIBS =
|
|
|
|
|
LIBDIR =
|
|
|
|
|
|
|
|
|
|
LDFLAGS = $(MCU) -nodefaultlibs -nostartfiles -Wl,--cref \
|
|
|
|
|
$(LIBDIR) \
|
|
|
|
|
-Wl,-T$(LDSCRIPT) \
|
|
|
|
|
-Wl,-Map=$(OUT)/$(TARGET).map
|
|
|
|
|
|
|
|
|
|
export LDFLAGS LDSCRIPT LIBS
|
|
|
|
|
######################################
|
|
|
|
|
# source
|
|
|
|
|
######################################
|
|
|
|
|
# C sources
|
|
|
|
|
C_SOURCES :=
|
|
|
|
|
|
|
|
|
|
# ASM sources
|
|
|
|
|
ASM_SOURCES :=
|
|
|
|
|
|
|
|
|
|
include $(srctree)/Drivers/drivers.mk
|
|
|
|
|
|
|
|
|
|
include $(srctree)/Common/common.mk
|
|
|
|
|
|
|
|
|
|
ifeq ("$(PROJ)","")
|
|
|
|
|
$(error "Unknown project !!!")
|
|
|
|
|
else
|
|
|
|
|
include $(srctree)/$(PROJ)/component.mk
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
OBJECTS = $(addprefix $(OUT)/,$(notdir $(C_SOURCES:.c=.o)))
|
|
|
|
|
vpath %.c $(sort $(dir $(C_SOURCES)))
|
|
|
|
|
|
|
|
|
|
OBJECTS += $(addprefix $(OUT)/,$(notdir $(ASM_SOURCES:.S=.o)))
|
|
|
|
|
vpath %.S $(sort $(dir $(ASM_SOURCES)))
|
|
|
|
|
|
|
|
|
|
RELT_SOURCES = $(foreach srcpath,$(C_SOURCES),$(subst $(srctree), ,$(srcpath)))
|
|
|
|
|
RELT_SOURCES += $(foreach srcpath,$(ASM_SOURCES),$(subst $(srctree),,$(srcpath)))
|
|
|
|
|
RELT_INCLUDES = $(foreach incpath,$(C_INCLUDES),$(subst $(srctree),,$(incpath)))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TARGET_GDB_SCRIPT :=
|
|
|
|
|
#######################################
|
|
|
|
|
# build the application
|
|
|
|
|
#######################################
|
|
|
|
|
ASFLAGS += $(AS_DEFS) $(AS_INCLUDES)
|
|
|
|
|
CFLAGS += $(C_DEFS) $(C_INCLUDES)
|
|
|
|
|
|
|
|
|
|
LDFLAGS += \
|
|
|
|
|
-Wl,-gc-sections \
|
|
|
|
|
-Wl,--check-sections \
|
|
|
|
|
-Wl,--start-group \
|
|
|
|
|
-lc_nano -lgcc -lm \
|
|
|
|
|
-Wl,--end-group
|
|
|
|
|
|
|
|
|
|
LDFLAGS += \
|
|
|
|
|
-Wl,--no-warn-rwx-segments
|
|
|
|
|
|
|
|
|
|
# default action: build all
|
|
|
|
|
all: $(OUT) $(OUT)/$(TARGET).elf $(OUT)/$(TARGET).hex $(OUT)/$(TARGET).bin
|
|
|
|
|
|
|
|
|
|
$(OUT)/%.o: %.c Makefile | $(OUT)
|
|
|
|
|
@$(ECHO) " CC $@"
|
|
|
|
|
$(Q)$(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(OUT)/$(notdir $(<:.c=.lst)) $< -o $@
|
|
|
|
|
|
|
|
|
|
$(OUT)/%.o: %.S Makefile | $(OUT)
|
|
|
|
|
@$(ECHO) " CC $@"
|
|
|
|
|
$(Q)$(AS) -c $(ASFLAGS) $(CFLAGS) $< -o $@
|
|
|
|
|
|
|
|
|
|
$(OUT)/$(TARGET).elf: $(OBJECTS) Makefile
|
|
|
|
|
$(Q)$(CC) -Wl,--whole-archive $(OBJECTS) $(LIBS) -Wl,--no-whole-archive $(LDFLAGS) -o $@
|
|
|
|
|
$(Q)$(OBJDUMP) -Sx $(OUT)/$(TARGET).elf > $(OUT)/$(TARGET).disa
|
|
|
|
|
@$(ECHO) $(GREEN)"\nSize $(OUT)/$(TARGET).elf" $(NC)
|
|
|
|
|
$(Q)$(SZ) $@
|
|
|
|
|
|
|
|
|
|
$(OUT)/%.hex: $(OUT)/%.elf | $(OUT)
|
|
|
|
|
@$(ECHO) $(YELLOW) "Generate $(OUT)/$(TARGET).hex" $(NC)
|
|
|
|
|
$(Q)$(HEX) $< $@
|
|
|
|
|
|
|
|
|
|
$(OUT)/%.bin: $(OUT)/%.elf | $(OUT)
|
|
|
|
|
@$(ECHO) $(YELLOW) "Generate $(OUT)/$(TARGET).bin" $(NC)
|
|
|
|
|
$(Q)$(BIN) $< $@
|
|
|
|
|
$(Q)od -A n -t x4 --width=4 -v $@ > $(OUT)/$(TARGET).txt
|
|
|
|
|
$(Q)$(ECHO) $(CYAN) "Project SoC=$(SOC) @$(PROJ)" $(NC)
|
|
|
|
|
|
|
|
|
|
$(OUT):
|
|
|
|
|
@mkdir -p $@
|
|
|
|
|
|
|
|
|
|
flash: $(OUT)/$(TARGET).bin
|
|
|
|
|
@$(ECHO) $(YELLOW) "Program $(OUT)/$(TARGET).elf to flash of DUT" $(NC)
|
|
|
|
|
@$(OPENOCD) -s Tools/openocd/scripts -f Tools/openocd/scripts/target/$(SOC).cfg \
|
|
|
|
|
-c "program $(OUT)/$(TARGET).bin verify 0; exit" 2>&1 | tee openocd.log
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gdb: $(OUT)/$(TARGET).elf
|
|
|
|
|
ifeq ("$(DEBUG)","y")
|
|
|
|
|
@$(ECHO) $(YELLOW) "Download and Run GDB" $(NC)
|
|
|
|
|
@$(ECHO) " load $(OUT)/$(TARGET).elf"
|
|
|
|
|
@$(GDB) $< $(TUI) --command=$(TARGET_GDB_SCRIPT) \
|
|
|
|
|
-ex "set remotetimeout 240" \
|
|
|
|
|
-ex "monitor reset halt resume" \
|
|
|
|
|
-ex "set mem inaccessible-by-default off" \
|
|
|
|
|
-ex "target remote | $(OPENOCD) -c \"gdb_port pipe; log_output openocd.log\" \
|
|
|
|
|
-s Tools/openocd/scripts \
|
|
|
|
|
-f Tools/openocd/scripts/target/$(SOC).cfg" \
|
|
|
|
|
-ex "j _start"
|
|
|
|
|
else
|
|
|
|
|
@$(ECHO) $(RED) "It MUST be compiled with debug mode !" $(NC)
|
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
upload: $(OUT)/$(TARGET).bin
|
|
|
|
|
@$(ECHO) $(YELLOW) "Download $(OUT)/$(TARGET).elf to flash of DUT and Run" $(NC)
|
|
|
|
|
@$(OPENOCD) -s Tools/openocd/scripts -f Tools/openocd/scripts/target/$(SOC).cfg \
|
2026-03-20 14:48:24 +08:00
|
|
|
-c "program $(OUT)/$(TARGET).elf verify reset exit" 2>&1 | tee openocd.log
|
2026-02-03 11:37:13 +08:00
|
|
|
|
|
|
|
|
clean:
|
|
|
|
|
@$(ECHO) $(YELLOW) "Clean target" $(NC)
|
|
|
|
|
@$(ECHO) " Remove $(OUT)"
|
|
|
|
|
@rm -fR $(OUT)
|
|
|
|
|
@$(ECHO) " Done\n"
|
|
|
|
|
|
|
|
|
|
tags TAGS cscope gtags: $(OUT)
|
|
|
|
|
@rm -f GPATH GRTAGS GTAGS
|
|
|
|
|
@$(srctree)/Tools/scripts/tags.sh $@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
help:
|
|
|
|
|
@$(ECHO) "----------------------------------------------------------------------"
|
|
|
|
|
@$(ECHO) "Useful make targets:"
|
|
|
|
|
@$(ECHO) ""
|
|
|
|
|
@$(ECHO) "Options:"
|
|
|
|
|
@$(ECHO) " SOC: $(SOC)"
|
|
|
|
|
@$(ECHO) " P: project path (root: $(srctree))"
|
|
|
|
|
@$(ECHO) " D: debug mode (0: release, default: 1)"
|
|
|
|
|
@$(ECHO) " O: output path (default: out)"
|
|
|
|
|
@$(ECHO) " L: link-script path (default: gcc_flashxip.ld in Drivers)"
|
|
|
|
|
@$(ECHO) ""
|
|
|
|
|
@$(ECHO) "e.g. make P=Examples/template/demo_project"
|
|
|
|
|
@$(ECHO) ""
|
|
|
|
|
@$(ECHO) " make clean - Remove most generated files"
|
|
|
|
|
@$(ECHO) ""
|
|
|
|
|
@$(ECHO) " make flash - Program ELF file to flash of DUT"
|
|
|
|
|
@$(ECHO) ""
|
|
|
|
|
@$(ECHO) " make upload - Program ELF file to flash of DUT and free-run"
|
|
|
|
|
@$(ECHO) ""
|
|
|
|
|
@$(ECHO) " make gdb - Download elf to flash and run GDB for development"
|
|
|
|
|
@$(ECHO) ""
|
|
|
|
|
@$(ECHO) " make tags/TAGS - Generate tags file for editors"
|
|
|
|
|
@$(ECHO) " make cscope - Generate cscope index"
|
|
|
|
|
@$(ECHO) ""
|
|
|
|
|
@$(ECHO) " make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build"
|
|
|
|
|
@$(ECHO) "----------------------------------------------------------------------"
|
|
|
|
|
|
|
|
|
|
#######################################
|
|
|
|
|
# dependencies
|
|
|
|
|
#######################################
|
|
|
|
|
|
|
|
|
|
-include $(wildcard $(OUT)/*.d)
|
|
|
|
|
|
|
|
|
|
.PHONY: $(PHONY)
|