#!/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