#!/usr/bin/env 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