1# 2# Copyright (c) 2016-2024, Arm Limited and Contributors. All rights reserved. 3# 4# SPDX-License-Identifier: BSD-3-Clause 5# 6 7toolchains := rk3399-m0 8 9include ../../../../../make_helpers/common.mk 10include ../../../../../make_helpers/toolchain.mk 11 12# Cross Compile 13M0_CROSS_COMPILE ?= arm-none-eabi- 14 15# Build architecture 16ARCH := cortex-m0 17 18# Build platform 19PLAT_M0 ?= rk3399m0 20PLAT_M0_PMU ?= rk3399m0pmu 21 22.SUFFIXES: 23 24INCLUDES += -Iinclude/ \ 25 -I../../include/shared/ 26 27# NOTE: Add C source files here 28C_SOURCES_COMMON := src/startup.c 29C_SOURCES := src/dram.c \ 30 src/stopwatch.c 31C_SOURCES_PMU := src/suspend.c 32 33# Flags definition 34COMMON_FLAGS := -g -mcpu=$(ARCH) -mthumb -Wall -O3 -nostdlib -mfloat-abi=soft 35CFLAGS := -ffunction-sections -fdata-sections -fomit-frame-pointer -fno-common 36ASFLAGS := -Wa,--gdwarf-2 37LDFLAGS := -Wl,--gc-sections -Wl,--build-id=none 38 39# NOTE: The line continuation '\' is required in the next define otherwise we 40# end up with a line-feed characer at the end of the last c filename. 41# Also bare this issue in mind if extending the list of supported filetypes. 42define SOURCES_TO_OBJS 43 $(notdir $(patsubst %.c,%.o,$(filter %.c,$(1)))) \ 44 $(notdir $(patsubst %.S,%.o,$(filter %.S,$(1)))) 45endef 46 47SOURCES_COMMON := $(C_SOURCES_COMMON) 48SOURCES := $(C_SOURCES) 49SOURCES_PMU := $(C_SOURCES_PMU) 50OBJS_COMMON := $(addprefix $(BUILD)/,$(call SOURCES_TO_OBJS,$(SOURCES_COMMON))) 51OBJS := $(addprefix $(BUILD)/,$(call SOURCES_TO_OBJS,$(SOURCES))) 52OBJS_PMU := $(addprefix $(BUILD)/,$(call SOURCES_TO_OBJS,$(SOURCES_PMU))) 53LINKERFILE := $(BUILD)/$(PLAT_M0).ld 54MAPFILE := $(BUILD)/$(PLAT_M0).map 55MAPFILE_PMU := $(BUILD)/$(PLAT_M0_PMU).map 56ELF := $(BUILD)/$(PLAT_M0).elf 57ELF_PMU := $(BUILD)/$(PLAT_M0_PMU).elf 58BIN := $(BUILD)/$(PLAT_M0).bin 59BIN_PMU := $(BUILD)/$(PLAT_M0_PMU).bin 60LINKERFILE_SRC := src/$(PLAT_M0).ld.S 61 62# Function definition related compilation 63define MAKE_C 64$(eval OBJ := $(1)/$(patsubst %.c,%.o,$(notdir $(2)))) 65-include $(patsubst %.o,%.d,$(OBJ)) 66 67$(OBJ) : $(2) 68 $(s)echo " CC $$<" 69 $$(q)$(rk3399-m0-cc) $$(COMMON_FLAGS) $$(CFLAGS) $$(INCLUDES) -MMD -MT $$@ -c $$< -o $$@ 70endef 71 72define MAKE_S 73$(eval OBJ := $(1)/$(patsubst %.S,%.o,$(notdir $(2)))) 74 75$(OBJ) : $(2) 76 $(s)echo " AS $$<" 77 $$(q)$(rk3399-m0-cc) -x assembler-with-cpp $$(COMMON_FLAGS) $$(ASFLAGS) -c $$< -o $$@ 78endef 79 80define MAKE_OBJS 81 $(eval C_OBJS := $(filter %.c,$(2))) 82 $(eval REMAIN := $(filter-out %.c,$(2))) 83 $(eval $(foreach obj,$(C_OBJS),$(call MAKE_C,$(1),$(obj),$(3)))) 84 85 $(eval S_OBJS := $(filter %.S,$(REMAIN))) 86 $(eval REMAIN := $(filter-out %.S,$(REMAIN))) 87 $(eval $(foreach obj,$(S_OBJS),$(call MAKE_S,$(1),$(obj),$(3)))) 88 89 $(and $(REMAIN),$(error Unexpected source files present: $(REMAIN))) 90endef 91 92.PHONY: all 93all: $(BIN) $(BIN_PMU) 94 95.DEFAULT_GOAL := all 96 97$(LINKERFILE): $(LINKERFILE_SRC) 98 $(rk3399-m0-cc) $(COMMON_FLAGS) $(INCLUDES) -P -E -D__LINKER__ -MMD -MF $@.d -MT $@ -o $@ $< 99-include $(LINKERFILE).d 100 101$(ELF) : $(OBJS) $(OBJS_COMMON) $(LINKERFILE) 102 $(s)echo " LD $@" 103 $(q)$(rk3399-m0-cc) -o $@ $(COMMON_FLAGS) $(LDFLAGS) -Wl,-Map=$(MAPFILE) -Wl,-T$(LINKERFILE) $(OBJS) $(OBJS_COMMON) 104 105%.bin : %.elf 106 $(s)echo " BIN $@" 107 $(q)$(rk3399-m0-oc) -O binary $< $@ 108 109$(ELF_PMU) : $(OBJS_COMMON) $(OBJS_PMU) $(LINKERFILE) 110 $(s)echo " LD $@" 111 $(q)$(rk3399-m0-cc) -o $@ $(COMMON_FLAGS) $(LDFLAGS) -Wl,-Map=$(MAPFILE_PMU) -Wl,-T$(LINKERFILE) $(OBJS_PMU) $(OBJS_COMMON) 112 113$(eval $(call MAKE_OBJS,$(BUILD),$(SOURCES_COMMON),$(1))) 114$(eval $(call MAKE_OBJS,$(BUILD),$(SOURCES),$(1))) 115$(eval $(call MAKE_OBJS,$(BUILD),$(SOURCES_PMU),$(1))) 116