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 9*436376efSJoseph ChenIMAGE_ITS="image.its" 10*436376efSJoseph Chen 1175323eb8SJoseph Chenfunction usage() 1275323eb8SJoseph Chen{ 1375323eb8SJoseph Chen echo 1475323eb8SJoseph Chen echo "usage:" 151ae3dd15SJoseph Chen echo " $0 -f [fit/itb] -o [output]" 1675323eb8SJoseph Chen echo 1775323eb8SJoseph Chen} 1875323eb8SJoseph Chen 1975323eb8SJoseph Chenfunction args_process() 2075323eb8SJoseph Chen{ 211ae3dd15SJoseph Chen if [ $# -ne 4 -a $# -ne 2 ]; then 2275323eb8SJoseph Chen usage 2375323eb8SJoseph Chen exit 1 2475323eb8SJoseph Chen fi 2575323eb8SJoseph Chen 2675323eb8SJoseph Chen while [ $# -gt 0 ]; do 2775323eb8SJoseph Chen case $1 in 2875323eb8SJoseph Chen -f) 295facc6b8SJoseph Chen IMAGE=$2 3075323eb8SJoseph Chen shift 2 3175323eb8SJoseph Chen ;; 3275323eb8SJoseph Chen -o) 335facc6b8SJoseph Chen IMAGE_DIR=$2 3475323eb8SJoseph Chen shift 2 3575323eb8SJoseph Chen ;; 3675323eb8SJoseph Chen *) 3775323eb8SJoseph Chen usage 3875323eb8SJoseph Chen exit 1 3975323eb8SJoseph Chen ;; 4075323eb8SJoseph Chen esac 4175323eb8SJoseph Chen done 4275323eb8SJoseph Chen 435facc6b8SJoseph Chen if [ ! -f $IMAGE ]; then 445facc6b8SJoseph Chen echo "ERROR: No $IMAGE" 4575323eb8SJoseph Chen exit 1 4675323eb8SJoseph Chen fi 4775323eb8SJoseph Chen 485facc6b8SJoseph Chen if [ -z $IMAGE_DIR ]; then 495facc6b8SJoseph Chen IMAGE_DIR="out" 5075323eb8SJoseph Chen fi 5175323eb8SJoseph Chen 525facc6b8SJoseph Chen mkdir -p $IMAGE_DIR 5375323eb8SJoseph Chen} 5475323eb8SJoseph Chen 5575323eb8SJoseph Chenfunction gen_images() 5675323eb8SJoseph Chen{ 575facc6b8SJoseph Chen printf "\n# Unpack $IMAGE to directory $IMAGE_DIR/\n" 585facc6b8SJoseph Chen fdtget -l $IMAGE /images > $IMAGE_DIR/unpack.txt 595facc6b8SJoseph Chen cat $IMAGE_DIR/unpack.txt | while read line 6075323eb8SJoseph Chen do 610fb435faSJoseph Chen # generate image 625facc6b8SJoseph Chen NODE="/images/${line}" 635facc6b8SJoseph Chen NAME=`fdtget -ts $IMAGE $NODE image` 645facc6b8SJoseph Chen OFFS=`fdtget -ti $IMAGE $NODE data-position` 655facc6b8SJoseph Chen SIZE=`fdtget -ti $IMAGE $NODE data-size` 665facc6b8SJoseph Chen if [ -z $OFFS ]; then 671ae3dd15SJoseph Chen continue; 6875323eb8SJoseph Chen fi 691ae3dd15SJoseph Chen 705facc6b8SJoseph Chen if [ $SIZE -ne 0 ]; then 715facc6b8SJoseph Chen dd if=$IMAGE of=$IMAGE_DIR/dd.tmp bs=$OFFS skip=1 >/dev/null 2>&1 725facc6b8SJoseph Chen dd if=$IMAGE_DIR/dd.tmp of=$IMAGE_DIR/$NAME bs=$SIZE count=1 >/dev/null 2>&1 735facc6b8SJoseph Chen rm $IMAGE_DIR/dd.tmp 741ae3dd15SJoseph Chen else 755facc6b8SJoseph Chen touch $IMAGE_DIR/$NAME 761ae3dd15SJoseph Chen fi 770fb435faSJoseph Chen 780fb435faSJoseph Chen # hash verify 795facc6b8SJoseph Chen algo=`fdtget -ts $IMAGE $NODE/hash@1 algo` 800fb435faSJoseph Chen if [ -z $algo ]; then 815facc6b8SJoseph Chen printf " %-20s: %d bytes" $NAME $SIZE 820fb435faSJoseph Chen continue; 830fb435faSJoseph Chen fi 840fb435faSJoseph Chen 855facc6b8SJoseph Chen data=`fdtget -tx $IMAGE $NODE/hash@1 value` 860fb435faSJoseph Chen data=`echo " "$data | sed "s/ / 0x/g"` 875facc6b8SJoseph Chen csum=`"$algo"sum $IMAGE_DIR/$NAME | awk '{ print $1}'` 880fb435faSJoseph Chen 890fb435faSJoseph Chen hash="" 900fb435faSJoseph Chen for((i=1;;i++)); 910fb435faSJoseph Chen do 920fb435faSJoseph Chen hex=`echo $data | awk -v idx=$i '{ print $idx }'` 930fb435faSJoseph Chen if [ -z $hex ]; then 940fb435faSJoseph Chen break; 950fb435faSJoseph Chen fi 960fb435faSJoseph Chen 970fb435faSJoseph Chen hex=`printf "%08x" $hex` # align !! 980fb435faSJoseph Chen hash="$hash$hex" 990fb435faSJoseph Chen done 1000fb435faSJoseph Chen 1015facc6b8SJoseph Chen printf " %-20s: %d bytes... %s" $NAME $SIZE $algo 1025facc6b8SJoseph Chen if [ "$csum" = "$hash" -o $SIZE -eq 0 ]; then 1030fb435faSJoseph Chen echo "+" 1040fb435faSJoseph Chen else 1050fb435faSJoseph Chen echo "-" 1060fb435faSJoseph Chen fi 1071ae3dd15SJoseph Chen done 1081ae3dd15SJoseph Chen 10975323eb8SJoseph Chen echo 11075323eb8SJoseph Chen} 11175323eb8SJoseph Chen 112*436376efSJoseph Chenfunction gen_its() 113*436376efSJoseph Chen{ 114*436376efSJoseph Chen ./scripts/dtc/dtc -I dtb -O dts $IMAGE -o $IMAGE_DIR/$IMAGE_ITS >/dev/null 2>&1 115*436376efSJoseph Chen 116*436376efSJoseph Chen FIT_IMAGE_ITS=$IMAGE_DIR/$IMAGE_ITS 117*436376efSJoseph Chen 118*436376efSJoseph Chen # remove 119*436376efSJoseph Chen sed -i "/memreserve/d" $FIT_IMAGE_ITS 120*436376efSJoseph Chen sed -i "/data-size/d" $FIT_IMAGE_ITS 121*436376efSJoseph Chen sed -i "/data-position/d" $FIT_IMAGE_ITS 122*436376efSJoseph Chen sed -i "/value/d" $FIT_IMAGE_ITS 123*436376efSJoseph Chen sed -i "/hashed-strings/d" $FIT_IMAGE_ITS 124*436376efSJoseph Chen sed -i "/hashed-nodes/d" $FIT_IMAGE_ITS 125*436376efSJoseph Chen sed -i "/signer-version/d" $FIT_IMAGE_ITS 126*436376efSJoseph Chen sed -i "/signer-name/d" $FIT_IMAGE_ITS 127*436376efSJoseph Chen sed -i "/timestamp/d" $FIT_IMAGE_ITS 128*436376efSJoseph Chen 129*436376efSJoseph Chen # add placeholder 130*436376efSJoseph Chen sed -i '/image = /a\ \ \ data = /incbin/("IMAGE_PATH");' $FIT_IMAGE_ITS 131*436376efSJoseph Chen 132*436376efSJoseph Chen # fixup placeholder: "data = /incbin/("...");" 133*436376efSJoseph Chen num=`grep 'image =' $FIT_IMAGE_ITS | wc -l` 134*436376efSJoseph Chen for ((i = 1; i <= $num; i++)); 135*436376efSJoseph Chen do 136*436376efSJoseph Chen NAME=`grep 'image =' $FIT_IMAGE_ITS | sed -n ''${i}p'' | awk '{ printf $3 }' | tr -d '";'` 137*436376efSJoseph Chen sed -i ''$i',/IMAGE_PATH/{s/IMAGE_PATH/.\/'$NAME'/}' $FIT_IMAGE_ITS 138*436376efSJoseph Chen done 139*436376efSJoseph Chen} 140*436376efSJoseph Chen 14175323eb8SJoseph Chenargs_process $* 14275323eb8SJoseph Chengen_images 143*436376efSJoseph Chengen_its 1440fb435faSJoseph Chen 145