xref: /rk3399_rockchip-uboot/make.sh (revision 1cd698aefc59b10c9d15dae44afda5a9f35b344a)
1#!/bin/sh
2set -e
3BOARD=$1
4SUBCMD=$2
5RKCHIP=${BOARD##*-}
6DSTDIR=rockdev/${RKCHIP}
7RKCHIP=$(echo ${RKCHIP} | tr '[a-z]' '[A-Z]')
8JOB=`sed -n "N;/processor/p" /proc/cpuinfo|wc -l`
9
10# Declare global rkbin tools and rkbin Responsity path, updated in prepare()
11TOOLCHAIN_RKBIN=./
12RKBIN=./
13# RKTOOL path
14RKBIN_TOOLS=../rkbin/tools
15
16# Declare global toolchain path for CROSS_COMPILE, updated in select_toolchain()
17TOOLCHAIN_GCC=./
18TOOLCHAIN_OBJDUMP=./
19# GCC toolchain
20GCC_ARM32=arm-linux-gnueabihf-
21GCC_ARM64=aarch64-linux-gnu-
22TOOLCHAIN_ARM32=../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin
23TOOLCHAIN_ARM64=../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin
24# OBJDMP
25OBJ_ARM32=arm-linux-gnueabihf-objdump
26OBJ_ARM64=aarch64-linux-gnu-objdump
27
28prepare()
29{
30	local absolute_path
31
32	# Check invaid args and help
33	if [ "$BOARD" = '--help' -o "$BOARD" = '-h' -o "$BOARD" = '--h' -o "$BOARD" = '' ]; then
34		echo
35		echo "Usage: ./make.sh [board]"
36		echo "Example:"
37		echo "./make.sh evb-rk3399     ---- build for evb-rk3399_defconfig"
38		echo "./make.sh firefly-rk3288 ---- build for firefly-rk3288_defconfig"
39		exit 1
40	elif [ ! -f configs/${BOARD}_defconfig ]; then
41		echo "Can't find: configs/${BOARD}_defconfig"
42		exit 1
43	fi
44
45	# Initialize RKBIN and TOOLCHAIN_RKBIN
46	if [ -d ${RKBIN_TOOLS} ]; then
47		absolute_path=$(cd `dirname ${RKBIN_TOOLS}`; pwd)
48		RKBIN=${absolute_path}
49		TOOLCHAIN_RKBIN=${absolute_path}/tools
50	else
51		echo
52		echo "Can't find '../rkbin/' Responsity, please download it before pack image!"
53		echo "How to obtain? 3 ways:"
54		echo "	1. Login your Rockchip gerrit account: \"Projects\" -> \"List\" -> search \"rk/rkbin\" Responsity"
55		echo "	2. Github Responsity: https://github.com/rockchip-linux/rkbin"
56		echo "	3. Download full release SDK Responsity"
57		exit 1
58	fi
59
60	# Clean! We assume that ./u-boot.map, u-boot.cfg or u-boot.lds indicates U-Boot project is not clean,
61	# maybe git checkout from rkdevelop.
62	if [ -f ./u-boot.map -o -f ./u-boot.cfg -o -f ./u-boot.lds ]; then
63		make mrproper
64		echo "auto \"make mrproper\" done..."
65	fi
66}
67
68select_toolchain()
69{
70	local absolute_path
71
72	if grep  -q '^CONFIG_ARM64=y' ${DSTDIR}/out/.config ; then
73		if [ -d ${TOOLCHAIN_ARM64} ]; then
74			absolute_path=$(cd `dirname ${TOOLCHAIN_ARM64}`; pwd)
75			TOOLCHAIN_GCC=${absolute_path}/bin/${GCC_ARM64}
76			TOOLCHAIN_OBJDUMP=${absolute_path}/bin/${OBJ_ARM64}
77		else
78			echo "Can't find toolchain: ${TOOLCHAIN_GCC}"
79			exit 1
80		fi
81	else
82		if [ -d ${TOOLCHAIN_ARM32} ]; then
83			absolute_path=$(cd `dirname ${TOOLCHAIN_ARM32}`; pwd)
84			TOOLCHAIN_GCC=${absolute_path}/bin/${GCC_ARM32}
85			TOOLCHAIN_OBJDUMP=${absolute_path}/bin/${OBJ_ARM32}
86		else
87			echo "Can't find toolchain: ${TOOLCHAIN_GCC}"
88			exit 1
89		fi
90	fi
91
92	echo "toolchain: ${TOOLCHAIN_GCC}"
93}
94
95sub_commands()
96{
97	local elf=${SUBCMD%-*} opt=${SUBCMD#*-}
98
99	# Make clean, distclean and mrproper
100	if [ "$SUBCMD" = 'clean' -o "$SUBCMD" = 'distclean' -o "$SUBCMD" = 'mrproper' ]; then
101		make $SUBCMD O=${DSTDIR}/out
102		exit 0
103	elif [ "$elf" = 'elf' ]; then
104		if [ ! -f ${DSTDIR}/out/u-boot ]; then
105			echo "Can't find elf file: ${DSTDIR}/out/u-boot"
106			exit 1
107		else
108			# default 'elf' without option, use '-D'
109			if [ "${elf}" = 'elf' -a "${opt}" = 'elf' ]; then
110				opt=D
111			fi
112
113			${TOOLCHAIN_OBJDUMP} -${opt} ${DSTDIR}/out/u-boot | less
114			exit 0
115		fi
116	elif [ "$SUBCMD" = 'map' ]; then
117		if [ ! -f ${DSTDIR}/out/System.map ]; then
118			echo "Can't find map file: ${DSTDIR}/out/System.map"
119			exit 1
120		else
121			vim ${DSTDIR}/out/System.map
122			exit 0
123		fi
124	elif [ "$SUBCMD" = '.config' ]; then
125		if [ ! -f ${DSTDIR}/out/.config ]; then
126			echo "Can't find .config file: ${DSTDIR}/out/.config"
127			exit 1
128		else
129			vim ${DSTDIR}/out/.config
130			exit 0
131		fi
132	fi
133}
134
135fixup_chip_name()
136{
137	if [ "$RKCHIP" = 'RK3228' -o "$RKCHIP" = 'RK3229' ]; then
138		RKCHIP=RK322X
139	fi
140}
141
142pack_uboot_image()
143{
144	local UBOOT_LOAD_ADDR
145
146	UBOOT_LOAD_ADDR=`sed -n "/CONFIG_SYS_TEXT_BASE=/s/CONFIG_SYS_TEXT_BASE=//p" ${DSTDIR}/out/include/autoconf.mk|tr -d '\r'`
147	${TOOLCHAIN_RKBIN}/loaderimage --pack --uboot ${DSTDIR}/out/u-boot.bin uboot.img ${UBOOT_LOAD_ADDR}
148	echo "pack uboot okay! Input: ${DSTDIR}/out/u-boot.bin"
149}
150
151pack_loader_image()
152{
153	if [ ! -f ${RKBIN}/RKBOOT/${RKCHIP}MINIALL.ini ]; then
154		echo "pack loader failed! Can't find: ${RKBIN}/RKBOOT/${RKCHIP}MINIALL.ini"
155		return
156	fi
157
158	cd ${RKBIN}
159	${TOOLCHAIN_RKBIN}/boot_merger --replace tools/rk_tools/ ./ ${RKBIN}/RKBOOT/${RKCHIP}MINIALL.ini
160	cd -
161	mv ${RKBIN}/*_loader_*.bin ./
162	echo "pack loader okay! Input: ${RKBIN}/RKBOOT/${RKCHIP}MINIALL.ini"
163}
164
165pack_trust_image()
166{
167	local TOS TOS_TA DARM_BASE TEE_LOAD_ADDR TEE_OFFSET=0x8400000
168
169	# ARM64 uses trust_merger
170	if grep  -q '^CONFIG_ARM64=y' ${DSTDIR}/out/.config ; then
171		if [ ! -f ${RKBIN}/RKTRUST/${RKCHIP}TRUST.ini ]; then
172			echo "pack trust failed! Can't find: ${RKBIN}/RKRUST/${RKCHIP}TRUST.ini"
173			return
174		fi
175
176		cd ${RKBIN}
177		${TOOLCHAIN_RKBIN}/trust_merger --replace tools/rk_tools/ ./ ${RKBIN}/RKTRUST/${RKCHIP}TRUST.ini
178		cd -
179		mv ${RKBIN}/trust.img ./trust.img
180		echo "pack trust okay! Input: ${RKBIN}/RKRUST/${RKCHIP}TRUST.ini"
181	# ARM uses loaderimage
182	else
183		if [ ! -f ${RKBIN}/RKTRUST/${RKCHIP}TOS.ini ]; then
184			echo "pack trust failed! Can't find: ${RKBIN}/RKTRUST/${RKCHIP}TOS.ini"
185			return
186		fi
187
188		# OP-TEE is 132M(0x8400000) offset from DRAM base.
189		DARM_BASE=`sed -n "/CONFIG_SYS_SDRAM_BASE=/s/CONFIG_SYS_SDRAM_BASE=//p" ${DSTDIR}/out/include/autoconf.mk|tr -d '\r'`
190		TEE_LOAD_ADDR=$((DARM_BASE+TEE_OFFSET))
191
192		# Convert Dec to Hex
193		TEE_LOAD_ADDR=$(echo "obase=16;${TEE_LOAD_ADDR}"|bc)
194
195		# Parse orignal path
196		TOS=`sed -n "/TOS=/s/TOS=//p" ${RKBIN}/RKTRUST/${RKCHIP}TOS.ini|tr -d '\r'`
197		TOS_TA=`sed -n "/TOSTA=/s/TOSTA=//p" ${RKBIN}/RKTRUST/${RKCHIP}TOS.ini|tr -d '\r'`
198
199		# replace "./tools/rk_tools/" with "./" to compatible legacy ini content of rkdevelop branch
200		TOS=$(echo ${TOS} | sed "s/tools\/rk_tools\//\.\//g")
201		TOS_TA=$(echo ${TOS_TA} | sed "s/tools\/rk_tools\//\.\//g")
202
203		if [ $TOS_TA -a $TOS ]; then
204			${TOOLCHAIN_RKBIN}/loaderimage --pack --trustos ${RKBIN}/${TOS} ./trust.img ${TEE_LOAD_ADDR}
205			${TOOLCHAIN_RKBIN}/loaderimage --pack --trustos ${RKBIN}/${TOS_TA} ./trust_with_ta.img ${TEE_LOAD_ADDR}
206			echo "Both trust.img and trust_with_ta.img are ready"
207		elif [ $TOS ]; then
208			${TOOLCHAIN_RKBIN}/loaderimage --pack --trustos ${RKBIN}/${TOS} ./trust.img ${TEE_LOAD_ADDR}
209			echo "trust.img is ready"
210		elif [ $TOS_TA ]; then
211			${TOOLCHAIN_RKBIN}/loaderimage --pack --trustos ${RKBIN}/${TOS_TA} ./trust.img ${TEE_LOAD_ADDR}
212			echo "trust.img with ta is ready"
213		else
214			echo "Can't find any tee bin"
215			exit 1
216		fi
217
218		echo "pack trust okay! Input: ${RKBIN}/RKTRUST/${RKCHIP}TOS.ini"
219	fi
220}
221
222prepare
223echo "make for ${BOARD}_defconfig by -j${JOB}"
224make ${BOARD}_defconfig O=${DSTDIR}/out
225select_toolchain
226sub_commands
227make CROSS_COMPILE=${TOOLCHAIN_GCC}  all --jobs=${JOB} O=${DSTDIR}/out
228fixup_chip_name
229pack_uboot_image
230pack_loader_image
231pack_trust_image
232