xref: /rk3399_rockchip-uboot/scripts/fit-unpack.sh (revision 75323eb82786f655df63962ea6eb5b1b45970ae5)
1*75323eb8SJoseph Chen#!/bin/bash
2*75323eb8SJoseph Chen#
3*75323eb8SJoseph Chen# Copyright (c) 2020 Fuzhou Rockchip Electronics Co., Ltd
4*75323eb8SJoseph Chen#
5*75323eb8SJoseph Chen# SPDX-License-Identifier: GPL-2.0
6*75323eb8SJoseph Chen#
7*75323eb8SJoseph Chen
8*75323eb8SJoseph ChenFIT_UBOOT_IMAGES=(
9*75323eb8SJoseph Chen	"/images/uboot@1      u-boot-nodtb.bin"
10*75323eb8SJoseph Chen	"/images/optee@1      tee.bin"
11*75323eb8SJoseph Chen	"/images/fdt@1        u-boot.dtb"
12*75323eb8SJoseph Chen)
13*75323eb8SJoseph Chen
14*75323eb8SJoseph ChenFIT_BOOT_IMAGES=(
15*75323eb8SJoseph Chen	"/images/kernel@1     kernel.img"
16*75323eb8SJoseph Chen	"/images/ramdisk@1    ramdisk.img"
17*75323eb8SJoseph Chen	"/images/resource@1   resource.img"
18*75323eb8SJoseph Chen	"/images/fdt@1        rk-kernel.dtb"
19*75323eb8SJoseph Chen)
20*75323eb8SJoseph Chen
21*75323eb8SJoseph Chenfunction usage()
22*75323eb8SJoseph Chen{
23*75323eb8SJoseph Chen	echo
24*75323eb8SJoseph Chen	echo "usage:"
25*75323eb8SJoseph Chen	echo "    $0 -f [fit/itb image] -o [output] -u    // unpack uboot.fit/itb"
26*75323eb8SJoseph Chen	echo "    $0 -f [fit/itb image] -o [output] -b    // unpack boot.fit/itb"
27*75323eb8SJoseph Chen	echo
28*75323eb8SJoseph Chen}
29*75323eb8SJoseph Chen
30*75323eb8SJoseph Chenfunction args_process()
31*75323eb8SJoseph Chen{
32*75323eb8SJoseph Chen	if [ $# -ne 5 ]; then
33*75323eb8SJoseph Chen		usage
34*75323eb8SJoseph Chen		exit 1
35*75323eb8SJoseph Chen	fi
36*75323eb8SJoseph Chen
37*75323eb8SJoseph Chen	while [ $# -gt 0 ]; do
38*75323eb8SJoseph Chen		case $1 in
39*75323eb8SJoseph Chen			-b|-u)
40*75323eb8SJoseph Chen				TYPE=$1
41*75323eb8SJoseph Chen				shift 1
42*75323eb8SJoseph Chen				;;
43*75323eb8SJoseph Chen			-f)
44*75323eb8SJoseph Chen				IMAGE=$2
45*75323eb8SJoseph Chen				shift 2
46*75323eb8SJoseph Chen				;;
47*75323eb8SJoseph Chen			-o)
48*75323eb8SJoseph Chen				OUTPUT=$2
49*75323eb8SJoseph Chen				shift 2
50*75323eb8SJoseph Chen				;;
51*75323eb8SJoseph Chen			*)
52*75323eb8SJoseph Chen				usage
53*75323eb8SJoseph Chen				exit 1
54*75323eb8SJoseph Chen				;;
55*75323eb8SJoseph Chen		esac
56*75323eb8SJoseph Chen	done
57*75323eb8SJoseph Chen
58*75323eb8SJoseph Chen	if [ ! -f $IMAGE ]; then
59*75323eb8SJoseph Chen		echo "ERROR: No $IMAGE"
60*75323eb8SJoseph Chen		exit 1
61*75323eb8SJoseph Chen	elif [ -z $OUTPUT ]; then
62*75323eb8SJoseph Chen		echo "ERROR: No output"
63*75323eb8SJoseph Chen		exit 1
64*75323eb8SJoseph Chen	elif [ -z $TYPE ]; then
65*75323eb8SJoseph Chen		echo "ERROR: No args -u or -b"
66*75323eb8SJoseph Chen		exit 1
67*75323eb8SJoseph Chen	fi
68*75323eb8SJoseph Chen
69*75323eb8SJoseph Chen	mkdir -p $OUTPUT
70*75323eb8SJoseph Chen}
71*75323eb8SJoseph Chen
72*75323eb8SJoseph Chenfunction copy_image()
73*75323eb8SJoseph Chen{
74*75323eb8SJoseph Chen	LIST=$1
75*75323eb8SJoseph Chen
76*75323eb8SJoseph Chen	NODE=`echo $LIST | awk '{ print $1 }'`
77*75323eb8SJoseph Chen	NAME=`echo $LIST | awk '{ print $2 }'`
78*75323eb8SJoseph Chen	OFFS=`fdtget -ti $IMAGE $NODE data-position`
79*75323eb8SJoseph Chen	SIZE=`fdtget -ti $IMAGE $NODE data-size`
80*75323eb8SJoseph Chen	if [ -z $OFFS ]; then
81*75323eb8SJoseph Chen		echo "ERROR: No find $NODE"
82*75323eb8SJoseph Chen		exit 1
83*75323eb8SJoseph Chen	fi
84*75323eb8SJoseph Chen
85*75323eb8SJoseph Chen	printf "    %-15s: %d bytes\n" $OUTPUT$NAME $SIZE
86*75323eb8SJoseph Chen	if [ $SIZE -ne 0 ]; then
87*75323eb8SJoseph Chen		dd if=$IMAGE         of=$OUTPUT/dd.tmp  bs=$OFFS skip=1  >/dev/null 2>&1
88*75323eb8SJoseph Chen		dd if=$OUTPUT/dd.tmp of=$OUTPUT/$NAME   bs=$SIZE count=1 >/dev/null 2>&1
89*75323eb8SJoseph Chen		rm $OUTPUT/dd.tmp
90*75323eb8SJoseph Chen	else
91*75323eb8SJoseph Chen		touch $OUTPUT/$NAME
92*75323eb8SJoseph Chen	fi
93*75323eb8SJoseph Chen}
94*75323eb8SJoseph Chen
95*75323eb8SJoseph Chenfunction gen_images()
96*75323eb8SJoseph Chen{
97*75323eb8SJoseph Chen	echo "Image:"
98*75323eb8SJoseph Chen	if [ $TYPE = "-u" ]; then
99*75323eb8SJoseph Chen		for LIST in "${FIT_UBOOT_IMAGES[@]}"
100*75323eb8SJoseph Chen		do
101*75323eb8SJoseph Chen			copy_image "$LIST"
102*75323eb8SJoseph Chen		done
103*75323eb8SJoseph Chen	elif [ $TYPE = "-k" ]; then
104*75323eb8SJoseph Chen		for LIST in "${FIT_BOOT_IMAGES[@]}"
105*75323eb8SJoseph Chen		do
106*75323eb8SJoseph Chen			copy_image "$LIST"
107*75323eb8SJoseph Chen		done
108*75323eb8SJoseph Chen	fi
109*75323eb8SJoseph Chen	echo
110*75323eb8SJoseph Chen}
111*75323eb8SJoseph Chen
112*75323eb8SJoseph Chenargs_process $*
113*75323eb8SJoseph Chengen_images