blob: a01d2834e1809fb013b01ef0a03130ec663be80f [file] [log] [blame]
#!/bin/bash
if [ -z "$1" ]
then
# Show the partition layout if no argument input
echo 'Usage:'
echo ' Show current Partitions layout:'
echo ' sh partition_editor.sh ${XMLFILE}'
exit 1
fi
if [ ! -f "$1" ]
then
echo $1': File not exist!'
exit 1
fi
# Show the partition layout in better interactive mode
tmpfile=".part.tmp"
xmlfile=$1
# LBS(size defined in tmp file is KB based)
lbs_exist=`grep -o "\<lbs\>" ${xmlfile}`
if [ -z $lbs_exist ]
then
# For eMMC/Nor, only support 1024-aligned by now
lbs=1
else
lbs=`awk -F'"' '/lbs=/{print $4}' ${xmlfile}`
lbs=$(($lbs/1024))
fi
# LBA(Total page number)
lba_exist=`grep -o "\<lba\>" ${xmlfile}`
if [ -z $lba_exist ]
then
lba=0
else
lba=`awk -F'"' '/lba=/{print $2}' ${xmlfile}`
fi
# reserved some blocks to store BBT
reserved_exist=`grep -o "\<reserved\>" ${xmlfile}`
if [ -z $reserved_exist ]
then
reserved=0
else
reserved=`awk -F'"' '/reserved=/{print $6}' ${xmlfile}`
fi
# Generate temporary file for interactive modifing and editing
echo '*** You can delete/insert/modify(partname/size) partitions ***' > ${tmpfile}
echo '*** Partition size must be ERASE_BLOCK_SIZE(define in Nand SPEC) aligned ***' >> ${tmpfile}
echo '' >> ${tmpfile}
echo 'Part_name Size(KB) Attr' >> ${tmpfile}
`sed -nr 's/^.+start=\"(\w+)\"\s*end=\"(\w+)\"\s*(attributes=\"(\w+)\"\s*)?name=\"(\w+)\".+$/\5 \1 \2 \4/p' ${xmlfile} |
awk -v blk_size=$lbs '{printf "%-15s\t\t%d\t\t%s\n", $1, ($3-$2+1)*blk_size, $4}' >> ${tmpfile}`
# Edit the partition layout via vim
vim ${tmpfile}
# The new partition layout
part_name=(`awk '/^\w+\s+[0-9]+/{print $1}' ${tmpfile}`)
part_size=(`awk '/^\w+\s+[0-9]+/{print $2}' ${tmpfile}`)
part_attr=(`awk '/^\w+\s+[0-9]+/{if ($3 == "") print "-"; else print $3}' ${tmpfile}`)
# How many elements in the array
newcnt=$((${#part_name[@]}-1))
# Generate the temporary xml file
xmltmp=".xml.tmp"
`cp -f ${xmlfile} ${xmltmp}`
`sed -i '/name=/d' ${xmltmp}`
# Modify the temporary xml file
str1=' <entry type="{0FC63DAF-8483-4772-8E79-3D69D8477DE4}" start="'
str2='" end="'
strattr='" attributes="'
str3='" name="'
str4='" />'
# first start address
sa=`awk -F'"' '/name=/{print $4; exit;}' ${xmlfile}`
# last end address
lea=`sed -n '/name=/p' ${xmlfile} | sed -n '$p' | awk -F'"' '{print $6}'`
for ((i=0; i<=$newcnt; i++)) {
len=${part_size[i]}
if [ $i -eq $newcnt ]
then
ea=$lea
if [ $lba -ne 0 -a $reserved -ne 0 ]
then
ea=$(($lba-$reserved-1))
fi
else
ea=$(($sa+$len/$lbs-1))
fi
name=${part_name[i]}
attr=${part_attr[i]}
if [ "$attr" == "-" ]
then
`sed -i '/<\/partition>/i \'"$str1$sa$str2$ea$str3$name$str4"'' ${xmltmp}`
else
`sed -i '/<\/partition>/i \'"$str1$sa$str2$ea$strattr$attr$str3$name$str4"'' ${xmltmp}`
fi
sa=$(($ea+1))
}
# Replace the xml file with the temp xml file, delete useless temporary files
`cp -f ${xmltmp} ${xmlfile}`
`rm -f ${xmltmp} ${tmpfile}`
exit 0