xref: /rk3399_rockchip-uboot/scripts/fit-repack.sh (revision fe82910a2d30e126e9e892e088c1534528517473)
1bc0a7e78SJoseph Chen#!/bin/bash
2bc0a7e78SJoseph Chen#
3bc0a7e78SJoseph Chen# Copyright (c) 2020 Rockchip Electronics Co., Ltd
4bc0a7e78SJoseph Chen#
5bc0a7e78SJoseph Chen# SPDX-License-Identifier: GPL-2.0
6bc0a7e78SJoseph Chen#
7bc0a7e78SJoseph Chenset -e
8bc0a7e78SJoseph Chen
981f4ded5SXuhui LinOFFS="0x1200"
10bc0a7e78SJoseph ChenOUT="out/repack"
11bc0a7e78SJoseph ChenITB="out/repack/image.itb"
12bc0a7e78SJoseph ChenITS="out/repack/image.its"
13bc0a7e78SJoseph Chen
14bc0a7e78SJoseph Chenfunction usage_repack()
15bc0a7e78SJoseph Chen{
16bc0a7e78SJoseph Chen	echo
17bc0a7e78SJoseph Chen	echo "usage:"
18bc0a7e78SJoseph Chen	echo "    $0 -f [image] -d [data dir]"
19bc0a7e78SJoseph Chen	echo
20bc0a7e78SJoseph Chen}
21bc0a7e78SJoseph Chen
22bc0a7e78SJoseph Chenfunction fit_repack()
23bc0a7e78SJoseph Chen{
24bc0a7e78SJoseph Chen	if [ $# -ne 4 ]; then
25bc0a7e78SJoseph Chen		usage_repack
26bc0a7e78SJoseph Chen		exit 1
27bc0a7e78SJoseph Chen	fi
28bc0a7e78SJoseph Chen
29bc0a7e78SJoseph Chen	while [ $# -gt 0 ]; do
30bc0a7e78SJoseph Chen		case $1 in
31bc0a7e78SJoseph Chen			-f)
32bc0a7e78SJoseph Chen				IMAGE=$2
33bc0a7e78SJoseph Chen				shift 2
34bc0a7e78SJoseph Chen				;;
35bc0a7e78SJoseph Chen			-d)
36bc0a7e78SJoseph Chen				DATA=$2
37bc0a7e78SJoseph Chen				shift 2
38bc0a7e78SJoseph Chen				;;
39bc0a7e78SJoseph Chen			*)
40bc0a7e78SJoseph Chen				usage_repack
41bc0a7e78SJoseph Chen				exit 1
42bc0a7e78SJoseph Chen				;;
43bc0a7e78SJoseph Chen		esac
44bc0a7e78SJoseph Chen	done
45bc0a7e78SJoseph Chen
46bc0a7e78SJoseph Chen	if [ ! -f ${IMAGE} ]; then
47bc0a7e78SJoseph Chen		echo "ERROR: No ${IMAGE}"
48bc0a7e78SJoseph Chen		exit 1
49e156df43SJoseph Chen	elif ! file ${IMAGE} | grep 'Device Tree Blob' ; then
50e156df43SJoseph Chen		echo "ERROR: ${IMAGE} is not FIT image"
51e156df43SJoseph Chen		exit 1
52bc0a7e78SJoseph Chen	elif [ ! -d ${DATA} ]; then
53bc0a7e78SJoseph Chen		echo "ERROR: No input directory ${DATA}"
54bc0a7e78SJoseph Chen		exit 1
55bc0a7e78SJoseph Chen	fi
56bc0a7e78SJoseph Chen
57bc0a7e78SJoseph Chen	COPIES=`strings ${IMAGE} | grep "rollback-index"  | wc -l`
58bc0a7e78SJoseph Chen	if [ ${COPIES} -eq 0 ]; then
59bc0a7e78SJoseph Chen		echo "ERROR: Invalid fit image"
60bc0a7e78SJoseph Chen		exit 1
61bc0a7e78SJoseph Chen	fi
62bc0a7e78SJoseph Chen
63125d49daSJoseph Chen	IMG_BS=`ls -l ${IMAGE} | awk '{ print $5 }'`
64125d49daSJoseph Chen	ITB_KB=`expr ${IMG_BS} / ${COPIES} / 1024`
65bc0a7e78SJoseph Chen
66125d49daSJoseph Chen	rm -rf ${OUT} && mkdir -p ${OUT}
67*fe82910aSXuhui Lin	UNPACK=$(find . -type f -name "fit-unpack.sh")
68*fe82910aSXuhui Lin	if [ -z ${UNPACK} ]; then
69*fe82910aSXuhui Lin		echo "ERROR: No fit-unpack.sh script"
70*fe82910aSXuhui Lin		exit 1
71*fe82910aSXuhui Lin	fi
72bc0a7e78SJoseph Chen	${UNPACK} -f ${IMAGE} -o ${OUT}/
7334df577aSJoseph Chen	find ${DATA}/ -maxdepth 1 -type f | xargs cp -t ${OUT}/
74bc0a7e78SJoseph Chen
75*fe82910aSXuhui Lin	MKIMAGE=$(find . -type f -name "mkimage")
76*fe82910aSXuhui Lin	if [ -z ${MKIMAGE} ]; then
77*fe82910aSXuhui Lin		echo "ERROR: No mkimage tool"
78*fe82910aSXuhui Lin		exit 1
79*fe82910aSXuhui Lin	fi
80*fe82910aSXuhui Lin
81bc0a7e78SJoseph Chen	if fdtget -l ${IMAGE} /images/uboot >/dev/null 2>&1 ; then
82bc0a7e78SJoseph Chen		rm -f ${IMAGE}
83bc0a7e78SJoseph Chen		${MKIMAGE} -f ${ITS} -E -p ${OFFS} ${ITB}
84bc0a7e78SJoseph Chen		for ((i = 0; i < ${COPIES}; i++));
85bc0a7e78SJoseph Chen		do
86bc0a7e78SJoseph Chen			cat ${ITB} >> ${IMAGE}
87125d49daSJoseph Chen			truncate -s %${ITB_KB}K ${IMAGE}
88bc0a7e78SJoseph Chen		done
89bc0a7e78SJoseph Chen	else
90bc0a7e78SJoseph Chen		${MKIMAGE} -f ${ITS} -E -p ${OFFS} ${IMAGE}
91bc0a7e78SJoseph Chen	fi
92bc0a7e78SJoseph Chen
93bc0a7e78SJoseph Chen	rm ${OUT} -rf
94bc0a7e78SJoseph Chen	echo
95bc0a7e78SJoseph Chen	echo "Image(repack):  ${IMAGE} is ready"
96bc0a7e78SJoseph Chen}
97bc0a7e78SJoseph Chen
98bc0a7e78SJoseph Chenfit_repack $*
99bc0a7e78SJoseph Chen
100