1 #/******************************************************************************* 2 # * OK335xS-Android mkmmc-android-ubifs.sh hacking 3 # * 声明: 4 # * 通过分析该源代码,可以知道常说的自动烧写软件的工作原理 5 # * 参考:sfidsk创建可启动分区问题--http://segmentfault.com/a/1190000002493628 6 # * 2015-6-4 晴 深圳 南山平山村 曾剑锋 7 # ******************************************************************************/ 8 #!/bin/bash 9 10 # 如果命令行参数等于1,则告知用户如何使用该软件,第一个参数为mmc设备节点 11 EXPECTED_ARGS=1 12 if [ $# == $EXPECTED_ARGS ] 13 then 14 echo "Assuming Default Locations for Prebuilt Images" 15 $0 $1 Boot_Images/MLO Boot_Images/u-boot.img Boot_Images/uImage Boot_Images/uEnv.txt Filesystem/ubi.img Media_Clips START_HERE Boot_Images/boot.scr 16 exit 17 fi 18 19 # 判断参数字符串是否为空,从这里我们可以知道参数长度为6 20 if [[ -z $1 || -z $2 || -z $3 || -z $4 || -z $5 || -z $6 ]] 21 then 22 echo "mkmmc-android-ubifs.sh Usage:" 23 echo " sudo ./mkmmc-android-ubifs.sh <device> <MLO> <u-boot.img> <uImage> <uEnv.txt> <ubi.img> <Optional_Media_Clips_Folder> <Optional_Start_Here_Folder> " 24 echo " Example: sudo ./mkmmc-android-ubifs.sh /dev/sdc MLO u-boot.img uImage uEnv.txt ubi.img Media_Clips START_HERE" 25 exit 26 fi 27 28 # 检查参数传入的文件是否存在 29 if ! [[ -e $2 ]] 30 then 31 echo "Incorrect MLO location!" 32 exit 33 fi 34 35 if ! [[ -e $3 ]] 36 then 37 echo "Incorrect u-boot.img location!" 38 exit 39 fi 40 41 if ! [[ -e $4 ]] 42 then 43 echo "Incorrect uImage location!" 44 exit 45 fi 46 47 if ! [[ -e $5 ]] 48 then 49 echo "Incorrect uEnv.txt location!" 50 exit 51 fi 52 53 if ! [[ -e $6 ]] 54 then 55 echo "Incorrect ubifs location!" 56 exit 57 fi 58 59 # 提醒用户,如果继续,mmc中数据将丢失 60 echo "All data on "$1" now will be destroyed! Continue? [y/n]" 61 read ans 62 if ! [ $ans == 'y' ] 63 then 64 exit 65 fi 66 67 echo "[Unmounting all existing partitions on the device ]" 68 69 umount $1* # 卸载可能挂载的mmc设备节点 70 71 echo "[Partitioning $1...]" # 提示开始对mmc设备重新分区 72 73 # 开始擦除分区表,每次擦除1024字节,一共擦除1024次,也就是相当于擦除: 74 # 1024字节 * 1024 次 = 1M 字节 75 DRIVE=$1 76 dd if=/dev/zero of=$DRIVE bs=1024 count=1024 77 78 SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'` # 获取mmc的总大小 79 80 echo DISK SIZE - $SIZE bytes # 显示mmc的总大小 81 82 # mmc为1G所以CYLINDERS=1024*1024*1024/255/63/512=130,63为扇区数,255磁头数, 83 # 其他的参数目前没搞懂,反正这里就是计算一共有多少个CYLINDER 84 CYLINDERS=`echo $SIZE/255/63/512 | bc` 85 86 echo CYLINDERS - $CYLINDERS # 显示柱面的多少 87 88 # 这里分了4个区,目前没有完全理解这里的分区原理: 89 # 1. 第一分区: 90 # 1. 可用地址开始(不进行指定则为第一可用柱面); 91 # 2. 占用40个柱面; 92 # 3. 分区ID: 0x0C(FAT32(LBA)分区); 93 # 4. *:从man文档感觉是代表可启动分区. 94 # 2. 第二分区: 95 # 1. 可用地址开始; 96 # 2. 占用1个柱面; 97 # 3. 分区ID: 0x0C(FAT32(LBA)分区); 98 # 4. -:从man文档感觉是代表非启动分区. 99 # 3. 第三分区: 100 # 1. 可用地址开始; 101 # 2. 占用($CYLINDERS / 4)个柱面; 102 # 3. 分区ID: 未指定(默认貌似是Linux); 103 # 4. -:同上 104 # 4. 第四分区: 105 # 1. 可用地址开始; 106 # 2. 剩余柱面(不进行指定则指全部柱面); 107 # 3. 分区ID: 未指定(默认貌似是Linux); 108 # 4. -:同上 109 { 110 echo ,40,0x0C,* 111 echo ,1,0x0C,- 112 echo ,$(expr $CYLINDERS / 4),,- 113 echo ,,,- 114 } | sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE 115 116 echo "[Making filesystems...]" # 提示开始制作文件系统 117 118 if [[ ${DRIVE} == /dev/*mmcblk* ]] 119 then 120 DRIVE=${DRIVE}p # 获取设备节点模板 121 fi 122 123 # 格式化各个分区 124 mkfs.vfat -F 32 -n boot ${DRIVE}1 &> /dev/null 125 mkfs.vfat -F 32 -n dummy ${DRIVE}2 &> /dev/null 126 mkfs.ext4 -L usrdata ${DRIVE}3 &> /dev/null 127 mkfs.vfat -F 32 -n data ${DRIVE}4 &> /dev/null 128 129 echo "[Copying files...]" 130 131 # 将各个文件拷贝进入对应的分区,结果绝大部分拷入了boot分区 @__@ 132 mount ${DRIVE}1 /mnt 133 echo "[Copying boot files...]" 134 cp $2 /mnt/MLO 135 cp $3 /mnt/u-boot.img 136 cp $4 /mnt/uImage 137 cp $5 /mnt/uEnv.txt 138 cp $9 /mnt/boot.scr 139 echo "[Copying ubifs image...]" 140 cp $6 /mnt/ubi.img 141 if [ "$8" ] 142 then 143 echo "[Copying start-here folder to boot partition...]" 144 cp -r $8 /mnt/START_HERE 145 fi 146 echo "[syncing...]" 147 sync # flush file system buffers 148 umount ${DRIVE}1 149 150 if [ "$7" ] 151 then 152 echo "[Copying all media clips to data partition...]" 153 mount ${DRIVE}4 /mnt 154 cp -r $7/* /mnt/ 155 umount ${DRIVE}4 156 fi 157 158 echo "[Done]"
时间: 2024-10-03 10:58:11