175323eb8SJoseph Chen#!/bin/bash 275323eb8SJoseph Chen# 375323eb8SJoseph Chen# Copyright (c) 2020 Fuzhou Rockchip Electronics Co., Ltd 475323eb8SJoseph Chen# 575323eb8SJoseph Chen# SPDX-License-Identifier: GPL-2.0 675323eb8SJoseph Chen# 71ae3dd15SJoseph Chenset -e 875323eb8SJoseph Chen 975323eb8SJoseph Chenfunction usage() 1075323eb8SJoseph Chen{ 1175323eb8SJoseph Chen echo 1275323eb8SJoseph Chen echo "usage:" 131ff581bbSJoseph Chen echo " $0 -f [fit/itb] -o [out]" 1475323eb8SJoseph Chen echo 1575323eb8SJoseph Chen} 1675323eb8SJoseph Chen 1775323eb8SJoseph Chenfunction args_process() 1875323eb8SJoseph Chen{ 191ae3dd15SJoseph Chen if [ $# -ne 4 -a $# -ne 2 ]; then 2075323eb8SJoseph Chen usage 2175323eb8SJoseph Chen exit 1 2275323eb8SJoseph Chen fi 2375323eb8SJoseph Chen 2475323eb8SJoseph Chen while [ $# -gt 0 ]; do 2575323eb8SJoseph Chen case $1 in 2675323eb8SJoseph Chen -f) 271ff581bbSJoseph Chen ITB=$2 2875323eb8SJoseph Chen shift 2 2975323eb8SJoseph Chen ;; 3075323eb8SJoseph Chen -o) 311ff581bbSJoseph Chen OUT=$2 3275323eb8SJoseph Chen shift 2 3375323eb8SJoseph Chen ;; 3475323eb8SJoseph Chen *) 3575323eb8SJoseph Chen usage 3675323eb8SJoseph Chen exit 1 3775323eb8SJoseph Chen ;; 3875323eb8SJoseph Chen esac 3975323eb8SJoseph Chen done 4075323eb8SJoseph Chen 411ff581bbSJoseph Chen if [ ! -f ${ITB} ]; then 421ff581bbSJoseph Chen echo "ERROR: No ${ITB}" 4375323eb8SJoseph Chen exit 1 44*e156df43SJoseph Chen elif ! file ${ITB} | grep 'Device Tree Blob' ; then 45*e156df43SJoseph Chen echo "ERROR: ${ITB} is not FIT image" 46*e156df43SJoseph Chen exit 1 4775323eb8SJoseph Chen fi 4875323eb8SJoseph Chen 491ff581bbSJoseph Chen if [ -z ${OUT} ]; then 501ff581bbSJoseph Chen OUT="out" 5175323eb8SJoseph Chen fi 5275323eb8SJoseph Chen} 5375323eb8SJoseph Chen 541ff581bbSJoseph Chenunpack_itb() 5575323eb8SJoseph Chen{ 561ff581bbSJoseph Chen mkdir -p ${OUT} 571ff581bbSJoseph Chen echo "Unpack to directory ${OUT}:" 581ff581bbSJoseph Chen 591ff581bbSJoseph Chen for NAME in `fdtget -l ${ITB} /images` 6075323eb8SJoseph Chen do 611ff581bbSJoseph Chen # generate ITB 621ff581bbSJoseph Chen NODE="/images/${NAME}" 631ff581bbSJoseph Chen OFFS=`fdtget -ti ${ITB} ${NODE} data-position` 641ff581bbSJoseph Chen SIZE=`fdtget -ti ${ITB} ${NODE} data-size` 651ff581bbSJoseph Chen if [ -z ${OFFS} ]; then 661ae3dd15SJoseph Chen continue; 6775323eb8SJoseph Chen fi 681ae3dd15SJoseph Chen 691ff581bbSJoseph Chen if [ ${SIZE} -ne 0 ]; then 701ff581bbSJoseph Chen dd if=${ITB} of=${OUT}/${NAME} bs=${SIZE} count=1 skip=${OFFS} iflag=skip_bytes >/dev/null 2>&1 711ae3dd15SJoseph Chen else 721ff581bbSJoseph Chen touch ${OUT}/${NAME} 731ae3dd15SJoseph Chen fi 740fb435faSJoseph Chen 750fb435faSJoseph Chen # hash verify 761ff581bbSJoseph Chen ALGO=`fdtget -ts ${ITB} ${NODE}/hash algo` 771ff581bbSJoseph Chen if [ -z ${ALGO} ]; then 781ff581bbSJoseph Chen printf " %-20s: %d bytes" ${NAME} ${SIZE} 791ff581bbSJoseph Chen else 801ff581bbSJoseph Chen VALUE=`fdtget -tx ${ITB} ${NODE}/hash value` 811ff581bbSJoseph Chen VALUE=`echo " "${VALUE} | sed "s/ / 0x/g"` 821ff581bbSJoseph Chen CSUM=`"${ALGO}"sum ${OUT}/${NAME} | awk '{ print $1}'` 830fb435faSJoseph Chen 841ff581bbSJoseph Chen HASH="" 850fb435faSJoseph Chen for((i=1;;i++)); 860fb435faSJoseph Chen do 871ff581bbSJoseph Chen HEX=`echo ${VALUE} | awk -v idx=$i '{ print $idx }'` 881ff581bbSJoseph Chen if [ -z ${HEX} ]; then 890fb435faSJoseph Chen break; 900fb435faSJoseph Chen fi 910fb435faSJoseph Chen 921ff581bbSJoseph Chen HEX=`printf "%08x" ${HEX}` 931ff581bbSJoseph Chen HASH="${HASH}${HEX}" 940fb435faSJoseph Chen done 950fb435faSJoseph Chen 961ff581bbSJoseph Chen printf " %-20s: %d bytes... %s" ${NAME} ${SIZE} ${ALGO} 971ff581bbSJoseph Chen if [ "${CSUM}" == "${HASH}" -o ${SIZE} -eq 0 ]; then 980fb435faSJoseph Chen echo "+" 990fb435faSJoseph Chen else 1000fb435faSJoseph Chen echo "-" 1010fb435faSJoseph Chen fi 1021ff581bbSJoseph Chen fi 1031ae3dd15SJoseph Chen done 10475323eb8SJoseph Chen echo 10575323eb8SJoseph Chen} 10675323eb8SJoseph Chen 107436376efSJoseph Chenfunction gen_its() 108436376efSJoseph Chen{ 1091ff581bbSJoseph Chen ITS=${OUT}/image.its 1101ff581bbSJoseph Chen TMP_ITB=${OUT}/image.tmp 111436376efSJoseph Chen 112436376efSJoseph Chen # add placeholder 1131ff581bbSJoseph Chen cp -a ${ITB} ${TMP_ITB} 1141ff581bbSJoseph Chen for NAME in `fdtget -l ${ITB} /images`; do 1151ff581bbSJoseph Chen fdtput -t s ${TMP_ITB} /images/${NAME} data "/INCBIN/(${NAME})" 116436376efSJoseph Chen done 1171ff581bbSJoseph Chen dtc -I dtb -O dts ${TMP_ITB} -o ${ITS} 1181ff581bbSJoseph Chen rm -f ${TMP_ITB} 1191ff581bbSJoseph Chen 1201ff581bbSJoseph Chen # fixup placeholder: data = "/INCBIN/(...)"; -> data = /incbin/("..."); 1211ff581bbSJoseph Chen sed -i "s/\"\/INCBIN\/(\(.*\))\"/\/incbin\/(\"\1\")/" ${ITS} 1221ff581bbSJoseph Chen 1231ff581bbSJoseph Chen # remove 1241ff581bbSJoseph Chen sed -i "/memreserve/d" ${ITS} 1251ff581bbSJoseph Chen sed -i "/timestamp/d" ${ITS} 1261ff581bbSJoseph Chen sed -i "/data-size/d" ${ITS} 1271ff581bbSJoseph Chen sed -i "/data-position/d" ${ITS} 1281ff581bbSJoseph Chen sed -i "/value/d" ${ITS} 1291ff581bbSJoseph Chen sed -i "/hashed-strings/d" ${ITS} 1301ff581bbSJoseph Chen sed -i "/hashed-nodes/d" ${ITS} 1311ff581bbSJoseph Chen sed -i "/signer-version/d" ${ITS} 1321ff581bbSJoseph Chen sed -i "/signer-name/d" ${ITS} 133436376efSJoseph Chen} 134436376efSJoseph Chen 13575323eb8SJoseph Chenargs_process $* 1361ff581bbSJoseph Chenunpack_itb 137436376efSJoseph Chengen_its 1380fb435faSJoseph Chen 139