#! /bin/sh

## @file
#
#  Copyright (c) 2010 Intel Corporation. All rights reserved.<BR>
#
#  This program and the accompanying materials
#  are licensed and made available under the terms and conditions of the BSD License
#  which accompanies this distribution. The full text of the license may be found at
#  http://opensource.org/licenses/bsd-license.php
#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
#
##

# Set up environment at fisrt.

export BASETOOLS_DIR=$WORKSPACE/Conf/BaseToolsSource/Source/C/bin
export BOOTSECTOR_BIN_DIR=$WORKSPACE/DuetPkg/BootSector/bin
export DISK_LABEL=DUET
export PROCESS_MARK=TRUE

if [ \
     -z "$*" -o \
     "$*" = "-?" -o \
     "$*" = "-h" -o \
     "$*" = "--help" \
   ]
then
	echo "Usage: CreateBootDisk [usb|floppy|ide] MediaPath DevicePath [FAT12|FAT16|FAT32] [IA32|X64]"
	echo "e.g. : CreateBootDisk floppy /media/floppy0 /dev/fd0 FAT12 IA32"
	PROCESS_MARK=FALSE
fi

case "$5" in
   IA32)
     export PROCESSOR=IA32
     ;;
   X64)
     export PROCESSOR=X64
     ;;
   *)
     echo Invalid Architecture string, should be only IA32 or X64
     return 1
esac

export BUILD_DIR=$WORKSPACE/Build/DuetPkg$PROCESSOR/DEBUG_UNIXGCC


export EFI_BOOT_MEDIA=$2
export EFI_BOOT_DEVICE=$3

if [ "$PROCESS_MARK" = TRUE ]
then
	case "$1" in
		floppy)
			if [ "$4" = FAT12 ]
			then
				echo Start to create floppy boot disk ...
				echo Format $EFI_BOOT_MEDIA ...
				## Format floppy disk
				umount $EFI_BOOT_MEDIA
				mkfs.msdos $EFI_BOOT_DEVICE
				mount $EFI_BOOT_DEVICE $EFI_BOOT_MEDIA
				echo Create boot sector ...
				## Linux version of GenBootSector has not pass build yet.
				$BASETOOLS_DIR/GnuGenBootSector -i $EFI_BOOT_DEVICE -o FDBs.com
				$BASETOOLS_DIR/BootSectImage -g FDBs.com $BOOTSECTOR_BIN_DIR/bootsect.com -f
				$BASETOOLS_DIR/GnuGenBootSector -o $EFI_BOOT_DEVICE -i $BOOTSECTOR_BIN_DIR/bootsect.com
	
				cp $BUILD_DIR/FV/Efildr $EFI_BOOT_MEDIA
	
				mkdir -p $EFI_BOOT_MEDIA/efi
				mkdir -p $EFI_BOOT_MEDIA/efi/boot
				if [ "$5" = IA32 ]
				then
					cp $WORKSPACE/EdkShellBinPkg/MinimumShell/Ia32/Shell.efi $EFI_BOOT_MEDIA/efi/boot/bootia32.efi 
				else
					if [ "$5" = X64 ]
					then
						cp $WORKSPACE/EdkShellBinPkg/MinimumShell/X64/Shell.efi $EFI_BOOT_MEDIA/efi/boot/bootx64.efi 
					else
						echo Wrong Arch!
					fi
				fi
				echo Done.
			else
				echo "Wrong FAT type $4 for floppy!"
			fi
			;;

		file) # CreateFile
			if [ "$4" = FAT12 ]
				then
				echo "Start to create file boot disk ..."
				echo Create boot sector ...	
	
				## Linux version of GenBootSector has not pass build yet.
				$BASETOOLS_DIR/GnuGenBootSector -i $EFI_BOOT_MEDIA -o FDBs.com
				$BASETOOLS_DIR/BootSectImage -g FDBs.com $BOOTSECTOR_BIN_DIR/bootsect.com -f
				$BASETOOLS_DIR/GnuGenBootSector -o $EFI_BOOT_MEDIA -i $BOOTSECTOR_BIN_DIR/bootsect.com
				echo Done.
			else
				echo "Wrong FAT type" $4 "for floppy!"
			fi
			;;

		usb) # CreateUsb

			if [ "$4" = FAT16 ]
			then
				if [ "$6" = step2 ]
				then
					cp $BUILD_DIR/FV/Efildr16 $EFI_BOOT_MEDIA
					mkdir $EFI_BOOT_MEDIA/efi/boot
					if [ "$5" = IA32 ]
					then
						cp $WORKSPACE/EdkShellBinPkg/MinimumShell/Ia32/Shell.efi $EFI_BOOT_MEDIA/efi/boot/bootia32.efi 
					else
						if [ "$5" = X64 ]
						then
							cp $WORKSPACE/EdkShellBinPkg/MinimumShell/X64/Shell.efi $EFI_BOOT_MEDIA/efi/boot/bootx64.efi 
						else
							echo Wrong Arch!
						fi
					fi
					echo "step2 Done!"
				else
					echo Format $EFI_BOOT_DEVICE ...
					#Do format command.
					echo Create boot sector ...
					## Linux version of GenBootSector & Bootsectimage has not pass build yet.
					$BASETOOLS_DIR/GnuGenBootSector -i $EFI_BOOT_DEVICE -o UsbBs16.com
					$BASETOOLS_DIR/BootSectImage -g UsbBs16.com $BOOTSECTOR_BIN_DIR/bs16.com -f
					$BASETOOLS_DIR/GnuGenBootSector -o $EFI_BOOT_DEVICE -i $BOOTSECTOR_BIN_DIR/bs16.com
					$BASETOOLS_DIR/GnuGenBootSector -m -o $EFI_BOOT_DEVICE -i $BOOTSECTOR_BIN_DIR/Mbr.com
					echo Done.
					echo PLEASE UNPLUG USB, THEN PLUG IT AGAIN TO DO STEP2!
				fi
			elif [ "$4" = FAT32 ]
			then 
				if [ "$6" = step2 ]
				then
					cp $BUILD_DIR/FV/Efildr20 $EFI_BOOT_MEDIA
					mkdir $EFI_BOOT_MEDIA/efi/boot
					if [ "$5" = IA32 ]
					then
						cp $WORKSPACE/EdkShellBinPkg/MinimumShell/Ia32/Shell.efi $EFI_BOOT_MEDIA/efi/boot/bootia32.efi 
					else
						if [ "$5" = X64 ]
						then
							cp $WORKSPACE/EdkShellBinPkg/MinimumShell/X64/Shell.efi $EFI_BOOT_MEDIA/efi/boot/bootx64.efi 
						else
							echo Wrong Arch!
						fi
					fi
					echo "step2 Done!"
				else
					echo Format $EFI_BOOT_DEVICE ...
					#Do format command.
					echo Create boot sector ...
					## Linux version of GenBootSector & Bootsectimage has not pass build yet.
					$BASETOOLS_DIR/GnuGenBootSector -i $EFI_BOOT_DEVICE -o UsbBs32.com
					$BASETOOLS_DIR/BootSectImage -g UsbBs32.com $BOOTSECTOR_BIN_DIR/bs32.com -f
					$BASETOOLS_DIR/GnuGenBootSector -o $EFI_BOOT_DEVICE -i $BOOTSECTOR_BIN_DIR/bs32.com
					$BASETOOLS_DIR/GnuGenBootSector -m -o $EFI_BOOT_DEVICE -i $BOOTSECTOR_BIN_DIR/Mbr.com
					echo Done.
					echo PLEASE UNPLUG USB, THEN PLUG IT AGAIN TO DO STEP2!
				fi			
			else
				echo "Wrong FAT type $1 for floppy!"
			fi
	
			;;

		ide) # CreateIde
		echo "Not support yet!"
		;;
		*)
		echo "Arg1 should be [floppy | file | usb | ide] !"

	esac
fi
