aboutsummaryrefslogtreecommitdiffstats
path: root/scripts/pad_image
diff options
context:
space:
mode:
authorblogic <blogic@3c298f89-4303-0410-b956-a3cf2f4a3e73>2012-10-05 10:12:53 +0000
committerblogic <blogic@3c298f89-4303-0410-b956-a3cf2f4a3e73>2012-10-05 10:12:53 +0000
commit5c105d9f3fd086aff195d3849dcf847d6b0bd927 (patch)
tree1229a11f725bfa58aa7c57a76898553bb5f6654a /scripts/pad_image
downloadopenwrt-5c105d9f3fd086aff195d3849dcf847d6b0bd927.tar.gz
openwrt-5c105d9f3fd086aff195d3849dcf847d6b0bd927.zip
branch Attitude Adjustment
git-svn-id: svn://svn.openwrt.org/openwrt/branches/attitude_adjustment@33625 3c298f89-4303-0410-b956-a3cf2f4a3e73
Diffstat (limited to 'scripts/pad_image')
-rwxr-xr-xscripts/pad_image100
1 files changed, 100 insertions, 0 deletions
diff --git a/scripts/pad_image b/scripts/pad_image
new file mode 100755
index 000000000..14f149907
--- /dev/null
+++ b/scripts/pad_image
@@ -0,0 +1,100 @@
+#!/bin/bash
+
+function usage {
+ echo "Usage: prepare_image image_type kernel_image rootfs_image header_size"
+ echo "Padd root and kernel image to the correct size and append the jffs2 start marker as needed"
+ exit 1
+}
+
+function pad_file {
+ echo "Padding $1 to size $2"
+ dd if=$1 of=$1.paddingtempfile bs=$2 count=1 conv=sync &> /dev/null
+ mv $1.paddingtempfile $1
+}
+
+#filesize filestart padding
+function calc_pad {
+ [ $((($1 + $2) & ($3 - 1))) == 0 ] && {
+ echo $1
+ return 0
+ }
+ echo $(((($1 + $2) | ($3 - 1)) + 1 - $2))
+}
+
+function prep_squash {
+ echo "kernel_size: $kernel_size"
+ echo "header_size: $header_size"
+ kernel_pad_size=$(calc_pad $kernel_size $header_size 32)
+ kernel_end=$(($header_size + $kernel_pad_size))
+ pad_file $kernel_image $kernel_pad_size
+
+ #4k
+ rootfs_pad_size=$(calc_pad $rootfs_size $kernel_end 4096)
+ pad_file $rootfs_image $rootfs_pad_size
+ echo -ne '\xde\xad\xc0\xde' >> $rootfs_image
+
+ #8k
+ rootfs_pad_size=$(calc_pad $rootfs_size $kernel_end 8192)
+ [ $rootfs_pad_size == rootfs_old_padsize ] || {
+ pad_file $rootfs_image $rootfs_pad_size
+ rootfs_old_padsize=$rootfs_pad_size
+ echo -ne '\xde\xad\xc0\xde' >> $rootfs_image
+ }
+
+ #64k
+ rootfs_pad_size=$(calc_pad $rootfs_size $kernel_end 65536)
+ [ $rootfs_pad_size == rootfs_old_padsize ] || {
+ pad_file $rootfs_image $rootfs_pad_size
+ rootfs_old_padsize=$rootfs_pad_size
+ echo -ne '\xde\xad\xc0\xde' >> $rootfs_image
+ }
+
+ #128k
+ rootfs_pad_size=$(calc_pad $rootfs_size $kernel_end 131072)
+ [ $rootfs_pad_size == rootfs_old_padsize ] || {
+ pad_file $rootfs_image $rootfs_pad_size
+ rootfs_old_padsize=$rootfs_pad_size
+ echo -ne '\xde\xad\xc0\xde' >> $rootfs_image
+ }
+
+}
+
+function prep_jffs2 {
+ kernel_pad_size=$(calc_pad $kernel_size $header_size $1)
+ pad_file $kernel_image $kernel_pad_size
+}
+
+image_type=$1
+kernel_image=$2
+rootfs_image=$3
+header_size=$4
+
+if [ -z "$image_type" ] || [ -z "$rootfs_image" ] || [ -z "$kernel_image" ] || [ -z "$header_size" ]; then
+ usage
+fi
+
+if [ ! -e "$rootfs_image" ] || [ -z "$kernel_image" ]; then
+ echo "input file not found"
+ exit 1
+fi
+
+kernel_size=$(stat -c "%s" "$kernel_image")
+rootfs_size=$(stat -c "%s" "$rootfs_image")
+
+if [ $kernel_size == 0 ] || [ $rootfs_size == 0 ]; then
+ echo "kernel or rootfs empty"
+ exit 1
+fi
+
+case $image_type in
+ squashfs )
+ prep_squash ;;
+ jffs2-64k )
+ prep_jffs2 65536 ;;
+ jffs2-128k )
+ prep_jffs2 131072 ;;
+ * )
+ echo "Unknown image type"
+ exit 1 ;;
+esac
+