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