xref: /OK3568_Linux_fs/u-boot/scripts/fit-repack.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# Copyright (c) 2020 Rockchip Electronics Co., Ltd
4*4882a593Smuzhiyun#
5*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
6*4882a593Smuzhiyun#
7*4882a593Smuzhiyunset -e
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunMKIMAGE="./tools/mkimage"
10*4882a593SmuzhiyunUNPACK="./scripts/fit-unpack.sh"
11*4882a593SmuzhiyunOFFS="0x1000"
12*4882a593SmuzhiyunOUT="out/repack"
13*4882a593SmuzhiyunITB="out/repack/image.itb"
14*4882a593SmuzhiyunITS="out/repack/image.its"
15*4882a593Smuzhiyun
16*4882a593Smuzhiyunfunction usage_repack()
17*4882a593Smuzhiyun{
18*4882a593Smuzhiyun	echo
19*4882a593Smuzhiyun	echo "usage:"
20*4882a593Smuzhiyun	echo "    $0 -f [image] -d [data dir]"
21*4882a593Smuzhiyun	echo
22*4882a593Smuzhiyun}
23*4882a593Smuzhiyun
24*4882a593Smuzhiyunfunction fit_repack()
25*4882a593Smuzhiyun{
26*4882a593Smuzhiyun	if [ $# -ne 4 ]; then
27*4882a593Smuzhiyun		usage_repack
28*4882a593Smuzhiyun		exit 1
29*4882a593Smuzhiyun	fi
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun	while [ $# -gt 0 ]; do
32*4882a593Smuzhiyun		case $1 in
33*4882a593Smuzhiyun			-f)
34*4882a593Smuzhiyun				IMAGE=$2
35*4882a593Smuzhiyun				shift 2
36*4882a593Smuzhiyun				;;
37*4882a593Smuzhiyun			-d)
38*4882a593Smuzhiyun				DATA=$2
39*4882a593Smuzhiyun				shift 2
40*4882a593Smuzhiyun				;;
41*4882a593Smuzhiyun			*)
42*4882a593Smuzhiyun				usage_repack
43*4882a593Smuzhiyun				exit 1
44*4882a593Smuzhiyun				;;
45*4882a593Smuzhiyun		esac
46*4882a593Smuzhiyun	done
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun	if [ ! -f ${IMAGE} ]; then
49*4882a593Smuzhiyun		echo "ERROR: No ${IMAGE}"
50*4882a593Smuzhiyun		exit 1
51*4882a593Smuzhiyun	elif ! file ${IMAGE} | grep 'Device Tree Blob' ; then
52*4882a593Smuzhiyun		echo "ERROR: ${IMAGE} is not FIT image"
53*4882a593Smuzhiyun		exit 1
54*4882a593Smuzhiyun	elif [ ! -d ${DATA} ]; then
55*4882a593Smuzhiyun		echo "ERROR: No input directory ${DATA}"
56*4882a593Smuzhiyun		exit 1
57*4882a593Smuzhiyun	fi
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun	COPIES=`strings ${IMAGE} | grep "rollback-index"  | wc -l`
60*4882a593Smuzhiyun	if [ ${COPIES} -eq 0 ]; then
61*4882a593Smuzhiyun		echo "ERROR: Invalid fit image"
62*4882a593Smuzhiyun		exit 1
63*4882a593Smuzhiyun	fi
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun	IMG_BS=`ls -l ${IMAGE} | awk '{ print $5 }'`
66*4882a593Smuzhiyun	ITB_KB=`expr ${IMG_BS} / ${COPIES} / 1024`
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun	rm -rf ${OUT} && mkdir -p ${OUT}
69*4882a593Smuzhiyun	${UNPACK} -f ${IMAGE} -o ${OUT}/
70*4882a593Smuzhiyun	find ${DATA}/ -maxdepth 1 -type f | xargs cp -t ${OUT}/
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun	if fdtget -l ${IMAGE} /images/uboot >/dev/null 2>&1 ; then
73*4882a593Smuzhiyun		rm -f ${IMAGE}
74*4882a593Smuzhiyun		${MKIMAGE} -f ${ITS} -E -p ${OFFS} ${ITB}
75*4882a593Smuzhiyun		for ((i = 0; i < ${COPIES}; i++));
76*4882a593Smuzhiyun		do
77*4882a593Smuzhiyun			cat ${ITB} >> ${IMAGE}
78*4882a593Smuzhiyun			truncate -s %${ITB_KB}K ${IMAGE}
79*4882a593Smuzhiyun		done
80*4882a593Smuzhiyun	else
81*4882a593Smuzhiyun		${MKIMAGE} -f ${ITS} -E -p ${OFFS} ${IMAGE}
82*4882a593Smuzhiyun	fi
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun	rm ${OUT} -rf
85*4882a593Smuzhiyun	echo
86*4882a593Smuzhiyun	echo "Image(repack):  ${IMAGE} is ready"
87*4882a593Smuzhiyun}
88*4882a593Smuzhiyun
89*4882a593Smuzhiyunfit_repack $*
90*4882a593Smuzhiyun
91