xref: /rk3399_rockchip-uboot/scripts/fit-unpack.sh (revision e156df4354e0bed6fc45424c9e997a702a1900f5)
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:"
131ff581bbSJoseph 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)
271ff581bbSJoseph Chen				ITB=$2
2875323eb8SJoseph Chen				shift 2
2975323eb8SJoseph Chen				;;
3075323eb8SJoseph Chen			-o)
311ff581bbSJoseph 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
411ff581bbSJoseph Chen	if [ ! -f ${ITB} ]; then
421ff581bbSJoseph Chen		echo "ERROR: No ${ITB}"
4375323eb8SJoseph Chen		exit 1
44*e156df43SJoseph Chen	elif ! file ${ITB} | grep 'Device Tree Blob' ; then
45*e156df43SJoseph Chen		echo "ERROR: ${ITB} is not FIT image"
46*e156df43SJoseph Chen		exit 1
4775323eb8SJoseph Chen	fi
4875323eb8SJoseph Chen
491ff581bbSJoseph Chen	if [ -z ${OUT} ]; then
501ff581bbSJoseph Chen		OUT="out"
5175323eb8SJoseph Chen	fi
5275323eb8SJoseph Chen}
5375323eb8SJoseph Chen
541ff581bbSJoseph Chenunpack_itb()
5575323eb8SJoseph Chen{
561ff581bbSJoseph Chen	mkdir -p ${OUT}
571ff581bbSJoseph Chen	echo "Unpack to directory ${OUT}:"
581ff581bbSJoseph Chen
591ff581bbSJoseph Chen	for NAME in `fdtget -l ${ITB} /images`
6075323eb8SJoseph Chen	do
611ff581bbSJoseph Chen		# generate ITB
621ff581bbSJoseph Chen		NODE="/images/${NAME}"
631ff581bbSJoseph Chen		OFFS=`fdtget -ti ${ITB} ${NODE} data-position`
641ff581bbSJoseph Chen		SIZE=`fdtget -ti ${ITB} ${NODE} data-size`
651ff581bbSJoseph Chen		if [ -z ${OFFS} ]; then
661ae3dd15SJoseph Chen			continue;
6775323eb8SJoseph Chen		fi
681ae3dd15SJoseph Chen
691ff581bbSJoseph Chen		if [ ${SIZE} -ne 0 ]; then
701ff581bbSJoseph Chen			dd if=${ITB} of=${OUT}/${NAME} bs=${SIZE} count=1 skip=${OFFS} iflag=skip_bytes >/dev/null 2>&1
711ae3dd15SJoseph Chen		else
721ff581bbSJoseph Chen			touch ${OUT}/${NAME}
731ae3dd15SJoseph Chen		fi
740fb435faSJoseph Chen
750fb435faSJoseph Chen		# hash verify
761ff581bbSJoseph Chen		ALGO=`fdtget -ts ${ITB} ${NODE}/hash algo`
771ff581bbSJoseph Chen		if [ -z ${ALGO} ]; then
781ff581bbSJoseph Chen			printf "    %-20s: %d bytes" ${NAME} ${SIZE}
791ff581bbSJoseph Chen		else
801ff581bbSJoseph Chen			VALUE=`fdtget -tx ${ITB} ${NODE}/hash value`
811ff581bbSJoseph Chen			VALUE=`echo " "${VALUE} | sed "s/ / 0x/g"`
821ff581bbSJoseph Chen			CSUM=`"${ALGO}"sum ${OUT}/${NAME} | awk '{ print $1}'`
830fb435faSJoseph Chen
841ff581bbSJoseph Chen			HASH=""
850fb435faSJoseph Chen			for((i=1;;i++));
860fb435faSJoseph Chen			do
871ff581bbSJoseph Chen				HEX=`echo ${VALUE} | awk -v idx=$i '{ print $idx }'`
881ff581bbSJoseph Chen				if [ -z ${HEX} ]; then
890fb435faSJoseph Chen					break;
900fb435faSJoseph Chen				fi
910fb435faSJoseph Chen
921ff581bbSJoseph Chen				HEX=`printf "%08x" ${HEX}`
931ff581bbSJoseph Chen				HASH="${HASH}${HEX}"
940fb435faSJoseph Chen			done
950fb435faSJoseph Chen
961ff581bbSJoseph Chen			printf "  %-20s: %d bytes... %s" ${NAME} ${SIZE} ${ALGO}
971ff581bbSJoseph Chen			if [ "${CSUM}" == "${HASH}" -o ${SIZE} -eq 0 ]; then
980fb435faSJoseph Chen				echo "+"
990fb435faSJoseph Chen			else
1000fb435faSJoseph Chen				echo "-"
1010fb435faSJoseph Chen			fi
1021ff581bbSJoseph Chen		fi
1031ae3dd15SJoseph Chen	done
10475323eb8SJoseph Chen	echo
10575323eb8SJoseph Chen}
10675323eb8SJoseph Chen
107436376efSJoseph Chenfunction gen_its()
108436376efSJoseph Chen{
1091ff581bbSJoseph Chen	ITS=${OUT}/image.its
1101ff581bbSJoseph Chen	TMP_ITB=${OUT}/image.tmp
111436376efSJoseph Chen
112436376efSJoseph Chen	# add placeholder
1131ff581bbSJoseph Chen	cp -a ${ITB} ${TMP_ITB}
1141ff581bbSJoseph Chen	for NAME in `fdtget -l ${ITB} /images`; do
1151ff581bbSJoseph Chen		fdtput -t s ${TMP_ITB} /images/${NAME} data "/INCBIN/(${NAME})"
116436376efSJoseph Chen	done
1171ff581bbSJoseph Chen	dtc -I dtb -O dts ${TMP_ITB} -o ${ITS}
1181ff581bbSJoseph Chen	rm -f ${TMP_ITB}
1191ff581bbSJoseph Chen
1201ff581bbSJoseph Chen	# fixup placeholder: data = "/INCBIN/(...)"; -> data = /incbin/("...");
1211ff581bbSJoseph Chen	sed -i "s/\"\/INCBIN\/(\(.*\))\"/\/incbin\/(\"\1\")/" ${ITS}
1221ff581bbSJoseph Chen
1231ff581bbSJoseph Chen	# remove
1241ff581bbSJoseph Chen	sed -i "/memreserve/d"		${ITS}
1251ff581bbSJoseph Chen	sed -i "/timestamp/d"		${ITS}
1261ff581bbSJoseph Chen	sed -i "/data-size/d"		${ITS}
1271ff581bbSJoseph Chen	sed -i "/data-position/d"	${ITS}
1281ff581bbSJoseph Chen	sed -i "/value/d"		${ITS}
1291ff581bbSJoseph Chen	sed -i "/hashed-strings/d"	${ITS}
1301ff581bbSJoseph Chen	sed -i "/hashed-nodes/d"	${ITS}
1311ff581bbSJoseph Chen	sed -i "/signer-version/d"	${ITS}
1321ff581bbSJoseph Chen	sed -i "/signer-name/d"		${ITS}
133436376efSJoseph Chen}
134436376efSJoseph Chen
13575323eb8SJoseph Chenargs_process $*
1361ff581bbSJoseph Chenunpack_itb
137436376efSJoseph Chengen_its
1380fb435faSJoseph Chen
139