xref: /rk3399_rockchip-uboot/scripts/fit-unpack.sh (revision 5facc6b84e42d8fb07a96523784a4c8c1cd4299f)
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 [output]"
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				IMAGE=$2
28				shift 2
29				;;
30			-o)
31				IMAGE_DIR=$2
32				shift 2
33				;;
34			*)
35				usage
36				exit 1
37				;;
38		esac
39	done
40
41	if [ ! -f $IMAGE ]; then
42		echo "ERROR: No $IMAGE"
43		exit 1
44	fi
45
46	if [ -z $IMAGE_DIR ]; then
47		IMAGE_DIR="out"
48	fi
49
50	mkdir -p $IMAGE_DIR
51}
52
53function gen_images()
54{
55	printf "\n# Unpack $IMAGE to directory $IMAGE_DIR/\n"
56	fdtget -l $IMAGE /images > $IMAGE_DIR/unpack.txt
57	cat $IMAGE_DIR/unpack.txt | while read line
58	do
59		# generate image
60		NODE="/images/${line}"
61		NAME=`fdtget -ts $IMAGE $NODE image`
62		OFFS=`fdtget -ti $IMAGE $NODE data-position`
63		SIZE=`fdtget -ti $IMAGE $NODE data-size`
64		if [ -z $OFFS ]; then
65			continue;
66		fi
67
68		if [ $SIZE -ne 0 ]; then
69			dd if=$IMAGE of=$IMAGE_DIR/dd.tmp  bs=$OFFS skip=1  >/dev/null 2>&1
70			dd if=$IMAGE_DIR/dd.tmp of=$IMAGE_DIR/$NAME bs=$SIZE count=1 >/dev/null 2>&1
71			rm $IMAGE_DIR/dd.tmp
72		else
73			touch $IMAGE_DIR/$NAME
74		fi
75
76		# hash verify
77		algo=`fdtget -ts $IMAGE $NODE/hash@1 algo`
78		if [ -z $algo ]; then
79			printf "    %-20s: %d bytes" $NAME $SIZE
80			continue;
81		fi
82
83		data=`fdtget -tx $IMAGE $NODE/hash@1 value`
84		data=`echo " "$data | sed "s/ / 0x/g"`
85		csum=`"$algo"sum $IMAGE_DIR/$NAME | awk '{ print $1}'`
86
87		hash=""
88		for((i=1;;i++));
89		do
90			hex=`echo $data | awk -v idx=$i '{ print $idx }'`
91			if [ -z $hex ]; then
92				break;
93			fi
94
95			hex=`printf "%08x" $hex` # align !!
96			hash="$hash$hex"
97		done
98
99		printf "  %-20s: %d bytes... %s" $NAME $SIZE $algo
100		if [ "$csum" = "$hash" -o $SIZE -eq 0 ]; then
101			echo "+"
102		else
103			echo "-"
104		fi
105	done
106
107	rm $output/unpack.txt
108	echo
109}
110
111args_process $*
112gen_images
113
114