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