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