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