blob: e1a61c79a2a9adfec829d9a538daa7a6693f4717 [file] [log] [blame]
#!/bin/bash
#set -x
#set -e
inFile=${1?need input file}
#outFile=${2:-block1_layout.bin}
outFile=${2:-"out"}
if [ ! -f $inFile ]; then echo "$inFile does not exist"; exit 1; fi
# BLOCK1_IMAGE_TYPE_MASK = 0x000000FF;
# BLOCK1_IMAGE_TYPE_LAYOUT = 0x00;
# BLOCK1_IMAGE_TYPE_EROM = 0x01;
# BLOCK1_IMAGE_TYPE_IMAGE2 = 0x02;
# BLOCK1_IMAGE_TYPE_LOADER = 0x03;
# BLOCK1_IMAGE_TYPE_TZ = 0x04;
# BLOCK1_IMAGE_TYPE_DATA = 0x10;
#
# BLOCK1_IMAGE_DESTINATION_TYPE_MASK = 0x000F0000;
# BLOCK1_IMAGE_DESTINATION_IN_SOC = 0x00000;
# BLOCK1_IMAGE_DESTINATION_IN_BCM = 0x10000;
# BLOCK1_IMAGE_DESTINATION_NA = 0x20000;
#
# BLOCK1_IMAGE_SIGNING_OPTIONS_MASK = 0x0F0000000;
# BLOCK1_IMAGE_IS_SIGNED = 0x00000000;
# BLOCK1_IMAGE_NOT_SIGNED = 0x10000000;
#
# BLOCK1_IMAGE_HANDSHAKE_MASK = 0xF0000000;
# BLOCK1_IMAGE_HANDSHAKE_ACK = 0x80000000;
#image1/release/bcm_erom.bin
#image1/release/bcm_erom.info
#image2/release/samsung_image2.bin
#image2/release/samsung_image2.info
# type START SIZE entry
#echo 0x00010001 0x00000 0x01400 0x0002c000 bcm erom
##echo 0x01000000 0x01400 0x00080 0xf7a40004 this
#echo 0x00000002 0x01400 0x04C00 0xf7a40000 sysinit or drm-erom
#echo 0x00000003 0x06000 0x56000 0x00680000 bootloader
#echo
function endian
{
# revert_endian for xxd
local VAL=${1?need value}
local HEX="$(printf %08x $VAL)"
local HEX1=`echo $HEX|cut -b 7-8`
local HEX2=`echo $HEX|cut -b 5-6`
local HEX3=`echo $HEX|cut -b 3-4`
local HEX4=`echo $HEX|cut -b 1-2`
echo "0x$HEX1$HEX2$HEX3$HEX4"
}
function gen_layout_item
{
#generate "$TYPE $FROM $SIZE $ENTRY" for a layout item
local TYPE=${1:-0}
local FROM=${2:-0}
local NAME=${3?need file name}
# get "Entry point address: 0x2c001" string
local TXT=$(cat $NAME.info|grep "Entry point")
# remve till ':' char and revert the endian
local ENTRY="$(endian $(printf %d ${TXT#*:}))"
# get file size and revert the endian
local SIZE="$(endian $(stat -c %s $NAME.bin))"
# revert the endian
let TYPE="$(endian $(printf %d $TYPE))"
let FROM="$(endian $(printf %d $FROM))"
echo "$TYPE $FROM $SIZE $ENTRY"
}
function output_layout_item
{
declare -a entry_l=("${!1}")
declare -i nItems=${#entry_l[@]}
local str
[ $nItems -eq 4 ] || (echo "nItems($nItems) != 4"; exit 1);
for k in $(seq 0 $((${#entry_l[@]} - 1))); do
printf %08x ${entry_l[$k]} | xxd -r -p >>$outFile
str="$str $(printf "0x%08x" $(endian ${entry_l[$k]}))"
done
echo "output item: $str"
}
echo "inFile is $inFile"
numImg=0
declare -a entry
declare -a nameList
declare -a typeList
while read line; do
entry=($line)
nameList[$numImg]=${entry[0]}
typeList[$numImg]=${entry[1]}
let "numImg += 1"
#echo "line $numImg:${entry[0]} ${entry[1]}"
done < "$inFile"
#echo "names: ${nameList[@]}"
#echo "types: ${typeList[@]}"
#exit 0
#numArg=$#
#image1=${1:-image1/release/bcm_erom}
#image2=${2:-image2/release/samsung_image2}
#image3=${3:-bootloader/release/nand_bootloader}
#nameList=($image1 $image2 $image3)
#nameList=($image1 $image2)
#nameList=($@)
#typeList=(0x10001 2 3)
sizeofItem=16
ALIGN=1024
START=0
# the element index of the layout item
iTYPE=0
iSTART=1
iSIZE=2
iENTRY=3
rm $outFile
#MV_Block1_Head;
#unsigned int HeaderVersion;
#unsigned short MagicNumber;
#unsigned short OffsetSignature;
#unsigned char NumItems;
#unsigned char RootAesKey;
#unsigned char SubKeyIndex;
#unsigned char SubKeyParam;
let numImg="(${#nameList[@]} + 1)"
let uint_1="$(printf %d 0xda7a)"
let uint_1="(($numImg + 1) * $sizeofItem) * 65536 + $uint_1"
entry=($(endian 1) $(endian $uint_1) $(endian $numImg) 0)
output_layout_item entry[@]
let sizeLayout="(($numImg + 1) * 16)"
entry=(0 $(endian 512) $(endian $sizeLayout) $(endian 0xf7a60010))
output_layout_item entry[@]
for i in $(seq 0 $((${#nameList[@]} - 1))); do
# TYPE START SIZE ENTRY
entry=($(gen_layout_item ${typeList[$i]} $START ${nameList[$i]}))
let SIZE="$(printf %d $(endian ${entry[$iSIZE]}))"
let START="($START + $SIZE + $ALIGN - 1) / $ALIGN * $ALIGN"
#echo "img $i: ${entry[*]}"
#echo "start=$(printf 0x%08x ${entry[iSTART]}); size=$(printf 0x%08x ${entry[iSIZE]})"
output_layout_item entry[@]
#for k in $(seq 0 $((${#entry[@]} - 1))); do
#printf %08x ${entry[$k]} | xxd -r -p >>$outFile
#done
done
xxd -g1 $outFile