1#!/bin/bash 2# 3# Copyright (c) 2020 Fuzhou Rockchip Electronics Co., Ltd 4# 5# SPDX-License-Identifier: GPL-2.0 6# 7set -e 8 9function usage() 10{ 11 echo 12 echo "usage:" 13 echo " $0 -f [fit/itb] -o [out]" 14 echo 15} 16 17function args_process() 18{ 19 if [ $# -ne 4 -a $# -ne 2 ]; then 20 usage 21 exit 1 22 fi 23 24 while [ $# -gt 0 ]; do 25 case $1 in 26 -f) 27 ITB=$2 28 shift 2 29 ;; 30 -o) 31 OUT=$2 32 shift 2 33 ;; 34 *) 35 usage 36 exit 1 37 ;; 38 esac 39 done 40 41 if [ ! -f ${ITB} ]; then 42 echo "ERROR: No ${ITB}" 43 exit 1 44 fi 45 46 if [ -z ${OUT} ]; then 47 OUT="out" 48 fi 49} 50 51unpack_itb() 52{ 53 mkdir -p ${OUT} 54 echo "Unpack to directory ${OUT}:" 55 56 for NAME in `fdtget -l ${ITB} /images` 57 do 58 # generate ITB 59 NODE="/images/${NAME}" 60 OFFS=`fdtget -ti ${ITB} ${NODE} data-position` 61 SIZE=`fdtget -ti ${ITB} ${NODE} data-size` 62 if [ -z ${OFFS} ]; then 63 continue; 64 fi 65 66 if [ ${SIZE} -ne 0 ]; then 67 dd if=${ITB} of=${OUT}/${NAME} bs=${SIZE} count=1 skip=${OFFS} iflag=skip_bytes >/dev/null 2>&1 68 else 69 touch ${OUT}/${NAME} 70 fi 71 72 # hash verify 73 ALGO=`fdtget -ts ${ITB} ${NODE}/hash algo` 74 if [ -z ${ALGO} ]; then 75 printf " %-20s: %d bytes" ${NAME} ${SIZE} 76 else 77 VALUE=`fdtget -tx ${ITB} ${NODE}/hash value` 78 VALUE=`echo " "${VALUE} | sed "s/ / 0x/g"` 79 CSUM=`"${ALGO}"sum ${OUT}/${NAME} | awk '{ print $1}'` 80 81 HASH="" 82 for((i=1;;i++)); 83 do 84 HEX=`echo ${VALUE} | awk -v idx=$i '{ print $idx }'` 85 if [ -z ${HEX} ]; then 86 break; 87 fi 88 89 HEX=`printf "%08x" ${HEX}` 90 HASH="${HASH}${HEX}" 91 done 92 93 printf " %-20s: %d bytes... %s" ${NAME} ${SIZE} ${ALGO} 94 if [ "${CSUM}" == "${HASH}" -o ${SIZE} -eq 0 ]; then 95 echo "+" 96 else 97 echo "-" 98 fi 99 fi 100 done 101 echo 102} 103 104function gen_its() 105{ 106 ITS=${OUT}/image.its 107 TMP_ITB=${OUT}/image.tmp 108 109 # add placeholder 110 cp -a ${ITB} ${TMP_ITB} 111 for NAME in `fdtget -l ${ITB} /images`; do 112 fdtput -t s ${TMP_ITB} /images/${NAME} data "/INCBIN/(${NAME})" 113 done 114 dtc -I dtb -O dts ${TMP_ITB} -o ${ITS} 115 rm -f ${TMP_ITB} 116 117 # fixup placeholder: data = "/INCBIN/(...)"; -> data = /incbin/("..."); 118 sed -i "s/\"\/INCBIN\/(\(.*\))\"/\/incbin\/(\"\1\")/" ${ITS} 119 120 # remove 121 sed -i "/memreserve/d" ${ITS} 122 sed -i "/timestamp/d" ${ITS} 123 sed -i "/data-size/d" ${ITS} 124 sed -i "/data-position/d" ${ITS} 125 sed -i "/value/d" ${ITS} 126 sed -i "/hashed-strings/d" ${ITS} 127 sed -i "/hashed-nodes/d" ${ITS} 128 sed -i "/signer-version/d" ${ITS} 129 sed -i "/signer-name/d" ${ITS} 130} 131 132args_process $* 133unpack_itb 134gen_its 135 136