• 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]"
  • 相关阅读:
    2018-04-27 搭建Python官方文档翻译环境-汉化示例代码
    2018-04-21 搭建Python官方文档翻译环境
    2018-01-19 Xtext试用: 5步实现一个(中文)JVM语言
    2018-02-27 "Literate Programming"一书摘记之一
    2018-02-18 Antlr4实现简单语言之条件语句
    2018-02-17 中文代码示例[译]Scala中创建隐式函数
    2018-02-16 中文代码示例之冒泡算法, 后感
    C code example for strdup
    Hash table: why size should be prime?
    Hash table lengths and prime numbers
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/4552255.html
Copyright © 2020-2023  润新知