(可选)-flash> <(可选)-ddrsize>用法示例:sudo ./imx6mks..._i.mx6ull rootfs烧写sd">
赞
踩
- #! /bin/sh
- #I.MX6 SD卡启动系统烧写脚本
- #版本v1.0
- #Author:ALIENTEK
- VERSION="1.0"
- #打印用法
- usage ()
- {
- echo "
- 用法: `basename $1` [选项] <(必选)-device> <(可选)-flash> <(可选)-ddrsize>
- 用法示例:
- sudo ./imx6mksdboot.sh -device /dev/sdd
- sudo ./imx6mksdboot.sh -device /dev/sdd -flash emmc -ddrsize 512
- 命令选项:
- -device SD卡块设备节点 (例如/dev/sdx)
- -flash 请选择开发板Flash类型(emmc | nand)
- -ddrsize 请选择DDR大小 (512 | 256)
- 可选选项:
- --version 打印版本信息.
- --help 打印帮助信息.
- "
- exit 1
- }
- #Uboot默认值
- Uboot='u-boot-imx6ull-14x14-ddr512-emmc.imx'
-
- #execute执行语句成功与否打印
- execute ()
- {
- $* >/dev/null
- if [ $? -ne 0 ]; then
- echo
- echo "错误: 执行 $*"
- echo
- exit 1
- fi
- }
-
- #打印版本信息
- version ()
- {
- echo
- echo "`basename $1` version $VERSION"
- echo "I.MX6 SD卡制卡脚本"
- echo
-
- exit 0
- }
-
- #判断参数个数
- arg=$#
- if [ $arg -ne 6 ];then
- number=1
-
- while [ $# -gt 0 ]; do
- case $1 in
- --help | -h)
- usage $0
- ;;
- -device) shift; device=$1; shift; ;;
- --version) version $0;;
- *) copy="$copy $1"; shift; ;;
- esac
- done
- #判断字符串是否为零
- test -z $device && usage $0
- echo ""
- echo "根据下面的提示,补全缺省的参数-flash -ddrsize"
- read -p "请选择开发板参数,输入数字1~4,按Enter键确认
- 1.-flash emmc,-ddrsize 512
- 2.-flash emmc,-ddrsize 256
- 3.-flash nand,-ddrsize 512
- 4.-flash nand,-ddrsize 256
- 输入数字1~4(default 1): " number
- if [ -z $number ];then
- echo "使用默认参数:EMMC版本,DDR大小为512MB"
- else
- case $number in
- 1) echo '您已经选择开发板参数为:EMMC版本,DDR大小为512MB'
- Uboot='u-boot-imx6ull-14x14-ddr512-emmc.imx'
- ;;
- 2) echo '您已经选择开发板参数为:EMMC版本,DDR大小为256MB'
- Uboot='u-boot-imx6ull-14x14-ddr256-emmc.imx'
- ;;
- 3) echo '您已经选择开发板参数为:NAND FLASH版本,DDR大小为512MB'
- Uboot='u-boot-imx6ull-14x14-ddr512-nand-sd.imx'
- ;;
- 4) echo '您已经选择开发板参数为:NAND FLASH版本,DDR大小为256MB'
- Uboot='u-boot-imx6ull-14x14-ddr256-nand-sd.imx'
- ;;
- *) echo '输入的参数有误,退出制卡';exit;
- ;;
- esac
- fi
- else
- #命令行处理,根据选项获得参数
- while [ $# -gt 0 ]; do
- case $1 in
- --help | -h)
- usage $0
- ;;
- -device) shift; device=$1; shift; ;;
- -flash) shift; flash=$1; shift; ;;
- -ddrsize) shift; ddrsize=$1; shift; ;;
- --version) version $0;;
- *) copy="$copy $1"; shift; ;;
- esac
- done
- if [ $flash = "emmc" -a $ddrsize = "512" ];then
- Uboot='u-boot-imx6ull-14x14-ddr512-emmc.imx'
- echo '您已经选择开发板参数为:EMMC版本,DDR大小为512MB'
-
- elif [ $flash = "emmc" -a $ddrsize = "256" ];then
- Uboot='u-boot-imx6ull-14x14-ddr256-emmc.imx'
- echo '您已经选择开发板参数为:EMMC版本,DDR大小为256MB'
-
- elif [ $flash = "nand" -a $ddrsize = "512" ];then
- Uboot='u-boot-imx6ull-14x14-ddr512-nand-sd.imx'
- echo '您已经选择开发板参数为:NAND FLASH版本,DDR大小为512MB'
-
- elif [ $flash = "nand" -a $ddrsize = "256" ];then
- Uboot='u-boot-imx6ull-14x14-ddr256-nand-sd.imx'
- echo '您的开发板参数为:NAND FLASH版本,DDR大小为256MB'
- else
- echo '参数有误!'
- usage $0
- fi
- fi
-
- #测试制卡包当前目录下是否缺失制卡所需要的文件
- sdkdir=$PWD
-
- if [ ! -d $sdkdir ]; then
- echo "错误: $sdkdir目录不存在"
- exit 1
- fi
-
- if [ ! -f $sdkdir/filesystem/*.tar.* ]; then
- echo "错误: $sdkdir/filesystem/下找不到文件系统压缩包"
- exit 1
- fi
-
- if [ ! -f $sdkdir/boot/zImage ]; then
- echo "错误: $sdkdir/boot/下找不到zImage"
- exit 1
- fi
- #判断选择的块设备是否存在及是否是一个块设备
- if [ ! -b $device ]; then
- echo "错误: $device 不是一个块设备文件"
- exit 1
- fi
- #这里防止选错设备,否则会影响Ubuntu系统的启动
- if [ $device = '/dev/sda' ];then
- echo "请不要选择sda设备,/dev/sda通常是您的Ubuntu硬盘!
- 继续操作你的系统将会受到影响!脚本已自动退出"
- exit 1
- fi
- echo "即将进行制作SD系统启动卡,大约花费几分钟时间,请耐心等待!"
- echo "************************************************************"
- echo "* 注意:这将会清除$device所有的数据 *"
- echo "* 在脚本执行时请不要将$device拔出 *"
- echo "* 请按<Enter>确认继续 *"
- echo "************************************************************"
- read enter
-
- #格式化前要卸载
- for i in `ls -1 $device?`; do
- echo "卸载 device '$i'"
- umount $i 2>/dev/null
- done
-
- #执行格式化$device
- execute "dd if=/dev/zero of=$device bs=1024 count=1024"
-
- #第一个分区为64M用来存放设备树与内核镜像文件,因为设备树与内核都比较小,不需要太大的空间
- #第二个分区为SD卡的总大小-64M,用来存放文件系统
- cat << END | fdisk -H 255 -S 63 $device
- n
- p
- 1
- +64M
- n
- p
- 2
- t
- 1
- c
- a
- 1
- w
- END
-
- #两个分区处理
- PARTITION1=${device}1
- if [ ! -b ${PARTITION1} ]; then
- PARTITION1=${device}1
- fi
-
- PARTITION2=${device}2
- if [ ! -b ${PARTITION2} ]; then
- PARTITION2=${device}2
- fi
-
- #第一个分区创建为Fat32格式
- echo "格式化 ${device}1 ..."
- if [ -b ${PARTITION1} ]; then
- mkfs.vfat -F 32 -n "boot" ${PARTITION1}
- else
- echo "错误: /dev下找不到 SD卡 boot分区"
- fi
- #第二个分区创建为ext4格式
- echo "格式化${device}2 ..."
- if [ -b ${PARITION2} ]; then
- mkfs.ext4 -F -L "rootfs" ${PARTITION2}
- else
- echo "错误: /dev下找不到 SD卡 rootfs分区"
- fi
-
- while [ ! -e $device ]
- do
- sleep 1
- echo "wait for $device appear"
- done
-
- echo "正在烧写${Uboot}到${device}"
- execute "dd if=$sdkdir/boot/$Uboot of=$device bs=1024 seek=1 conv=fsync"
- sync
- echo "烧写${Uboot}到${device}完成!"
-
- echo "正在准备复制..."
- echo "正在复制设备树与内核到${device}1,请稍候..."
- execute "mkdir -p /tmp/sdk/$$"
- execute "mount ${device}1 /tmp/sdk/$$"
- execute "cp -r $sdkdir/boot/*${flash}*.dtb /tmp/sdk/$$/"
- execute "cp -r $sdkdir/boot/zImage /tmp/sdk/$$/"
- #execute "cp $sdkdir/boot/alientek.bmp /tmp/sdk/$$/"
- sync
- echo "复制设备树与内核到${device}1完成!"
-
- if [ "$copy" != "" ]; then
- echo "Copying additional file(s) on ${device}p1"
- execute "cp -r $copy /tmp/sdk/$$"
- fi
-
- echo "卸载${device}1"
- execute "umount /tmp/sdk/$$"
- sleep 1
- #解压文件系统到文件系统分区
- #挂载文件系统分区
- execute "mkdir -p /tmp/sdk/$$"
- execute "mount ${device}2 /tmp/sdk/$$"
-
- echo "正在解压文件系统到${device}2 ,请稍候..."
- rootfs=`ls -1 filesystem/*.tar.*`
- execute "tar jxfm $rootfs -C /tmp/sdk/$$"
- sync
- echo "解压文件系统到${device}2完成!"
-
- echo "正在解压模块到${device}2/lib/modules/ ,请稍候..."
- modules=`ls -1 modules/*.tar.*`
- execute "tar jxfm $modules -C /tmp/sdk/$$/lib/modules/"
- sync
- echo "解压模块到${device}2/lib/modules/完成!"
-
- echo "卸载${device}2"
- execute "umount /tmp/sdk/$$"
-
- execute "rm -rf /tmp/sdk/$$"
- sync
- echo "SD卡启动系统烧写完成!"
-
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。