• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2#
3# Copyright (c) 2022 iSoftStone Device Co., Ltd.
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7
8   # http://www.apache.org/licenses/LICENSE-2.0
9
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16
17function pack_error()
18{
19	echo -e "\033[47;31mERROR: $*\033[0m"
20}
21
22function pack_warn()
23{
24	echo -e "\033[47;34mWARN: $*\033[0m"
25}
26
27function pack_info()
28{
29	echo -e "\033[47;30mINFO: $*\033[0m"
30}
31
32localpath=$(cd $(dirname $0) && pwd)
33
34PACK_CHIP=${LICHEE_CHIP}
35PACK_IC=${LICHEE_IC}
36PACK_PLATFORM=${LICHEE_PLATFORM}
37PACK_PLATFORM_VERSION=
38PACK_BOARD=${LICHEE_BOARD}
39PACK_KERN=${LICHEE_KERN_VER}
40PACK_DEBUG=uart0
41PACK_SIG=none
42PACK_SECURE=none
43PACK_MODE=normal
44PACK_FUNC=android
45PACK_VSP=
46PACK_PROGRAMMER=
47PACK_NOR=
48PACK_PRODUCT=
49PACK_VERITY=1
50PACK_SIGNFEL=1
51PACK_ADD_FILES=
52PACK_FEX_PATH=${LICHEE_CHIP_CONFIG_DIR}/fex
53
54
55CFG_TOP_DIR=$(cd $localpath/../../../../../ && pwd)
56CFG_PLAT_OUT=$CFG_TOP_DIR/out/$PACK_IC/$PACK_BOARD/$PACK_PLATFORM
57CFG_KEY_DIR=$CFG_TOP_DIR/out/$PACK_IC/common/keys
58
59
60if [ -z "${PACK_KERN}" ]; then
61	pack_info "No kernel param, parse it from .buildconfig"
62	PACK_KERN=$LICHEE_KERN_VER
63	if [ -z "${PACK_KERN}" ]; then
64		pack_error "Failed to parse kernel param from .buildconfig"
65		exit 1
66	fi
67fi
68
69PACK_TYPE="linux"
70OTA_TEST_NAME="ota_test"
71
72export PATH=${LICHEE_TOOLS_DIR}/pack/mod_update:${LICHEE_TOOLS_DIR}/pack/openssl:${LICHEE_TOOLS_DIR}/pack/eDragonEx:${LICHEE_TOOLS_DIR}/pack/fsbuild200:${LICHEE_TOOLS_DIR}/pack/android:$PATH
73
74possible_bin_path=(
75bin
76${LICHEE_BUSSINESS}/bin
77configs/${PACK_BOARD}/bin
78configs/${PACK_BOARD}/${LICHEE_BUSSINESS}/bin
79configs/${PACK_BOARD}/${PACK_PLATFORM}/bin
80configs/${PACK_BOARD}/${PACK_PLATFORM}/${LICHEE_BUSSINESS}/bin
81)
82
83BIN_PATH=""
84for d in ${possible_bin_path[@]}; do
85	[ -d ${LICHEE_CHIP_CONFIG_DIR}/$d ] && BIN_PATH=$d && break
86done
87
88[ -z "${BIN_PATH}" ] &&
89pack_error "No BIN_PATH found!" && exit 1
90
91pack_info "Use BIN_PATH: ${LICHEE_CHIP_CONFIG_DIR}/$BIN_PATH"
92
93
94
95fex_file_list=(
96${PACK_FEX_PATH}/aultls32.fex
97${PACK_FEX_PATH}/aultools.fex
98${PACK_FEX_PATH}/cardscript.fex
99${PACK_FEX_PATH}/cardscript_secure.fex
100${PACK_FEX_PATH}/cardtool.fex
101${PACK_FEX_PATH}/split_xxxx.fex
102${PACK_FEX_PATH}/usbtool.fex
103${PACK_FEX_PATH}/usbtool_crash.fex
104${PACK_FEX_PATH}/usbtool_test.fex
105)
106
107configs_file_list=(
108${PACK_FEX_PATH}/toc1.fex
109${PACK_FEX_PATH}/toc0.fex
110${LICHEE_CHIP_CONFIG_DIR}/configs/default/*
111${LICHEE_CHIP_CONFIG_DIR}/configs/${PACK_BOARD}/*.fex
112${LICHEE_CHIP_CONFIG_DIR}/configs/default/version_base.mk
113${LICHEE_CHIP_CONFIG_DIR}/dtbo/*
114${LICHEE_BOARD_CONFIG_DIR}/dtbo/*
115)
116
117product_configs_file_list=(
118${LICHEE_CHIP_CONFIG_DIR}/configs/${PACK_BOARD}/${PACK_PLATFORM}/*.fex
119${LICHEE_CHIP_CONFIG_DIR}/configs/${PACK_BOARD}/${PACK_PLATFORM}/*.cfg
120)
121
122boot_resource_list=(
123${LICHEE_CHIP_CONFIG_DIR}/boot-resource/boot-resource:${LICHEE_PACK_OUT_DIR}
124${LICHEE_CHIP_CONFIG_DIR}/boot-resource/boot-resource.ini:${LICHEE_PACK_OUT_DIR}
125${LICHEE_CHIP_CONFIG_DIR}/configs/${PACK_BOARD}/*.bmp:${LICHEE_PACK_OUT_DIR}/boot-resource/
126${LICHEE_CHIP_CONFIG_DIR}/configs/${PACK_BOARD}/bootlogo.bmp:${LICHEE_PACK_OUT_DIR}/bootlogo.bmp
127${LICHEE_CHIP_CONFIG_DIR}/configs/${PACK_BOARD}/${PACK_TYPE}/*.bmp:${LICHEE_PACK_OUT_DIR}/boot-resource/
128${LICHEE_CHIP_CONFIG_DIR}/configs/${PACK_BOARD}/${PACK_PLATFORM}/bootlogo.bmp:${LICHEE_PACK_OUT_DIR}/boot-resource/bootlogo.bmp
129${LICHEE_CHIP_CONFIG_DIR}/boot-resource/boot-resource/bat/bempty.bmp:${LICHEE_PACK_OUT_DIR}/bempty.bmp
130${LICHEE_CHIP_CONFIG_DIR}/boot-resource/boot-resource/bat/battery_charge.bmp:${LICHEE_PACK_OUT_DIR}/battery_charge.bmp
131)
132
133boot_file_list=(
134${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/boot0_nand_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/boot0_nand.fex
135${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/boot0_sdcard_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/boot0_sdcard.fex
136${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/boot0_spinor_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/boot0_spinor.fex
137${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/fes1_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/fes1.fex
138${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/u-boot-${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/u-boot.fex
139${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/u-boot-crashdump-${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/u-boot-crash.fex
140${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/u-boot-crashdump-spinor-${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/u-boot-spinor-crash.fex
141${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/bl31.bin:${LICHEE_PACK_OUT_DIR}/monitor.fex
142${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/bl31_${PACK_BOARD}.bin:${LICHEE_PACK_OUT_DIR}/monitor.fex
143${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/scp.bin:${LICHEE_PACK_OUT_DIR}/scp.fex
144${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/dsp0.bin:${LICHEE_PACK_OUT_DIR}/dsp0.fex
145${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/dsp1.bin:${LICHEE_PACK_OUT_DIR}/dsp1.fex
146${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/optee_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/optee.fex
147${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/u-boot-spinor-${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/u-boot-spinor.fex
148${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/u-boot-${PACK_CHIP}-${OTA_TEST_NAME}.bin:${LICHEE_PACK_OUT_DIR}/u-boot-${OTA_TEST_NAME}.fex
149)
150
151boot_file_list_2=(
152${LICHEE_PLAT_OUT}/boot0_nand_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/boot0_nand.fex
153${LICHEE_PLAT_OUT}/boot0_sdcard_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/boot0_sdcard.fex
154${LICHEE_PLAT_OUT}/boot0_spinor_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/boot0_spinor.fex
155${LICHEE_PLAT_OUT}/fes1_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/fes1.fex
156${LICHEE_PLAT_OUT}/sboot_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/sboot.bin
157${LICHEE_PLAT_OUT}/u-boot-${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/u-boot.fex
158${LICHEE_PLAT_OUT}/u-boot-crashdump-${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/u-boot-crash.fex
159${LICHEE_PLAT_OUT}/u-boot-crashdump-spinor-${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/u-boot-spinor-crash.fex
160${LICHEE_PLAT_OUT}/u-boot-spinor-${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/u-boot-spinor.fex
161${LICHEE_PLAT_OUT}/sboot_${PACK_CHIP}-${OTA_TEST_NAME}.bin:${LICHEE_PACK_OUT_DIR}/sboot-${OTA_TEST_NAME}.bin
162${LICHEE_PLAT_OUT}/u-boot-${PACK_CHIP}-${OTA_TEST_NAME}.bin:${LICHEE_PACK_OUT_DIR}/u-boot-${OTA_TEST_NAME}.fex
163${LICHEE_PLAT_OUT}/u-boot-spinor-${PACK_CHIP}-${OTA_TEST_NAME}.bin:${LICHEE_PACK_OUT_DIR}/u-boot-spinor-${OTA_TEST_NAME}.fex
164)
165
166boot_file_secure=(
167${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/semelis_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/semelis.bin
168${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/optee_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/optee.bin
169${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/sboot_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/sboot.bin
170${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/sboot_${PACK_CHIP}-${OTA_TEST_NAME}.bin:${LICHEE_PACK_OUT_DIR}/sboot-${OTA_TEST_NAME}.bin
171)
172
173a64_boot_file_secure=(
174${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/optee_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/optee.fex
175${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/sboot_${PACK_CHIP}.bin:${LICHEE_PACK_OUT_DIR}/sboot.bin
176# ${LICHEE_CHIP_CONFIG_DIR}/${BIN_PATH}/sboot_${PACK_CHIP}-${OTA_TEST_NAME}.bin:pack_out/sboot-${OTA_TEST_NAME}.bin
177)
178
179#
180# This function can get the realpath between $SRC and $DST
181#
182function get_realpath()
183{
184	local src=$(cd $1; pwd);
185	local dst=$(cd $2; pwd);
186	local res="./";
187	local tmp="$dst"
188
189	while [ "${src##*$tmp}" == "${src}" ]; do
190		tmp=${tmp%/*};
191		res=$res"../"
192	done
193	res="$res${src#*$tmp/}"
194
195	printf "%s" $res
196}
197
198function show_boards()
199{
200	printf "\nAll avaiable chips, platforms and boards:\n\n"
201	printf "Chip            Board\n"
202	for chipdir in $(find chips/ -mindepth 1 -maxdepth 1 -type d) ; do
203		chip=`basename ${chipdir}`
204		printf "${chip}\n"
205		for boarddir in $(find chips/${chip}/configs/${platform} \
206			-mindepth 1 -maxdepth 1 -type d) ; do
207			board=`basename ${boarddir}`
208			printf "                ${board}\n"
209		done
210	done
211	printf "\nFor Usage:\n"
212	printf "     $(basename $0) -h\n\n"
213}
214
215function uart_switch()
216{
217	rm -rf ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
218	touch ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
219	TX=`awk  '$0~"'$PACK_CHIP'"{print $2}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_pin`
220	RX=`awk  '$0~"'$PACK_CHIP'"{print $3}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_pin`
221	PORT=`awk  '$0~"'$PACK_CHIP'"{print $4}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_pin`
222	MS=`awk  '$0~"'$PACK_CHIP'"{print $5}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_pin`
223	CK=`awk  '$0~"'$PACK_CHIP'"{print $6}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_pin`
224	DO=`awk  '$0~"'$PACK_CHIP'"{print $7}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_pin`
225	DI=`awk  '$0~"'$PACK_CHIP'"{print $8}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_pin`
226
227	BOOT_UART_ST=`awk  '$0~"'$PACK_CHIP'"{print $2}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
228	BOOT_PORT_ST=`awk  '$0~"'$PACK_CHIP'"{print $3}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
229	BOOT_TX_ST=`awk  '$0~"'$PACK_CHIP'"{print $4}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
230	BOOT_RX_ST=`awk  '$0~"'$PACK_CHIP'"{print $5}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
231	UART0_ST=`awk  '$0~"'$PACK_CHIP'"{print $6}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
232	UART0_USED_ST=`awk  '$0~"'$PACK_CHIP'"{print $7}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
233	UART0_PORT_ST=`awk  '$0~"'$PACK_CHIP'"{print $8}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
234	UART0_TX_ST=`awk  '$0~"'$PACK_CHIP'"{print $9}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
235	UART0_RX_ST=`awk  '$0~"'$PACK_CHIP'"{print $10}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
236	UART1_ST=`awk  '$0~"'$PACK_CHIP'"{print $11}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
237	JTAG_ST=`awk  '$0~"'$PACK_CHIP'"{print $12}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
238	MS_ST=`awk  '$0~"'$PACK_CHIP'"{print $13}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
239	CK_ST=`awk  '$0~"'$PACK_CHIP'"{print $14}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
240	DO_ST=`awk  '$0~"'$PACK_CHIP'"{print $15}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
241	DI_ST=`awk  '$0~"'$PACK_CHIP'"{print $16}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
242	MMC0_ST=`awk  '$0~"'$PACK_CHIP'"{print $17}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
243	MMC0_USED_ST=`awk  '$0~"'$PACK_CHIP'"{print $18}' ${LICHEE_COMMON_CONFIG_DIR}/debug/card_debug_string`
244
245	if [ -z "$TX" ] || [ -z "$BOOT_UART_ST" ]; then
246		pack_error "$FUNCNAME: $PACK_CHIP not configured in card_debug_pin/card_debug_string!"
247		exit 1
248	fi
249
250	echo '$0!~";" && $0~"'$BOOT_TX_ST'"{if(C)$0="'$BOOT_TX_ST' = '$TX'"} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
251	echo '$0!~";" && $0~"'$BOOT_RX_ST'"{if(C)$0="'$BOOT_RX_ST' = '$RX'"} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
252	echo '$0!~";" && $0~"'$BOOT_PORT_ST'"{if(C)$0="'$BOOT_PORT_ST' = '$PORT'"} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
253	if [ "`grep "auto_print_used" "${LICHEE_PACK_OUT_DIR}/sys_config.fex" | grep "1"`" ]; then
254		echo '$0!~";" && $0~"'$MMC0_USED_ST'"{if(A)$0="'$MMC0_USED_ST' = 1";A=0} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
255	else
256	echo '$0!~";" && $0~"'$MMC0_USED_ST'"{if(A)$0="'$MMC0_USED_ST' = 0";A=0} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
257	fi
258	echo '$0!~";" && $0~"\\['$MMC0_ST'\\]"{A=1}  \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
259	echo '$0!~";" && $0~"'$UART0_TX_ST'"{if(B)$0="'$UART0_TX_ST' = '$TX'"} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
260	echo '$0!~";" && $0~"'$UART0_RX_ST'"{if(B)$0="'$UART0_RX_ST' = '$RX'"} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
261	echo '$0!~";" && $0~"\\['$UART0_ST'\\]"{B=1} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
262	echo '$0!~";" && $0~"'$UART0_USED_ST'"{if(B)$0="'$UART0_USED_ST' = 1"}  \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
263	echo '/^'$UART0_PORT_ST'/{next} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
264	echo '$0!~";" && $0~"\\['$UART1_ST'\\]"{B=0} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
265	echo '$0!~";" && $0~"\\['$BOOT_UART_ST'\\]"{C=1} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
266	echo '$0!~";" && $0~"\\['$JTAG_ST'\\]"{C=0} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
267	echo '$0!~";" && $0~"'$MS_ST'"{$0="'$MS_ST' = '$MS'"} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
268	echo '$0!~";" && $0~"'$CK_ST'"{$0="'$CK_ST' = '$CK'"} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
269	echo '$0!~";" && $0~"'$DO_ST'"{$0="'$DO_ST' = '$DO'"} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
270	echo '$0!~";" && $0~"'$DI_ST'"{$0="'$DI_ST' = '$DI'"} \' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
271	echo '1' >> ${LICHEE_PACK_OUT_DIR}/awk_debug_card0
272
273	if [ "`grep "auto_print_used" "${LICHEE_PACK_OUT_DIR}/sys_config.fex" | grep "1"`" ]; then
274		sed -i -e '/^uart0_rx/a\pinctrl-1=' ${LICHEE_PACK_OUT_DIR}/sys_config.fex
275		sed -i -e '/^uart0_rx/a\pinctrl-0=' ${LICHEE_PACK_OUT_DIR}/sys_config.fex
276	fi
277
278	awk -f ${LICHEE_PACK_OUT_DIR}/awk_debug_card0 ${LICHEE_PACK_OUT_DIR}/sys_config.fex > ${LICHEE_PACK_OUT_DIR}/sys_config_debug.fex
279	rm -f ${LICHEE_PACK_OUT_DIR}/sys_config.fex
280	mv ${LICHEE_PACK_OUT_DIR}/sys_config_debug.fex ${LICHEE_PACK_OUT_DIR}/sys_config.fex
281	echo "uart -> card0"
282}
283
284function add_lzma_header()
285{
286	lzma_file=$1
287	original_file=$2
288	file_size=$(printf "%.8x\n" `stat -c%s ${lzma_file}`)
289	original_file_size=$(printf "%.8x\n" `stat -c%s ${original_file}`)
290
291	bin_str=""
292
293	file_size_len=${#file_size}
294
295	#"LZMA"+size+origin_size
296	bin_str="\x4c\x5a\x4d\x41\x${file_size:6:2}\x${file_size:4:2}\x${file_size:2:2}\x${file_size:0:2}"
297	bin_str+="\x${original_file_size:6:2}\x${original_file_size:4:2}\x${original_file_size:2:2}\x${original_file_size:0:2}"
298
299
300	printf "%b" ${bin_str} > tempbin
301
302	cat ${lzma_file} >> tempbin
303
304	mv tempbin "${lzma_file}.head"
305}
306
307function do_prepare()
308{
309	if [ -z "${PACK_CHIP}" -o -z "${PACK_TYPE}" -o -z "${PACK_BOARD}" ] ; then
310		pack_error "Invalid parameters Chip: ${PACK_CHIP}, \
311			Platform: ${PACK_TYPE}, Board: ${PACK_BOARD}"
312		show_boards
313		exit 1
314	fi
315
316	if [ ! -d ${LICHEE_CHIP_CONFIG_DIR}/configs/${PACK_BOARD} ] ; then
317		pack_error "Board's directory \
318			\"${LICHEE_CHIP_CONFIG_DIR}/configs/${PACK_BOARD}\" is not exist."
319		show_boards
320		exit 1
321	fi
322
323	# Cleanup
324	if [ "x" != "x${LICHEE_PACK_OUT_DIR}" ]; then
325		rm -rf ${LICHEE_PACK_OUT_DIR}
326	fi
327	mkdir -p ${LICHEE_PACK_OUT_DIR}
328
329	printf "copying fex file\n"
330	for file in ${fex_file_list[@]} ; do
331		cp -f $file ${LICHEE_PACK_OUT_DIR} 2> /dev/null
332	done
333
334	printf "copying configs file\n"
335	for file in ${configs_file_list[@]} ; do
336		cp -f $file ${LICHEE_PACK_OUT_DIR} 2> /dev/null
337	done
338
339	printf "copying product configs file\n"
340	for file in ${product_configs_file_list[@]}; do
341		cp -f $file ${LICHEE_PACK_OUT_DIR} 2>/dev/null
342	done
343
344	# If platform config files exist, we will cover the default files
345	# For example, mv pack_out/image_linux.cfg pack_out/image.cfg
346	if [ ${PACK_PLATFORM} != "android" ]; then
347		cp -f ${LICHEE_BOARD_CONFIG_DIR}/${PACK_PLATFORM}/* ${LICHEE_PACK_OUT_DIR} 2> /dev/null
348		if [ ${PACK_PLATFORM} = "bsp" -o "x${PACK_PLATFORM}" = "xsata" ] ; then
349			find ${LICHEE_PACK_OUT_DIR}/* -type f -a \( -name "*.fex" -o -name "*.cfg" \) -print | \
350			sed "s#\(.*\)_linux\(\..*\)#mv -fv & \1\2#e"
351		else
352			find ${LICHEE_PACK_OUT_DIR}/* -type f -a \( -name "*.fex" -o -name "*.cfg" \) -print | \
353			sed "s#\(.*\)_${PACK_PLATFORM}\(\..*\)#mv -fv & \1\2#e"
354		fi
355	else
356		find ${LICHEE_PACK_OUT_DIR}/* -type f -a \( -name "*.fex" -o -name "*.cfg" \) -print | \
357			sed "s#\(.*\)_${PACK_TYPE}\(\..*\)#mv -fv & \1\2#e"
358	fi
359
360	if [ "x${PACK_NOR}" = "xnor" ] ; then
361		cp -vf ${LICHEE_PACK_OUT_DIR}/image_nor.cfg ${LICHEE_PACK_OUT_DIR}/image.cfg
362	fi
363
364	if [ "x${PACK_MODE}" = "xdump" ] ; then
365		cp -vf ${LICHEE_PACK_OUT_DIR}/sys_partition_dump.fex ${LICHEE_PACK_OUT_DIR}/sys_partition.fex
366		cp -vf ${LICHEE_PACK_OUT_DIR}/usbtool_test.fex ${LICHEE_PACK_OUT_DIR}/usbtool.fex
367	elif [ "x${PACK_FUNC}" = "xprvt" ] ; then
368		cp -vf ${LICHEE_PACK_OUT_DIR}/sys_partition_private.fex ${LICHEE_PACK_OUT_DIR}/sys_partition.fex
369	fi
370
371	printf "copying boot resource\n"
372	for file in ${boot_resource_list[@]} ; do
373		cp -rf $(echo $file | sed -e 's/:/ /g') 2>/dev/null
374	done
375
376	if [ ! -f ${LICHEE_PACK_OUT_DIR}/bootlogo.bmp ]; then
377		cp ${LICHEE_PACK_OUT_DIR}/boot-resource/bootlogo.bmp ${LICHEE_PACK_OUT_DIR}/bootlogo.bmp
378	fi
379
380	lzma -k ${LICHEE_PACK_OUT_DIR}/bootlogo.bmp
381	lzma -k ${LICHEE_PACK_OUT_DIR}/bempty.bmp
382	lzma -k ${LICHEE_PACK_OUT_DIR}/battery_charge.bmp
383
384	if [ -f ${LICHEE_PACK_OUT_DIR}/bootlogo.bmp.lzma ]; then
385		add_lzma_header "${LICHEE_PACK_OUT_DIR}/bootlogo.bmp.lzma" "${LICHEE_PACK_OUT_DIR}/bootlogo.bmp"
386		(cd ${LICHEE_PACK_OUT_DIR}; ln -sf bootlogo.bmp.lzma.head  bootlogo.fex)
387	fi
388
389	printf "copying boot file\n"
390	for d in ${possible_bin_path[@]}; do
391		[ ! -d ${LICHEE_CHIP_CONFIG_DIR}/$d ] && continue
392		BIN_PATH=$d
393		for file in ${boot_file_list[@]} ; do
394			eval cp -v -f $(echo $file | sed -e 's/:/ /g') 2>/dev/null
395		done
396	done
397	printf "copying boot file 2.0\n"
398	for file in ${boot_file_list_2[@]} ; do
399		eval cp -v -f $(echo $file | sed -e 's/:/ /g') 2>/dev/null
400	done
401
402	[ -z "${BIN_PATH}" ] &&
403	pack_error "No BIN_PATH found!" && exit 1
404
405
406	if [ "x${LICHEE_ARCH}" != "xarm64" ] ; then
407		if [ "x${PACK_SECURE}" = "xsecure" -o "x${PACK_SIG}" = "xsecure" -o  "x${PACK_SIG}" = "xprev_refurbish" ] ; then
408			printf "copying secure boot file\n"
409			for file in ${boot_file_secure[@]} ; do
410				cp -f $(echo $file | sed -e 's/:/ /g') 2>/dev/null
411			done
412		fi
413	else
414		if [ "x${PACK_SECURE}" = "xsecure" -o "x${PACK_SIG}" = "xsecure" -o  "x${PACK_SIG}" = "xprev_refurbish" ] ; then
415			printf "copying arm64 secure boot file\n"
416			for file in ${a64_boot_file_secure[@]} ; do
417				cp -f $(echo $file | sed -e 's/:/ /g') 2>/dev/null
418			done
419		fi
420	fi
421
422	# If platform config use
423	if [ -f ${LICHEE_CHIP_CONFIG_DIR}/tools/plat_config.sh ] ; then
424		${LICHEE_CHIP_CONFIG_DIR}/tools/plat_config.sh
425	fi
426
427	if [ "x${PACK_SECURE}" = "xsecure"  -o "x${PACK_SIG}" = "xsecure" ] ; then
428		printf "add burn_secure_mode in target in sys config\n"
429		sed -i -e '/^\[target\]/a\burn_secure_mode=1' ${LICHEE_PACK_OUT_DIR}/sys_config.fex
430		sed -i -e '/^\[platform\]/a\secure_without_OS=0' ${LICHEE_PACK_OUT_DIR}/sys_config.fex
431	elif [ "x${PACK_SIG}" = "xprev_refurbish" ] ; then
432		printf "add burn_secure_mode in target in sys config\n"
433		sed -i -e '/^\[target\]/a\burn_secure_mode=1' ${LICHEE_PACK_OUT_DIR}/sys_config.fex
434		sed -i -e '/^\[platform\]/a\secure_without_OS=1' ${LICHEE_PACK_OUT_DIR}/sys_config.fex
435	else
436		sed -i '/^burn_secure_mod/d' ${LICHEE_PACK_OUT_DIR}/sys_config.fex
437		sed -i '/^secure_without_OS/d' ${LICHEE_PACK_OUT_DIR}/sys_config.fex
438	fi
439
440	if [ "x${PACK_VSP}" = "xvsp" ] ; then
441		printf "change usb_port_type to device...\n"
442		printf "disable usb_serial_unique...\n"
443		printf "change usb_serial_number to ${PACK_TYPE}_android...\n"
444		sed -i 's/^usb_port_type.*/usb_port_type = 0/g' ${LICHEE_PACK_OUT_DIR}/sys_config.fex
445		sed -i 's/^usb_serial_unique.*/usb_serial_unique = 0/g' ${LICHEE_PACK_OUT_DIR}/sys_config.fex
446		sed -i 's/^usb_serial_number.*/usb_serial_number = "'"${PACK_CHIP}"'_android"/g' ${LICHEE_PACK_OUT_DIR}/sys_config.fex
447	fi
448
449	printf "copying additional files\n"
450	for file in ${PACK_ADD_FILES[@]}; do
451		cp -f $(echo $file | sed -e 's/:/ /g') 2>/dev/null
452	done
453
454	if [ "x${PACK_PROGRAMMER}" = "xprogrammer" ]; then
455		printf "add programmer img info target in sys config\n"
456		sed -i -e '/^\[target\]/a\programmer=1' ${LICHEE_PACK_OUT_DIR}/sys_config.fex
457	fi
458
459	# Here, we can switch uart to card or normal
460	if [ "x${PACK_DEBUG}" = "xcard0" -a "x${PACK_MODE}" != "xdump" \
461		-a "x${PACK_FUNC}" != "xprvt" ] ; then \
462		uart_switch
463	else
464		sed -i -e '/^auto_print_used/s\1\0\' ${LICHEE_PACK_OUT_DIR}/sys_config.fex
465	fi
466
467	sed -i 's/\\boot-resource/\/boot-resource/g' ${LICHEE_PACK_OUT_DIR}/boot-resource.ini
468	sed -i 's/\\\\/\//g' ${LICHEE_PACK_OUT_DIR}/image.cfg
469	sed -i 's/^imagename/;imagename/g' ${LICHEE_PACK_OUT_DIR}/image.cfg
470
471	IMG_NAME="${PACK_IC}_${PACK_TYPE}${PACK_PLATFORM_VERSION}_${PACK_BOARD}_${PACK_DEBUG}"
472
473	if [ "x${PACK_SIG}" != "xnone" ]; then
474		IMG_NAME="${IMG_NAME}_${PACK_SIG}"
475	fi
476
477	if [ "x${PACK_MODE}" = "xdump" -o "x${PACK_MODE}" = "xota_test" ] ; then
478		IMG_NAME="${IMG_NAME}_${PACK_MODE}"
479	fi
480
481	if [ "x${PACK_FUNC}" = "xprvt" ] ; then
482		IMG_NAME="${IMG_NAME}_${PACK_FUNC}"
483	fi
484
485	if [ "x${PACK_SECURE}" = "xsecure" ] ; then
486		IMG_NAME="${IMG_NAME}_${PACK_SECURE}"
487	fi
488
489	if [ "x${PACK_FUNC}" = "xprev_refurbish" ] ; then
490		IMG_NAME="${IMG_NAME}_${PACK_FUNC}"
491	fi
492
493	if [ "x${PACK_NOR}" = "xnor" ] ; then
494		IMG_NAME="${IMG_NAME}_${PACK_NOR}"
495	fi
496
497	IMG_PROGRAMMER_NAME="${IMG_NAME}_programmer.img"
498
499	if [ "x${PACK_SECURE}" != "xnone" -o "x${PACK_SIG}" != "xnone" ]; then
500		MAIN_VERION="$(echo '__unique:;@echo ${MAIN_VERSION}' | make -f - -f ${LICHEE_PACK_OUT_DIR}/version_base.mk --no-print-directory __unique)"
501
502		IMG_NAME="${IMG_NAME}_v${MAIN_VERION}.img"
503	else
504		IMG_NAME="${IMG_NAME}.img"
505	fi
506
507	echo "imagename = $IMG_NAME" >> ${LICHEE_PACK_OUT_DIR}/image.cfg
508	echo "" >> ${LICHEE_PACK_OUT_DIR}/image.cfg
509}
510
511function img_to_programmer()
512{
513	local out_img=$1
514	local in_img=$2
515
516	if [ "x${PACK_SIG}" = "xprev_refurbish" -o "x${PACK_SIG}" = "xsecure" ]; then
517		programmer_img toc0.fex toc1.fex ${out_img} > /dev/null
518	else
519		programmer_img boot0_sdcard.fex boot_package.fex ${out_img} > /dev/null
520	fi
521	#create_img toc0.fex toc1.fex
522	programmer_img sys_partition.bin sunxi_mbr.fex ${out_img} ${in_img} > /dev/null
523}
524
525function do_dtboimg()
526{
527	cd ${LICHEE_PACK_OUT_DIR}/
528
529	local MKDTIMG=${LICHEE_BUILD_DIR}/bin/mkdtimg
530	if [ -f ${MKDTIMG} ]; then
531		if [ -f dtboimg.cfg ]; then
532			printf "do_dtboimg: mkdting dtboimg.\n"
533			${MKDTIMG} cfg_create dtbo.img dtboimg.cfg
534			${MKDTIMG} dump dtbo.img
535			cp -r dtbo.img  dtbo.fex
536		else
537			pack_error "do_dtboimg: Can not find dtboimg.cfg\n"
538		fi
539	else
540		pack_error "do_dtboimg: Can not find mkdtimg\n"
541	fi
542	cd ../
543}
544
545function do_ini_to_dts()
546{
547
548	local DTC_SRC_PATH=${LICHEE_PLAT_OUT}
549	local DTC_COMPILER=${LICHEE_PLAT_OUT}/dtc
550	local DTC_FLAGS=""
551
552	[[ ! ${PACK_KERN/linux-} < 4.9 ]] && DTC_FLAGS+=" -W no-unit_address_vs_reg"
553	[[ ! ${PACK_KERN/linux-} < 5.4 ]] && DTC_FLAGS+=" -W no-simple_bus_reg"
554
555	if [ "x${PACK_KERN}" == "xlinux-5.10" -o  "x${PACK_KERN}" == "xlinux-5.4" -o "x${PACK_KERN}" == "xlinux-4.19" ]; then
556		# For debug: sunxi.dtb -> .sunxi.dts
557		DTC_FLAGS+=" -W no-unique_unit_address -W no-cooling_device_property -W no-unit_address_format"
558		$DTC_COMPILER ${DTC_FLAGS} -I dtb -O dts -o ${LICHEE_PLAT_OUT}/.sunxi.dts ${LICHEE_PLAT_OUT}/sunxi.dtb
559		echo "dbg1 pack "
560		echo "$DTC_COMPILER ${DTC_FLAGS} -I dtb -O dts -o ${LICHEE_PLAT_OUT}/.sunxi.dts ${LICHEE_PLAT_OUT}/sunxi.dtbs"
561		return
562	fi
563
564
565	local DTC_DEP_BOARD1=${DTC_SRC_PATH}/.board.dtb.d.dtc.tmp
566	local DTC_SRC_BOARD1=${DTC_SRC_PATH}/.board.dtb.dts.tmp
567	local DTC_DEP_BOARD=${DTC_SRC_PATH}/.${PACK_CHIP}-${PACK_BOARD}.dtb.d.dtc.tmp
568	local DTC_SRC_BOARD=${DTC_SRC_PATH}/.${PACK_CHIP}-${PACK_BOARD}.dtb.dts.tmp
569	local DTC_DEP_BUSSINESS=${DTC_SRC_PATH}/.${PACK_CHIP}-${LICHEE_BUSSINESS}.dtb.d.dtc.tmp
570	local DTC_SRC_BUSSINESS=${DTC_SRC_PATH}/.${PACK_CHIP}-${LICHEE_BUSSINESS}.dtb.dts.tmp
571	local DTC_DEP_COMMON=${DTC_SRC_PATH}/.${PACK_CHIP}-soc.dtb.d.dtc.tmp
572	local DTC_SRC_COMMON=${DTC_SRC_PATH}/.${PACK_CHIP}-soc.dtb.dts.tmp
573
574	local DTC_INI_FILE_BASE=${LICHEE_PACK_OUT_DIR}/sys_config.fex
575	local DTC_INI_FILE=${LICHEE_PACK_OUT_DIR}/sys_config_fix.fex
576
577	cp $DTC_INI_FILE_BASE $DTC_INI_FILE
578	sed -i "s/\(\[dram\)_para\(\]\)/\1\2/g" $DTC_INI_FILE
579	sed -i "s/\(\[nand[0-9]\)_para\(\]\)/\1\2/g" $DTC_INI_FILE
580
581	if [ ! -f $DTC_COMPILER ]; then
582		pack_error "Script_to_dts: Can not find dtc compiler.\n"
583		exit 1
584	fi
585
586	if [ -f $DTC_DEP_BOARD1 ]; then
587		printf "Script_to_dts: use board special dts file board.dts\n"
588		DTC_DEP_FILE=${DTC_DEP_BOARD1}
589		DTC_SRC_FILE=${DTC_SRC_BOARD1}
590	elif [ -f $DTC_DEP_BOARD ]; then
591		printf "Script_to_dts: use board special dts file ${PACK_CHIP}-${PACK_BOARD}.dts\n"
592		DTC_DEP_FILE=${DTC_DEP_BOARD}
593		DTC_SRC_FILE=${DTC_SRC_BOARD}
594	elif [ -f $DTC_DEP_BUSSINESS ]; then
595		printf "Script_to_dts: use bussiness special dts file ${PACK_CHIP}-${LICHEE_BUSSINESS}.dts\n"
596		DTC_DEP_FILE=${DTC_DEP_BUSSINESS}
597		DTC_SRC_FILE=${DTC_SRC_BUSSINESS}
598	else
599		printf "Script_to_dts: use common dts file ${PACK_CHIP}-soc.dts\n"
600		DTC_DEP_FILE=${DTC_DEP_COMMON}
601		DTC_SRC_FILE=${DTC_SRC_COMMON}
602	fi
603
604	#Disbale noisy checks
605	if [ "x${PACK_KERN}" == "xlinux-4.9" ]; then
606	local DTC_FLAGS="-W no-unit_address_vs_reg"
607	fi
608
609	if [ -d ${LICHEE_CHIP_CONFIG_DIR}/dtbo ];  then
610		echo "sunxi dtboimg create"
611		local DTO_COMPILER=${LICHEE_BUILD_DIR}/bin/dtco
612		if [ ! -f $DTO_COMPILER ]; then
613			pack_error "Script_to_dts: Can not find dtco compiler.\n"
614			exit 1
615		fi
616
617		$DTO_COMPILER ${DTC_FLAGS} -a 4 -@ -O dtb -o ${LICHEE_PACK_OUT_DIR}/sunxi_board1.dtbo ${LICHEE_PACK_OUT_DIR}/sunxi_board1.dts
618		if [ $? -ne 0 ]; then
619			pack_error "dtbo:create dtbo file failed"
620			exit 1
621		fi
622		do_dtboimg
623
624		$DTO_COMPILER ${DTC_FLAGS} -@ -O dtb -o ${LICHEE_PLAT_OUT}/sunxi.dtb	\
625			-b 0			\
626			-i $DTC_SRC_PATH	\
627			-F $DTC_INI_FILE	\
628			-d $DTC_DEP_FILE $DTC_SRC_FILE
629		if [ $? -ne 0 ]; then
630			pack_error "dtbo: Conver script to dts failed"
631			exit 1
632		fi
633	else
634		echo "sunxi_dtb create"
635		$DTC_COMPILER ${DTC_FLAGS} -O dtb -o ${LICHEE_PLAT_OUT}/sunxi.dtb	\
636			-b 0			\
637			-i $DTC_SRC_PATH	\
638			-F $DTC_INI_FILE	\
639			-d $DTC_DEP_FILE $DTC_SRC_FILE
640	fi
641	if [ $? -ne 0 ]; then
642		pack_error "Conver script to dts failed"
643		exit 1
644	fi
645
646	#restore the orignal dtsi
647	if [ "x${PACK_TYPE}" = "xdragonboard" \
648		-o "x${PACK_TYPE}" = "xdragonmat" ]; then
649		local DTS_PATH=${LICHEE_KERN_DIR}/arch/${LICHEE_ARCH}/boot/dts
650		[ "x${LICHEE_ARCH}" = "xarm64" ] && DTS_PATH=${LICHEE_KERN_DIR}/arch/${LICHEE_ARCH}/boot/dts/sunxi
651		if [ -f ${DTS_PATH}/${PACK_CHIP}_bak.dtsi ];then
652			rm -f ${DTS_PATH}/${PACK_CHIP}.dtsi
653			mv  ${DTS_PATH}/${PACK_CHIP}_bak.dtsi  ${DTS_PATH}/${PACK_CHIP}.dtsi
654		fi
655	fi
656
657	printf "Conver script to dts ok.\n"
658
659	# It'is used for debug dtb
660	$DTC_COMPILER ${DTC_FLAGS} -I dtb -O dts -o ${LICHEE_PLAT_OUT}/.sunxi.dts ${LICHEE_PLAT_OUT}/sunxi.dtb
661
662	return
663}
664
665function do_common()
666{
667	cd ${LICHEE_PACK_OUT_DIR}/
668
669	if [ ! -f board_config.fex ]; then
670		echo "[empty]" > board_config.fex
671	fi
672
673	busybox unix2dos sys_config.fex
674	busybox unix2dos board_config.fex
675
676	script  sys_config.fex > /dev/null
677	cp -f   sys_config.bin config.fex
678	script  board_config.fex > /dev/null
679	cp -f board_config.bin board.fex
680
681	busybox unix2dos sys_partition.fex
682	script  sys_partition.fex > /dev/null
683	update_boot0 boot0_nand.fex     sys_config.bin NAND > /dev/null
684	update_boot0 boot0_sdcard.fex   sys_config.bin SDMMC_CARD > /dev/null
685	update_chip boot0_nand.fex > /dev/null
686	update_chip boot0_sdcard.fex > /dev/null
687
688	if [ ! -f "u-boot-crash.fex" ]; then
689		touch "u-boot-crash.fex"
690		echo "ensure u-boot-crash.fex is not empty" > u-boot-crash.fex
691	fi
692
693	if [ -f "${LICHEE_PLAT_OUT}/sunxi.dtb" ]; then
694		cp ${LICHEE_PLAT_OUT}/sunxi.dtb sunxi.fex
695		update_dtb sunxi.fex 4096
696	fi
697	if [ -f "scp.fex" ]; then
698		echo "update scp"
699		update_scp scp.fex sunxi.fex >/dev/null
700	fi
701
702	if [ -f "optee.fex" ]; then
703		echo "update optee"
704		update_optee optee.fex sunxi.fex >/dev/null
705	fi
706
707	# Those files for Nand or Card
708	update_boot0 boot0_nand.fex	sys_config.bin NAND > /dev/null
709	update_boot0 boot0_sdcard.fex	sys_config.bin SDMMC_CARD > /dev/null
710
711	if [ "x${PACK_KERN}" = "xlinux-3.4" ] ; then
712		update_uboot -merge u-boot.fex sys_config.bin > /dev/null
713	else
714		update_uboot -no_merge u-boot.fex sys_config.bin > /dev/null
715	fi
716	update_fes1  fes1.fex           sys_config.bin > /dev/null
717	if [ -f ${LICHEE_TOOLS_DIR}/pack/pctools/linux/mod_update/update_sboot ];then
718		update_sboot sboot.bin  sys_config.bin
719		if [ $? -ne 0 ]
720		then
721			pack_error "update sboot run error"
722			exit 1
723		fi
724	fi
725
726	fsbuild      boot-resource.ini  split_xxxx.fex > /dev/null
727	if [ -f boot_package.cfg ]; then
728			echo "pack boot package"
729			busybox unix2dos boot_package.cfg
730			dragonsecboot -pack boot_package.cfg
731
732		if [ $? -ne 0 ]
733		then
734			pack_error "dragon pack run error"
735			exit 1
736		fi
737	fi
738
739	if [ "x${PACK_FUNC}" = "xprvt" ] ; then
740		if [ "x${LICHEE_REDUNDANT_ENV_SIZE}" != "x" ]; then
741			echo "--mkenvimage create redundant env data!--"
742			echo "--redundant env data size ${LICHEE_REDUNDANT_ENV_SIZE}---"
743			mkenvimage -r -p 0x00 -s ${LICHEE_REDUNDANT_ENV_SIZE} -o env.fex env_burn.cfg
744		else
745			u_boot_env_gen env_burn.cfg env.fex > /dev/null
746		fi
747	else
748		if [ "x${LICHEE_REDUNDANT_ENV_SIZE}" != "x" ]; then
749			echo "--mkenvimage create redundant env data!--"
750			echo "--redundant env data size ${LICHEE_REDUNDANT_ENV_SIZE}---"
751			mkenvimage -r -p 0x00 -s ${LICHEE_REDUNDANT_ENV_SIZE} -o env.fex env.cfg
752		else
753			u_boot_env_gen env.cfg env.fex > /dev/null
754		fi
755	fi
756
757	local link_real=$(get_realpath ${LICHEE_PLAT_OUT} ./)
758	ln -sf ${link_real}/vmlinux.tar.bz2 vmlinux.fex
759
760	if [ -f "$LICHEE_PLAT_OUT/arisc" ]; then
761		ln -sf $(get_realpath $LICHEE_PLAT_OUT ./)/arisc arisc.fex
762	fi
763
764#	if [ "x""`grep "deal_verity)" ${LICHEE_KERN_DIR}/scripts/build.sh`" != "x" ]; then
765#		#if possable, clean verity utils anyway
766#		#make sure DO NOT do_mount_verity when dm-verity not set-up
767#		(
768#		cd ${LICHEE_KERN_DIR}
769#		./scripts/build.sh deal_verity clean ||
770#		{ pack_error "deal verity utils failed";exit 1; }
771#		)
772#	fi
773
774	if [ "x${PACK_SIGNFEL}" = "x${FLAGS_TRUE}" ]; then
775		do_signature_fel
776	fi
777}
778
779function showImageSize()
780{
781	echo '----------image is at----------'
782	echo -e '\033[0;31;1m'
783	echo -e "size:$5  ${LICHEE_OUT_DIR}/${IMG_NAME}"'\033[0m\033[0;30;1m'
784	date +%F' '%H:%M:%S
785	echo -e '\033[0m'
786}
787
788function do_finish()
789{
790	# Yeah, it should contain all files into full_img.fex for spinor
791	# Because, as usually, spinor image size is very small.
792	# If fail to create full_img.fex, we should fake it empty.
793
794	# WTF, it is so ugly!!! It must be sunxi_mbr.fex & sys_partition.bin,
795	# not sunxi_mbr_xxx.fex & sys_partition_xxx.bin. In order to advoid this
796	# loathsome thing, we need to backup & copy files. Check whether
797	# sys_partition_nor.bin is exist, and create sunxi_mbr.fex for Nor.
798
799	local toc_size
800	if [ "x${PACK_SIG}" = "xprev_refurbish" -o "x${PACK_SIG}" = "xsecure" ]; then
801		toc_size=`stat toc1.fex --format="%s"`
802	else
803		toc_size=`stat boot_package.fex --format="%s"`
804	fi
805
806	if [ ${toc_size} -gt 2097152 ];then
807		pack_error "boot_package.fex/toc1.fex More than 2097152 bytes limit too large!!!"
808		exit 1
809	fi
810
811	if [ ! -f sys_partition_nor.bin ]; then
812		update_mbr          sys_partition.bin 4
813		if [ $? -ne 0 ]; then
814			pack_error "update_mbr failed"
815			exit 1
816		fi
817	fi
818
819	local vmlinux="$(sed -n '/^\s*{\s*filename\s*=\s*"vmlinux.fex"\s*,/p' image.cfg)"
820	local fileend="$(sed -n '/^\s*{\s*filename\s*=/=' image.cfg | tail -1)"
821	if [ -z "$vmlinux" ] && [ -n "$fileend" ]; then
822		vmlinux+='    {filename = "vmlinux.fex",'
823		vmlinux+='     maintype = "12345678",'
824		vmlinux+='     subtype  = "123456789VMLINUX",},'
825		sed -i -e  ''"${fileend}"'a\' -e "$vmlinux" image.cfg
826	fi
827
828	dragon image.cfg    sys_partition.fex
829		if [ $? -eq 0 ]; then
830		if [ -e ${IMG_NAME} ]; then
831			mv ${IMG_NAME} $LICHEE_OUT_DIR/${IMG_NAME}
832			showImageSize `ls -alh ${LICHEE_OUT_DIR}/${IMG_NAME}`
833		fi
834		fi
835	cd ..
836
837	if [ -n "$PACK_HOOK" ] && [ -x "$PACK_HOOK" ]; then
838		$PACK_HOOK ${LICHEE_OUT_DIR}/${IMG_NAME}
839	fi
840
841	if [ "x${PACK_PROGRAMMER}" = "xprogrammer" ]; then
842		echo "waiting to ceate programmer img..."
843		img_to_programmer ${IMG_PROGRAMMER_NAME} ../${IMG_NAME}
844		if [ $? -eq 0 ]; then
845			if [ -e ${IMG_PROGRAMMER_NAME} ]; then
846				mv ${IMG_PROGRAMMER_NAME} ../${IMG_PROGRAMMER_NAME}
847				echo '----------programmer image is at----------'
848				echo -e '\033[0;31;1m'
849				echo ${LICHEE_OUT_DIR}/${IMG_PROGRAMMER_NAME}
850				echo -e '\033[0m'
851			fi
852		fi
853	fi
854	cd ..
855	printf "pack finish\n"
856}
857
858
859function dmverity_get_blk_count()
860{
861	local size=`du -b $1 | awk '{print $1}'`
862	local BLK_SIZE=$2
863
864	if [ `expr ${size} % ${BLK_SIZE}` = "0" ]; then
865			local blks=`(expr ${size} / ${BLK_SIZE})`
866	else
867			local blks=`(expr ${size} / ${BLK_SIZE} + 1 )`
868	fi
869
870	echo $blks
871}
872
873function dmverity_determ_blk_size()
874{
875	local type_info=`file -L $1`
876
877	#check rootfs file system type to determ block size
878	if [ "x""`echo ${type_info}| grep "ext4 filesystem"`" != "x" ];then
879		block_size=`tune2fs -l $1|grep "Block size"|awk {'print $3'}`
880		echo ${block_size}
881	else
882		echo "not support file system type"
883		return -1
884	fi
885
886}
887function dmverity_genHashTable()
888{
889	local fs_name=$1
890	local tree_name=$2
891	local table_name=$3
892	local block_size=`dmverity_determ_blk_size ${fs_name}`
893	if [ ${block_size} -lt 0 ];then
894		return -1
895	fi
896	veritysetup format --data-block-size=${block_size} --hash-block-size=${block_size} ${fs_name} ${tree_name} > ${table_name}
897	return $?
898}
899
900function dmverity_genDownloadFile()
901{
902	local fs_name=$1
903	local sign_name=$2
904	local table_name=$3
905	local tree_name=$4
906	local download_file_name=$5
907
908	local BLK_SIZE=`dmverity_determ_blk_size ${fs_name}`
909	if [ ${BLK_SIZE} -lt 0 ];then
910		return -1
911	fi
912	local SIGN_BLK=`dmverity_get_blk_count ${sign_name} ${BLK_SIZE}`
913	local TABLE_BLK=`dmverity_get_blk_count ${table_name} ${BLK_SIZE}`
914	local TREE_BLK=`dmverity_get_blk_count ${tree_name} ${BLK_SIZE}`
915
916	# 3.1 copy sign
917	dd if=${sign_name} of=${download_file_name}"tmp" bs=${BLK_SIZE} count=${SIGN_BLK} >/dev/null 2>&1
918
919	# 3.2 copy table size
920	local TABLE_SIZE=`du -b ${table_name} | awk '{print $1}'`
921	local HIGH_BYTES=`expr $TABLE_SIZE / 256 `
922	local LOW_BYTES=`expr $TABLE_SIZE % 256 `
923	if [ $HIGH_BYTES -gt 256 ]; then
924		echo "ERROR rootfs_hash_table size should < 64KB"
925		return -1
926	fi
927	local HIGH_BYTES_H=`echo "obase=16;ibase=10;$HIGH_BYTES" | bc`
928	local LOW_BYTES_H=`echo "obase=16;ibase=10;$LOW_BYTES" | bc`
929	echo -e -n "\x$LOW_BYTES_H\x$HIGH_BYTES_H" >> ${download_file_name}"tmp"
930
931	# 3.3 copy rootfs_hash_table
932	dd if=${table_name} of=${download_file_name}"tmp"  bs=${BLK_SIZE} seek=${SIGN_BLK} count=${TABLE_BLK} > /dev/null 2>&1
933
934	# 3.4 copy rootfs_hash_tree.bin
935	dd if=${tree_name} of=${download_file_name}"tmp"  bs=${BLK_SIZE} seek=`expr ${SIGN_BLK} + ${TABLE_BLK}` count=${TREE_BLK} > /dev/null 2>&1
936
937	dd of=${download_file_name} if=${download_file_name}"tmp" bs=${BLK_SIZE} count=`expr ${SIGN_BLK} + ${TABLE_BLK} + ${TREE_BLK}`>/dev/null 2>&1
938	rm ${download_file_name}"tmp"
939}
940
941function do_signature_dsp()
942{
943	local DSP0_BIN=${LICHEE_PACK_OUT_DIR}/dsp0.fex;
944	local DSP1_BIN=${LICHEE_PACK_OUT_DIR}/dsp1.fex;
945	local CFG_FILE=${LICHEE_CHIP_CONFIG_DIR}/configs/default/image_header_secure.cfg;
946
947	if [ -f ${CFG_FILE} ] ; then
948		cp -v ${CFG_FILE} image_header_secure.cfg
949	else
950		printf "can not found image_header_secure cfg\n"
951		return 1
952	fi
953
954	if [ -f ${DSP0_BIN} ] ; then
955		mkimage_header -C 5 -c image_header_secure.cfg -s rsa -k $CFG_KEY_DIR
956		if [ $? -ne 0 ]
957		then
958			pack_error "mkimage_header signature dsp error\n"
959			exit 1
960		fi
961		mv dsp0.fex.pack dsp0.fex
962	else
963		printf "can not found dsp0 bin\n"
964		return 3
965	fi
966
967	if [ -f ${DSP1_BIN} ] ; then
968		mv dsp1.fex.pack dsp1.fex
969	fi
970
971}
972
973
974function do_signature_fel()
975{
976	printf "prepare for signature for fex tools\n"
977	local  ROOT_KEY_NAME="";
978	if [ -f ${CFG_KEY_DIR}/RootKey_Level_0.bin ]; then
979		ROOT_KEY_NAME=${CFG_KEY_DIR}/RootKey_Level_0.bin
980	elif [ -f ${CFG_KEY_DIR}/Trustkey.bin ]; then
981		ROOT_KEY_NAME=${CFG_KEY_DIR}/Trustkey.bin
982	else
983		pack_error "can not found root key to sign fex tool"
984		exit 1
985	fi
986	echo rootkeyname ${ROOT_KEY_NAME}
987	sig_fel_image --input fes1.fex --rsakey ${ROOT_KEY_NAME} --output fes1_sign.fex --version_base ${LICHEE_PACK_OUT_DIR}/version_base.mk
988	if [ $? -ne 0 ]
989	then
990		pack_error "sig_fel_image fes fail"
991		exit 1
992	fi
993	sig_fel_image --input u-boot.fex --rsakey ${ROOT_KEY_NAME} --output u-boot_sign.fex --version_base ${LICHEE_PACK_OUT_DIR}/version_base.mk
994	if [ $? -ne 0 ]
995	then
996		pack_error "sig_fel_image uboot fail"
997	fi
998	mv fes1_sign.fex fes1.fex
999	mv u-boot_sign.fex u-boot.fex
1000}
1001
1002function do_signature()
1003{
1004	printf "prepare for signature by openssl\n"
1005	if [ "x${PACK_SIG}" = "xprev_refurbish" ] ; then
1006		if [ "x${LICHEE_ARCH}" = "xarm64" ] ; then
1007			cp -v ${LICHEE_COMMON_CONFIG_DIR}/sign_config/dragon_toc_a64_no_secureos.cfg dragon_toc.cfg
1008		else
1009			cp -v ${LICHEE_COMMON_CONFIG_DIR}/sign_config/dragon_toc_no_secureos.cfg dragon_toc.cfg
1010		fi
1011	else
1012		if [ "x${LICHEE_ARCH}" = "xarm64" ] ; then
1013			if [ -f ${LICHEE_CHIP_CONFIG_DIR}/configs/default/dragon_toc.cfg ] ; then
1014				cp -v ${LICHEE_CHIP_CONFIG_DIR}/configs/default/dragon_toc.cfg dragon_toc.cfg
1015			else
1016				cp -v ${LICHEE_COMMON_CONFIG_DIR}/sign_config/dragon_toc_a64.cfg dragon_toc.cfg
1017			fi
1018		else
1019			if [ -f ${LICHEE_CHIP_CONFIG_DIR}/configs/default/dragon_toc.cfg ] ; then
1020				cp -v ${LICHEE_CHIP_CONFIG_DIR}/configs/default/dragon_toc.cfg dragon_toc.cfg
1021			else
1022				cp -v ${LICHEE_COMMON_CONFIG_DIR}/sign_config/dragon_toc.cfg dragon_toc.cfg
1023			fi
1024		fi
1025	fi
1026
1027	if [ $? -ne 0 ]
1028	then
1029		pack_error "dragon toc config file is not exist"
1030		exit 1
1031	fi
1032
1033	rm -f cardscript.fex
1034	mv cardscript_secure.fex cardscript.fex
1035	if [ $? -ne 0 ]
1036	then
1037		pack_error "dragon cardscript_secure.fex file is not exist"
1038		exit 1
1039	fi
1040
1041	if [ "x""`grep "deal_verity)" ${LICHEE_KERN_DIR}/scripts/build.sh`" = "x" ]; then
1042		if [ "x${PACK_VERITY}" = "x${FLAGS_TRUE}" ]; then
1043			pack_error "verity utils for kernal not provided"
1044			exit 1
1045		fi
1046	else
1047		if [ "x${PACK_VERITY}" = "x${FLAGS_TRUE}" ]; then
1048			# generate verity data
1049			(dmverity_genHashTable rootfs.fex rootfsHashTree.fex rootfsHashTable.fex &&
1050			openssl dgst -sha256 -binary -sign $CFG_KEY_DIR/SCPFirmwareContentCertPK.pem rootfsHashTable.fex > rootfsHashSign.fex &&
1051			openssl rsa -in $CFG_KEY_DIR/SCPFirmwareContentCertPK.pem -pubout -out rootfsPubKey.pk &&
1052			dmverity_genDownloadFile rootfs.fex rootfsHashSign.fex rootfsHashTable.fex rootfsHashTree.fex VerityInfo.fex) ||
1053			{ pack_error "generate verity data failed";exit 1; }
1054			# add partition for verity data
1055			(add_partition -2 rootfsverityInfo 4096 "VerityInfo.fex" &&
1056			busybox unix2dos sys_partition.fex &&
1057			script  sys_partition.fex > /dev/null) ||
1058			{ pack_error "add verity info part failed";exit 1; }
1059			# add verity tools into ramdisk
1060			local rootfsPath=`readlink -f rootfs.fex`
1061			local keyPath=`readlink -f rootfsPubKey.pk`
1062			(
1063			cd ${LICHEE_KERN_DIR}
1064			./scripts/build.sh deal_verity `dmverity_determ_blk_size ${rootfsPath}` rootfsverityInfo ext4 $keyPath ||
1065			{ pack_error "deal verity utils failed";exit 1; }
1066			)
1067		else
1068			#clean verity tools in ramdisk
1069			(
1070			cd ${LICHEE_KERN_DIR}
1071			./scripts/build.sh deal_verity clean ||
1072			{ pack_error "deal verity utils failed";exit 1; }
1073			)
1074		fi
1075	fi
1076
1077
1078
1079	update_chip sboot.bin > /dev/null
1080
1081	dragonsecboot -toc0 dragon_toc.cfg $CFG_KEY_DIR ${LICHEE_PACK_OUT_DIR}/version_base.mk > /dev/null
1082	if [ $? -ne 0 ]
1083	then
1084		pack_error "dragon toc0 run error"
1085		exit 1
1086	fi
1087
1088	update_toc0  toc0.fex           sys_config.bin
1089	if [ $? -ne 0 ]
1090	then
1091		pack_error "update toc0 run error"
1092		exit 1
1093	fi
1094
1095	dragonsecboot -toc1 dragon_toc.cfg $CFG_KEY_DIR ${LICHEE_COMMON_CONFIG_DIR}/sign_config/cnf_base.cnf ${LICHEE_PACK_OUT_DIR}/version_base.mk
1096	if [ $? -ne 0 ]
1097	then
1098		pack_error "dragon toc1 run error"
1099		exit 1
1100	fi
1101
1102	sigbootimg --image boot.fex --cert toc1/cert/boot.der --output boot_sig.fex
1103	if [ $? -ne 0 ] ; then
1104		pack_error "Pack cert to image error"
1105		exit 1
1106	else
1107		mv -f boot_sig.fex boot.fex
1108	fi
1109
1110	if [ "x${LICHEE_ARCH}" = "xarm" ] ; then
1111		do_signature_dsp
1112	fi
1113
1114	local link_real=$(get_realpath ${LICHEE_PLAT_OUT} ./)
1115	local recovery_path=${link_real}/recovery.img
1116
1117	if [ -f "$recovery_path" ]; then
1118		sigbootimg --image recovery.fex --cert toc1/cert/recovery.der --output recovery_sig.fex
1119		if [ $? -ne 0 ] ; then
1120			pack_error "Pack cert to image error"
1121			exit 1
1122		else
1123			mv -f recovery_sig.fex recovery.fex
1124		fi
1125	fi
1126	echo "secure signature ok!"
1127
1128}
1129
1130function do_pack_linux()
1131{
1132
1133	local harmony_image_path=${LICHEE_OUT_DIR}/${PRODUCT_NAME}/packages/phone/images
1134	local link_real=$(get_realpath ${LICHEE_PLAT_OUT} ./)
1135	local recovery_path=${link_real}/recovery.img
1136
1137	printf "packing for linux\n"
1138
1139	ln -sf ${link_real}/boot.img        boot.fex
1140
1141	# link harmony image
1142	ln -sf ${harmony_image_path}/system.img     rootfs.fex
1143	ln -sf ${harmony_image_path}/vendor.img     vendor.fex
1144	ln -sf ${harmony_image_path}/userdata.img   userdata.fex
1145
1146	ln -sf ${link_real}/rootfs.ubifs     rootfs-ubifs.fex
1147
1148	if [ -f "$recovery_path" ]; then
1149		ln -sf ${recovery_path}     recovery.fex
1150	fi
1151
1152	# Those files is ready for SPINor.
1153	ln -sf ${link_real}/uImage          kernel.fex
1154	ln -sf ${link_real}/rootfs.squashfs rootfs_nor.fex
1155
1156	if [ "x${PACK_SIG}" = "xsecure" ] ; then
1157		echo "secure"
1158		do_signature
1159	elif [ "x${PACK_SIG}" = "xprev_refurbish" ] ; then
1160		echo "prev_refurbish"
1161		do_signature
1162	else
1163		echo "normal"
1164	fi
1165}
1166
1167do_prepare
1168do_ini_to_dts
1169do_common
1170do_pack_linux
1171do_finish
1172