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:" 13*1ff581bbSJoseph 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) 27*1ff581bbSJoseph Chen ITB=$2 2875323eb8SJoseph Chen shift 2 2975323eb8SJoseph Chen ;; 3075323eb8SJoseph Chen -o) 31*1ff581bbSJoseph 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 41*1ff581bbSJoseph Chen if [ ! -f ${ITB} ]; then 42*1ff581bbSJoseph Chen echo "ERROR: No ${ITB}" 4375323eb8SJoseph Chen exit 1 4475323eb8SJoseph Chen fi 4575323eb8SJoseph Chen 46*1ff581bbSJoseph Chen if [ -z ${OUT} ]; then 47*1ff581bbSJoseph Chen OUT="out" 4875323eb8SJoseph Chen fi 4975323eb8SJoseph Chen} 5075323eb8SJoseph Chen 51*1ff581bbSJoseph Chenunpack_itb() 5275323eb8SJoseph Chen{ 53*1ff581bbSJoseph Chen mkdir -p ${OUT} 54*1ff581bbSJoseph Chen echo "Unpack to directory ${OUT}:" 55*1ff581bbSJoseph Chen 56*1ff581bbSJoseph Chen for NAME in `fdtget -l ${ITB} /images` 5775323eb8SJoseph Chen do 58*1ff581bbSJoseph Chen # generate ITB 59*1ff581bbSJoseph Chen NODE="/images/${NAME}" 60*1ff581bbSJoseph Chen OFFS=`fdtget -ti ${ITB} ${NODE} data-position` 61*1ff581bbSJoseph Chen SIZE=`fdtget -ti ${ITB} ${NODE} data-size` 62*1ff581bbSJoseph Chen if [ -z ${OFFS} ]; then 631ae3dd15SJoseph Chen continue; 6475323eb8SJoseph Chen fi 651ae3dd15SJoseph Chen 66*1ff581bbSJoseph Chen if [ ${SIZE} -ne 0 ]; then 67*1ff581bbSJoseph Chen dd if=${ITB} of=${OUT}/${NAME} bs=${SIZE} count=1 skip=${OFFS} iflag=skip_bytes >/dev/null 2>&1 681ae3dd15SJoseph Chen else 69*1ff581bbSJoseph Chen touch ${OUT}/${NAME} 701ae3dd15SJoseph Chen fi 710fb435faSJoseph Chen 720fb435faSJoseph Chen # hash verify 73*1ff581bbSJoseph Chen ALGO=`fdtget -ts ${ITB} ${NODE}/hash algo` 74*1ff581bbSJoseph Chen if [ -z ${ALGO} ]; then 75*1ff581bbSJoseph Chen printf " %-20s: %d bytes" ${NAME} ${SIZE} 76*1ff581bbSJoseph Chen else 77*1ff581bbSJoseph Chen VALUE=`fdtget -tx ${ITB} ${NODE}/hash value` 78*1ff581bbSJoseph Chen VALUE=`echo " "${VALUE} | sed "s/ / 0x/g"` 79*1ff581bbSJoseph Chen CSUM=`"${ALGO}"sum ${OUT}/${NAME} | awk '{ print $1}'` 800fb435faSJoseph Chen 81*1ff581bbSJoseph Chen HASH="" 820fb435faSJoseph Chen for((i=1;;i++)); 830fb435faSJoseph Chen do 84*1ff581bbSJoseph Chen HEX=`echo ${VALUE} | awk -v idx=$i '{ print $idx }'` 85*1ff581bbSJoseph Chen if [ -z ${HEX} ]; then 860fb435faSJoseph Chen break; 870fb435faSJoseph Chen fi 880fb435faSJoseph Chen 89*1ff581bbSJoseph Chen HEX=`printf "%08x" ${HEX}` 90*1ff581bbSJoseph Chen HASH="${HASH}${HEX}" 910fb435faSJoseph Chen done 920fb435faSJoseph Chen 93*1ff581bbSJoseph Chen printf " %-20s: %d bytes... %s" ${NAME} ${SIZE} ${ALGO} 94*1ff581bbSJoseph Chen if [ "${CSUM}" == "${HASH}" -o ${SIZE} -eq 0 ]; then 950fb435faSJoseph Chen echo "+" 960fb435faSJoseph Chen else 970fb435faSJoseph Chen echo "-" 980fb435faSJoseph Chen fi 99*1ff581bbSJoseph Chen fi 1001ae3dd15SJoseph Chen done 10175323eb8SJoseph Chen echo 10275323eb8SJoseph Chen} 10375323eb8SJoseph Chen 104436376efSJoseph Chenfunction gen_its() 105436376efSJoseph Chen{ 106*1ff581bbSJoseph Chen ITS=${OUT}/image.its 107*1ff581bbSJoseph Chen TMP_ITB=${OUT}/image.tmp 108436376efSJoseph Chen 109436376efSJoseph Chen # add placeholder 110*1ff581bbSJoseph Chen cp -a ${ITB} ${TMP_ITB} 111*1ff581bbSJoseph Chen for NAME in `fdtget -l ${ITB} /images`; do 112*1ff581bbSJoseph Chen fdtput -t s ${TMP_ITB} /images/${NAME} data "/INCBIN/(${NAME})" 113436376efSJoseph Chen done 114*1ff581bbSJoseph Chen dtc -I dtb -O dts ${TMP_ITB} -o ${ITS} 115*1ff581bbSJoseph Chen rm -f ${TMP_ITB} 116*1ff581bbSJoseph Chen 117*1ff581bbSJoseph Chen # fixup placeholder: data = "/INCBIN/(...)"; -> data = /incbin/("..."); 118*1ff581bbSJoseph Chen sed -i "s/\"\/INCBIN\/(\(.*\))\"/\/incbin\/(\"\1\")/" ${ITS} 119*1ff581bbSJoseph Chen 120*1ff581bbSJoseph Chen # remove 121*1ff581bbSJoseph Chen sed -i "/memreserve/d" ${ITS} 122*1ff581bbSJoseph Chen sed -i "/timestamp/d" ${ITS} 123*1ff581bbSJoseph Chen sed -i "/data-size/d" ${ITS} 124*1ff581bbSJoseph Chen sed -i "/data-position/d" ${ITS} 125*1ff581bbSJoseph Chen sed -i "/value/d" ${ITS} 126*1ff581bbSJoseph Chen sed -i "/hashed-strings/d" ${ITS} 127*1ff581bbSJoseph Chen sed -i "/hashed-nodes/d" ${ITS} 128*1ff581bbSJoseph Chen sed -i "/signer-version/d" ${ITS} 129*1ff581bbSJoseph Chen sed -i "/signer-name/d" ${ITS} 130436376efSJoseph Chen} 131436376efSJoseph Chen 13275323eb8SJoseph Chenargs_process $* 133*1ff581bbSJoseph Chenunpack_itb 134436376efSJoseph Chengen_its 1350fb435faSJoseph Chen 136