#/*******************************************************************************
# * OK335xS-Android mkmmc-android-ubifs.sh hacking
# * 声明:
# * 通过分析该源代码,可以知道常说的自动烧写软件的工作原理
# * 参考:sfidsk创建可启动分区问题--http://segmentfault.com/a/1190000002493628
# * 2015-6-4 晴 深圳 南山平山村 曾剑锋
# ******************************************************************************/
#!/bin/bash # 如果命令行参数等于1,则告知用户如何使用该软件,第一个参数为mmc设备节点
EXPECTED_ARGS=
if [ $# == $EXPECTED_ARGS ]
then
echo "Assuming Default Locations for Prebuilt Images"
$ $ 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
exit
fi # 判断参数字符串是否为空,从这里我们可以知道参数长度为6
if [[ -z $ || -z $ || -z $ || -z $ || -z $ || -z $ ]]
then
echo "mkmmc-android-ubifs.sh Usage:"
echo " sudo ./mkmmc-android-ubifs.sh <device> <MLO> <u-boot.img> <uImage> <uEnv.txt> <ubi.img> <Optional_Media_Clips_Folder> <Optional_Start_Here_Folder> "
echo " Example: sudo ./mkmmc-android-ubifs.sh /dev/sdc MLO u-boot.img uImage uEnv.txt ubi.img Media_Clips START_HERE"
exit
fi # 检查参数传入的文件是否存在
if ! [[ -e $ ]]
then
echo "Incorrect MLO location!"
exit
fi if ! [[ -e $ ]]
then
echo "Incorrect u-boot.img location!"
exit
fi if ! [[ -e $ ]]
then
echo "Incorrect uImage location!"
exit
fi if ! [[ -e $ ]]
then
echo "Incorrect uEnv.txt location!"
exit
fi if ! [[ -e $ ]]
then
echo "Incorrect ubifs location!"
exit
fi # 提醒用户,如果继续,mmc中数据将丢失
echo "All data on "$" now will be destroyed! Continue? [y/n]"
read ans
if ! [ $ans == 'y' ]
then
exit
fi echo "[Unmounting all existing partitions on the device ]" umount $* # 卸载可能挂载的mmc设备节点 echo "[Partitioning $1...]" # 提示开始对mmc设备重新分区 # 开始擦除分区表,每次擦除1024字节,一共擦除1024次,也就是相当于擦除:
# 1024字节 * 次 = 1M 字节
DRIVE=$
dd if=/dev/zero of=$DRIVE bs= count= SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'` # 获取mmc的总大小 echo DISK SIZE - $SIZE bytes # 显示mmc的总大小 # mmc为1G所以CYLINDERS=**///=,63为扇区数,255磁头数,
# 其他的参数目前没搞懂,反正这里就是计算一共有多少个CYLINDER
CYLINDERS=`echo $SIZE/// | bc` echo CYLINDERS - $CYLINDERS # 显示柱面的多少 # 这里分了4个区,目前没有完全理解这里的分区原理:
# . 第一分区:
# . 可用地址开始(不进行指定则为第一可用柱面);
# . 占用40个柱面;
# . 分区ID: 0x0C(FAT32(LBA)分区);
# . *:从man文档感觉是代表可启动分区.
# . 第二分区:
# . 可用地址开始;
# . 占用1个柱面;
# . 分区ID: 0x0C(FAT32(LBA)分区);
# . -:从man文档感觉是代表非启动分区.
# . 第三分区:
# . 可用地址开始;
# . 占用($CYLINDERS / )个柱面;
# . 分区ID: 未指定(默认貌似是Linux);
# . -:同上
# . 第四分区:
# . 可用地址开始;
# . 剩余柱面(不进行指定则指全部柱面);
# . 分区ID: 未指定(默认貌似是Linux);
# . -:同上
{
echo ,,0x0C,*
echo ,,0x0C,-
echo ,$(expr $CYLINDERS / ),,-
echo ,,,-
} | sfdisk -D -H -S -C $CYLINDERS $DRIVE echo "[Making filesystems...]" # 提示开始制作文件系统 if [[ ${DRIVE} == /dev/*mmcblk* ]]
then
DRIVE=${DRIVE}p # 获取设备节点模板
fi # 格式化各个分区
mkfs.vfat -F 32 -n boot ${DRIVE}1 &> /dev/null
mkfs.vfat -F 32 -n dummy ${DRIVE}2 &> /dev/null
mkfs.ext4 -L usrdata ${DRIVE}3 &> /dev/null
mkfs.vfat -F 32 -n data ${DRIVE}4 &> /dev/null echo "[Copying files...]" # 将各个文件拷贝进入对应的分区,结果绝大部分拷入了boot分区 @__@
mount ${DRIVE}1 /mnt
echo "[Copying boot files...]"
cp $2 /mnt/MLO
cp $3 /mnt/u-boot.img
cp $4 /mnt/uImage
cp $5 /mnt/uEnv.txt
cp $9 /mnt/boot.scr
echo "[Copying ubifs image...]"
cp $6 /mnt/ubi.img
if [ "$8" ]
then
echo "[Copying start-here folder to boot partition...]"
cp -r $8 /mnt/START_HERE
fi
echo "[syncing...]"
sync # flush file system buffers
umount ${DRIVE}1 if [ "$7" ]
then
echo "[Copying all media clips to data partition...]"
mount ${DRIVE}4 /mnt
cp -r $7/* /mnt/
umount ${DRIVE}4
fi echo "[Done]"

OK335xS-Android mkmmc-android-ubifs.sh hacking的更多相关文章

  1. AM335x Android eMMC mkmmc-android.sh hacking

    # AM335x Android eMMC mkmmc-android.sh hacking # # . 有空解读一下android的分区文件. # . 代码来源:https://github.com ...

  2. Android Mokoid Open Source Project hacking

    /***************************************************************************** * Android Mokoid Open ...

  3. OK335xS psplash make-image-header.sh hacking

    /***************************************************************************** * OK335xS psplash mak ...

  4. Android开发过程中在sh,py,mk文件中添加log信息的方法

    Android开发过程中在sh,py,mk文件中添加log信息的方法 在sh文件中: echo "this is a log info" + $info 在py文件中: print ...

  5. Android编译执行envsetup.sh,产生工具命令m、mm、mmm、mmma、tapas 、croot、cgrep、jgrep、 resgrep、godir

    一般来说编译一个sdk或者一个比较大的工程项目,第一步都是执行 envsetup.sh这个脚本,比如编译android,qt源码以及其他一些嵌入式的sdk. 而且执行的时候需要特别注意使用 sourc ...

  6. OK335xS-Android pack-ubi-256M.sh hacking

    #/******************************************************************************* # * OK335xS-Androi ...

  7. I.MX6 mkuserimg.sh hacking

    /*********************************************************************** * I.MX6 mkuserimg.sh hackin ...

  8. android.mk android源码编译

    http://www.cnblogs.com/chenbin7/archive/2013/01/05/2846863.html Android.mk简单分析 2013-01-05 22:51 by . ...

  9. 〖Android〗Android源代码所有目录生成的Target(编译生成文件反查)

    => build/tools/zipalign: out/host/linux-x86/bin/zipalign (host) => build/tools/atree: out/host ...

随机推荐

  1. ubuntu 14.04 添加、删除用户,修改用户名称,修改主机名

    ubuntu添加用户 sudo adduser test ubuntu删除用户 sudo userdel test cd /home/ sudo rm -r test

  2. html js 捕捉鼠标右键事件,按下滚轮事件,左键点击事件

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. vs下手敲git命令补遗

    大多数常用的点按钮就行了.少数还是手敲方便 ng new myapp   的时候已经新建git了,不过只有master分支. 创建新分支可以点vs左下角分支名字,然后在上方弹出的命令行里写名字,不过鼠 ...

  4. 算法笔记--区间dp

    1.石子归并问题 dp[i][j]表示区间i到j合并所需的最小花费. 先求出小区间的最小花费,再转移到大的区间. 转移方程:dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1] ...

  5. Howto: 使用ImageBrush替换PictureMarkerSymbol以加强graphic显示性能

      软件: ArcGIS API for Microsoft Silverlight/WPF 9.3.1 操作系统: N/A 摘要:          ArcGIS API for Microsoft ...

  6. python模块——socket (实现简单的C/S架构端通信操作CMD)

    # 服务端代码#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "loki" import socket impo ...

  7. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛

    题意:到一个城市得钱,离开要花钱.开始时有现金.城市是环形的,问从哪个开始,能在途中任意时刻金钱>=0; 一个开始指针i,一个结尾指针j.指示一个区间.如果符合条件++j,并将收益加入sum中( ...

  8. How to create own operator with python in mxnet?

    继承CustomOp 定义操作符,重写前向后向方法,此时可以通过_init__ 方法传递需要用到的参数 class LossLayer(mxnet.operator.CustomOp): def __ ...

  9. Java IO流中的flush()

    通过BufferedOutputStream或BufferedWriter 链接到底层流上来实现.因此,在写 完数据时,flush就显得尤为重要. 例如: 上图中WEB服务器通过输出流向客户端响应了一 ...

  10. OAF SubTabLayoutBean隐藏子控件

    SubLayout隐藏子控件有两种方法 OASubTabLayoutBean layBean = (OASubTabLayoutBean) webBean.findIndexedChildRecurs ...