xref: /rk3399_rockchip-uboot/scripts/fit-unpack.sh (revision 436376efb7004be2d944d59ca26c29890f93fae7)
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