#!/bin/bash -e
#
# Copyright (c) 2009-2010 Robert Nelson <robertcnelson@gmail.com>
# Copyright (c) 2010 Mario Di Francesco <mdf-code@digitalexile.it>
# Copyright (c) 2010 Till Harbaum <till@harbaum.org>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
# Latest can be found at:
# http://github.com/RobertCNelson/omap-image-builder/blob/master/tools/setup_sdcard.sh

#Notes: need to check for: parted, fdisk, wget, mkfs.*, mkimage, md5sum

#Debug Tips
#oem-config username/password
#add: "debug-oem-config" to bootargs

unset MMC
unset SWAP_BOOT_USER
unset DEFAULT_USER
unset DEBUG

#Defaults
RFS=ext3
BOOT_LABEL=BOOT
RFS_LABEL=ROOT
PARTITION_PREFIX=""
UBOOT_TYPE=beagle
SWAPSIZE=512

if [ "$TYPE" == "" ]; then
    TYPE=mer-core
fi

ARCH=armv7l

DIR=$PWD

function detect_software {

#Currently only Ubuntu and Debian..
#Working on Fedora...
unset PACKAGE
unset APT

if [ ! $(which mkimage) ];then
echo "Missing uboot-mkimage"
 PACKAGE="uboot-mkimage "
 APT=1
fi

if [ ! $(which wget) ];then
echo "Missing wget"
 PACKAGE+="wget "
 APT=1
fi

if [ ! $(which pv) ];then
echo "Missing pv"
 PACKAGE+="pv "
 APT=1
fi

if [ "${APT}" ];then
echo "Installing Dependencies"
 sudo aptitude install $PACKAGE
fi
}

function beagle_boot_scripts {

cat > /tmp/boot.cmd <<beagle_boot_cmd
echo "Booting Mer ..."
if test "\${beaglerev}" = "xMA"; then
echo "Kernel is not ready for 1Ghz limiting to 800Mhz"
setenv mpurate 800
fi
if test "\${beaglerev}" = "xMB"; then
echo "Kernel is not ready for 1Ghz limiting to 800Mhz"
setenv mpurate 800
fi
setenv dvimode 800x480-16@60
setenv vram 0:2M,1:2M,2:2M
setenv bootcmd 'mmc init; fatload mmc 0:1 0x80300000 uImage; bootm 0x80300000'
#setenv bootargs console=ttyO2,115200n8 console=tty0 root=/dev/mmcblk0p2 rootwait ro omapfb.vram=\${vram} omapfb.mode=dvi:\${dvimode} fixrtc mpurate=\${mpurate}
setenv bootargs console=ttyO2,115200n8 console=tty0 root=/dev/mmcblk0p2 rootwait ro omapfb.mode=dvi:\${dvimode} fixrtc mpurate=\${mpurate}
boot

beagle_boot_cmd

}

function touchbook_boot_scripts {

cat > /tmp/boot.cmd <<touchbook_boot_cmd
setenv dvimode 1024x600MR-16@60
setenv vram 12MB
setenv bootcmd 'mmc init; fatload mmc 0:1 0x80300000 uImage; fatload mmc 0:1 0x81600000 uInitrd; bootm 0x80300000 0x81600000'
setenv bootargs console=tty1 root=/dev/mmcblk0p2 rootwait ro vram=\${vram} omapfb.mode=dvi:\${dvimode} fixrtc mpurate=600
boot

touchbook_boot_cmd

}

function panda_boot_scripts {

cat > /tmp/boot.cmd <<panda_boot_cmd
setenv dvimode 1024x600MR-16@60
setenv vram 16MB
setenv bootcmd 'mmc init; fatload mmc 0:1 0x80300000 uImage; fatload mmc 0:1 0x81600000 uInitrd; bootm 0x80300000 0x81600000'
setenv bootargs console=ttyO2,115200n8 console=tty0 root=/dev/mmcblk0p2 rootwait ro vram=\${vram} omapfb.mode=dvi:\${dvimode} fixrtc mpurate=600
boot

panda_boot_cmd

}
function dl_xload_uboot {
# sudo rm -rfd ${DIR}/downloads/ || true
#mkdir -p ${DIR}/downloads/

case "$SYSTEM" in
    beagle)

beagle_boot_scripts

 #beagle
 MIRROR="http://rcn-ee.net/deb/"

 echo ""
 echo "1 / 7: Downloading X-loader and Uboot"
 echo ""

 rm -f ${DIR}/downloads/bootloader || true
 wget -c --directory-prefix=${DIR}/downloads/ ${MIRROR}tools/latest/bootloader

 MLO=$(cat ${DIR}/downloads/bootloader | grep "ABI:1:MLO" | awk '{print $2}')
 UBOOT=$(cat ${DIR}/downloads/bootloader | grep "ABI:1:UBOOT" | awk '{print $2}')

 wget -c --no-verbose --directory-prefix=${DIR}/downloads/ ${MLO}
 wget -c --no-verbose --directory-prefix=${DIR}/downloads/ ${UBOOT}

 MLO=${MLO##*/}
 UBOOT=${UBOOT##*/}

        ;;
    igepv2)

 #MLO=${MLO##*/}
 #UBOOT=${UBOOT##*/}
 MLO=NA
 UBOOT=NA
        ;;
    touchbook)

touchbook_boot_scripts

 MIRROR="http://rcn-ee.net/deb/"

 echo ""
 echo "1 / 7: Downloading X-loader and Uboot"
 echo ""

 rm -f ${DIR}/downloads/bootloader || true
wget -c --no-verbose --directory-prefix=${DIR}/downloads/ ${MIRROR}tools/latest/bootloader

 MLO=$(cat ${DIR}/downloads/bootloader | grep "ABI:5:MLO" | awk '{print $2}')
 UBOOT=$(cat ${DIR}/downloads/bootloader | grep "ABI:5:UBOOT" | awk '{print $2}')

 wget -c --no-verbose --directory-prefix=${DIR}/downloads/ ${MLO}
 wget -c --no-verbose --directory-prefix=${DIR}/downloads/ ${UBOOT}

 MLO=${MLO##*/}
 UBOOT=${UBOOT##*/}

        ;;
    panda)

panda_boot_scripts

 MIRROR="http://rcn-ee.net/deb/"

 echo ""
 echo "1 / 7: Downloading X-loader and Uboot"
 echo ""

 rm -f ${DIR}/downloads/bootloader || true
wget -c --no-verbose --directory-prefix=${DIR}/downloads/ ${MIRROR}tools/latest/bootloader

 MLO=$(cat ${DIR}/downloads/bootloader | grep "ABI:2:MLO" | awk '{print $2}')
 UBOOT=$(cat ${DIR}/downloads/bootloader | grep "ABI:2:UBOOT" | awk '{print $2}')

 wget -c --no-verbose --directory-prefix=${DIR}/downloads/ ${MLO}
 wget -c --no-verbose --directory-prefix=${DIR}/downloads/ ${UBOOT}

 MLO=${MLO##*/}
 UBOOT=${UBOOT##*/}

        ;;
esac

}

function cleanup_sd {

 echo ""
 echo "2 / 7: Unmountting Partitions"
 echo ""

 NUM_MOUNTS=$(mount | grep -v none | grep "$MMC" | wc -l)

 for (( c=1; c<=$NUM_MOUNTS; c++ ))
 do
DRIVE=$(mount | grep -v none | grep "$MMC" | tail -1 | awk '{print $1}')
  sudo umount ${DRIVE} &> /dev/null || true
done

sudo parted -s ${MMC} mklabel msdos
}

function create_partitions {

sudo fdisk -H 255 -S 63 ${MMC} << END
n
p
1

+64M
a
1
t
e
p
w
END

echo ""
echo "3 / 7: Formatting Boot Partition"
echo ""

sudo mkfs.vfat -F 16 ${MMC}${PARTITION_PREFIX}1 -n ${BOOT_LABEL}

sudo rm -rfd ${DIR}/disk || true

mkdir ${DIR}/disk
sudo mount ${MMC}${PARTITION_PREFIX}1 ${DIR}/disk

if [ "$DO_UBOOT" ];then
if ls ${DIR}/downloads/${MLO} >/dev/null 2>&1;then
 sudo cp -v ${DIR}/downloads/${MLO} ${DIR}/disk/MLO
fi

if ls ${DIR}/downloads/${UBOOT} >/dev/null 2>&1;then
 sudo cp -v ${DIR}/downloads/${UBOOT} ${DIR}/disk/u-boot.bin
fi
fi

cd ${DIR}/disk
sync
cd ${DIR}/
sudo umount ${DIR}/disk || true
echo "done"

SIZE=`sudo fdisk -s ${MMC}`
SIZE=$(( (SIZE/1024)-64-SWAPSIZE ))
echo "rootfs size = ${SIZE}"

sudo fdisk ${MMC} << ROOTFS
n
p
2

+${SIZE}M
p
w
ROOTFS

echo ""
echo "4 / 7: Formating ${RFS} Partition"
echo ""
sudo mkfs.${RFS} ${MMC}${PARTITION_PREFIX}2 -L ${RFS_LABEL}

sudo fdisk ${MMC} << SWAP
n
p
3


t
3
82
p
w
SWAP

echo ""
echo "4a / 7: Creating Swap Partition"
echo ""
sudo mkswap ${MMC}${PARTITION_PREFIX}3
echo "done"

}

function populate_boot {
 echo ""
 echo "5 / 7: Populating Boot Partition"
 echo ""
 sudo mount ${MMC}${PARTITION_PREFIX}1 ${DIR}/disk

 sudo cp ${LATEST_UIMAGE} ${DIR}/disk/uImage

if [ "$DO_UBOOT" ];then

if ls /tmp/boot.cmd >/dev/null 2>&1;then
 sudo mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Boot Script" -d /tmp/boot.cmd ${DIR}/disk/boot.scr
 sudo cp /tmp/boot.cmd ${DIR}/disk/boot.cmd
 rm -f /tmp/boot.cmd || true
fi



 #for igepv2 users
# if ls ${DIR}/disk/boot.scr >/dev/null 2>&1;then
# sudo cp -v ${DIR}/disk/boot.scr ${DIR}/disk/boot.ini
# fi

fi

 cd ${DIR}/disk/
 sync
 sync
 cd ${DIR}/

 sudo umount ${DIR}/disk || true
}

function populate_rootfs {
 echo ""
 echo "6 / 7: Populating rootfs Partition"
 echo "Be patient, this may take a few minutes"
 echo ""
 sudo mount ${MMC}${PARTITION_PREFIX}2 ${DIR}/disk

 mkdir image
 sudo mount -o loop ${LATEST_ROOT_IMAGE} ./image
 sudo rsync -aHx --delete ./image/* ${DIR}/disk/

 # add SGX and kernel modules
 INSTALL_ROOT=${DIR}/disk/

 # check if module tarball exists and install modules
 if [ -d ./$KERNEL_DIR/deploy ]; then
   echo "Installing kernel modules for $KERNEL_VERSION"
   # find latest module package
   LATEST_MODULES=`ls -t1 ./$KERNEL_DIR/deploy/$KERNEL_VERSION-*-modules.tar.gz | head -n1`
   echo "Installing modules from ${LATEST_MODULES}"
   sudo tar xfz $LATEST_MODULES -C $INSTALL_ROOT
 else
   echo "WARNING: kernel module path ./$KERNEL_VERSION-devel/deploy not found!"
 fi

 sudo umount ./image
 rmdir ./image

cd ${DIR}/disk/
 sync
 sync
 cd ${DIR}/

 sudo umount ${DIR}/disk || true

echo ""
 echo "7 / 7: setup_sdcard.sh script complete"
 echo ""
}

function check_mmc {
 FDISK=$(sudo LC_ALL=C sfdisk -l 2>/dev/null | grep "[Disk] ${MMC}" | awk '{print $2}')

 if test "-$FDISK-" = "-$MMC:-"
 then
echo ""
  echo "I see..."
  echo "sudo sfdisk -l:"
  sudo LC_ALL=C sfdisk -l 2>/dev/null | grep "[Disk] /dev/" --color=never
  echo ""
  echo "mount:"
  mount | grep -v none | grep "/dev/" --color=never
  echo ""
  read -p "Are you 100% sure, on selecting [${MMC}] (y/n)? "
  [ "$REPLY" == "y" ] || exit
echo ""
 else
echo ""
  echo "Are you sure? I Don't see [${MMC}], here is what I do see..."
  echo ""
  echo "sudo sfdisk -l:"
  sudo LC_ALL=C sfdisk -l 2>/dev/null | grep "[Disk] /dev/" --color=never
  echo ""
  echo "mount:"
  mount | grep -v none | grep "/dev/" --color=never
  echo ""
  exit
fi
}

function check_uboot_type {
 IN_VALID_UBOOT=1
 unset DO_UBOOT

case "$UBOOT_TYPE" in
    beagle)

 SYSTEM=beagle
 unset IN_VALID_UBOOT
 DO_UBOOT=1

        ;;
    beagle-proto)
#hidden: proto button bug

 SYSTEM=beagle
 SWAP_BOOT_USER=1
 unset IN_VALID_UBOOT
 DO_UBOOT=1

        ;;
    igepv2)

 SYSTEM=igepv2
 unset IN_VALID_UBOOT
 DO_UBOOT=1

        ;;
    touchbook)

 SYSTEM=touchbook
 unset IN_VALID_UBOOT
 DO_UBOOT=1

        ;;
    panda)

 SYSTEM=panda
 unset IN_VALID_UBOOT
 DO_UBOOT=1

        ;;
esac

if [ "$IN_VALID_UBOOT" ] ; then
usage
 fi
}

function check_addon_type {
 IN_VALID_ADDON=1

 if test "-$ADDON_TYPE-" = "-pico-"
 then
ADDON=pico
 unset IN_VALID_ADDON
 fi

if [ "$IN_VALID_ADDON" ] ; then
usage
 fi
}


function check_fs_type {
 IN_VALID_FS=1

case "$FS_TYPE" in
    ext2)

 RFS=ext2
 unset IN_VALID_FS

        ;;
    ext3)

 RFS=ext3
 unset IN_VALID_FS

        ;;
    ext4)

 RFS=ext4
 unset IN_VALID_FS

        ;;
    btrfs)

  if [ ! $(which mkfs.btrfs) ];then
echo "Missing btrfs tools"
   sudo aptitude install btrfs-tools
  fi

RFS=btrfs
 unset IN_VALID_FS

        ;;
esac

if [ "$IN_VALID_FS" ] ; then
usage
 fi
}

function check_contents {

 # determine name of latest kernel built
 KERNEL_DIR=stable-kernel
 KERNEL_VERSION=3.0.7
 if [ -d ./$KERNEL_DIR/deploy ]; then
   echo "Installing kernel modules for $KERNEL_VERSION"
   # find latest module package
   LATEST_UIMAGE=`ls -t1 ./$KERNEL_DIR/deploy/$KERNEL_VERSION-*.uImage | head -n1`
 fi

  if [ "${LATEST_UIMAGE}" == "" ]; then
    echo "No kernel image found in ./$KERNEL_DIR/deploy!"
    exit -1
  fi

  echo "Using kernel image ${LATEST_UIMAGE}"

  # try to find latest image
  LATEST_ROOT_IMAGE=`ls -t1 ./meego-${TYPE}-${ARCH}-beagle-*.img | head -n1`
  if [ "${LATEST_ROOT_IMAGE}" == "" ]; then
    echo "No root image found for ${TYPE}-${ARCH}-beagle"
    echo "Please run ./build_image.sh first"
    exit -1
  fi
  
  echo "using root image ${LATEST_ROOT_IMAGE}"
}

function usage {
    echo "usage: $(basename $0) --mmc /dev/sdX"
cat <<EOF

required options:
--mmc </dev/sdX>
Unformated MMC Card

Additional/Optional options:
-h --help
this help

--uboot <dev board>
beagle - <Bx, C2/C3/C4, xMA, xMB>
igepv2 - <no u-boot or MLO yet>
panda - <A1>

--use-default-user
(useful for serial only modes and when oem-config is broken)

--rootfs <fs_type>
ext3
ext4 - <set as default>
btrfs

--boot_label <boot_label>
boot partition label

--rfs_label <rfs_label>
rootfs partition label

--debug
enable all debug options for troubleshooting

EOF
exit
}

function checkparm {
    if [ "$(echo $1|grep ^'\-')" ];then
echo "E: Need an argument"
        usage
    fi
}

# parse commandline options
while [ ! -z "$1" ]; do
case $1 in
        -h|--help)
            usage
            MMC=1
            ;;
        --mmc)
            checkparm $2
            MMC="$2"
if [[ "${MMC}" =~ "mmcblk" ]]
            then
PARTITION_PREFIX="p"
            fi
check_mmc
            ;;
        --uboot)
            checkparm $2
            UBOOT_TYPE="$2"
            check_uboot_type
            ;;
        --addon)
            checkparm $2
            ADDON_TYPE="$2"
            check_addon_type
            ;;
        --rootfs)
            checkparm $2
            FS_TYPE="$2"
            check_fs_type
            ;;
        --use-default-user)
            DEFAULT_USER=1
            ;;
        --boot_label)
            checkparm $2
            BOOT_LABEL="$2"
            ;;
        --rfs_label)
            checkparm $2
            RFS_LABEL="$2"
            ;;
        --debug)
            DEBUG=1
            ;;
    esac
shift
done

if [ ! "${MMC}" ];then
    usage
fi

check_contents
check_uboot_type

detect_software

if [ "$DO_UBOOT" ];then
    dl_xload_uboot
fi

cleanup_sd
create_partitions
populate_boot
populate_rootfs
