xref: /rk3399_rockchip-uboot/scripts/fit-unpack.sh (revision 5facc6b84e42d8fb07a96523784a4c8c1cd4299f)
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:"
131ae3dd15SJoseph Chen	echo "    $0 -f [fit/itb] -o [output]"
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*5facc6b8SJoseph Chen				IMAGE=$2
2875323eb8SJoseph Chen				shift 2
2975323eb8SJoseph Chen				;;
3075323eb8SJoseph Chen			-o)
31*5facc6b8SJoseph Chen				IMAGE_DIR=$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*5facc6b8SJoseph Chen	if [ ! -f $IMAGE ]; then
42*5facc6b8SJoseph Chen		echo "ERROR: No $IMAGE"
4375323eb8SJoseph Chen		exit 1
4475323eb8SJoseph Chen	fi
4575323eb8SJoseph Chen
46*5facc6b8SJoseph Chen	if [ -z $IMAGE_DIR ]; then
47*5facc6b8SJoseph Chen		IMAGE_DIR="out"
4875323eb8SJoseph Chen	fi
4975323eb8SJoseph Chen
50*5facc6b8SJoseph Chen	mkdir -p $IMAGE_DIR
5175323eb8SJoseph Chen}
5275323eb8SJoseph Chen
5375323eb8SJoseph Chenfunction gen_images()
5475323eb8SJoseph Chen{
55*5facc6b8SJoseph Chen	printf "\n# Unpack $IMAGE to directory $IMAGE_DIR/\n"
56*5facc6b8SJoseph Chen	fdtget -l $IMAGE /images > $IMAGE_DIR/unpack.txt
57*5facc6b8SJoseph Chen	cat $IMAGE_DIR/unpack.txt | while read line
5875323eb8SJoseph Chen	do
590fb435faSJoseph Chen		# generate image
60*5facc6b8SJoseph Chen		NODE="/images/${line}"
61*5facc6b8SJoseph Chen		NAME=`fdtget -ts $IMAGE $NODE image`
62*5facc6b8SJoseph Chen		OFFS=`fdtget -ti $IMAGE $NODE data-position`
63*5facc6b8SJoseph Chen		SIZE=`fdtget -ti $IMAGE $NODE data-size`
64*5facc6b8SJoseph Chen		if [ -z $OFFS ]; then
651ae3dd15SJoseph Chen			continue;
6675323eb8SJoseph Chen		fi
671ae3dd15SJoseph Chen
68*5facc6b8SJoseph Chen		if [ $SIZE -ne 0 ]; then
69*5facc6b8SJoseph Chen			dd if=$IMAGE of=$IMAGE_DIR/dd.tmp  bs=$OFFS skip=1  >/dev/null 2>&1
70*5facc6b8SJoseph Chen			dd if=$IMAGE_DIR/dd.tmp of=$IMAGE_DIR/$NAME bs=$SIZE count=1 >/dev/null 2>&1
71*5facc6b8SJoseph Chen			rm $IMAGE_DIR/dd.tmp
721ae3dd15SJoseph Chen		else
73*5facc6b8SJoseph Chen			touch $IMAGE_DIR/$NAME
741ae3dd15SJoseph Chen		fi
750fb435faSJoseph Chen
760fb435faSJoseph Chen		# hash verify
77*5facc6b8SJoseph Chen		algo=`fdtget -ts $IMAGE $NODE/hash@1 algo`
780fb435faSJoseph Chen		if [ -z $algo ]; then
79*5facc6b8SJoseph Chen			printf "    %-20s: %d bytes" $NAME $SIZE
800fb435faSJoseph Chen			continue;
810fb435faSJoseph Chen		fi
820fb435faSJoseph Chen
83*5facc6b8SJoseph Chen		data=`fdtget -tx $IMAGE $NODE/hash@1 value`
840fb435faSJoseph Chen		data=`echo " "$data | sed "s/ / 0x/g"`
85*5facc6b8SJoseph Chen		csum=`"$algo"sum $IMAGE_DIR/$NAME | awk '{ print $1}'`
860fb435faSJoseph Chen
870fb435faSJoseph Chen		hash=""
880fb435faSJoseph Chen		for((i=1;;i++));
890fb435faSJoseph Chen		do
900fb435faSJoseph Chen			hex=`echo $data | awk -v idx=$i '{ print $idx }'`
910fb435faSJoseph Chen			if [ -z $hex ]; then
920fb435faSJoseph Chen				break;
930fb435faSJoseph Chen			fi
940fb435faSJoseph Chen
950fb435faSJoseph Chen			hex=`printf "%08x" $hex` # align !!
960fb435faSJoseph Chen			hash="$hash$hex"
970fb435faSJoseph Chen		done
980fb435faSJoseph Chen
99*5facc6b8SJoseph Chen		printf "  %-20s: %d bytes... %s" $NAME $SIZE $algo
100*5facc6b8SJoseph Chen		if [ "$csum" = "$hash" -o $SIZE -eq 0 ]; then
1010fb435faSJoseph Chen			echo "+"
1020fb435faSJoseph Chen		else
1030fb435faSJoseph Chen			echo "-"
1040fb435faSJoseph Chen		fi
1051ae3dd15SJoseph Chen	done
1061ae3dd15SJoseph Chen
1071ae3dd15SJoseph Chen	rm $output/unpack.txt
10875323eb8SJoseph Chen	echo
10975323eb8SJoseph Chen}
11075323eb8SJoseph Chen
11175323eb8SJoseph Chenargs_process $*
11275323eb8SJoseph Chengen_images
1130fb435faSJoseph Chen
114