xref: /rk3399_rockchip-uboot/scripts/fit-unpack.sh (revision 1ff581bb9ed8deefd78faf794daf33c28dd896a3)
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
975323eb8SJoseph Chenfunction usage()
1075323eb8SJoseph Chen{
1175323eb8SJoseph Chen	echo
1275323eb8SJoseph Chen	echo "usage:"
13*1ff581bbSJoseph Chen	echo "    $0 -f [fit/itb] -o [out]"
1475323eb8SJoseph Chen	echo
1575323eb8SJoseph Chen}
1675323eb8SJoseph Chen
1775323eb8SJoseph Chenfunction args_process()
1875323eb8SJoseph Chen{
191ae3dd15SJoseph Chen	if [ $# -ne 4 -a $# -ne 2 ]; then
2075323eb8SJoseph Chen		usage
2175323eb8SJoseph Chen		exit 1
2275323eb8SJoseph Chen	fi
2375323eb8SJoseph Chen
2475323eb8SJoseph Chen	while [ $# -gt 0 ]; do
2575323eb8SJoseph Chen		case $1 in
2675323eb8SJoseph Chen			-f)
27*1ff581bbSJoseph Chen				ITB=$2
2875323eb8SJoseph Chen				shift 2
2975323eb8SJoseph Chen				;;
3075323eb8SJoseph Chen			-o)
31*1ff581bbSJoseph Chen				OUT=$2
3275323eb8SJoseph Chen				shift 2
3375323eb8SJoseph Chen				;;
3475323eb8SJoseph Chen			*)
3575323eb8SJoseph Chen				usage
3675323eb8SJoseph Chen				exit 1
3775323eb8SJoseph Chen				;;
3875323eb8SJoseph Chen		esac
3975323eb8SJoseph Chen	done
4075323eb8SJoseph Chen
41*1ff581bbSJoseph Chen	if [ ! -f ${ITB} ]; then
42*1ff581bbSJoseph Chen		echo "ERROR: No ${ITB}"
4375323eb8SJoseph Chen		exit 1
4475323eb8SJoseph Chen	fi
4575323eb8SJoseph Chen
46*1ff581bbSJoseph Chen	if [ -z ${OUT} ]; then
47*1ff581bbSJoseph Chen		OUT="out"
4875323eb8SJoseph Chen	fi
4975323eb8SJoseph Chen}
5075323eb8SJoseph Chen
51*1ff581bbSJoseph Chenunpack_itb()
5275323eb8SJoseph Chen{
53*1ff581bbSJoseph Chen	mkdir -p ${OUT}
54*1ff581bbSJoseph Chen	echo "Unpack to directory ${OUT}:"
55*1ff581bbSJoseph Chen
56*1ff581bbSJoseph Chen	for NAME in `fdtget -l ${ITB} /images`
5775323eb8SJoseph Chen	do
58*1ff581bbSJoseph Chen		# generate ITB
59*1ff581bbSJoseph Chen		NODE="/images/${NAME}"
60*1ff581bbSJoseph Chen		OFFS=`fdtget -ti ${ITB} ${NODE} data-position`
61*1ff581bbSJoseph Chen		SIZE=`fdtget -ti ${ITB} ${NODE} data-size`
62*1ff581bbSJoseph Chen		if [ -z ${OFFS} ]; then
631ae3dd15SJoseph Chen			continue;
6475323eb8SJoseph Chen		fi
651ae3dd15SJoseph Chen
66*1ff581bbSJoseph Chen		if [ ${SIZE} -ne 0 ]; then
67*1ff581bbSJoseph Chen			dd if=${ITB} of=${OUT}/${NAME} bs=${SIZE} count=1 skip=${OFFS} iflag=skip_bytes >/dev/null 2>&1
681ae3dd15SJoseph Chen		else
69*1ff581bbSJoseph Chen			touch ${OUT}/${NAME}
701ae3dd15SJoseph Chen		fi
710fb435faSJoseph Chen
720fb435faSJoseph Chen		# hash verify
73*1ff581bbSJoseph Chen		ALGO=`fdtget -ts ${ITB} ${NODE}/hash algo`
74*1ff581bbSJoseph Chen		if [ -z ${ALGO} ]; then
75*1ff581bbSJoseph Chen			printf "    %-20s: %d bytes" ${NAME} ${SIZE}
76*1ff581bbSJoseph Chen		else
77*1ff581bbSJoseph Chen			VALUE=`fdtget -tx ${ITB} ${NODE}/hash value`
78*1ff581bbSJoseph Chen			VALUE=`echo " "${VALUE} | sed "s/ / 0x/g"`
79*1ff581bbSJoseph Chen			CSUM=`"${ALGO}"sum ${OUT}/${NAME} | awk '{ print $1}'`
800fb435faSJoseph Chen
81*1ff581bbSJoseph Chen			HASH=""
820fb435faSJoseph Chen			for((i=1;;i++));
830fb435faSJoseph Chen			do
84*1ff581bbSJoseph Chen				HEX=`echo ${VALUE} | awk -v idx=$i '{ print $idx }'`
85*1ff581bbSJoseph Chen				if [ -z ${HEX} ]; then
860fb435faSJoseph Chen					break;
870fb435faSJoseph Chen				fi
880fb435faSJoseph Chen
89*1ff581bbSJoseph Chen				HEX=`printf "%08x" ${HEX}`
90*1ff581bbSJoseph Chen				HASH="${HASH}${HEX}"
910fb435faSJoseph Chen			done
920fb435faSJoseph Chen
93*1ff581bbSJoseph Chen			printf "  %-20s: %d bytes... %s" ${NAME} ${SIZE} ${ALGO}
94*1ff581bbSJoseph Chen			if [ "${CSUM}" == "${HASH}" -o ${SIZE} -eq 0 ]; then
950fb435faSJoseph Chen				echo "+"
960fb435faSJoseph Chen			else
970fb435faSJoseph Chen				echo "-"
980fb435faSJoseph Chen			fi
99*1ff581bbSJoseph Chen		fi
1001ae3dd15SJoseph Chen	done
10175323eb8SJoseph Chen	echo
10275323eb8SJoseph Chen}
10375323eb8SJoseph Chen
104436376efSJoseph Chenfunction gen_its()
105436376efSJoseph Chen{
106*1ff581bbSJoseph Chen	ITS=${OUT}/image.its
107*1ff581bbSJoseph Chen	TMP_ITB=${OUT}/image.tmp
108436376efSJoseph Chen
109436376efSJoseph Chen	# add placeholder
110*1ff581bbSJoseph Chen	cp -a ${ITB} ${TMP_ITB}
111*1ff581bbSJoseph Chen	for NAME in `fdtget -l ${ITB} /images`; do
112*1ff581bbSJoseph Chen		fdtput -t s ${TMP_ITB} /images/${NAME} data "/INCBIN/(${NAME})"
113436376efSJoseph Chen	done
114*1ff581bbSJoseph Chen	dtc -I dtb -O dts ${TMP_ITB} -o ${ITS}
115*1ff581bbSJoseph Chen	rm -f ${TMP_ITB}
116*1ff581bbSJoseph Chen
117*1ff581bbSJoseph Chen	# fixup placeholder: data = "/INCBIN/(...)"; -> data = /incbin/("...");
118*1ff581bbSJoseph Chen	sed -i "s/\"\/INCBIN\/(\(.*\))\"/\/incbin\/(\"\1\")/" ${ITS}
119*1ff581bbSJoseph Chen
120*1ff581bbSJoseph Chen	# remove
121*1ff581bbSJoseph Chen	sed -i "/memreserve/d"		${ITS}
122*1ff581bbSJoseph Chen	sed -i "/timestamp/d"		${ITS}
123*1ff581bbSJoseph Chen	sed -i "/data-size/d"		${ITS}
124*1ff581bbSJoseph Chen	sed -i "/data-position/d"	${ITS}
125*1ff581bbSJoseph Chen	sed -i "/value/d"		${ITS}
126*1ff581bbSJoseph Chen	sed -i "/hashed-strings/d"	${ITS}
127*1ff581bbSJoseph Chen	sed -i "/hashed-nodes/d"	${ITS}
128*1ff581bbSJoseph Chen	sed -i "/signer-version/d"	${ITS}
129*1ff581bbSJoseph Chen	sed -i "/signer-name/d"		${ITS}
130436376efSJoseph Chen}
131436376efSJoseph Chen
13275323eb8SJoseph Chenargs_process $*
133*1ff581bbSJoseph Chenunpack_itb
134436376efSJoseph Chengen_its
1350fb435faSJoseph Chen
136