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