From 08a6c1c118d47abb9d10fb5c70b1cb3092505715 Mon Sep 17 00:00:00 2001
From: Guo Wenxue <guowenxue@gmail.com>
Date: Sat, 27 Jun 2020 16:28:14 +0800
Subject: [PATCH] add new uboot-sdcard.sh shell script and backup original create-sdcard.sh into ref folder

---
 tools/ref/create-sdcard.sh |    0 
 tools/uboot-sdcard.sh      |  251 ++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 251 insertions(+), 0 deletions(-)

diff --git a/tools/create-sdcard.sh b/tools/ref/create-sdcard.sh
similarity index 100%
rename from tools/create-sdcard.sh
rename to tools/ref/create-sdcard.sh
diff --git a/tools/uboot-sdcard.sh b/tools/uboot-sdcard.sh
new file mode 100755
index 0000000..4533be2
--- /dev/null
+++ b/tools/uboot-sdcard.sh
@@ -0,0 +1,251 @@
+#!/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
+

--
Gitblit v1.9.1