zoukankan      html  css  js  c++  java
  • OK335xS-Android mkmmc-android-ubifs.sh hacking

      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]"
  • 相关阅读:
    PAT 1006 Sign In and Sign Out
    PAT 1004. Counting Leaves
    JavaEE开发环境安装
    NoSql数据库探讨
    maven的配置
    VMWARE 下使用 32位 Ubuntu Linux ,不能给它分配超过3.5G 内存?
    XCODE 4.3 WITH NO GCC?
    在苹果虚拟机上跑 ROR —— Ruby on Rails On Vmware OSX 10.7.3
    推荐一首让人疯狂的好歌《Pumped Up Kicks》。好吧,顺便测下博客园可以写点无关技术的帖子吗?
    RUBY元编程学习之”编写你的第一种领域专属语言“
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/4552255.html
Copyright © 2011-2022 走看看