Files
2025-12-24 17:21:08 +09:00

347 lines
8.3 KiB
Makefile

#
# Copyright (c) 2020 Renesas Electronics Corporation. All rights reserved.
#
define add_define
DEFINES += -D$(1)$(if $(value $(1)),=$(value $(1)),)
endef
V=@
# LSI setting common define
RCAR_S4:=0
RCAR_V4H:=1
RCAR_V4M:=2
NORMAL:=0
SECURE:=1
HS400:=0
HS200:=1
HIGH_SPEED:=2
NO_HIGH_SPEED:=3
$(eval $(call add_define,RCAR_S4))
$(eval $(call add_define,RCAR_V4H))
$(eval $(call add_define,RCAR_V4M))
$(eval $(call add_define,NORMAL))
$(eval $(call add_define,SECURE))
$(eval $(call add_define,HS400))
$(eval $(call add_define,HS200))
$(eval $(call add_define,HIGH_SPEED))
$(eval $(call add_define,NO_HIGH_SPEED))
ifneq ("$(FORCE_115200)", "")
$(eval $(call add_define,FORCE_115200))
endif
$(eval $(call add_define,MOBIS_PRK3))
#/* Select LSI("S4" or "V4H" or "V4M")***********************
ifeq ("$(LSI)", "")
LSI = V4H
endif
ifeq (${LSI},V4H)
RCAR_LSI:=${RCAR_V4H}
else
$(error "Error: ${LSI} is not supported.")
endif
$(eval $(call add_define,RCAR_LSI))
ifndef BOOT_MODE
BOOT_MODE:=${NORMAL}
else
ifeq (${BOOT_MODE},NORMAL)
BOOT_MODE:=${NORMAL}
else ifeq (${BOOT_MODE},SECURE)
BOOT_MODE:=${SECURE}
ifeq (${LSI},V4H)
$(eval $(call add_define,TARGET_CORTEX_A))
$(eval $(call add_define,TARGET_DEVICE_V4H))
endif
else
$(error "Error: ${BOOT_MODE} is not supported.")
endif
$(eval $(call add_define,BOOT_MODE))
endif
$(eval $(call add_define,AARCH64))
ifndef EMMC_TRANS_MODE
EMMC_TRANS_MODE:=${HS400}
else
ifeq (${EMMC_TRANS_MODE},HS400)
EMMC_TRANS_MODE:=${HS400}
else ifeq (${EMMC_TRANS_MODE},HS200)
EMMC_TRANS_MODE:=${HS200}
else ifeq (${EMMC_TRANS_MODE},HIGH_SPEED)
EMMC_TRANS_MODE:=${HIGH_SPEED}
else ifeq (${EMMC_TRANS_MODE},NO_HIGH_SPEED)
EMMC_TRANS_MODE:=${NO_HIGH_SPEED}
else
$(error "Error: ${EMMC_TRANS_MODE} is not supported.")
endif
$(eval $(call add_define,EMMC_TRANS_MODE))
endif
RTOS_LOAD_NUM := 1
$(eval $(call add_define,RTOS_LOAD_NUM))
BOOT = ICUMXA
AArch = 64
CPU = -march=armv8-a
AS_NEON =
CC_NEON = # -mgeneral-regs-only
ALIGN = -mstrict-align
AArch32_64 = AArch64
BOOTDIR = AArch64_boot
OUTPUT_DIR = build/release
OBJECT_DIR = build/obj
CROSS_COMPILE ?= aarch64-elf-
MEMORY_DEF = memory_cx_ipl.def
FILE_NAME = $(OUTPUT_DIR)/ca76_loader
INCLUDE_DIR = -I$(BOOTDIR) -I./include -I../V4H_Cx_Loader/include
OUTPUT_FILE = $(FILE_NAME).axf
#Object file
OBJ_FILE_BOOT = \
$(OBJECT_DIR)/boot_mon.o \
$(OBJECT_DIR)/stack.o
SRC_FILE := \
main.c \
common/string.c \
common/log/log.c \
common/log/scif.c \
common/timer/generic_timer.c \
loader/loader_main_common.c \
image_load/image_load.c
SRC_FILE += \
ip/emmc/emmc_boot.c \
ip/emmc/emmc_cmd.c \
ip/emmc/emmc_init.c \
ip/emmc/emmc_interrupt.c \
ip/emmc/emmc_mount.c \
ip/emmc/emmc_multiboot.c \
ip/emmc/emmc_read.c \
ip/emmc/emmc_utility.c
ifeq (${BOOT_MODE},SECURE)
SRC_FILE += secure/secure_boot.c \
secure/src/comm_drv/icum_d_comm_pe.c \
secure/src/icumif_lib/r_icumif.c \
secure/shared/src/mem_info_def.c \
secure/user_api/user_icumif_api.c
INCLUDE_DIR += -Isecure/src/comm_drv -Isecure/src/icumif_lib \
-Isecure/icumif -Isecure/include -Isecure/user_api \
-Isecure/shared/src
endif
ifeq ("$(DCACHE)", "1")
OBJ_FILE_BOOT += $(OBJECT_DIR)/d_armasm.o
SRC_FILE += vmsatable.c
endif
ifeq ("$(BOOT)", "WRITER_WITH_CERT")
SRC_FILE += cert_param.c
endif
###################################################
# Process access protection flag
# 0:Disable 1:Enable
ifndef ACC_PROT_ENABLE
ACC_PROT_ENABLE := 0
$(eval $(call add_define,ACC_PROT_ENABLE))
else
ifeq (${ACC_PROT_ENABLE},0)
$(eval $(call add_define,ACC_PROT_ENABLE))
else ifeq (${ACC_PROT_ENABLE},1)
$(eval $(call add_define,ACC_PROT_ENABLE))
else
$(error "Error:ACC_PROT_ENABLE=${ACC_PROT_ENABLE} is not supported.")
endif
endif
# Debug build
DEBUG:=0
# Process DEBUG flag
$(eval $(call assert_boolean,DEBUG))
$(eval $(call add_define,DEBUG))
ifeq (${DEBUG},0)
$(eval $(call add_define,NDEBUG))
CFLAGS += -Os
else
CFLAGS += -g
endif
# timing measurement
ifeq ("$(MEASURE_TIME)", "")
MEASURE_TIME = 0
else
$(eval $(call add_define,MEASURE_TIME))
# Set log level to Error, so we dont waste time with unnecessary prints
LOG_LEVEL := 1
SRC_FILE += \
common/scmt_checkpoint.c \
common/timer/scmt.c
endif
ifneq ("$(BE_QUIET)", "")
$(eval $(call add_define,BE_QUIET))
endif
# Process OPTEE_LOAD_ENABLE flag
ifeq ($(filter ${LSI},V4H V4M),${LSI})
ifndef OPTEE_LOAD_ENABLE
OPTEE_LOAD_ENABLE := 1
$(eval $(call add_define,OPTEE_LOAD_ENABLE))
else
ifeq (${OPTEE_LOAD_ENABLE},0)
$(eval $(call add_define,OPTEE_LOAD_ENABLE))
else ifeq (${OPTEE_LOAD_ENABLE},1)
$(eval $(call add_define,OPTEE_LOAD_ENABLE))
else
$(error "Error:OPTEE_LOAD_ENABLE=${OPTEE_LOAD_ENABLE} is not supported.")
endif
endif
endif
# Process BL2_LOAD_ENABLE flag
ifeq (${LSI},V4H)
ifndef BL2_LOAD_ENABLE
BL2_LOAD_ENABLE := 1
$(eval $(call add_define,BL2_LOAD_ENABLE))
else
ifeq (${BL2_LOAD_ENABLE},0)
$(eval $(call add_define,BL2_LOAD_ENABLE))
else ifeq (${BL2_LOAD_ENABLE},1)
$(eval $(call add_define,BL2_LOAD_ENABLE))
else
$(error "Error:BL2_LOAD_ENABLE=${BL2_LOAD_ENABLE} is not supported.")
endif
endif
endif
# Process QNX_OS_LOAD_ENABLE flag
ifeq (${LSI},V4H)
ifndef QNX_OS_LOAD_ENABLE
QNX_OS_LOAD_ENABLE := 1
$(eval $(call add_define,QNX_OS_LOAD_ENABLE))
else
ifeq (${QNX_OS_LOAD_ENABLE},0)
$(eval $(call add_define,QNX_OS_LOAD_ENABLE))
else ifeq (${QNX_OS_LOAD_ENABLE},1)
$(eval $(call add_define,QNX_OS_LOAD_ENABLE))
else
$(error "Error:QNX_OS_LOAD_ENABLE=${QNX_OS_LOAD_ENABLE} is not supported.")
endif
endif
endif
# Process LOG_LEVEL
ifndef LOG_LEVEL
LOG_LEVEL := 2
endif
$(eval $(call add_define,LOG_LEVEL))
###################################################
#C compiler
CC = $(CROSS_COMPILE)gcc
#Assembler
AS = $(CROSS_COMPILE)as
#Linker
LD = $(CROSS_COMPILE)ld
#Liblary
AR = $(CROSS_COMPILE)ar
#Object dump
OBJDMP = $(CROSS_COMPILE)objdump
#Object copy
OBJCOPY = $(CROSS_COMPILE)objcopy
#clean
CL = rm -rf
OBJ_FILE := $(addprefix $(OBJECT_DIR)/,$(patsubst %.c,%.o,$(SRC_FILE)))
#Dependency File
DEPEND_FILE = $(patsubst %.lib, ,$(OBJ_FILE:%.o=%.d))
CFLAGS += -ffreestanding -Wall \
-Wmissing-include-dirs \
-std=c99 -c \
-D__CX_IPL__ \
$(DEFINES)
LDFLAGS = --fatal-warnings -O1 -lm
BUILD_MESSAGE_TIMESTAMP ?= __TIME__", "__DATE__
LIBS = -L$(subst libc.a, ,$(shell $(CC) -print-file-name=libc.a 2> /dev/null)) -lc
LIBS += -L$(subst libgcc.a, ,$(shell $(CC) -print-libgcc-file-name 2> /dev/null)) -lgcc
###################################################
# Suffixes
.SUFFIXES : .s .c .o
###################################################
# Command
.PHONY: all
all: $(OBJECT_DIR) $(OUTPUT_DIR) $(OBJ_FILE_BOOT) $(OBJ_FILE) $(OUTPUT_FILE)
#------------------------------------------
# Make Directory
#------------------------------------------
$(OBJECT_DIR):
-mkdir -p "$(OBJECT_DIR)"
$(OUTPUT_DIR):
-mkdir -p "$(OUTPUT_DIR)"
#------------------------------------------
# Compile
#------------------------------------------
$(OBJECT_DIR)/%.o:$(BOOTDIR)/%.s
$(V)$(AS) -g $(AS_NEON) --MD $(patsubst %.o,%.d,$@) \
$(INCLUDE_DIR) $< -o $@ --defsym $(AArch32_64)=0
$(OBJECT_DIR)/%.o:%.c
@if [ ! -e `dirname $@` ]; then mkdir -p `dirname $@`; fi
$(V)$(CC) $(ALIGN) $(CPU) $(CC_NEON) -MMD -MP -c \
$(INCLUDE_DIR) $< -o $@ -D$(AArch32_64)=0 $(DEFINES) $(CFLAGS)
#------------------------------------------
# Linker
#------------------------------------------
$(OUTPUT_FILE): $(OBJ_FILE_BOOT) $(OBJ_FILE) $(MEMORY_DEF)
@echo 'const char build_message[] = "Built : "$(BUILD_MESSAGE_TIMESTAMP);' | \
$(CC) $(CFLAGS) -xc - -o $(OBJECT_DIR)/build_message.o
$(V)$(LD) $(OBJ_FILE_BOOT) $(OBJ_FILE) $(OBJECT_DIR)/build_message.o \
-T '$(MEMORY_DEF)' \
-o '$(OUTPUT_FILE)' \
$(LDFLAGS) \
-Map '$(FILE_NAME).map' \
-static \
$(LIBS)
$(V)$(OBJCOPY) -O srec --srec-forceS3 "$(OUTPUT_FILE)" "$(FILE_NAME).srec"
$(V)$(OBJCOPY) -O binary "$(OUTPUT_FILE)" "$(FILE_NAME).bin"
$(V)$(OBJDMP) -d -S "$(OUTPUT_FILE)" > "$(FILE_NAME)_disasm.txt"
@chmod 644 $(FILE_NAME).*
ifneq ("$(V)", "")
@echo "Build complete: $(OUTPUT_FILE)"
@echo "Output files:"
@echo " - $(FILE_NAME).srec"
endif
.PHONY: clean
clean:
@$(CL) $(OBJECT_DIR)/* $(OUTPUT_DIR)/*
distclean: clean
@$(CL) build
-include $(DEPEND_FILE)