一. MFGTools的基本使用
1. 概述
本章一步一步的举例描述如何使用MFGTools。
操作步骤:
第一步:
在运行MfgTool2.exe之前,必须确保cfg.ini和UIcfg.ini存在,此外还要确保这两个文件的配置正确。如果配置有误可能不能正常的工作。UIcfg.ini文件是用来描述与配置同时支持多少个开发板的,UIcfg.ini文件格式为文本文件,文件内容如下:
-
[UICfg]
-
PortMgrDlg=1
例如,当前只有一个开发板,那么它只需要支持一个即可,因此PortMgrDlg=1即可,如果需要支持4个,那么PortMgrDlg=4,目前最多支持4个,因此该值的范围是1~4。
Cfg.ini文件用来配置目标芯片和目标操作列表,文件格式和UIcfg.ini一样,文件内容如下:
-
[profiles]
-
chip = MX6DL Linux Update
-
[platform]
-
board = ARM2
-
[LIST]
-
name = Android-SD
“profiles/chip”用于表明目标profile name,“list/name”用于表明目标操作链表名,该名字可以在"profiles/CHIP_PROFILE/OSFirmware/ucl2.xml"文件中找到,也就是会按照此链表配置的流程进行烧写系统。“platform/board”字段目前保留,在修改的时候忽略即可。
第二步:
开发板设置好启动模式,如USB OTG(设置拨码,在核心板上有丝印,按照丝印拨码即可 ),链接好USB线,一端链接开发板的OTG,另一端链接运行MFGTools的PC。连接好后系统上电,在PC的设备管理器里可以看到人体学设备 Hid-compliant device。到此确定连接和启动方式已经完全正确,可以进入第三步了。
第三步:
双击MfgTool2.exe开始运行。这里需要注意,当首次使用MFGTools V2版本的时候,必须将设备连好之后再运行。MFGTools起来之后只有两个按钮,一个start,一个exit,如果点击start开始烧写,点击后start按钮表现为stop,如果start按钮显示为stop时不能点击exit按钮进行退出,只有停止烧写了才能exit,镜像烧写的过程会花费一些时间,如果中途点击stop,接着再点击start,那么MFGTools会接着上次stop的地方继续烧写。不过官方不建议这样做。
图1.1 MFGTools运行效果
第四步:
点击start按钮开始烧写,如果有终端工具,如xshell,可以将调试串口链接到PC,烧写过程的信息可以在xshell中看到更详细的信息。
图1.2 MFGTools烧写过程
图1.3 终端工具显示效果
在烧写过程中,图1.2中,下面两个框是进度条,上面是具体加载的哪块,如图显示loading kernel,说明正在烧写kernel。在stop、exit按钮上面有个状态框,用于显示成功操作信息和失败操作信息。当一切烧写完成,会显示Done,两个进度条满格并且显示绿色。
图1.4 烧写完毕
注意:在下载文件系统到sd卡上时,MFGTools可能会报一些错误信息,这可能是sd卡的分区太小而导致的空间不足,为了解决这一问题,可以解压"Profiles\ CHIP_PROFILE \OSFirmware\mksdcard.sh.tar"并根据系统需求在脚本中修改分区,修改之后需要重新运行脚本。
2. 配置文件ucl2.XML
Ucl2.xml为版本2对应的配置文件,相对于ucl.xml要更复杂,但是ucl.xml的内容同样适用于ucl2.xml,相对于ucl.xml,v2做了如下改变:
2.1 The <STATE>...</STATE>
在V2中,该条目简化了,v1的是:
-
<STATE name="Recovery" dev="MX6Q"/>
-
<DEV name="MX6DL/Solo" vid="15A2" pid="0054"/>
V2的是:
<STATE name="BootStrap" dev="MX6Q" vid="15A2" pid="0054"/>
这里需要说明,如果name是"BootStrap",在该条目下dev只能是"MX6Q", "MX6D", "MX6SL",其余值均不合法。name只能是"BootStrap","Updater",其余不合法。如果name是"Updater",则dev必须是"MSC",该名称对所有的SoC来说固定不变。
2.2 添加state属性
在<CMD> <CMD/>中可以添加state属性,ucl.xml和ucl2.xml的例子如下:
ucl.xml:
<CMD type="boot" body="Recovery" file ="u-boot-mx6sl.bin" >Loading U-boot</CMD>
ucl2.xml:
<CMD state="BootStrap" type="boot" body="Recovery" file ="u-boot-mx6sl.bin" >Loading U-boot</CMD>
2.3 state的概念
通常目标板烧写过程分为两个阶段:分别是bootstrap 和updater。Bootstrap阶段,MFGTools将特殊的uboot和kernel镜像烧写到目标板上,这特殊的镜像在目标板正常运行后为下一阶段做准备。Updater阶段,是主机(PC)与目标板建立连接,然后将uboot、kernel、文件系统等烧写到目标板的整个过程。
2.4 find命令不再使用
Find命令不再使用了,直接从ucl的脚本中移除。最后一个命令必须是Done,例如:
<CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD
二. MFGTools的基本使用
MFGTools是飞思卡尔专门为imx系列产品开发的烧写工具,随着版本的更新,烧写工具也越来越强大。
1. MFGTools目录简介
MFGTools为飞思卡尔专门为imx系列产品开发的一套烧写工具,因此想要获取该工具,可以直接从恩智浦官网下载,具体方法不详述。下载到本地如图2.1所示。
图2.1 tools包
从官网下载后解压,得到如图2.2所示的目录:
图2.2 解压后的截图
图2.2中,包含两个包,这里关心的是MFGTools,因此在此解压mfgtools.zip,另一个包本文档不做解释。这里还有两个txt文档,其中SCR-n7.1.1_1.0.0_tools.txt是介绍说明MFGTools工具库的,文档内容如下:
图2.3 SCR-n7.1.1_1.0.0_tools.txt
这里可以简单的看一下,主要是了解一下而已,没啥实际用处。接着解压后进入tools目录,目录内容如下:
图2.4 MFGTools目录
第一个文件夹Document,里边主要放与该工具相关的文档,进入V2目录,里边有7个文档,本文档的第一张就是结合Manufacturing Tool V2 Quick Start Guide.docx文档进行编写,如果需要详细了解,可以详细阅读这里的文档。
图2.5 文档
Driver目录为Windows 32位和64位操作系统的驱动,驱动一般都不会出现问题。下一个目录是more_scripts,该文件夹里存放了一些yocto项目脚本,该目录下和图2.4中的脚本都是以后缀.vbs结尾的,他们都是VBScript脚本,这里不用详述,可以理解为shell脚本。下一个是profile目录,也就是本工具最后重要的目录,后面再述。下一个目录是Utils目录,下面又分为cfimager和sb_loader目录,cfimager的作用是:cfimager.exe tool is used to flash boot images and create FAT partitionon SD/MMC cards on the host PC for i.MX233 ,i.MX28 ,i.MX50 ,i.MX51 and i.MX53SOCs。sb_loader的作用:The tool is used todownload an image to target platform to run。
2. 文件介绍
按照排序,目录之后就是文件了,首先是cfg.ini,为MFGTools的初始化配置文件,默认内容如下(UICfg.ini略):
-
[profiles]
-
chip = Linux
-
[platform]
-
board = SabreSD
-
[LIST]
-
name = SDCard
-
[variable]
-
board = sabresd
-
mmc = 0
-
sxuboot=sabresd
-
sxdtb=sdb
-
7duboot=sabresd
-
7ddtb=sdb
-
6uluboot=14x14ddr3arm2
-
6uldtb=14x14-ddr3-arm2
-
ldo=
-
plus=
-
initramfs=fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot
-
seek = 1
-
sxnor=qspi2
-
7dnor=qspi1
-
6ulnor=qspi1
-
nor_part=0
因为这部分使用率较高,前面已经介绍其格式,这里不详细说明。为了方便修改,详细说明各个字段的值。第一个是chip,固定写成Linux,其次platform,按照官方文档是保留,在变量里边也有设置board,因此该字段就认为保留,最好还是写上,该字段可直接由编译输出目录获得,在out\target\product\sabresd_6dq\android-info.txt,内容就是board=SABRESD。接下来是list,该值是在ucl2.xml中找到粘贴过来的,具体后面一章讲述。下面是变量,这些变量会匹配镜像文件、设备树文件等。再是MfgTool2.exe,也就是工具主应用程序。
该程序是MFGTools的主应用程序,启动的时候会加载动态库、检测配置、检测文件等是否存在,双击即可运行,运行的时候会加载cfg.ini文件,读取该文件的配置并进行上述检测,如果正确则继续执行,如果错误则异常终止,此时会在同级目录下创建一个MfgTool.log的日志文件,该文件详细记录MFGTools在运行中遇到的错误和运行过程的关键步骤。例如我这里记录如下:
-
DLL version: 2.6.2
-
Thursday, April 13, 2017 15:39:31 Start new logging
-
ModuleID[2] LevelID[10]: CMyExceptionHandler thread is running
-
ModuleID[2] LevelID[1]: new MxHidDeviceClass
-
ModuleID[2] LevelID[1]: new MxHidDeviceClass
-
ModuleID[2] LevelID[1]: new MxHidDeviceClass
-
ModuleID[2] LevelID[1]: new MxHidDeviceClass
-
ModuleID[2] LevelID[1]: new MxHidDeviceClass
-
ModuleID[2] LevelID[1]: new MxHidDeviceClass
-
ModuleID[2] LevelID[10]: Device Manager thread is running
-
ModuleID[2] LevelID[1]: Can't set m_hStopEvent before it initialized or it already stop Ucl
接下来是一系列的VB脚本,因为我这儿是为了烧写Android,那么我就以mfgtool2-android-mx6dl-sabresd-emmc.vbs为例说明。VB脚本对我们这一代或许使用的比较少,因此比较陌生,但是有shell脚本基础,这就不是难事儿。
-
Set wshShell = CreateObject("WScript.shell")
-
wshShell.run "mfgtool2.exe -c ""linux"" -l ""eMMC-Android"" -s ""board=sabresd"" -s ""folder=sabresd"" -s ""soc=6dl"" -s ""mmc=3"" -s ""data_type="""
-
Set wshShell = Nothing
CreateObject("WScript.shell")也就是创建一个wscript shell对象,wshShell.run就是调用该对应的run方法,这就相当于在命令行做下面引号括起来的动作,最后释放该对象。在run 引号中,符合第一章介绍的命令行操作,这样可以自己改写一个cfg.ini,对应上面的配置内容如下:
-
[profiles]
-
chip = Linux
-
[platform]
-
board = SABRESD
-
[LIST]
-
name = eMMC-Android
-
[variable]
-
board = sabresd
-
folder=sabresd
-
soc=6dl
-
mmc = 3
-
data_type=
-
sxuboot=sabresd
-
sxdtb=sdb
-
7duboot=sabresd
-
7ddtb=sdb
-
6uluboot=14x14ddr3arm2
-
6uldtb=14x14-ddr3-arm2
-
ldo=
-
plus=
-
initramfs=fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot
-
seek = 1
-
sxnor=qspi2
-
7dnor=qspi1
-
6ulnor=qspi1
-
nor_part=0
如果我一般都会执行该脚本,那么将得到的内容粘贴到cfg.ini,以后直接双击MfgTool2.exe即可(这里需要注意,默认的cfg.ini的变量如果在脚本中有修改则覆盖,如果没有则添加,但是不能随意删除,因为按照优先级他会读取该配置文件,当然如果知道某个变量一定不会用,删除肯定是没问题的)。这个根据个人爱好,如我有时候需要烧写整个系统,有时候只需要烧写bootimage,那么肯定写两个不同的脚本更方便。其他的脚本都类似,这里不一一详述。
三. ucl2.xml
本章主要介绍ucl2.xml文件,详细说明如何修改和添加,介绍如何匹配镜像。这部分的书写的目的是给需要修改系统、部分烧写等需求的人群提供方便,也是部分客户的需求。
1. ucl2.xml
第二章已经提到了profile目录是该工具的核心部分,那么就进入该目录一探究竟。进入之后是Linux,这里就再深入一下前面的cfg.ini文件,首先内容如下:
-
[profiles]
-
chip = Linux
我在第二章说的固定位Linux(为了简单才这么说的),其实这里profiles和Linux实际就是匹配的目录,因为profiles目录下就一个Linux,那自然固定为Linux了,例如直接将Linux目录复制为Android,在修改chip=Android,发现烧写一点儿问题也没有。接着进入OS Firmware目录,内容如下:
图3.1 OS Firmware目录
第一个文件夹是files,意思太明显不过了,就是一些文件,第二个目录是firmware,这也很明显,就是一些固件,该版本相对于以前的版本固件目录内容更多,因为Android也是用了设备树。这两个文件内容稍后再ucl2.xml中遇到了再说。
接下来是几个压缩包,这些也可以根据名字看明白,就是用于制作SD卡的脚本,例如需要将uboot、kernel等烧写到SD卡中,那么需将SD卡做成对应的格式,这里可以解压看看里边是否是脚本,解压发现真是一个脚本,内容如下:
-
#!/bin/sh
-
# partition size in MB
-
BOOT_ROM_SIZE=10
-
# wait for the SD/MMC device node ready
-
while [ ! -e $1 ]
-
do
-
sleep 1
-
echo “wait for $1 appear”
-
done
-
# call sfdisk to create partition table
-
# destroy the partition table
-
node=$1
-
dd if=/dev/zero of=${node} bs=1024 count=1
-
sfdisk --force ${node} << EOF
-
${BOOT_ROM_SIZE}M,500M,0c
-
600M,,83
-
EOF
脚本内容不详述,主要就是为uboot留空间,格式化SD卡。后面几个压缩包也都类似。下面开始进入本章的重点ucl2.xml。
打开后粗略的看一下,发现该文件的格式就是mxl语言格式,注释方法也是使用 <!-- burn uboot -->进行注释。如果有HTML、XML等标记语言的基础,这部分看起来会比较轻松。首先看文件头,一般类似这样的文件都有一个简单的说明,ucl2.xml也不例外,文件头就给我们了一部分介绍、解释。内容如下:
-
* Each LIST element contains a list of update instructions.
-
* "Install" - Erase media and install firmware.
-
* "Update" - Update firmware only.
-
*
-
* Each CMD element contains one update instruction of attribute type.
-
* "pull" - Does UtpRead(body, file) transaction.
-
* "push" - Does UtpWrite(body, file) transaction.
-
* "drop" - Does UtpCommand(body) then waits for device to disconnect.
-
* "boot" - Finds configured device, forces it to "body" device and downloads "file".
-
* "find" - Waits for "timeout" seconds for the "body" device to connect.
-
* "show" - Parse and show device info in "file".
这部分说明已经很清楚,一般都会看看下面是哪儿使用了这些属性,这里不详述。看最外层标签<UCL> <UCL/>,可以看到所有内容均包含在该标签之下,这里再深入一下,如果配置有误,如操作清单没找到等,错误会在log文件中体现,如这里的一个测试log内容如下:
ModuleID[2] LevelID[1]: Parse ucl script failed, error code: 21
这说的是parse ucl脚本失败,它不是说v1的ucl.xml,而是说这里的<UCL><UCL/>标签内的内容解释失败。第一块是CFG,也即是配置,这就和前面第一章的内容结合了,State的name只能是BootStrap和Updater,而dev的值只能是MX6SL、MX6D、MX6Q、MX6SX、MX6UL、MX7D,Updater的dev只能是MSC,这部分内容如下:
-
<CFG>
-
<STATE name="BootStrap" dev="MX6SL" vid="15A2" pid="0063"/>
-
<STATE name="BootStrap" dev="MX6D" vid="15A2" pid="0061"/>
-
<STATE name="BootStrap" dev="MX6Q" vid="15A2" pid="0054"/>
-
<STATE name="BootStrap" dev="MX6SX" vid="15A2" pid="0071"/>
-
<STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>
-
<STATE name="BootStrap" dev="MX7D" vid="15A2" pid="0076"/>
-
<STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/>
-
</CFG>
接下来,可以看到该文件内有多个< LIST ><LIST/>,这就是前面说的操作清单,list后面有name、desc属性。这里的name就对应到前面cfg.ini文件的LIST下的name,这也就是前面说的可以在ucl2.xml中找到的原因,如果在这里边找不到,则不能正常工作,例如我将name改写成eMMC-Android23,则log信息如下:
-
Friday, April 14, 2017 15:35:36 Start new logging
-
ModuleID[2] LevelID[1]: Error: Can't find the specified list(eMMC-Android23) in the xml file
-
ModuleID[2] LevelID[1]: Parse ucl script failed, error code: 12
前面已经说了,这是操作清单,也就是说烧写系统的操作步骤就在这个List里边。List节点下,是一系列的CMD元素,通过观察发现里边很大一部分是一样的,例如state=” BootStrap”的前面部分:
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6q%plus%%board%_sd.imx" ifdev="MX6Q">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6dl%board%_sd.imx" ifdev="MX6D">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6slevk_sd.imx" ifdev="MX6SL">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6sx%sxuboot%_sd.imx" ifdev="MX6SX">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx7d%7duboot%_sd.imx" ifdev="MX7D">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%6uluboot%_sd.imx" ifdev="MX6UL">Loading U-boot</CMD>
可以很清晰的看见file和ifdev不一样,这里就拿出其中一个进行说明,如第一行的file和ifdev:
file ="firmware/u-boot-imx6q%plus%%board%_sd.imx" ifdev="MX6Q"
这里的file指明文件,值用双引号包裹,包含路径和完整的固件名称,可以看到后面有%plus%、%board%,这个就是变量的替换,这个在Windows中也是比较常见的,例如%appdata%,则代表的是用户目录下的应用数据目录:C:\Users\Administrator\AppData\Roaming。在前面已经说了,board=sabresd,这个是在变量中设置的,那么这里就替换成sabresd了,plus在变量中这样写的:plus=,那么也就是什么也没有,因此这里的file实际就是这样一个文件名:firmware/u-boot-imx6qsabresd_sd.imx,当然别忘了还有ifdev,使用该文件的前提是dev= MX6Q,这里自然是前面的soc变量设置的了,例如前面脚本中的soc=6dl,这里就是MX6D。接下来就会检验该文件是否存在,例如在firmware下可以找到该文件(当然找不到肯定也会出错,可以再log中看到):
图3.2 u-boot-imx6qsabresd_sd.imx文件
这里也就是根据dev选择不同的file并下载,这里为什么说是选择,自然是因为它的type值是boot了,因为前面注释中这样写的:"boot" - Finds configured device, forces it to "body"device and downloads "file"。接下来就是下载kernel了,下载kernel的操作如下:
-
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x12000000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Kernel.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Kernel.</CMD>
这里很明显,根据dev的不同,将zimage下载到不同的地方了,这里下载的文件时一样的,包含加载的section和设置的section都是一样的。再往下就是下载RAMFS了,操作如下:
-
<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x12C00000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Initramfs.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Initramfs.</CMD>
这里也是地址不一样,不详述。接下来是下载设备树,这里zImage-imx6q%plus%-%board%%ldo%.dtb和前面的uboot文件一样,通过变量替换找到文件并下载。到此固件下载完毕,最小系统成功运行起来了。这里的目的是烧写系统,目前来说还没开始,接下来的工作就是正真烧写了。
-
<!-- create partition -->
-
<CMD state="Updater" type="push" body="send" file="mksdcard.sh.tar">Sending partition shell</CMD>
-
<CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...</CMD>
-
<CMD state="Updater" type="push" body="$ sh mksdcard.sh /dev/mmcblk%mmc%"> Partitioning...</CMD>
这部分是分区,执行这部分的时候Windows可能会弹出U盘的对话框,请求格式化,在Windows上不用管。这部分就是发送压缩包到系统,使用tar命令解压,然后执行脚本,脚本中使用到前面cfg.ini总的mmc的值,如脚本中mmc= 3,这里的命令就是sh mksdcard.sh /dev/mmcblk3。系统烧写前必须格式化,也就是必须执行这步操作。接下来烧写uboot,由于该文档主要是给Android开发用户看的,因此这里开始使用Android的例子:
-
<CMD state="Updater" type="push" body="$ dd if=/dev/zero of=/dev/mmcblk%mmc% bs=1k seek=768 conv=fsync count=8">clear u-boot arg</CMD>
-
<CMD state="Updater" type="push" body="$ echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">access boot partition 1</CMD>
-
<CMD state="Updater" type="push" body="send" file="files/android/%folder%/u-boot-imx%soc%%plus%%ldo%.imx" >Sending u-boot.bin</CMD>
-
<CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">write U-Boot to sd card</CMD>
-
<CMD state="Updater" type="push" body="$ echo 1 > /sys/block/mmcblk%mmc%boot0/force_ro"> re-enable read-only access </CMD>
-
<CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk%mmc%">enable boot partion 1 to boot</CMD>
-
<CMD state="Updater" type="push" body="$ ls -l /dev/mmc* ">Formatting sd partition</CMD>
-
<CMD state="Updater" type="push" body="send" file="files/android/%folder%/boot-imx%soc%%plus%%ldo%.img" >Sending and writting boot.img</CMD>
-
<CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%p1">write boot.img</CMD>
前面两条命令是为烧写uboot做准备,这里使用的命令都是Linux标准命令,这部分我就不解释了,第三条命令开始,body的值是send,也就是发送,紧随其后的file,也就是要发送什么文件,file的值为files/android/%folder%/u-boot-imx%soc%%plus%%ldo%.imx,这个和前面一样,可以拼接处具体的文件名。再下一条是写入,dd if=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2,这个也是和Linux标准命令一样。这里发送的不是bootimage,而是uboot.bin类似的文件,那么如果做uboot的实验、修改uboot,则到此基本就结束了(为什么是基本?因为最终都要有Done命令)。接着是分区、下载bootimage,这和前面的又类似。同样是下一个dd命令执行完就结束了。如果修改了内核,需要验证是否修改成功,则只需要烧写bootimage。接下来是Formatting system partition,到writting sparse system.img结束时结束,如果修改了Android系统部分,重新烧写system.img即可。再后面是烧写recovery,这里就不详述了。
到此ucl2.xml已经很清楚了,那么我只烧写uboot.bin,我该怎么修改呢?下面就列举几个例子。
只烧写uboot:
-
<LIST name="eMMC-Android" desc="Choose eMMC as media">
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6q%plus%%board%_sd.imx" ifdev="MX6Q">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6dl%board%_sd.imx" ifdev="MX6D">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6sx%board%_emmc.imx" ifdev="MX6SX">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx7d%7duboot%_sd.imx" ifdev="MX7D">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%6uluboot%_emmc.imx" ifdev="MX6UL">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x12000000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Kernel.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Kernel.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x12C00000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Initramfs.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Initramfs.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6q%plus%-%board%%ldo%.dtb" address="0x18000000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q">Loading device tree.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6dl-%board%%ldo%.dtb" address="0x18000000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6D">Loading device tree.</CMD>
-
<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>
-
<!-- create partition -->
-
<CMD state="Updater" type="push" body="send" file="mksdcard-android%data_type%.sh.tar">Sending partition shell</CMD>
-
<CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...</CMD>
-
<CMD state="Updater" type="push" body="$ sh mksdcard-android%data_type%.sh /dev/mmcblk%mmc%"> Partitioning...</CMD>
-
<!-- burn uboot -->
-
<CMD state="Updater" type="push" body="$ dd if=/dev/zero of=/dev/mmcblk%mmc% bs=1k seek=768 conv=fsync count=8">clear u-boot arg</CMD>
-
<CMD state="Updater" type="push" body="$ echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">access boot partition 1</CMD>
-
<CMD state="Updater" type="push" body="send" file="files/android/%folder%/u-boot-imx%soc%%plus%%ldo%.imx" >Sending u-boot.bin</CMD>
-
<CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">write U-Boot to sd card</CMD>
-
<CMD state="Updater" type="push" body="$ echo 1 > /sys/block/mmcblk%mmc%boot0/force_ro"> re-enable read-only access </CMD>
-
<CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk%mmc%">enable boot partion 1 to boot</CMD>
-
<CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
-
</LIST>
只烧写bootimage:
-
<LIST name="eMMC-Android" desc="Choose eMMC as media">
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6q%plus%%board%_sd.imx" ifdev="MX6Q">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6dl%board%_sd.imx" ifdev="MX6D">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6sx%board%_emmc.imx" ifdev="MX6SX">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx7d%7duboot%_sd.imx" ifdev="MX7D">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%6uluboot%_emmc.imx" ifdev="MX6UL">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x12000000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Kernel.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Kernel.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x12C00000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Initramfs.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Initramfs.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6q%plus%-%board%%ldo%.dtb" address="0x18000000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q">Loading device tree.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6dl-%board%%ldo%.dtb" address="0x18000000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6D">Loading device tree.</CMD>
-
<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>
-
<!-- create partition -->
-
<CMD state="Updater" type="push" body="send" file="mksdcard-android%data_type%.sh.tar">Sending partition shell</CMD>
-
<CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...</CMD>
-
<CMD state="Updater" type="push" body="$ sh mksdcard-android%data_type%.sh /dev/mmcblk%mmc%"> Partitioning...</CMD>
-
<CMD state="Updater" type="push" body="$ ls -l /dev/mmc* ">Formatting sd partition</CMD>
-
<CMD state="Updater" type="push" body="send" file="files/android/%folder%/boot-imx%soc%%plus%%ldo%.img" >Sending and writting boot.img</CMD>
-
<CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%p1">write boot.img</CMD>
-
<CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
-
</LIST>
只烧写system.img:
-
<LIST name="eMMC-Android" desc="Choose eMMC as media">
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6q%plus%%board%_sd.imx" ifdev="MX6Q">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6dl%board%_sd.imx" ifdev="MX6D">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6sx%board%_emmc.imx" ifdev="MX6SX">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx7d%7duboot%_sd.imx" ifdev="MX7D">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%6uluboot%_emmc.imx" ifdev="MX6UL">Loading U-boot</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x12000000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Kernel.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Kernel.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x12C00000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Initramfs.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Initramfs.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6q%plus%-%board%%ldo%.dtb" address="0x18000000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q">Loading device tree.</CMD>
-
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6dl-%board%%ldo%.dtb" address="0x18000000"
-
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6D">Loading device tree.</CMD>
-
<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>
-
<!-- create partition -->
-
<CMD state="Updater" type="push" body="send" file="mksdcard-android%data_type%.sh.tar">Sending partition shell</CMD>
-
<CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...</CMD>
-
<CMD state="Updater" type="push" body="$ sh mksdcard-android%data_type%.sh /dev/mmcblk%mmc%"> Partitioning...</CMD>
-
<CMD state="Updater" type="push" body="$ mkfs.ext4 -E nodiscard /dev/mmcblk%mmc%p5">Formatting system partition</CMD>
-
<CMD state="Updater" type="push" body="$ mkfs.ext4 -E nodiscard /dev/mmcblk%mmc%p6">Formatting cache partition</CMD>
-
<CMD state="Updater" type="push" body="$ mkfs.ext4 -E nodiscard /dev/mmcblk%mmc%p7">Formatting device partition</CMD>
-
<CMD state="Updater" type="push" body="$ mount -o remount,size=800M rootfs /">change size of tmpfs</CMD>
-
<CMD state="Updater" type="push" body="send" file="files/android/%folder%/system.img" >Sending system.img</CMD>
-
<CMD state="Updater" type="push" body="$ simg2img $FILE /dev/mmcblk%mmc%p5">writting sparse system.img</CMD>
-
<CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
-
</LIST>