#/*******************************************************************************
# * 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. 模型层model layer

    题外话: Django的教程写到这里,就进入了整体的第二部分,也是最关键的部分.此时有一个问题必须想清楚,那就是,以项目带动内容还是以参考书目的方式展开?为此,我考虑了很久. 我在开始学习Django ...

  2. jq的attr()与prop()之间区别

    1.attr() 一直存在,prop() 仅存在于 jq-1.6 及其之后 2.新版本jq使用细节: 2.1 自定义添加至dom节点的属性,用attr获取 2.2 表单类checked.selecte ...

  3. ubuntu 安装 openssh-server,xinetd,vmware tools

    ●安装SSH服务 ●判断是否安装ssh服务,通过如下命令:ps -e|grep ssh 1, sudo apt-get update --->软件的更新地址变了,需要更新本机的sources.l ...

  4. cygwin install git

    Installation with Cygwin If you're comfortable with Cygwin, then use it to install git, ssh, wget an ...

  5. Python - PIL-pytesseract-tesseract验证码识别

    N天前实现了简单的验证识别,这玩意以前都觉得是高大上的东西,一直没有去研究,这次花了点时间研究了一下,当然只是一些基础的东西,高深的我也不会,分享一下给大家吧. 关于python验证码识别库,网上主要 ...

  6. 3-9《元编程》第3章Tuesday:methods

    第3章methods Ruby是动态语言,有静态语言实现不了的技巧.本章讲解代码的重构,把代码变得更简洁. 3.2Dynamic Methods 3.21Calling Methods Dynamic ...

  7. js 正则去除指定的单词

    以企业邮箱为例:@后面不能是qq   126   163  188 gmail   yahoo   sina   hotmail  suhu   sogu  等单词. <!DOCTYPE htm ...

  8. OAF中trunc函数的使用(转)

    原文地址:OAF中trunc函数的使用 需求:在做OAF开发时,经常会需要查询功能,由于需求的不同,往往不能使用OAF标准的查询功能,需要自己客户化实现查询功能,而在查询功能中,经常会遇到查询的时间范 ...

  9. OC @property @synthesize和id

    文顶顶   OC语言@property @synthesize和id OC语言@property @synthesize和id 一.@property @synthesize关键字 注意:这两个关键字 ...

  10. 线程正常终止pthread_exit,pthread_join,pthread_kill,pthread_cancel,sigwait,sigaddset

    int pthread_join(pthread_t thread, void **retval); int pthread_detach(pthread_t thread); void pthrea ...