xref: /rk3399_rockchip-uboot/make.sh (revision d3acdc96e2fd0ed34beb32b26ba57131a1e04ea3)
1#!/bin/bash
2#
3# Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd
4#
5# SPDX-License-Identifier: GPL-2.0
6#
7
8set -e
9JOB=`sed -n "N;/processor/p" /proc/cpuinfo|wc -l`
10SUPPORT_LIST=`ls configs/*[r,p][x,v,k][0-9][0-9]*_defconfig`
11CMD_ARGS=$1
12
13# @LOADER: map to $RKCHIP_LOADER for loader ini
14# @TRUST:  map to $RKCHIP_TRUST for trust ini
15# @LABEL:  map to $RKCHIP_LEBEL for verbose message
16# @-:      default state/value
17CHIP_TYPE_FIXUP_TABLE=(
18	# CONFIG_XXX                         RKCHIP         LOADER       TRUST         LABEL
19	"CONFIG_ROCKCHIP_RK3368              RK3368H         -            -             -"
20	"CONFIG_ROCKCHIP_RV1108              RV110X          -            -             -"
21	"CONFIG_ROCKCHIP_PX3SE               PX3SE           -            -             -"
22	"CONFIG_ROCKCHIP_RK3126              RK3126          -            -             -"
23	"CONFIG_ROCKCHIP_RK3326              RK3326          -            -             -"
24	"CONFIG_ROCKCHIP_RK3128X             RK3128X         -            -             -"
25	"CONFIG_ROCKCHIP_PX5                 PX5             -            -             -"
26	"CONFIG_ROCKCHIP_RK3399PRO           RK3399PRO       -            -             -"
27	"CONFIG_ROCKCHIP_RK1806              RK1806          -            -             -"
28	"CONFIG_TARGET_GVA_RK3229            RK322X          RK322XAT     -             -"
29	"CONFIG_COPROCESSOR_RK1808           RKNPU-LION      RKNPULION    RKNPULION     -"
30)
31
32# <*> Fixup rsa/sha pack mode for platforms
33#     RSA: RK3308/PX30/RK3326/RK1808 use RSA-PKCS1 V2.1, it's pack magic is "3", and others use default configure.
34#     SHA: RK3368 use rk big endian SHA256, it's pack magic is "2", and others use default configure.
35# <*> Fixup images size pack for platforms
36# <*> Fixup verbose message about AARCH32
37#
38# @RSA:     rsa mode
39# @SHA:     sha mode
40# @A64-KB:  arm64 platform image size: [uboot,trust]
41# @A64-NUM: arm64 platform image number of total: [uboot,trust]
42# @A32-KB:  arm32 platform image size: [uboot,trust]
43# @A32-NUM: arm32 platform image number of total: [uboot,trust]
44# @LOADER:  map to $RKCHIP_LOADER for loader ini
45# @TRUST:   map to $RKCHIP_TRUST for trust ini
46# @-:       default state/value
47CHIP_CFG_FIXUP_TABLE=(
48	# CONFIG_XXX              RSA     SHA     A64-KB      A64-NUM     A32-KB       A32-NUM      LOAER        TRUST
49	"CONFIG_ROCKCHIP_RK3368    -       2       -,-          -,-        -,-          -,-           -           -"
50	"CONFIG_ROCKCHIP_RK3036    -       -       512,512      1,1        -,-          -,-           -           -"
51	"CONFIG_ROCKCHIP_PX30      3       -       -,-          -,-        -,-          -,-           -           -"
52	"CONFIG_ROCKCHIP_RK3326    3       -       -,-          -,-        -,-          -,-           AARCH32     -"
53	"CONFIG_ROCKCHIP_RK3308    3       -       1024,1024    2,2        512,512      2,2           -           AARCH32"
54	"CONFIG_ROCKCHIP_RK1808    3       -       1024,1024    2,2        -,-          -,-           -           -"
55	"CONFIG_ROCKCHIP_RV1126    3       -       -,-          -,-        -,-          -,-           -           -"
56)
57
58########################################### User can modify #############################################
59# User's rkbin tool relative path
60RKBIN_TOOLS=../rkbin/tools
61
62# User's GCC toolchain and relative path
63ADDR2LINE_ARM32=arm-linux-gnueabihf-addr2line
64ADDR2LINE_ARM64=aarch64-linux-gnu-addr2line
65OBJ_ARM32=arm-linux-gnueabihf-objdump
66OBJ_ARM64=aarch64-linux-gnu-objdump
67NM_ARM32=arm-linux-gnueabihf-nm
68NM_ARM64=aarch64-linux-gnu-nm
69GCC_ARM32=arm-linux-gnueabihf-
70GCC_ARM64=aarch64-linux-gnu-
71TOOLCHAIN_ARM32=../prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin
72TOOLCHAIN_ARM64=../prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin
73
74########################################### User not touch #############################################
75# Declare global INI file searching index name for every chip, update in select_chip_info()
76RKCHIP="-"
77RKCHIP_LABEL="-"
78RKCHIP_LOADER="-"
79RKCHIP_TRUST="-"
80
81INI_TRUST=
82INI_LOADER=
83
84# Declare rkbin repository path, updated in prepare()
85RKBIN=
86
87# Declare global toolchain path for CROSS_COMPILE, updated in select_toolchain()
88TOOLCHAIN_GCC=
89TOOLCHAIN_NM=
90TOOLCHAIN_OBJDUMP=
91TOOLCHAIN_ADDR2LINE=
92
93# Declare global plaform configure, updated in fixup_platform_configure()
94PLAT_RSA=
95PLAT_SHA=
96PLAT_UBOOT_SIZE=
97PLAT_TRUST_SIZE=
98PLAT_TYPE="RKFW" # default
99
100SRCTREE=`pwd`
101SCRIPT_ATF="${SRCTREE}/scripts/atf.sh"
102SCRIPT_TOS="${SRCTREE}/scripts/tos.sh"
103SCRIPT_SPL="${SRCTREE}/scripts/spl.sh"
104SCRIPT_UBOOT="${SRCTREE}/scripts/uboot.sh"
105SCRIPT_LOADER="${SRCTREE}/scripts/loader.sh"
106
107#########################################################################################################
108function help()
109{
110	echo
111	echo "Usage:"
112	echo "	./make.sh [board|sub-command]"
113	echo
114	echo "	 - board:        board name of defconfig"
115	echo "	 - sub-command:  elf*|loader|trust|uboot|--spl|--tpl|itb|map|sym|<addr>"
116	echo "	 - ini:          ini file to pack trust/loader"
117	echo
118	echo "Output:"
119	echo "	 When board built okay, there are uboot/trust/loader images in current directory"
120	echo
121	echo "Example:"
122	echo
123	echo "1. Build:"
124	echo "	./make.sh evb-rk3399               --- build for evb-rk3399_defconfig"
125	echo "	./make.sh firefly-rk3288           --- build for firefly-rk3288_defconfig"
126	echo "	./make.sh EXT_DTB=rk-kernel.dtb    --- build with exist .config and external dtb"
127	echo "	./make.sh                          --- build with exist .config"
128	echo "	./make.sh env                      --- build envtools"
129	echo
130	echo "2. Pack:"
131	echo "	./make.sh uboot                    --- pack uboot.img"
132	echo "	./make.sh trust                    --- pack trust.img"
133	echo "	./make.sh trust <ini>              --- pack trust img with assigned ini file"
134	echo "	./make.sh loader                   --- pack loader bin"
135	echo "	./make.sh loader <ini>             --- pack loader img with assigned ini file"
136	echo "	./make.sh --spl                    --- pack loader with u-boot-spl.bin"
137	echo "	./make.sh --tpl                    --- pack loader with u-boot-tpl.bin"
138	echo "	./make.sh --tpl --spl              --- pack loader with u-boot-tpl.bin and u-boot-spl.bin"
139	echo
140	echo "3. Debug:"
141	echo "	./make.sh elf                      --- dump elf file with -D(default)"
142	echo "	./make.sh elf-S                    --- dump elf file with -S"
143	echo "	./make.sh elf-d                    --- dump elf file with -d"
144	echo "	./make.sh elf-*                    --- dump elf file with -*"
145	echo "	./make.sh <no reloc_addr>          --- unwind address(no relocated)"
146	echo "	./make.sh <reloc_addr-reloc_off>   --- unwind address(relocated)"
147	echo "	./make.sh map                      --- cat u-boot.map"
148	echo "	./make.sh sym                      --- cat u-boot.sym"
149}
150
151function prepare()
152{
153	if [ -d ${RKBIN_TOOLS} ]; then
154		absolute_path=$(cd `dirname ${RKBIN_TOOLS}`; pwd)
155		RKBIN=${absolute_path}
156	else
157		echo "ERROR: No ../rkbin repository"
158		exit 1
159	fi
160
161	if grep -Eq ''^CONFIG_ARM64=y'|'^CONFIG_ARM64_BOOT_AARCH32=y'' .config ; then
162		ARM64_TRUSTZONE="y"
163	fi
164
165	if grep  -q '^CONFIG_ROCKCHIP_FIT_IMAGE_PACK=y' .config ; then
166		PLAT_TYPE="FIT"
167	fi
168}
169
170function process_args()
171{
172	while [ $# -gt 0 ]; do
173		case $1 in
174			*help|--h|-h)
175				help
176				exit 0
177				;;
178			# '': build with exist .config
179			# loader|trust|uboot: pack image
180			# debug*|map|sym|elf*|nm: debug command
181			# env: build env tool
182			# itb: pack itb image
183			# fit: pack non-secure uboot.img && boot.img
184			''|loader|trust|uboot|debug*|itb|env|fit|map|sym|elf*|nm)
185				if [ "$2" == "spl" -o "$2" == "tpl" ]; then
186					ARG_TSPL=$2
187					shift 1
188				fi
189				shift 1
190				;;
191			# trust/loader ini files for packing trust.img/loader.img
192			*.ini|*.INI)
193				if [ ! -f $1 ]; then
194					echo "ERROR: No $1"
195				fi
196				if grep -q 'CODE471_OPTION' $1 ; then
197					ARG_INI_LOADER=$1
198				elif grep -Eq ''BL31_OPTION'|'TOS'' $1 ; then
199					ARG_INI_TRUST=$1
200				fi
201				shift 1
202				;;
203			--sz-trust) # set trust size
204				ARG_TRUST_SIZE="--size $2 $3"
205				shift 3
206				;;
207			--sz-uboot) # set uboot size
208				ARG_UBOOT_SIZE="--size $2 $3"
209				shift 3
210				;;
211			--no-pack)  # FIT: build but not pack image
212				ARG_NO_PACK="y"
213				shift 1
214				;;
215			--no-uboot) # FIT: pack uboot.img without u-boot
216				ARG_NO_UBOOT="y"
217				shift 1
218				;;
219			--idblock)  # pack idblock.bin
220				shift 1
221				;;
222			--tpl|tpl)  # use tpl file
223				ARG_TPL_BIN="tpl/u-boot-tpl.bin"
224				shift 1
225				;;
226			--spl|spl*) # use spl file
227				ARG_SPL_BIN="spl/u-boot-spl.bin"
228				shift 1
229				;;
230			*)
231				#1. FIT scripts args
232				NUM=$(./scripts/fit-mkimg.sh --arg-check $1)
233				if  [ ${NUM} -ne 0 ]; then
234					[ ${NUM} -eq 1 ] && ARG_LIST_FIT="${ARG_LIST_FIT} $1"
235					[ ${NUM} -eq 2 ] && ARG_LIST_FIT="${ARG_LIST_FIT} $1 $2"
236					shift ${NUM}
237					continue
238				#2. unwind function address
239				elif [ -z $(echo $1 | sed 's/[0-9,a-f,A-F,x,X,-]//g') ]; then
240					ARG_FUNCADDR=$1
241				#3. make defconfig
242				else
243					ARG_BOARD=$1
244					if [ ! -f configs/${ARG_BOARD}_defconfig -a ! -f configs/${ARG_BOARD}.config ]; then
245						echo -e "\n${SUPPORT_LIST}\n"
246						echo "ERROR: No configs/${ARG_BOARD}_defconfig"
247						exit 1
248					elif [ -f configs/${ARG_BOARD}.config ]; then
249						BASE1_DEFCONFIG=`sed -n "/CONFIG_BASE_DEFCONFIG=/s/CONFIG_BASE_DEFCONFIG=//p" configs/${ARG_BOARD}.config |tr -d '\r' | tr -d '"'`
250						BASE0_DEFCONFIG=`sed -n "/CONFIG_BASE_DEFCONFIG=/s/CONFIG_BASE_DEFCONFIG=//p" configs/${BASE1_DEFCONFIG} |tr -d '\r' | tr -d '"'`
251						MAKE_CMD="make ${BASE0_DEFCONFIG} ${BASE1_DEFCONFIG} ${ARG_BOARD}.config -j${JOB}"
252						echo "## ${MAKE_CMD}"
253						make ${BASE0_DEFCONFIG} ${BASE1_DEFCONFIG} ${ARG_BOARD}.config ${OPTION}
254					else
255						MAKE_CMD="make ${ARG_BOARD}_defconfig -j${JOB}"
256						echo "## ${MAKE_CMD}"
257						make ${ARG_BOARD}_defconfig ${OPTION}
258					fi
259				fi
260				shift 1
261				;;
262		esac
263	done
264
265	if [ ! -f .config ]; then
266		echo
267		echo "ERROR: No .config"
268		help
269		exit 1
270	fi
271}
272
273function select_toolchain()
274{
275	if grep -q '^CONFIG_ARM64=y' .config ; then
276		if [ -d ${TOOLCHAIN_ARM64} ]; then
277			absolute_path=$(cd `dirname ${TOOLCHAIN_ARM64}`; pwd)
278			TOOLCHAIN_NM=${absolute_path}/bin/${NM_ARM64}
279			TOOLCHAIN_GCC=${absolute_path}/bin/${GCC_ARM64}
280			TOOLCHAIN_OBJDUMP=${absolute_path}/bin/${OBJ_ARM64}
281			TOOLCHAIN_ADDR2LINE=${absolute_path}/bin/${ADDR2LINE_ARM64}
282		else
283			echo "ERROR: No toolchain: ${TOOLCHAIN_ARM64}"
284			exit 1
285		fi
286	else
287		if [ -d ${TOOLCHAIN_ARM32} ]; then
288			absolute_path=$(cd `dirname ${TOOLCHAIN_ARM32}`; pwd)
289			TOOLCHAIN_NM=${absolute_path}/bin/${NM_ARM32}
290			TOOLCHAIN_GCC=${absolute_path}/bin/${GCC_ARM32}
291			TOOLCHAIN_OBJDUMP=${absolute_path}/bin/${OBJ_ARM32}
292			TOOLCHAIN_ADDR2LINE=${absolute_path}/bin/${ADDR2LINE_ARM32}
293		else
294			echo "ERROR: No toolchain: ${TOOLCHAIN_ARM32}"
295			exit 1
296		fi
297	fi
298}
299
300#
301# We select chip info to do:
302#	1. RKCHIP:        fixup platform configure
303#	2. RKCHIP_LOADER: search ini file to pack loader
304#	3. RKCHIP_TRUST:  search ini file to pack trust
305#	4. RKCHIP_LABEL:  show build message
306#
307function select_chip_info()
308{
309	# Read RKCHIP firstly from .config
310	# The regular expression that matching:
311	#  - PX30, PX3SE
312	#  - RK????, RK????X
313	#  - RV????
314	CHIP_PATTERN='^CONFIG_ROCKCHIP_[R,P][X,V,K][0-9ESX]{1,5}'
315	RKCHIP=`egrep -o ${CHIP_PATTERN} .config`
316
317	# default
318	RKCHIP=${RKCHIP##*_}
319	# fixup ?
320	for item in "${CHIP_TYPE_FIXUP_TABLE[@]}"
321	do
322		CONFIG_ROCKCHIP_XXX=`echo ${item} | awk '{ print $1 }'`
323		if grep  -q "^${CONFIG_ROCKCHIP_XXX}=y" .config ; then
324			RKCHIP=`echo ${item} | awk '{ print $2 }'`
325			RKCHIP_LOADER=`echo ${item} | awk '{ print $3 }'`
326			RKCHIP_TRUST=`echo  ${item} | awk '{ print $4 }'`
327			RKCHIP_LABEL=`echo  ${item} | awk '{ print $5 }'`
328		fi
329	done
330
331	if [ "${RKCHIP_LOADER}" == "-" ]; then
332		RKCHIP_LOADER=${RKCHIP}
333	fi
334	if [ "${RKCHIP_TRUST}" == "-" ]; then
335		RKCHIP_TRUST=${RKCHIP}
336	fi
337	if [ "${RKCHIP_LABEL}" == "-" ]; then
338		RKCHIP_LABEL=${RKCHIP}
339	fi
340}
341
342# Priority: default < CHIP_CFG_FIXUP_TABLE() < make.sh args
343function fixup_platform_configure()
344{
345	U_KB="-" U_NUM="-" T_KB="-" T_NUM="-"  SHA="-" RSA="-"
346
347	for item in "${CHIP_CFG_FIXUP_TABLE[@]}"
348	do
349		config_xxx=`echo ${item} | awk '{ print $1 }'`
350		if grep  -q "^${config_xxx}=y" .config ; then
351			# <*> Fixup rsa/sha pack mode for platforms
352			RSA=`echo ${item} | awk '{ print $2 }'`
353			SHA=`echo ${item} | awk '{ print $3 }'`
354
355			# <*> Fixup images size pack for platforms, and ini file
356			if grep -q '^CONFIG_ARM64=y' .config ; then
357				U_KB=`echo  ${item} | awk '{ print $4 }' | awk -F "," '{ print $1 }'`
358				T_KB=`echo  ${item} | awk '{ print $4 }' | awk -F "," '{ print $2 }'`
359				U_NUM=`echo ${item} | awk '{ print $5 }' | awk -F "," '{ print $1 }'`
360				T_NUM=`echo ${item} | awk '{ print $5 }' | awk -F "," '{ print $2 }'`
361			else
362				U_KB=`echo  ${item} | awk '{ print $6 }' | awk -F "," '{ print $1 }'`
363				T_KB=`echo  ${item} | awk '{ print $6 }' | awk -F "," '{ print $2 }'`
364				U_NUM=`echo ${item} | awk '{ print $7 }' | awk -F "," '{ print $1 }'`
365				T_NUM=`echo ${item} | awk '{ print $7 }' | awk -F "," '{ print $2 }'`
366				# AArch32
367				if grep -q '^CONFIG_ARM64_BOOT_AARCH32=y' .config ; then
368					PADDING=`echo ${item} | awk '{ print $8 }'`
369					if [ "${PADDING}" != "-" ]; then
370						RKCHIP_LOADER=${RKCHIP_LOADER}${PADDING}
371					fi
372					PADDING=`echo  ${item} | awk '{ print $9 }'`
373					if [ "${PADDING}" != "-" ]; then
374						RKCHIP_TRUST=${RKCHIP_TRUST}${PADDING}
375					fi
376					RKCHIP_LABEL=${RKCHIP_LABEL}"AARCH32"
377				fi
378			fi
379		fi
380	done
381
382	if [ "${SHA}" != "-" ]; then
383		PLAT_SHA="--sha ${SHA}"
384	fi
385	if [ "${RSA}" != "-" ]; then
386		PLAT_RSA="--rsa ${RSA}"
387	fi
388	if [ "${U_KB}" != "-" ]; then
389		PLAT_UBOOT_SIZE="--size ${U_KB} ${U_NUM}"
390	fi
391	if [ "${T_KB}" != "-" ]; then
392		PLAT_TRUST_SIZE="--size ${T_KB} ${T_NUM}"
393	fi
394
395	# args
396	if [ ! -z "${ARG_UBOOT_SIZE}" ]; then
397		PLAT_UBOOT_SIZE=${ARG_UBOOT_SIZE}
398	fi
399
400	if [ ! -z "${ARG_TRUST_SIZE}" ]; then
401		PLAT_TRUST_SIZE=${ARG_TRUST_SIZE}
402	fi
403}
404
405# Priority: default < CHIP_TYPE_FIXUP_TABLE() < defconfig < make.sh args
406function select_ini_file()
407{
408	# default
409	INI_LOADER=${RKBIN}/RKBOOT/${RKCHIP_LOADER}MINIALL.ini
410	if [ "${ARM64_TRUSTZONE}" == "y" ]; then
411		INI_TRUST=${RKBIN}/RKTRUST/${RKCHIP_TRUST}TRUST.ini
412	else
413		INI_TRUST=${RKBIN}/RKTRUST/${RKCHIP_TRUST}TOS.ini
414	fi
415
416	# defconfig
417	NAME=`sed -n "/CONFIG_LOADER_INI=/s/CONFIG_LOADER_INI=//p" .config |tr -d '\r' | tr -d '"'`
418	if [ ! -z "${NAME}" ]; then
419		INI_LOADER=${RKBIN}/RKBOOT/${NAME}
420	fi
421	NAME=`sed -n "/CONFIG_TRUST_INI=/s/CONFIG_TRUST_INI=//p" .config |tr -d '\r' | tr -d '"'`
422	if [ ! -z "${NAME}" ]; then
423		INI_TRUST=${RKBIN}/RKTRUST/${NAME}
424	fi
425
426	# args
427	if [ ! -z "${ARG_INI_TRUST}" ]; then
428		INI_TRUST=${ARG_INI_TRUST}
429	fi
430	if [ ! -z "${ARG_INI_LOADER}" ]; then
431		INI_LOADER=${ARG_INI_LOADER}
432	fi
433}
434
435function sub_commands()
436{
437	# skip "--" parameter, such as "--rollback-index-..."
438	if [[ ${CMD_ARGS} != --* ]]; then
439		CMD=${CMD_ARGS%-*}
440		ARG=${CMD_ARGS#*-}
441	else
442		CMD=${CMD_ARGS}
443	fi
444
445	if [ "${ARG_TSPL}" == "tpl" -o "${ARG_TSPL}" == "spl" ]; then
446		ELF=`find -name u-boot-${ARG_TSPL}`
447		MAP=`find -name u-boot-${ARG_TSPL}.map`
448		SYM=`find -name u-boot-${ARG_TSPL}.sym`
449	else
450		ELF=u-boot
451		MAP=u-boot.map
452		SYM=u-boot.sym
453	fi
454
455	case ${CMD} in
456		elf|nm)
457			if [ "${CMD}" == "nm" ]; then
458				${TOOLCHAIN_NM} -r --size ${ELF} | less
459			else
460				if [ "${CMD}" == "elf" -a "${ARG}" == "elf" ]; then
461					ARG=D # default
462				fi
463				${TOOLCHAIN_OBJDUMP} -${ARG} ${ELF} | less
464			fi
465			exit 0
466			;;
467		map|sym)
468			if [ ${CMD} == "map" ]; then
469				cat ${MAP} | less
470			else
471				cat ${SYM} | less
472			fi
473			exit 0
474			;;
475		debug)
476			./scripts/rkpatch.sh ${ARG}
477			exit 0
478			;;
479		fit)
480			# Non-secure
481			./scripts/fit-mkimg.sh --uboot-itb --boot-itb --no-vboot ${ARG_LIST_FIT}
482			exit 0
483			;;
484		uboot)
485			pack_uboot_image
486			exit 0
487			;;
488		trust)
489			pack_trust_image
490			exit 0
491			;;
492		loader)
493			pack_loader_image
494			exit 0
495			;;
496		itb)
497			pack_uboot_itb_image
498			exit 0
499			;;
500		env)
501			make CROSS_COMPILE=${TOOLCHAIN_GCC} envtools
502			exit 0
503			;;
504		--idblock)
505			pack_idblock
506			exit 0
507			;;
508		--tpl|--spl|tpl|spl)
509			pack_spl_loader_image
510			exit 0
511			;;
512		*)
513			unwind_addr_or_continue
514			;;
515	esac
516}
517
518function unwind_addr_or_continue()
519{
520	FUNCADDR=${ARG_FUNCADDR}
521	RELOCOFF=${FUNCADDR#*-}
522	FUNCADDR=${FUNCADDR%-*}
523
524	if [ -z $(echo ${FUNCADDR} | sed 's/[0-9,a-f,A-F,x,X,-]//g') ] && [ ${FUNCADDR} ]; then
525		# With prefix: '0x' or '0X'
526		if [ `echo ${FUNCADDR} | sed -n "/0[x,X]/p" | wc -l` -ne 0 ]; then
527			FUNCADDR=`echo ${FUNCADDR} | awk '{ print strtonum($0) }'`
528			FUNCADDR=`echo "obase=16;${FUNCADDR}"|bc | tr '[A-Z]' '[a-z]'`
529		fi
530		if [ `echo ${RELOCOFF} | sed -n "/0[x,X]/p" | wc -l` -ne 0 ] && [ ${RELOCOFF} ]; then
531			RELOCOFF=`echo ${RELOCOFF} | awk '{ print strtonum($0) }'`
532			RELOCOFF=`echo "obase=16;${RELOCOFF}"|bc | tr '[A-Z]' '[a-z]'`
533		fi
534
535		# If reloc address is assigned, do sub
536		if [ "${FUNCADDR}" != "${RELOCOFF}" ]; then
537			# Hex -> Dec -> SUB -> Hex
538			FUNCADDR=`echo $((16#${FUNCADDR}))`
539			RELOCOFF=`echo $((16#${RELOCOFF}))`
540			FUNCADDR=$((FUNCADDR-RELOCOFF))
541			FUNCADDR=$(echo "obase=16;${FUNCADDR}"|bc | tr '[A-Z]' '[a-z]')
542		fi
543
544		echo
545		sed -n "/${FUNCADDR}/p" ${SYM}
546		${TOOLCHAIN_ADDR2LINE} -e ${ELF} ${FUNCADDR}
547		exit 0
548	fi
549}
550
551function pack_idblock()
552{
553	INI=${INI_LOADER}
554	if [ ! -f ${INI} ]; then
555		echo "ERROR: No ${INI}"
556		exit 1
557	fi
558
559	# chip
560	COMMON_H=`grep "_common.h:" include/autoconf.mk.dep | awk -F "/" '{ printf $3 }'`
561	PLAT=${COMMON_H%_*}
562
563	# file
564	SPL_BIN=${RKBIN}/`sed -n "/FlashBoot=/s/FlashBoot=//p" ${INI} | tr -d '\r'`
565	TPL_BIN=${RKBIN}/`sed -n "/FlashData=/s/FlashData=//p" ${INI} | tr -d '\r'`
566	if [ ! -z "${ARG_SPL_BIN}" ]; then
567		SPL_BIN=${ARG_SPL_BIN}
568	fi
569	if [ ! -z "${ARG_TPL_BIN}" ]; then
570		TPL_BIN=${ARG_TPL_BIN}
571	fi
572
573	# pack
574	rm idblock.bin -f
575	./tools/mkimage -n ${PLAT} -T rksd -d ${TPL_BIN}:${SPL_BIN} idblock.bin
576	echo "Input:"
577	echo "    ${INI}"
578	echo "    ${TPL_BIN}"
579	echo "    ${SPL_BIN}"
580	echo
581	echo "Pack ${PLAT} idblock.bin okay!"
582	echo
583}
584
585function pack_uboot_itb_image()
586{
587	INI=${INI_TRUST}
588	if [ ! -f ${INI} ]; then
589		echo "ERROR: No ${INI}"
590		exit 1
591	fi
592
593	if [ "${ARM64_TRUSTZONE}" == "y" ]; then
594		BL31_ELF=`sed -n '/_bl31_/s/PATH=//p' ${INI} | tr -d '\r'`
595		cp ${RKBIN}/${BL31_ELF} bl31.elf
596		make CROSS_COMPILE=${TOOLCHAIN_GCC} u-boot.itb
597		echo "pack u-boot.itb okay! Input: ${INI}"
598	else
599		# TOS
600		TOS=`sed -n "/TOS=/s/TOS=//p" ${INI} | tr -d '\r'`
601		TOSTA=`sed -n "/TOSTA=/s/TOSTA=//p" ${INI} | tr -d '\r'`
602		if [ ! -z "${TOSTA}" ]; then
603			cp ${RKBIN}/${TOSTA} tee.bin
604		elif [ ! -z "${TOS}" ]; then
605			cp ${RKBIN}/${TOS}   tee.bin
606		else
607			echo "ERROR: No tee bin"
608			exit 1
609		fi
610
611		TEE_OFFSET=`sed -n "/ADDR=/s/ADDR=//p" ${INI} | tr -d '\r'`
612		if [ "${TEE_OFFSET}" == "" ]; then
613			TEE_OFFSET=0x8400000
614		fi
615
616		# MCU
617		MCU_ENABLED=`awk -F"," '/MCU=/ { printf $3 }' ${INI} | tr -d ' '`
618		if [ "${MCU_ENABLED}" == "enabled" -o "${MCU_ENABLED}" == "okay" ]; then
619			MCU=`awk -F"," '/MCU=/  { printf $1 }' ${INI} | tr -d ' ' | cut -c 5-`
620			cp ${RKBIN}/${MCU} mcu.bin
621			MCU_OFFSET=`awk -F"," '/MCU=/ { printf $2 }' ${INI} | tr -d ' '`
622		fi
623
624		COMPRESSION=`awk -F"," '/COMPRESSION=/  { printf $1 }' ${INI} | tr -d ' ' | cut -c 13-`
625		if [ -z "${COMPRESSION}" ]; then
626			COMPRESSION="none"
627		fi
628
629		# its
630		SPL_FIT_SOURCE=`sed -n "/CONFIG_SPL_FIT_SOURCE=/s/CONFIG_SPL_FIT_SOURCE=//p" .config | tr -d '""'`
631		if [ ! -z ${SPL_FIT_SOURCE} ]; then
632			cp ${SPL_FIT_SOURCE} u-boot.its
633		else
634			SPL_FIT_GENERATOR=`sed -n "/CONFIG_SPL_FIT_GENERATOR=/s/CONFIG_SPL_FIT_GENERATOR=//p" .config | tr -d '""'`
635			if [ ! -z ${MCU_OFFSET} ]; then
636				${SPL_FIT_GENERATOR} -u -t ${TEE_OFFSET} -c ${COMPRESSION} -m ${MCU_OFFSET} > u-boot.its
637			else
638				${SPL_FIT_GENERATOR} -u -t ${TEE_OFFSET} -c ${COMPRESSION} > u-boot.its
639			fi
640		fi
641
642		./tools/mkimage -f u-boot.its -E u-boot.itb
643		echo "pack u-boot.itb okay! Input: ${INI}"
644	fi
645	echo
646}
647
648function pack_spl_loader_image()
649{
650	rm *_loader_*.bin -f
651	cd ${RKBIN}
652	if [ ! -z "${ARG_SPL_BIN}" -a ! -z "${ARG_TPL_BIN}" ]; then
653		${SCRIPT_SPL} --ini ${INI_LOADER} --tpl ${SRCTREE}/${ARG_TPL_BIN} --spl ${SRCTREE}/${ARG_SPL_BIN}
654	elif [ ! -z "${ARG_TPL_BIN}" ]; then
655		${SCRIPT_SPL} --ini ${INI_LOADER} --tpl ${SRCTREE}/${ARG_TPL_BIN}
656	else
657		${SCRIPT_SPL} --ini ${INI_LOADER} --spl ${SRCTREE}/${ARG_SPL_BIN}
658	fi
659	cd -
660	if [ -f ${RKBIN}/*_loader_*.bin ]; then
661		mv ${RKBIN}/*_loader_*.bin ./
662	fi
663}
664
665function pack_uboot_image()
666{
667	rm u-boot.img u-boot-dtb.img -f
668	LOAD_ADDR=`sed -n "/CONFIG_SYS_TEXT_BASE=/s/CONFIG_SYS_TEXT_BASE=//p" include/autoconf.mk|tr -d '\r'`
669	${SCRIPT_UBOOT} --load ${LOAD_ADDR} ${PLAT_UBOOT_SIZE}
670}
671
672function pack_loader_image()
673{
674	rm *_loader_*.bin -f
675	cd ${RKBIN}
676	${SCRIPT_LOADER} --ini ${INI_LOADER}
677	cd -
678	if [ -f ${RKBIN}/*_loader_*.bin ]; then
679		mv ${RKBIN}/*_loader_*.bin ./
680	fi
681}
682
683function pack_trust_image()
684{
685	DRAM_BASE=`sed -n "/CONFIG_SYS_SDRAM_BASE=/s/CONFIG_SYS_SDRAM_BASE=//p" include/autoconf.mk|tr -d '\r'`
686
687	rm trust*.img -f
688	cd ${RKBIN}
689	if [ "${ARM64_TRUSTZONE}" == "y" ]; then
690		${SCRIPT_ATF} --ini ${INI_TRUST} ${PLAT_SHA} ${PLAT_RSA} ${PLAT_TRUST_SIZE}
691	else
692		${SCRIPT_TOS} --ini ${INI_TRUST} --base ${DRAM_BASE} ${PLAT_TRUST_SIZE}
693	fi
694	cd -
695	if [ -f ${RKBIN}/trust*.img ]; then
696		mv ${RKBIN}/trust*.img ./
697	fi
698}
699
700function pack_fit_image()
701{
702	# If we don't plan to have uboot in uboot.img in case of: SPL => Trust => Kernel, creating empty files.
703	if [ "${ARG_NO_UBOOT}" == "y" ]; then
704		rm u-boot-nodtb.bin u-boot.dtb -f
705		touch u-boot-nodtb.bin u-boot.dtb
706	fi
707
708	# Verified boot=1:  must build both uboot.img and boot.img
709	# Verified boot=0:  build uboot.img
710	if grep -q '^CONFIG_FIT_SIGNATURE=y' .config ; then
711		./scripts/fit-mkimg.sh --uboot-itb --boot-itb ${ARG_LIST_FIT}
712	else
713		rm uboot.img trust*.img -f
714		./scripts/fit-mkimg.sh --uboot-itb --no-vboot --no-rebuild ${ARG_LIST_FIT}
715		echo "pack uboot.img okay! Input: ${INI_TRUST}"
716	fi
717}
718
719function handle_args_late()
720{
721	ARG_LIST_FIT="${ARG_LIST_FIT} --ini-trust ${INI_TRUST} --ini-loader ${INI_LOADER}"
722}
723
724function clean_files()
725{
726	rm spl/u-boot-spl.dtb tpl/u-boot-tpl.dtb u-boot.dtb -f
727	rm spl/u-boot-spl tpl/u-boot-tpl u-boot -f
728}
729
730function pack_images()
731{
732	if [ "${ARG_NO_PACK}" == "y" ]; then
733		return
734	fi
735
736	if [ "${PLAT_TYPE}" == "RKFW" ]; then
737		pack_uboot_image
738		pack_trust_image
739		pack_loader_image
740	elif [ "${PLAT_TYPE}" == "FIT" ]; then
741		pack_fit_image ${ARG_LIST_FIT}
742	fi
743}
744
745function finish()
746{
747	echo
748	if [ "${ARG_BOARD}" == "" ]; then
749		echo "Platform ${RKCHIP_LABEL} is build OK, with exist .config"
750	else
751		echo "Platform ${RKCHIP_LABEL} is build OK, with new .config(${MAKE_CMD})"
752	fi
753}
754
755process_args $*
756prepare
757select_toolchain
758select_chip_info
759fixup_platform_configure
760select_ini_file
761handle_args_late
762sub_commands
763clean_files
764make CROSS_COMPILE=${TOOLCHAIN_GCC} all --jobs=${JOB}
765pack_images
766finish
767