1COMPILE_NS_USER ?= 64
2override COMPILE_NS_KERNEL := 64
3COMPILE_S_USER ?= 64
4COMPILE_S_KERNEL ?= 64
5
6include common.mk
7
8DEBUG ?= 1
9
10# Do not leave a partially downloaded binary in case wget fails midway
11.DELETE_ON_ERROR:
12
13################################################################################
14# Paths to git projects and various binaries
15################################################################################
16TF_A_PATH		?= $(ROOT)/trusted-firmware-a
17BINARIES_PATH		?= $(ROOT)/out
18UBOOT_PATH		?= $(ROOT)/u-boot
19UBOOT_BIN		?= $(UBOOT_PATH)/u-boot.bin
20ROOT_IMG 		?= $(ROOT)/out-br/images/rootfs.ext2
21BOOT_IMG		?= $(ROOT)/out/rockpi4.img
22RKDEVELOPTOOL_PATH	?= $(ROOT)/rkdeveloptool
23RKDEVELOPTOOL_BIN	?= $(RKDEVELOPTOOL_PATH)/rkdeveloptool
24LOADER_BIN		?= $(BINARIES_PATH)/rk3399_loader_v1.20.119.bin
25
26LINUX_MODULES ?= n
27
28BR2_TARGET_ROOTFS_CPIO = n
29BR2_TARGET_ROOTFS_CPIO_GZIP = n
30BR2_TARGET_ROOTFS_EXT2 = y
31BR2_TARGET_GENERIC_GETTY_PORT = ttyS2
32ifeq ($(LINUX_MODULES),y)
33# If modules are installed...
34# ...enable automatic device detection and driver loading
35BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV = y
36# ...and configure eth0 automatically based on ifup helpers
37BR2_PACKAGE_IFUPDOWN_SCRIPTS = y
38BR2_SYSTEM_DHCP = eth0
39# An image with module takes more space
40BR2_TARGET_ROOTFS_EXT2_SIZE = 640M
41# Enable SSH daemon for remote login
42BR2_PACKAGE_OPENSSH = y
43BR2_PACKAGE_OPENSSH_SERVER = y
44BR2_ROOTFS_POST_BUILD_SCRIPT = $(ROOT)/build/br-ext/board/rockpi4/post-build.sh
45else
46BR2_TARGET_ROOTFS_EXT2_SIZE = 112M
47endif
48
49################################################################################
50# Targets
51################################################################################
52
53all: boot-img
54
55clean: buildroot-clean
56
57include toolchain.mk
58
59################################################################################
60# Arm Trusted Firmware-A
61################################################################################
62TF_A_EXPORTS ?= CROSS_COMPILE="$(CCACHE)$(AARCH64_CROSS_COMPILE)" \
63		M0_CROSS_COMPILE="$(CCACHE)$(AARCH32_CROSS_COMPILE)"
64
65TF_A_DEBUG ?= $(DEBUG)
66ifeq ($(TF_A_DEBUG),0)
67TF_A_LOGLVL ?= 30
68TF_A_OUT = $(TF_A_PATH)/build/rk3399/release
69else
70TF_A_LOGLVL ?= 40
71TF_A_OUT = $(TF_A_PATH)/build/rk3399/debug
72endif
73
74TF_A_FLAGS ?= ARCH=aarch64 PLAT=rk3399 SPD=opteed DEBUG=$(TF_A_DEBUG) \
75	      LOG_LEVEL=$(TF_A_LOGLVL)
76
77.PHONY: tfa
78tfa:
79	$(TF_A_EXPORTS) $(MAKE) -C $(TF_A_PATH) $(TF_A_FLAGS) bl31
80
81.PHONY: tfa-clean
82tfa-clean:
83	$(TF_A_EXPORTS) $(MAKE) -C $(TF_A_PATH) $(TF_A_FLAGS) clean
84
85clean: tfa-clean
86
87################################################################################
88# U-Boot
89################################################################################
90UBOOT_DEFCONFIG_FILES := $(UBOOT_PATH)/configs/rock-pi-4-rk3399_defconfig \
91			 $(ROOT)/build/kconfigs/u-boot_rockpi4.conf
92
93UBOOT_FLAGS ?= CROSS_COMPILE=$(CROSS_COMPILE_NS_KERNEL) \
94	       CC=$(CROSS_COMPILE_NS_KERNEL)gcc \
95	       HOSTCC="$(CCACHE) gcc"
96
97UBOOT_EXPORTS ?= BL31=$(TF_A_OUT)/bl31/bl31.elf TEE=$(OPTEE_OS_BIN)
98
99u-boot-defconfig: $(UBOOT_PATH)/.config
100
101$(UBOOT_PATH)/.config: $(UBOOT_DEFCONFIG_FILES)
102	cd $(UBOOT_PATH) && \
103                scripts/kconfig/merge_config.sh $(UBOOT_DEFCONFIG_FILES)
104
105.PHONY: u-boot-defconfig
106
107.PHONY: u-boot
108u-boot: $(UBOOT_PATH)/.config optee-os tfa
109	$(UBOOT_EXPORTS) $(MAKE) -C $(UBOOT_PATH) $(UBOOT_FLAGS)
110
111.PHONY: u-boot-clean
112u-boot-clean:
113	$(UBOOT_EXPORTS) $(MAKE) -C $(UBOOT_PATH) $(UBOOT_FLAGS) distclean
114
115clean: u-boot-clean
116
117################################################################################
118# Linux kernel
119################################################################################
120LINUX_DEFCONFIG_COMMON_ARCH ?= arm64
121LINUX_DEFCONFIG_COMMON_FILES ?= $(LINUX_PATH)/arch/arm64/configs/defconfig \
122				$(CURDIR)/kconfigs/rockpi4.conf
123
124.PHONY: linux-defconfig
125linux-defconfig: $(LINUX_PATH)/.config
126
127LINUX_COMMON_FLAGS += ARCH=arm64
128LINUX_COMMON_TARGETS += Image rockchip/rk3399-rock-pi-4b.dtb \
129			$(if $(filter y,$(LINUX_MODULES)),modules)
130
131.PHONY: linux
132linux: linux-common
133ifeq ($(LINUX_MODULES),y)
134	$(MAKE) -C $(LINUX_PATH) ARCH=arm64 modules_install \
135		INSTALL_MOD_PATH=$(BINARIES_PATH)/modules
136endif
137
138$(LINUX_PATH)/arch/arm64/boot/Image.gz: linux
139	gzip -c $(LINUX_PATH)/arch/arm64/boot/Image >$@
140
141.PHONY: linux-defconfig-clean
142linux-defconfig-clean: linux-defconfig-clean-common
143
144LINUX_CLEAN_COMMON_FLAGS += ARCH=arm64
145
146.PHONY: linux-clean
147linux-clean: linux-clean-common
148
149LINUX_CLEANER_COMMON_FLAGS += ARCH=arm64
150
151.PHONY: linux-cleaner
152linux-cleaner: linux-cleaner-common
153
154################################################################################
155# OP-TEE
156################################################################################
157OPTEE_OS_PLATFORM = rockchip-rk3399
158OPTEE_OS_COMMON_FLAGS += CFG_ENABLE_EMBEDDED_TESTS=y
159
160.PHONY: optee-os
161optee-os: optee-os-common
162
163.PHONY: optee-os-clean
164optee-os-clean: optee-os-clean-common
165
166clean: optee-os-clean
167
168################################################################################
169# Boot image, shall be copied to SD card
170################################################################################
171
172# U-Boot offset comes from CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x4000
173# Partition no. 5 ends at 12288 + BR2_TARGET_ROOTFS_EXT2_SIZE (in kiB)
174# File size needs to be slightly bigger to accomodate for whatever meta-data
175rootfs-size-kib := $(shell echo $(BR2_TARGET_ROOTFS_EXT2_SIZE) | sed 's/M/*1024/')
176p5-end-kib := $(shell echo $$((12288 + $(rootfs-size-kib))))
177img-size-kib := $(shell echo $$(($(p5-end-kib) + 1024)))
178
179.PHONY: boot-img
180boot-img: u-boot buildroot $(LINUX_PATH)/arch/arm64/boot/Image.gz
181	mkdir -p $(BINARIES_PATH)
182	rm -f $(BOOT_IMG)
183	truncate -s $(img-size-kib)KiB $(BOOT_IMG)
184	parted -s $(BOOT_IMG) \
185		unit kiB \
186		mklabel gpt \
187		mkpart idbloader 32 4032 \
188		mkpart primary fat32 4032 4096 \
189		mkpart primary fat32 4096 8192 \
190		mkpart uboot 8192 12288 \
191		mkpart root fat32 12288 $(p5-end-kib)
192	sgdisk -u 5:17d61bff-8fdc-4089-b675-9be21b9f6ac7 $(BOOT_IMG)
193	dd if=$(UBOOT_PATH)/idbloader.img of=$(BOOT_IMG) bs=1kiB seek=32 conv=notrunc
194	dd if=$(UBOOT_PATH)/u-boot.itb of=$(BOOT_IMG) bs=1kiB seek=8192 conv=notrunc
195	e2mkdir $(ROOT_IMG):/boot
196	e2cp $(LINUX_PATH)/arch/arm64/boot/Image.gz $(ROOT_IMG):/boot
197	e2cp $(LINUX_PATH)/arch/arm64/boot/dts/rockchip/rk3399-rock-pi-4b.dtb $(ROOT_IMG):/boot
198ifeq ($(LINUX_MODULES),y)
199	find $(BINARIES_PATH)/modules -type f | while read f; do e2cp -a $$f $(ROOT_IMG):$$(echo $$f | sed s@$(BINARIES_PATH)/modules@@); done
200endif
201	dd if=$(ROOT_IMG) of=$(BOOT_IMG) bs=1kiB seek=12288 conv=notrunc
202
203.PHONY: boot-img-clean
204boot-img-clean:
205	rm -f $(BOOT_IMG)
206
207clean: boot-img-clean
208
209################################################################################
210# rkdeveloptool
211################################################################################
212
213$(RKDEVELOPTOOL_PATH)/Makefile:
214	cd $(RKDEVELOPTOOL_PATH) && \
215		autoreconf -i && \
216		./configure CXXFLAGS=-Wno-format-truncation
217
218$(RKDEVELOPTOOL_BIN): $(RKDEVELOPTOOL_PATH)/Makefile
219	$(MAKE) -C $(RKDEVELOPTOOL_PATH)
220
221rkdeveloptool: $(RKDEVELOPTOOL_BIN)
222
223rkdeveloptool-clean:
224	$(MAKE) -C $(RKDEVELOPTOOL_PATH) clean
225
226rkdeveloptool-distclean:
227	$(MAKE) -C $(RKDEVELOPTOOL_PATH) clean
228
229clean: rkdeveloptool-clean
230
231$(LOADER_BIN):
232	cd $(BINARIES_PATH) && \
233		wget https://dl.radxa.com/rockpi/images/loader/$(notdir $(LOADER_BIN))
234
235################################################################################
236# Flash the image via USB onto the onboard eMMC
237################################################################################
238
239define flash-help
240	@echo
241	@echo "Please connect the board to the computer via a USB cable."
242	@echo "The cable must be connected to the upper USB 3 (blue) port."
243	@echo "Then press and hold the mask ROM button (first one on the left"
244	@echo "under the HDMI connector), apply power and release the button."
245	@echo "(More details at https://wiki.radxa.com/Rockpi4/dev/usb-install)"
246	@echo
247	@read -r -p "Press enter to continue, Ctrl-C to cancel:" dummy
248endef
249
250flash: $(BOOT_IMG) $(LOADER_BIN) $(RKDEVELOPTOOL_BIN)
251	$(call flash-help)
252	$(RKDEVELOPTOOL_BIN) db $(LOADER_BIN)
253	sleep 1
254	$(RKDEVELOPTOOL_BIN) wl 0 $(BOOT_IMG)
255
256nuke-emmc: $(LOADER_BIN) $(RKDEVELOPTOOL_BIN)
257	@echo
258	@echo "** WARNING: this command will make the onboard eMMC unbootable!"
259	@echo "It can be used to boot from the SD card again."
260	$(call flash-help)
261	dd if=/dev/zero of=$(BINARIES_PATH)/zero.img bs=1M count=64
262	$(RKDEVELOPTOOL_BIN) db $(LOADER_BIN)
263	sleep 1
264	$(RKDEVELOPTOOL_BIN) wl 0 $(BINARIES_PATH)/zero.img
265