summaryrefslogtreecommitdiffstats
path: root/scripts/pad_image
blob: 871063af3437f9e9c013e133ac64f5f26f1147d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/usr/bin/env bash

function usage {
  echo "Usage: prepare_image image_type kernel_image rootfs_image header_size"
  echo "Pad 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