xref: /rk3399_rockchip-uboot/scripts/fit-unpack.sh (revision 827e2ae92e2103f82dab5b54228ad24e40db6263)
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 [out]"
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				ITB=$2
28				shift 2
29				;;
30			-o)
31				OUT=$2
32				shift 2
33				;;
34			*)
35				usage
36				exit 1
37				;;
38		esac
39	done
40
41	if [ ! -f ${ITB} ]; then
42		echo "ERROR: No ${ITB}"
43		exit 1
44	fi
45
46	if [ -z ${OUT} ]; then
47		OUT="out"
48	fi
49}
50
51unpack_itb()
52{
53	mkdir -p ${OUT}
54	echo "Unpack to directory ${OUT}:"
55
56	for NAME in `fdtget -l ${ITB} /images`
57	do
58		# generate ITB
59		NODE="/images/${NAME}"
60		OFFS=`fdtget -ti ${ITB} ${NODE} data-position`
61		SIZE=`fdtget -ti ${ITB} ${NODE} data-size`
62		if [ -z ${OFFS} ]; then
63			continue;
64		fi
65
66		if [ ${SIZE} -ne 0 ]; then
67			dd if=${ITB} of=${OUT}/${NAME} bs=${SIZE} count=1 skip=${OFFS} iflag=skip_bytes >/dev/null 2>&1
68		else
69			touch ${OUT}/${NAME}
70		fi
71
72		# hash verify
73		ALGO=`fdtget -ts ${ITB} ${NODE}/hash algo`
74		if [ -z ${ALGO} ]; then
75			printf "    %-20s: %d bytes" ${NAME} ${SIZE}
76		else
77			VALUE=`fdtget -tx ${ITB} ${NODE}/hash value`
78			VALUE=`echo " "${VALUE} | sed "s/ / 0x/g"`
79			CSUM=`"${ALGO}"sum ${OUT}/${NAME} | awk '{ print $1}'`
80
81			HASH=""
82			for((i=1;;i++));
83			do
84				HEX=`echo ${VALUE} | awk -v idx=$i '{ print $idx }'`
85				if [ -z ${HEX} ]; then
86					break;
87				fi
88
89				HEX=`printf "%08x" ${HEX}`
90				HASH="${HASH}${HEX}"
91			done
92
93			printf "  %-20s: %d bytes... %s" ${NAME} ${SIZE} ${ALGO}
94			if [ "${CSUM}" == "${HASH}" -o ${SIZE} -eq 0 ]; then
95				echo "+"
96			else
97				echo "-"
98			fi
99		fi
100	done
101	echo
102}
103
104function gen_its()
105{
106	ITS=${OUT}/image.its
107	TMP_ITB=${OUT}/image.tmp
108
109	# add placeholder
110	cp -a ${ITB} ${TMP_ITB}
111	for NAME in `fdtget -l ${ITB} /images`; do
112		fdtput -t s ${TMP_ITB} /images/${NAME} data "/INCBIN/(${NAME})"
113	done
114	dtc -I dtb -O dts ${TMP_ITB} -o ${ITS}
115	rm -f ${TMP_ITB}
116
117	# fixup placeholder: data = "/INCBIN/(...)"; -> data = /incbin/("...");
118	sed -i "s/\"\/INCBIN\/(\(.*\))\"/\/incbin\/(\"\1\")/" ${ITS}
119
120	# remove
121	sed -i "/memreserve/d"		${ITS}
122	sed -i "/timestamp/d"		${ITS}
123	sed -i "/data-size/d"		${ITS}
124	sed -i "/data-position/d"	${ITS}
125	sed -i "/value/d"		${ITS}
126	sed -i "/hashed-strings/d"	${ITS}
127	sed -i "/hashed-nodes/d"	${ITS}
128	sed -i "/signer-version/d"	${ITS}
129	sed -i "/signer-name/d"		${ITS}
130}
131
132args_process $*
133unpack_itb
134gen_its
135
136