blob: 4ad3fabd10a2c3959a03b87aa8849a89cb122dab (
plain) (
tree)
|
|
#!/bin/bash
# replace the requested parts in the flash image with separate parts images
#
# Copyright (C) 2015 Paul Kocialkowski <contact@paulk.fr>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
[ "x${DEBUG+set}" = 'xset' ] && set -v
regex="\([0-9a-fA-F]*\):\([0-9a-fA-F]*\)[[:space:]]*\(.*\)"
block=256
layout="layout.txt"
flash=$1
shift 1
if [ ! -f "$flash" ]
then
echo "Usage: $0 [flash image] [image] ..."
exit 1
fi
if [ ! -f "$layout" ]
then
echo "Missing layout file: $layout"
exit 1
fi
flashsize=$( stat $flash -c "%s" )
for image in $@; do
range=$( grep "$image" "$layout" )
name=$( echo "$range" | sed "s/$regex/\3/g" )
file="$name.img"
if [ -z "$range" ] || [ ! -f "$file" ]
then
echo "Invalid image name: $name"
continue
fi
start=$( echo "$range" | sed "s/$regex/\1/g" )
start=$( printf "%d\n" "0x$start" )
stop=$( echo "$range" | sed "s/$regex/\2/g" )
stop=$( printf "%d\n" "0x$stop" )
size=$(( $stop - $start + 1 ))
filesize=$( stat $file -c "%s" )
if [ $size -ne $filesize ]
then
echo "Invalid file size: expected $size, read $filesize"
continue
fi
if [ $size -gt $flashsize ]
then
echo "Image size too big for flash"
continue
fi
printf "Replacing $image in $flash\n\n"
if [ $start -gt 0 ]
then
dd if=$flash of=before.img bs=$block count=$(( $start / $block ))
else
touch before.img
fi
if [ $(( $stop + 1 )) -lt $flashsize ]
then
dd if=$flash of=after.img skip=$(( ($stop + 1) / $block )) bs=$block count=$(( ($flashsize - $stop - 1) / $block ))
else
touch after.img
fi
cat before.img $file after.img > $flash
rm before.img after.img
printf "\n"
done
|