2016-04-28 20:34:13 +08:00
|
|
|
#!/usr/bin/env bash
|
2010-03-19 07:35:21 +08:00
|
|
|
|
|
|
|
function usage {
|
|
|
|
echo "Usage: prepare_image image_type kernel_image rootfs_image header_size"
|
2021-09-27 05:58:59 +08:00
|
|
|
echo "Pad root and kernel image to the correct size and append the jffs2 start marker as needed"
|
2010-03-19 07:35:21 +08:00
|
|
|
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
|
|
|
|
|