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 9IMAGE_ITS="image.its" 10 11function usage() 12{ 13 echo 14 echo "usage:" 15 echo " $0 -f [fit/itb] -o [output]" 16 echo 17} 18 19function args_process() 20{ 21 if [ $# -ne 4 -a $# -ne 2 ]; then 22 usage 23 exit 1 24 fi 25 26 while [ $# -gt 0 ]; do 27 case $1 in 28 -f) 29 IMAGE=$2 30 shift 2 31 ;; 32 -o) 33 IMAGE_DIR=$2 34 shift 2 35 ;; 36 *) 37 usage 38 exit 1 39 ;; 40 esac 41 done 42 43 if [ ! -f $IMAGE ]; then 44 echo "ERROR: No $IMAGE" 45 exit 1 46 fi 47 48 if [ -z $IMAGE_DIR ]; then 49 IMAGE_DIR="out" 50 fi 51 52 mkdir -p $IMAGE_DIR 53} 54 55function gen_images() 56{ 57 printf "\n# Unpack $IMAGE to directory $IMAGE_DIR/\n" 58 fdtget -l $IMAGE /images > $IMAGE_DIR/unpack.txt 59 cat $IMAGE_DIR/unpack.txt | while read line 60 do 61 # generate image 62 NODE="/images/${line}" 63 NAME=`fdtget -ts $IMAGE $NODE image` 64 OFFS=`fdtget -ti $IMAGE $NODE data-position` 65 SIZE=`fdtget -ti $IMAGE $NODE data-size` 66 if [ -z $OFFS ]; then 67 continue; 68 fi 69 70 if [ $SIZE -ne 0 ]; then 71 dd if=$IMAGE of=$IMAGE_DIR/dd.tmp bs=$OFFS skip=1 >/dev/null 2>&1 72 dd if=$IMAGE_DIR/dd.tmp of=$IMAGE_DIR/$NAME bs=$SIZE count=1 >/dev/null 2>&1 73 rm $IMAGE_DIR/dd.tmp 74 else 75 touch $IMAGE_DIR/$NAME 76 fi 77 78 # hash verify 79 algo=`fdtget -ts $IMAGE $NODE/hash@1 algo` 80 if [ -z $algo ]; then 81 printf " %-20s: %d bytes" $NAME $SIZE 82 continue; 83 fi 84 85 data=`fdtget -tx $IMAGE $NODE/hash@1 value` 86 data=`echo " "$data | sed "s/ / 0x/g"` 87 csum=`"$algo"sum $IMAGE_DIR/$NAME | awk '{ print $1}'` 88 89 hash="" 90 for((i=1;;i++)); 91 do 92 hex=`echo $data | awk -v idx=$i '{ print $idx }'` 93 if [ -z $hex ]; then 94 break; 95 fi 96 97 hex=`printf "%08x" $hex` # align !! 98 hash="$hash$hex" 99 done 100 101 printf " %-20s: %d bytes... %s" $NAME $SIZE $algo 102 if [ "$csum" = "$hash" -o $SIZE -eq 0 ]; then 103 echo "+" 104 else 105 echo "-" 106 fi 107 done 108 109 echo 110} 111 112function gen_its() 113{ 114 ./scripts/dtc/dtc -I dtb -O dts $IMAGE -o $IMAGE_DIR/$IMAGE_ITS >/dev/null 2>&1 115 116 FIT_IMAGE_ITS=$IMAGE_DIR/$IMAGE_ITS 117 118 # remove 119 sed -i "/memreserve/d" $FIT_IMAGE_ITS 120 sed -i "/data-size/d" $FIT_IMAGE_ITS 121 sed -i "/data-position/d" $FIT_IMAGE_ITS 122 sed -i "/value/d" $FIT_IMAGE_ITS 123 sed -i "/hashed-strings/d" $FIT_IMAGE_ITS 124 sed -i "/hashed-nodes/d" $FIT_IMAGE_ITS 125 sed -i "/signer-version/d" $FIT_IMAGE_ITS 126 sed -i "/signer-name/d" $FIT_IMAGE_ITS 127 sed -i "/timestamp/d" $FIT_IMAGE_ITS 128 129 # add placeholder 130 sed -i '/image = /a\ \ \ data = /incbin/("IMAGE_PATH");' $FIT_IMAGE_ITS 131 132 # fixup placeholder: "data = /incbin/("...");" 133 num=`grep 'image =' $FIT_IMAGE_ITS | wc -l` 134 for ((i = 1; i <= $num; i++)); 135 do 136 NAME=`grep 'image =' $FIT_IMAGE_ITS | sed -n ''${i}p'' | awk '{ printf $3 }' | tr -d '";'` 137 sed -i ''$i',/IMAGE_PATH/{s/IMAGE_PATH/.\/'$NAME'/}' $FIT_IMAGE_ITS 138 done 139} 140 141args_process $* 142gen_images 143gen_its 144 145