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