#!/bin/bash
|
# Author: Guo Wenxue<guowenxue@gmail.com> QQ: 281143292
|
#
|
# This script will create a bootable SD card and install u-boot into it.
|
# Formatting can be skipped if the SD card is already formatted properly.
|
# SD card had better smaller than 16GB.
|
#
|
# It must be run with root permissions. Example:
|
# $ sudo ./uboot-sdcard.sh
|
#
|
|
PWD=`pwd`
|
PRJ_PATH=`dirname ${PWD}`
|
IMG_PATH=${PRJ_PATH}/linux-bsp/images
|
|
function check_root_run()
|
{
|
AMIROOT=`whoami | awk {'print $1'}`
|
if [ "$AMIROOT" != "root" ] ; then
|
echo ""
|
echo " **** Error *** must run script with sudo"
|
echo ""
|
exit
|
fi
|
}
|
|
# find the avaible SD cards
|
function find_avaible_sdcard()
|
{
|
echo " "
|
echo "Availible Drives to write images to: "
|
echo " "
|
|
ROOTDRIVE=`mount | grep 'on / ' | awk {'print $1'} | cut -c6-8`
|
echo "# major minor size name "
|
cat /proc/partitions | grep -v $ROOTDRIVE | grep '\<sd.\>' | grep -n ''
|
echo " "
|
|
ENTERCORRECTLY=0
|
while [ $ENTERCORRECTLY -ne 1 ]
|
do
|
read -p 'Enter Device Number: ' DRIVENUMBER
|
echo " "
|
|
DEVNAME=`cat /proc/partitions | grep -v 'sda' | grep '\<sd.\>' | grep -n '' | grep "${DRIVENUMBER}:" | awk '{print $5}'`
|
DRIVE=/dev/$DEVNAME
|
DEVSIZE=`cat /proc/partitions | grep -v 'sda' | grep '\<sd.\>' | grep -n '' | grep "${DRIVENUMBER}:" | awk '{print $4}'`
|
|
if [ -n "$DEVNAME" ] ; then
|
ENTERCORRECTLY=1
|
echo "$DEVNAME was selected"
|
else
|
echo "Invalid selection"
|
fi
|
|
echo ""
|
done
|
|
}
|
|
function check_umount_sdcard()
|
{
|
echo ""
|
echo "+-----------------------------------------+"
|
echo "| Check and umount SD card $DEVNAME |"
|
echo "+-----------------------------------------+"
|
echo ""
|
|
#unmount drives if they are mounted
|
unmounted1=`df | grep '\<'$DEVNAME'1\>' | awk '{print $1}'`
|
unmounted2=`df | grep '\<'$DEVNAME'2\>' | awk '{print $1}'`
|
unmounted3=`df | grep '\<'$DEVNAME'3\>' | awk '{print $1}'`
|
|
if [ -n "$unmounted1" ] ; then
|
echo " unmounted ${DRIVE}1"
|
sudo umount -f ${DRIVE}1
|
fi
|
|
if [ -n "$unmounted2" ] ; then
|
echo " unmounted ${DRIVE}2"
|
sudo umount -f ${DRIVE}2
|
fi
|
|
if [ -n "$unmounted3" ] ; then
|
echo " unmounted ${DRIVE}3"
|
sudo umount -f ${DRIVE}3
|
fi
|
}
|
|
function check_partition_sdcard()
|
{
|
echo ""
|
echo "+-----------------------------------------+"
|
echo "| Check SD cards partitions |"
|
echo "+-----------------------------------------+"
|
echo ""
|
|
# check to see if the device is already partitioned
|
SIZE1=`cat /proc/partitions | grep -v 'sda' | grep '\<'$DEVNAME'1\>' | awk '{print $3}'`
|
SIZE2=`cat /proc/partitions | grep -v 'sda' | grep '\<'$DEVNAME'2\>' | awk '{print $3}'`
|
SIZE3=`cat /proc/partitions | grep -v 'sda' | grep '\<'$DEVNAME'3\>' | awk '{print $3}'`
|
SIZE4=`cat /proc/partitions | grep -v 'sda' | grep '\<'$DEVNAME'4\>' | awk '{print $3}'`
|
|
echo " ${DEVNAME}1 ${DEVNAME}2 ${DEVNAME}3"
|
echo $SIZE1 $SIZE2 $SIZE3
|
echo ""
|
|
PARTITION="0"
|
if [ -n "$SIZE1" -a -n "$SIZE2" ] ; then
|
if [ "$SIZE1" -gt "72000" -a "$SIZE2" -gt "700000" ] ; then
|
echo "Detected device has partitions already"
|
PARTITION=1
|
fi
|
else
|
echo "WARN: SD Card is not correctly partitioned"
|
fi
|
|
}
|
|
function format_sdcard()
|
{
|
check_partition_sdcard
|
|
if [ $PARTITION -eq 1 ] ; then
|
ENTERCORRECTLY=0
|
while [ $ENTERCORRECTLY -ne 1 ]
|
do
|
echo ""
|
read -p 'Would you like to re-partition the drive anyways [y/n] : ' CASEPARTITION
|
ENTERCORRECTLY=1
|
|
echo ""
|
case $CASEPARTITION in
|
"y") echo "Now partitioning $DEVICEDRIVENAME ...";PARTITION=0;;
|
"n") echo "Skipping partitioning"; return ;;
|
*) echo "Please enter y or n";ENTERCORRECTLY=0;;
|
esac
|
done
|
fi
|
|
|
echo ""
|
echo "+-----------------------------------------+"
|
echo "| Now making 2 partitions |"
|
echo "+-----------------------------------------+"
|
echo ""
|
|
dd if=/dev/zero of=$DRIVE bs=1024 count=1024
|
SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`
|
echo DISK SIZE - $SIZE bytes
|
|
# 每一个柱面的大小为255*63*512=8,225,280 Bytes
|
CYLINDERS=`echo $SIZE/255/63/512 | bc`
|
|
# sfdisk的-D参数指定与DOS兼容,并自动在每个分区前预留空间,以存放MBR(Master Boot Record);
|
# 第一行分区描述,40,0x0C,*, 自动分配起始柱面,数量为40,分区ID为0x0C(表示FAT32分区),< bootable >为*, 表示可启动分区。
|
# 第二行分区描述,41,,,-, 起始柱面为41,后面的所有空间分配到该分区。
|
|
sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE << EOF
|
,40,0x0C,*
|
41,,,-
|
EOF
|
|
|
echo ""
|
echo "+-----------------------------------------+"
|
echo "| Format boot partition as FAT |"
|
echo "+-----------------------------------------+"
|
echo ""
|
mkfs.vfat -F 32 -n "boot" ${DRIVE}1
|
|
|
echo ""
|
echo "+-----------------------------------------+"
|
echo "| Format rootfs partition as ext3 |"
|
echo "+-----------------------------------------+"
|
echo ""
|
mkfs.ext3 -L "rootfs" ${DRIVE}2
|
|
|
sync
|
sync
|
}
|
|
function install_uboot()
|
{
|
|
echo ""
|
echo "+-----------------------------------------+"
|
echo "| Install bootloader into SD card |"
|
echo "+-----------------------------------------+"
|
echo ""
|
|
ENTERCORRECTLY=0
|
while [ $ENTERCORRECTLY -ne 1 ]
|
do
|
read -p 'Would you like to continue install u-boot ? [y/n] : ' EXITQ
|
echo ""
|
echo " "
|
|
ENTERCORRECTLY=1
|
case $EXITQ in
|
"n") ;;
|
"y")
|
mkdir /media/{boot,rootfs} 2> /dev/null
|
sudo mount ${DRIVE}1 /media/boot
|
|
COPY=0
|
|
if [ -s ${IMG_PATH}/MLO ] ; then
|
echo "cp -f ${IMG_PATH}/MLO /media/boot"
|
cp -f ${IMG_PATH}/MLO /media/boot
|
COPY=1
|
fi
|
|
if [ -s ${IMG_PATH}/u-boot.img ] ; then
|
echo "cp -f ${IMG_PATH}/u-boot.img /media/boot"
|
cp -f ${IMG_PATH}/u-boot.img /media/boot
|
COPY=2
|
fi
|
|
if [ $COPY != 2 ] ; then
|
echo "ERROR: MLO or u-boot.img copy failure"
|
fi
|
|
echo "ls /medial/boot"
|
ls --color /media/boot
|
|
echo ""
|
echo "Install bootloader done"
|
echo ""
|
|
sudo umount /media/boot
|
return;;
|
|
*) echo "Please enter y or n"; ENTERCORRECTLY=0;;
|
esac
|
done
|
}
|
|
|
check_root_run
|
|
find_avaible_sdcard
|
|
check_umount_sdcard
|
|
format_sdcard
|
|
install_uboot
|