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