#!/bin/bash
#radiobox: dialog --radiolist text 0 0 0 1 sun4i on 2 sun5i off
NAME=$(basename $0)
CWD=$(pwd)
DIALOG_OUTPUT=/tmp/$$
LOGFILE=${NAME}.log

quit ()
{ echo $*
  exit 1
}

radiobox_dialog ()
{ TITLE=$1
  shift
  STRING=""
  for A in $*
  do
    [ "$STRING" = "" ] && STRING="$STRING $A . on" || STRING="$STRING $A . off"
  done 

  dialog --radiolist "${TITLE}"  0 0 0 $STRING 2>$DIALOG_OUTPUT
}

HWPACK=nofileatall
while [ ! -f $HWPACK ]
do
  ENTRIES=$(ls *_hwpack_*)
  radiobox_dialog "Choose the hwpack to use" $ENTRIES
  HWPACK=$(cat $DIALOG_OUTPUT)
done
echo "Chosen hwpack: $HWPACK" > $LOGFILE
echo "tar xf $HWPACK -C /tmp" >> $LOGFILE
[ -d /tmp/hwpack ] && rm -rf /tmp/hwpack
tar xf $HWPACK -C /tmp

( cd /tmp/hwpack/boards
  ENTRIES=$(find . -maxdepth 1  -type d -name "???*" -printf "%f ")
  radiobox_dialog "Choose Hardware" $ENTRIES
)
HARDWARE=$(cat $DIALOG_OUTPUT)
echo "Chosen hardware: $HARDWARE" >> $LOGFILE

( cd /tmp/hwpack/boards/$HARDWARE
  ENTRIES=$(find . -maxdepth 1  -type d -name "???*" -printf "%f ")
  radiobox_dialog "Choose Board" $ENTRIES
)
DEVICE=$(cat $DIALOG_OUTPUT)
echo "Chosen device: $DEVICE" >> $LOGFILE

( cd /tmp/hwpack/kernel
  ENTRIES=$(ls *_uImage.${HARDWARE} |sed -e "s/_.*$//")
  radiobox_dialog "Choose Kervel" $ENTRIES
)
KERNEL=$(cat $DIALOG_OUTPUT)
echo "Chosen kernel: $KERNEL" >> $LOGFILE

dialog --msgbox "Please insert your target device so that I can detect the correct size. If the device is already inserted please remove it and reinsert. The last device that the kernel detects will be suggested as default. Nothing will be written to the device it's just to get the correct size." 0 0

ENTRIES=$(dmesg |grep -E "sd.:|mmcblk.:" |sort -ru |sed -e "s/.*\(sd.\):.*/\1/" |sed -e "s/.*\(mmcblk.\):.*/\1/")
radiobox_dialog "Choose Target Device" $ENTRIES askme
TARGET_DEV=/dev/$(cat $DIALOG_OUTPUT)
echo "Chosen target device: $TARGET_DEV" >> $LOGFILE

TARGET_SIZE=$(fdisk  -l $TARGET_DEV |grep "Disk.*$TARGET_DEV" |awk '{print $(NF-1)}')
if [ "$TARGET_SIZE" = "" ]
then
  dialog --inputbox "Size of your desigred target image in Mb" 0 0 2>$DIALOG_OUTPUT
TARGET_SIZE=$(($(cat $DIALOG_OUTPUT) * 1048576))
fi
echo "Target device size in bytes: $TARGET_SIZE" >> $LOGFILE

dialog --inputbox "How big do you want the boot partition to be (Mb) ? Min 16Mb" 0 0 16 2>$DIALOG_OUTPUT
BOOTPARTITION_SIZE=$(($(cat $DIALOG_OUTPUT) * 2048))
echo "Boot partition size in sectors:i $BOOTPARTITION_SIZE" >> $LOGFILE

dialog --inputbox "How big do you want the root partition to be (Mb) ? Min 460Mb or 0 to maximize" 0 0 460 2>$DIALOG_OUTPUT
ROOTPARTITION_SIZE=$(($(cat $DIALOG_OUTPUT) * 2048))
[ $ROOTPARTITION_SIZE -eq 0 ] && ROOTPARTITION_SIZE=""
echo "Root partition size in sectors: $ROOTPARTITION_SIZE" >> $LOGFILE 

dialog --inputbox "How would you like to call the raw image ? " 0 0 "raw_card.img" 2>$DIALOG_OUTPUT
IMAGE_NAME=$(cat $DIALOG_OUTPUT)
echo "Image name: $IMAGE_NAME" >> $LOGFILE

[ "$(losetup -a)" != "" ] && quit "Aborting: there are loop devices in use"

echo "dd if=/dev/zero of=$IMAGE_NAME bs=1024 count=$(($TARGET_SIZE / 1024))" >> $LOGFILE
dd if=/dev/zero of=$IMAGE_NAME bs=1024 count=$(($TARGET_SIZE / 1024)) >> $LOGFILE 2>&1
cat <<EOT >> $LOGFILE
sfdisk -f -uS $IMAGE_NAME
2048,$BOOTPARTITION_SIZE,L,*
$(($BOOTPARTITION_SIZE + 2049)),$ROOTPARTITION_SIZE,L
0,0,0
0,0,0
EOT
cat <<EOT | sfdisk -f -uS $IMAGE_NAME >> $LOGFILE 2>&1
2048,$BOOTPARTITION_SIZE,L,*
$(($BOOTPARTITION_SIZE + 2049)),$ROOTPARTITION_SIZE,L
0,0,0
0,0,0
EOT

echo "losetup -o 1048576 --sizelimit $(($BOOTPARTITION_SIZE * 512)) /dev/loop0 $IMAGE_NAME" >> $LOGFILE
losetup -o 1048576 --sizelimit $(($BOOTPARTITION_SIZE * 512)) /dev/loop0 $IMAGE_NAME
if [ "$ROOTPARTITION_SIZE" = "" ]
then
  echo "losetup -o $(($BOOTPARTITION_SIZE * 512 + 1049088)) /dev/loop1 $IMAGE_NAME" >> $LOGFILE
  losetup -o $(($BOOTPARTITION_SIZE * 512 + 1049088)) /dev/loop1 $IMAGE_NAME
else
  echo "losetup -o $(($BOOTPARTITION_SIZE * 512 + 1049088)) --sizelimit $(($ROOTPARTITION_SIZE * 512)) /dev/loop1 $IMAGE_NAME" >> $LOGFILE
  losetup -o $(($BOOTPARTITION_SIZE * 512 + 1049088)) --sizelimit $(($ROOTPARTITION_SIZE * 512)) /dev/loop1 $IMAGE_NAME 
fi
echo "losetup /dev/loop2 --sizelimit 1048575 $IMAGE_NAME" >> $LOGFILE
losetup /dev/loop2 --sizelimit 1048575 $IMAGE_NAME
ENTRIES="ext2 ext4"
radiobox_dialog "Choose your root filesystem type" $ENTRIES
ROOTFSTYPE=$(cat $DIALOG_OUTPUT)
echo "mkfs.$ROOTFSTYPE /dev/loop1" >> $LOGFILE
mkfs.$ROOTFSTYPE /dev/loop1 >> $LOGFILE 2>&1

#the bootloader
if [ -f /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/sunxi-spl.bin ]
then 
  echo "mkfs.vfat /dev/loop0" >> $LOGFILE
  mkfs.vfat /dev/loop0 >> $LOGFILE 2>&1
  echo "dd if=/tmp/hwpack/boards/${HARDWARE}/${DEVICE}/sunxi-spl.bin of=/dev/loop2 bs=1024 seek=8" >> $LOGFILE
  dd if=/tmp/hwpack/boards/${HARDWARE}/${DEVICE}/sunxi-spl.bin of=/dev/loop2 bs=1024 seek=8 >> $LOGFILE 2>&1
  echo "dd if=/tmp/hwpack/boards/${HARDWARE}/${DEVICE}/u-boot.bin of=/dev/loop2 bs=1024 seek=32" >> $LOGFILE
  dd if=/tmp/hwpack/boards/${HARDWARE}/${DEVICE}/u-boot.bin of=/dev/loop2 bs=1024 seek=32 >> $LOGFILE 2>&1
elif [ -f /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/u-boot-sunxi-with-spl.bin ]
then
  echo "mkfs.ext2 /dev/loop0" >> $LOGFILE
  mkfs.ext2 /dev/loop0 >> $LOGFILE 2>&1
  echo "dd /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/u-boot-sunxi-with-spl.bin of=/dev/loop2 bs=1024 seek=8" >> $LOGFILE
  dd /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/u-boot-sunxi-with-spl.bin of=/dev/loop2 bs=1024 seek=8 >> $LOGFILE 2>&1
fi

echo "dd if=/tmp/hwpack/boards/uEnv-img.bin of=/dev/loop2 bs=1024 seek=544" >> $LOGFILE
dd if=/tmp/hwpack/boards/uEnv-img.bin of=/dev/loop2 bs=1024 seek=544 >> $LOGFILE 2>&1
sync

#the boot partition
mount /dev/loop0 /mnt/floppy
cp /tmp/hwpack/kernel/${KERNEL}_uImage.$HARDWARE /mnt/floppy/uImage >> $LOGFILE 2>&1
cp /tmp/hwpack/kernel/boot.scr /mnt/floppy >> $LOGFILE 2>&1
cp /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/script.bin /mnt/floppy >> $LOGFILE 2>&1
if [ -f /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/sunxi-spl.bin ]
then
  (cd /mnt/floppy
  cat << EOF >boot.cmd
kernel=uImage
setenv bootargs console=\${console} root=\${root} loglevel=\${loglevel} \${panic
arg} \${extraargs}
fatload mmc 0 0x43000000 script.bin
fatload mmc 0 0x48000000 \${kernel}
watchdog 0
bootm 0x48000000
EOF

  cat << EOF > uEnv.txt
console=tty0
loglevel=5
root=/dev/mmcblk0p2 ro rootwait
extraargs=console=ttyS0,115200 disp.screen0_output_mode=EDID:1280x720p60 hdmi.audio=EDID:0 sunxi_g2d_mem_reserve=0 sunxi_ve_mem_reserve=0 sunxi_fb_mem_reserve=16 sunxi_no_mali_mem_reserve
EOF
  )
elif [ -f /tmp/hwpack/boards/${HARDWARE}/${DEVICE}/u-boot-sunxi-with-spl.bin ]
then
  (cd /mnt/floppy
  cat << EOF >boot.cmd
kernel=uImage
setenv bootargs console=\${console} root=\${root} loglevel=\${loglevel} \${panicarg} \${extraargs}
ext2load mmc 0 0x43000000 script.bin
ext2load mmc 0 0x48000000 \${kernel}
watchdog 0
bootm 0x48000000
EOF

  cat << EOF > uEnv.txt 
console=tty0
loglevel=5
root=/dev/mmcblk0p2 ro rootwait
extraargs=console=ttyS0,115200 disp.screen0_output_mode=EDID:1280x720p60 hdmi.audio=EDID:0 sunxi_g2d_mem_reserve=0 sunxi_ve_mem_reserve=0 sunxi_fb_mem_reserve=16 sunxi_no_mali_mem_reserve
EOF
  )
fi

sync
umount /mnt/floppy

#the root filesystem
mount /dev/loop1 /mnt/floppy
ROOTTARBALL=nofileatall
while [ ! -f $ROOTTARBALL ]
do
  ENTRIES=$(ls *root*.t*z*)
  radiobox_dialog "Choose root image tarball" $ENTRIES
  ROOTTARBALL=$(cat $DIALOG_OUTPUT)
done
tar xpf $ROOTTARBALL -C /mnt/floppy >> $LOGFILE 2>&1
mkdir -p /mnt/floppy/lib/modules/${KERNEL}.${HARDWARE}+ >> $LOGFILE 2>&1
if [ -d /tmp/hwpack/modules/${KERNEL}.${HARDWARE}+ ]
then
  cp -apr /tmp/hwpack/modules/${KERNEL}.${HARDWARE}+/* /mnt/floppy/lib/modules/${KERNEL}.${HARDWARE}+/ >> $LOGFILE 2>&1
elif [ -d /tmp/hwpack/modules/${KERNEL}.${HARDWARE} ]
then
  cp -apr /tmp/hwpack/modules/${KERNEL}.${HARDWARE}/* /mnt/floppy/lib/modules/${KERNEL}.${HARDWARE}+/ >> $LOGFILE 2>&1
fi
cat << EOF > /mnt/floppy/etc/fstab
proc            /proc           proc    defaults        0       0
/dev/mmcblk0p2       /               $ROOTFSTYPE    errors=remount-ro,noatime 0 1
EOF
mv /mnt/floppy/etc/rc.d/rc.modules-* /mnt/floppy/etc/rc.d/rc.modules >/dev/null 2>&1
for module in sw_ahci_platform lcd hdmi ump disp mali mali_drm 8192cu
do
  echo "#/sbin/modprobe $module" >> /mnt/floppy/etc/rc.d/rc.modules
done
chmod a+x /mnt/floppy/etc/rc.d/rc.modules >> $LOGFILE 2>&1
sync
umount /mnt/floppy

################
dialog --msgbox "$IMAGE_NAME was created and the loop devices used to create it will remain untill you hit OK. Pleas check that everything is right befor you hit OK. You can then write the image to your target device with something like this: cat $IMAGE_NAME > $TARGET_DEV" 0 0
losetup -d /dev/loop0
losetup -d /dev/loop1
losetup -d /dev/loop2
rm -f $DIALOG_OUTPUT
