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 elif ! file ${ITB} | grep 'Device Tree Blob' ; then 45 echo "ERROR: ${ITB} is not FIT image" 46 exit 1 47 fi 48 49 if [ -z ${OUT} ]; then 50 OUT="out" 51 fi 52} 53 54unpack_itb() 55{ 56 mkdir -p ${OUT} 57 echo "Unpack to directory ${OUT}:" 58 59 for NAME in `fdtget -l ${ITB} /images` 60 do 61 # generate ITB 62 NODE="/images/${NAME}" 63 OFFS=`fdtget -ti ${ITB} ${NODE} data-position` 64 SIZE=`fdtget -ti ${ITB} ${NODE} data-size` 65 if [ -z ${OFFS} ]; then 66 continue; 67 fi 68 69 if [ ${SIZE} -ne 0 ]; then 70 dd if=${ITB} of=${OUT}/${NAME} bs=${SIZE} count=1 skip=${OFFS} iflag=skip_bytes >/dev/null 2>&1 71 else 72 touch ${OUT}/${NAME} 73 fi 74 75 # hash verify 76 ALGO=`fdtget -ts ${ITB} ${NODE}/hash algo` 77 if [ -z ${ALGO} ]; then 78 printf " %-20s: %d bytes" ${NAME} ${SIZE} 79 else 80 VALUE=`fdtget -tx ${ITB} ${NODE}/hash value` 81 VALUE=`echo " "${VALUE} | sed "s/ / 0x/g"` 82 CSUM=`"${ALGO}"sum ${OUT}/${NAME} | awk '{ print $1}'` 83 84 HASH="" 85 for((i=1;;i++)); 86 do 87 HEX=`echo ${VALUE} | awk -v idx=$i '{ print $idx }'` 88 if [ -z ${HEX} ]; then 89 break; 90 fi 91 92 HEX=`printf "%08x" ${HEX}` 93 HASH="${HASH}${HEX}" 94 done 95 96 printf " %-20s: %d bytes... %s" ${NAME} ${SIZE} ${ALGO} 97 if [ "${CSUM}" == "${HASH}" -o ${SIZE} -eq 0 ]; then 98 echo "+" 99 else 100 echo "-" 101 fi 102 fi 103 done 104 echo 105} 106 107function gen_its() 108{ 109 ITS=${OUT}/image.its 110 TMP_ITB=${OUT}/image.tmp 111 112 # add placeholder 113 cp -a ${ITB} ${TMP_ITB} 114 for NAME in `fdtget -l ${ITB} /images`; do 115 fdtput -t s ${TMP_ITB} /images/${NAME} data "/INCBIN/(${NAME})" 116 done 117 dtc -I dtb -O dts ${TMP_ITB} -o ${ITS} 118 rm -f ${TMP_ITB} 119 120 # fixup placeholder: data = "/INCBIN/(...)"; -> data = /incbin/("..."); 121 sed -i "s/\"\/INCBIN\/(\(.*\))\"/\/incbin\/(\"\1\")/" ${ITS} 122 123 # remove 124 sed -i "/memreserve/d" ${ITS} 125 sed -i "/timestamp/d" ${ITS} 126 sed -i "/data-size/d" ${ITS} 127 sed -i "/data-position/d" ${ITS} 128 sed -i "/value/d" ${ITS} 129 sed -i "/hashed-strings/d" ${ITS} 130 sed -i "/hashed-nodes/d" ${ITS} 131 sed -i "/signer-version/d" ${ITS} 132 sed -i "/signer-name/d" ${ITS} 133} 134 135args_process $* 136unpack_itb 137gen_its 138 139