xref: /rk3399_rockchip-uboot/scripts/fit-unpack.sh (revision 0fb435fa051047f1ecd4293f97f5ebcb139ebd9a)
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)
271ae3dd15SJoseph Chen				file=$2
2875323eb8SJoseph Chen				shift 2
2975323eb8SJoseph Chen				;;
3075323eb8SJoseph Chen			-o)
311ae3dd15SJoseph Chen				output=$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
411ae3dd15SJoseph Chen	if [ ! -f $file ]; then
421ae3dd15SJoseph Chen		echo "ERROR: No $file"
4375323eb8SJoseph Chen		exit 1
4475323eb8SJoseph Chen	fi
4575323eb8SJoseph Chen
461ae3dd15SJoseph Chen	if [ -z $output ]; then
471ae3dd15SJoseph Chen		output="out"
4875323eb8SJoseph Chen	fi
4975323eb8SJoseph Chen
501ae3dd15SJoseph Chen	mkdir -p $output
5175323eb8SJoseph Chen}
5275323eb8SJoseph Chen
5375323eb8SJoseph Chenfunction gen_images()
5475323eb8SJoseph Chen{
55*0fb435faSJoseph Chen	printf "\n# Unpack $file to directory $output/\n"
561ae3dd15SJoseph Chen	fdtget -l $file /images > $output/unpack.txt
571ae3dd15SJoseph Chen	cat $output/unpack.txt | while read line
5875323eb8SJoseph Chen	do
59*0fb435faSJoseph Chen		# generate image
601ae3dd15SJoseph Chen		node="/images/${line}"
611ae3dd15SJoseph Chen		name=`fdtget -ts $file $node image`
621ae3dd15SJoseph Chen		offs=`fdtget -ti $file $node data-position`
631ae3dd15SJoseph Chen		size=`fdtget -ti $file $node data-size`
641ae3dd15SJoseph Chen		if [ -z $offs ]; then
651ae3dd15SJoseph Chen			continue;
6675323eb8SJoseph Chen		fi
671ae3dd15SJoseph Chen
681ae3dd15SJoseph Chen		if [ $size -ne 0 ]; then
691ae3dd15SJoseph Chen			dd if=$file of=$output/dd.tmp  bs=$offs skip=1  >/dev/null 2>&1
701ae3dd15SJoseph Chen			dd if=$output/dd.tmp of=$output/$name bs=$size count=1 >/dev/null 2>&1
711ae3dd15SJoseph Chen			rm $output/dd.tmp
721ae3dd15SJoseph Chen		else
731ae3dd15SJoseph Chen			touch $output/$name
741ae3dd15SJoseph Chen		fi
75*0fb435faSJoseph Chen
76*0fb435faSJoseph Chen		# hash verify
77*0fb435faSJoseph Chen		algo=`fdtget -ts $file $node/hash@1 algo`
78*0fb435faSJoseph Chen		if [ -z $algo ]; then
79*0fb435faSJoseph Chen			printf "    %-20s: %d bytes" $name $size
80*0fb435faSJoseph Chen			continue;
81*0fb435faSJoseph Chen		fi
82*0fb435faSJoseph Chen
83*0fb435faSJoseph Chen		data=`fdtget -tx $file $node/hash@1 value`
84*0fb435faSJoseph Chen		data=`echo " "$data | sed "s/ / 0x/g"`
85*0fb435faSJoseph Chen		csum=`"$algo"sum $output/$name | awk '{ print $1}'`
86*0fb435faSJoseph Chen
87*0fb435faSJoseph Chen		hash=""
88*0fb435faSJoseph Chen		for((i=1;;i++));
89*0fb435faSJoseph Chen		do
90*0fb435faSJoseph Chen			hex=`echo $data | awk -v idx=$i '{ print $idx }'`
91*0fb435faSJoseph Chen			if [ -z $hex ]; then
92*0fb435faSJoseph Chen				break;
93*0fb435faSJoseph Chen			fi
94*0fb435faSJoseph Chen
95*0fb435faSJoseph Chen			hex=`printf "%08x" $hex` # align !!
96*0fb435faSJoseph Chen			hash="$hash$hex"
97*0fb435faSJoseph Chen		done
98*0fb435faSJoseph Chen
99*0fb435faSJoseph Chen		printf "  %-20s: %d bytes... %s" $name $size $algo
100*0fb435faSJoseph Chen		if [ "$csum" = "$hash" -o $size -eq 0 ]; then
101*0fb435faSJoseph Chen			echo "+"
102*0fb435faSJoseph Chen		else
103*0fb435faSJoseph Chen			echo "-"
104*0fb435faSJoseph 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
113*0fb435faSJoseph Chen
114