MFGTool烧写工具使用说明

5 篇文章 0 订阅

 

一. MFGTools的基本使用

1. 概述

    本章一步一步的举例描述如何使用MFGTools。

    操作步骤:

    第一步:

        在运行MfgTool2.exe之前,必须确保cfg.ini和UIcfg.ini存在,此外还要确保这两个文件的配置正确。如果配置有误可能不能正常的工作。UIcfg.ini文件是用来描述与配置同时支持多少个开发板的,UIcfg.ini文件格式为文本文件,文件内容如下:

 
  1. [UICfg]

  2. PortMgrDlg=1

        例如,当前只有一个开发板,那么它只需要支持一个即可,因此PortMgrDlg=1即可,如果需要支持4个,那么PortMgrDlg=4,目前最多支持4个,因此该值的范围是1~4。

        Cfg.ini文件用来配置目标芯片和目标操作列表,文件格式和UIcfg.ini一样,文件内容如下:

 
  1. [profiles]

  2. chip = MX6DL Linux Update

  3.  
  4. [platform]

  5. board = ARM2

  6.  
  7. [LIST]

  8. 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的是:

 
  1. <STATE name="Recovery" dev="MX6Q"/>

  2. <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略):

 
  1. [profiles]

  2. chip = Linux

  3.  
  4. [platform]

  5. board = SabreSD

  6.  
  7. [LIST]

  8. name = SDCard

  9.  
  10. [variable]

  11. board = sabresd

  12. mmc = 0

  13. sxuboot=sabresd

  14. sxdtb=sdb

  15. 7duboot=sabresd

  16. 7ddtb=sdb

  17. 6uluboot=14x14ddr3arm2

  18. 6uldtb=14x14-ddr3-arm2

  19. ldo=

  20. plus=

  21. initramfs=fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot

  22. seek = 1

  23. sxnor=qspi2

  24. 7dnor=qspi1

  25. 6ulnor=qspi1

  26. 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在运行中遇到的错误和运行过程的关键步骤。例如我这里记录如下:

 
  1. DLL version: 2.6.2

  2. Thursday, April 13, 2017 15:39:31 Start new logging

  3. ModuleID[2] LevelID[10]: CMyExceptionHandler thread is running

  4. ModuleID[2] LevelID[1]: new MxHidDeviceClass

  5. ModuleID[2] LevelID[1]: new MxHidDeviceClass

  6. ModuleID[2] LevelID[1]: new MxHidDeviceClass

  7. ModuleID[2] LevelID[1]: new MxHidDeviceClass

  8. ModuleID[2] LevelID[1]: new MxHidDeviceClass

  9. ModuleID[2] LevelID[1]: new MxHidDeviceClass

  10. ModuleID[2] LevelID[10]: Device Manager thread is running

  11. 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脚本基础,这就不是难事儿。

 
  1. Set wshShell = CreateObject("WScript.shell")

  2. wshShell.run "mfgtool2.exe -c ""linux"" -l ""eMMC-Android"" -s ""board=sabresd"" -s ""folder=sabresd"" -s ""soc=6dl"" -s ""mmc=3"" -s ""data_type="""

  3. Set wshShell = Nothing

        CreateObject("WScript.shell")也就是创建一个wscript shell对象,wshShell.run就是调用该对应的run方法,这就相当于在命令行做下面引号括起来的动作,最后释放该对象。在run 引号中,符合第一章介绍的命令行操作,这样可以自己改写一个cfg.ini,对应上面的配置内容如下:

 
  1. [profiles]

  2. chip = Linux

  3.  
  4. [platform]

  5. board = SABRESD

  6.  
  7. [LIST]

  8. name = eMMC-Android

  9.  
  10. [variable]

  11. board = sabresd

  12. folder=sabresd

  13. soc=6dl

  14. mmc = 3

  15. data_type=

  16. sxuboot=sabresd

  17. sxdtb=sdb

  18. 7duboot=sabresd

  19. 7ddtb=sdb

  20. 6uluboot=14x14ddr3arm2

  21. 6uldtb=14x14-ddr3-arm2

  22. ldo=

  23. plus=

  24. initramfs=fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot

  25. seek = 1

  26. sxnor=qspi2

  27. 7dnor=qspi1

  28. 6ulnor=qspi1

  29. nor_part=0

        如果我一般都会执行该脚本,那么将得到的内容粘贴到cfg.ini,以后直接双击MfgTool2.exe即可(这里需要注意,默认的cfg.ini的变量如果在脚本中有修改则覆盖,如果没有则添加,但是不能随意删除,因为按照优先级他会读取该配置文件,当然如果知道某个变量一定不会用,删除肯定是没问题的)。这个根据个人爱好,如我有时候需要烧写整个系统,有时候只需要烧写bootimage,那么肯定写两个不同的脚本更方便。其他的脚本都类似,这里不一一详述。

三. ucl2.xml

        本章主要介绍ucl2.xml文件,详细说明如何修改和添加,介绍如何匹配镜像。这部分的书写的目的是给需要修改系统、部分烧写等需求的人群提供方便,也是部分客户的需求。

    1. ucl2.xml

        第二章已经提到了profile目录是该工具的核心部分,那么就进入该目录一探究竟。进入之后是Linux,这里就再深入一下前面的cfg.ini文件,首先内容如下:

 
  1. [profiles]

  2. 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卡做成对应的格式,这里可以解压看看里边是否是脚本,解压发现真是一个脚本,内容如下:

 
  1. #!/bin/sh

  2. # partition size in MB

  3. BOOT_ROM_SIZE=10

  4.  
  5. # wait for the SD/MMC device node ready

  6. while [ ! -e $1 ]

  7. do

  8. sleep 1

  9. echo “wait for $1 appear”

  10. done

  11.  
  12. # call sfdisk to create partition table

  13. # destroy the partition table

  14. node=$1

  15. dd if=/dev/zero of=${node} bs=1024 count=1

  16.  
  17. sfdisk --force ${node} << EOF

  18. ${BOOT_ROM_SIZE}M,500M,0c

  19. 600M,,83

  20. EOF

  21.  

        脚本内容不详述,主要就是为uboot留空间,格式化SD卡。后面几个压缩包也都类似。下面开始进入本章的重点ucl2.xml。

        打开后粗略的看一下,发现该文件的格式就是mxl语言格式,注释方法也是使用    <!-- burn uboot -->进行注释。如果有HTML、XML等标记语言的基础,这部分看起来会比较轻松。首先看文件头,一般类似这样的文件都有一个简单的说明,ucl2.xml也不例外,文件头就给我们了一部分介绍、解释。内容如下:

 
  1. * Each LIST element contains a list of update instructions.

  2. * "Install" - Erase media and install firmware.

  3. * "Update" - Update firmware only.

  4. *

  5. * Each CMD element contains one update instruction of attribute type.

  6. * "pull" - Does UtpRead(body, file) transaction.

  7. * "push" - Does UtpWrite(body, file) transaction.

  8. * "drop" - Does UtpCommand(body) then waits for device to disconnect.

  9. * "boot" - Finds configured device, forces it to "body" device and downloads "file".

  10. * "find" - Waits for "timeout" seconds for the "body" device to connect.

  11. * "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,这部分内容如下:

 
  1. <CFG>

  2. <STATE name="BootStrap" dev="MX6SL" vid="15A2" pid="0063"/>

  3. <STATE name="BootStrap" dev="MX6D" vid="15A2" pid="0061"/>

  4. <STATE name="BootStrap" dev="MX6Q" vid="15A2" pid="0054"/>

  5. <STATE name="BootStrap" dev="MX6SX" vid="15A2" pid="0071"/>

  6. <STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>

  7. <STATE name="BootStrap" dev="MX7D" vid="15A2" pid="0076"/>

  8. <STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/>

  9. </CFG>

        接下来,可以看到该文件内有多个< LIST ><LIST/>,这就是前面说的操作清单,list后面有name、desc属性。这里的name就对应到前面cfg.ini文件的LIST下的name,这也就是前面说的可以在ucl2.xml中找到的原因,如果在这里边找不到,则不能正常工作,例如我将name改写成eMMC-Android23,则log信息如下:

 
  1. Friday, April 14, 2017 15:35:36 Start new logging

  2. ModuleID[2] LevelID[1]: Error: Can't find the specified list(eMMC-Android23) in the xml file

  3. ModuleID[2] LevelID[1]: Parse ucl script failed, error code: 12

        前面已经说了,这是操作清单,也就是说烧写系统的操作步骤就在这个List里边。List节点下,是一系列的CMD元素,通过观察发现里边很大一部分是一样的,例如state=” BootStrap”的前面部分:

 
  1. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6q%plus%%board%_sd.imx" ifdev="MX6Q">Loading U-boot</CMD>

  2.  
  3. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6dl%board%_sd.imx" ifdev="MX6D">Loading U-boot</CMD>

  4.  
  5. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6slevk_sd.imx" ifdev="MX6SL">Loading U-boot</CMD>

  6.  
  7. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6sx%sxuboot%_sd.imx" ifdev="MX6SX">Loading U-boot</CMD>

  8.  
  9. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx7d%7duboot%_sd.imx" ifdev="MX7D">Loading U-boot</CMD>

  10.  
  11. <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的操作如下:

 
  1. <CMD state="BootStrap" type="load" file="firmware/zImage" address="0x12000000"

  2. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Kernel.</CMD>

  3.  
  4. <CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"

  5. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Kernel.</CMD>

        这里很明显,根据dev的不同,将zimage下载到不同的地方了,这里下载的文件时一样的,包含加载的section和设置的section都是一样的。再往下就是下载RAMFS了,操作如下:

 
  1. <CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x12C00000"

  2. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Initramfs.</CMD>

  3.  
  4. <CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"

  5. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Initramfs.</CMD>

        这里也是地址不一样,不详述。接下来是下载设备树,这里zImage-imx6q%plus%-%board%%ldo%.dtb和前面的uboot文件一样,通过变量替换找到文件并下载。到此固件下载完毕,最小系统成功运行起来了。这里的目的是烧写系统,目前来说还没开始,接下来的工作就是正真烧写了。

 
  1. <!-- create partition -->

  2. <CMD state="Updater" type="push" body="send" file="mksdcard.sh.tar">Sending partition shell</CMD>

  3. <CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...</CMD>

  4. <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的例子:

 
  1. <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>

  2. <CMD state="Updater" type="push" body="$ echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">access boot partition 1</CMD>

  3.  
  4. <CMD state="Updater" type="push" body="send" file="files/android/%folder%/u-boot-imx%soc%%plus%%ldo%.imx" >Sending u-boot.bin</CMD>

  5.  
  6. <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>

  7. <CMD state="Updater" type="push" body="$ echo 1 > /sys/block/mmcblk%mmc%boot0/force_ro"> re-enable read-only access </CMD>

  8. <CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk%mmc%">enable boot partion 1 to boot</CMD>

  9.  
  10. <CMD state="Updater" type="push" body="$ ls -l /dev/mmc* ">Formatting sd partition</CMD>

  11.  
  12. <CMD state="Updater" type="push" body="send" file="files/android/%folder%/boot-imx%soc%%plus%%ldo%.img" >Sending and writting boot.img</CMD>

  13.  
  14. <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:

 
  1. <LIST name="eMMC-Android" desc="Choose eMMC as media">

  2. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6q%plus%%board%_sd.imx" ifdev="MX6Q">Loading U-boot</CMD>

  3. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6dl%board%_sd.imx" ifdev="MX6D">Loading U-boot</CMD>

  4. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6sx%board%_emmc.imx" ifdev="MX6SX">Loading U-boot</CMD>

  5. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx7d%7duboot%_sd.imx" ifdev="MX7D">Loading U-boot</CMD>

  6. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%6uluboot%_emmc.imx" ifdev="MX6UL">Loading U-boot</CMD>

  7.  
  8. <CMD state="BootStrap" type="load" file="firmware/zImage" address="0x12000000"

  9. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Kernel.</CMD>

  10. <CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"

  11. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Kernel.</CMD>

  12.  
  13. <CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x12C00000"

  14. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Initramfs.</CMD>

  15. <CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"

  16. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Initramfs.</CMD>

  17.  
  18. <CMD state="BootStrap" type="load" file="firmware/zImage-imx6q%plus%-%board%%ldo%.dtb" address="0x18000000"

  19. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q">Loading device tree.</CMD>

  20. <CMD state="BootStrap" type="load" file="firmware/zImage-imx6dl-%board%%ldo%.dtb" address="0x18000000"

  21. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6D">Loading device tree.</CMD>

  22.  
  23. <CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>

  24.  
  25. <!-- create partition -->

  26. <CMD state="Updater" type="push" body="send" file="mksdcard-android%data_type%.sh.tar">Sending partition shell</CMD>

  27. <CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...</CMD>

  28. <CMD state="Updater" type="push" body="$ sh mksdcard-android%data_type%.sh /dev/mmcblk%mmc%"> Partitioning...</CMD>

  29.  
  30. <!-- burn uboot -->

  31. <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>

  32. <CMD state="Updater" type="push" body="$ echo 0 > /sys/block/mmcblk%mmc%boot0/force_ro">access boot partition 1</CMD>

  33.  
  34. <CMD state="Updater" type="push" body="send" file="files/android/%folder%/u-boot-imx%soc%%plus%%ldo%.imx" >Sending u-boot.bin</CMD>

  35.  
  36. <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>

  37. <CMD state="Updater" type="push" body="$ echo 1 > /sys/block/mmcblk%mmc%boot0/force_ro"> re-enable read-only access </CMD>

  38. <CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1 /dev/mmcblk%mmc%">enable boot partion 1 to boot</CMD>

  39. <CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>

  40. </LIST>

        只烧写bootimage:

 
  1. <LIST name="eMMC-Android" desc="Choose eMMC as media">

  2. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6q%plus%%board%_sd.imx" ifdev="MX6Q">Loading U-boot</CMD>

  3. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6dl%board%_sd.imx" ifdev="MX6D">Loading U-boot</CMD>

  4. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6sx%board%_emmc.imx" ifdev="MX6SX">Loading U-boot</CMD>

  5. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx7d%7duboot%_sd.imx" ifdev="MX7D">Loading U-boot</CMD>

  6. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%6uluboot%_emmc.imx" ifdev="MX6UL">Loading U-boot</CMD>

  7.  
  8. <CMD state="BootStrap" type="load" file="firmware/zImage" address="0x12000000"

  9. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Kernel.</CMD>

  10. <CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"

  11. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Kernel.</CMD>

  12.  
  13. <CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x12C00000"

  14. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Initramfs.</CMD>

  15. <CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"

  16. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Initramfs.</CMD>

  17.  
  18. <CMD state="BootStrap" type="load" file="firmware/zImage-imx6q%plus%-%board%%ldo%.dtb" address="0x18000000"

  19. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q">Loading device tree.</CMD>

  20. <CMD state="BootStrap" type="load" file="firmware/zImage-imx6dl-%board%%ldo%.dtb" address="0x18000000"

  21. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6D">Loading device tree.</CMD>

  22.  
  23. <CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>

  24.  
  25. <!-- create partition -->

  26. <CMD state="Updater" type="push" body="send" file="mksdcard-android%data_type%.sh.tar">Sending partition shell</CMD>

  27. <CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...</CMD>

  28. <CMD state="Updater" type="push" body="$ sh mksdcard-android%data_type%.sh /dev/mmcblk%mmc%"> Partitioning...</CMD>

  29. <CMD state="Updater" type="push" body="$ ls -l /dev/mmc* ">Formatting sd partition</CMD>

  30.  
  31. <CMD state="Updater" type="push" body="send" file="files/android/%folder%/boot-imx%soc%%plus%%ldo%.img" >Sending and writting boot.img</CMD>

  32.  
  33. <CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mmcblk%mmc%p1">write boot.img</CMD>

  34. <CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>

  35. </LIST>

        只烧写system.img:

 
  1. <LIST name="eMMC-Android" desc="Choose eMMC as media">

  2. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6q%plus%%board%_sd.imx" ifdev="MX6Q">Loading U-boot</CMD>

  3. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6dl%board%_sd.imx" ifdev="MX6D">Loading U-boot</CMD>

  4. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6sx%board%_emmc.imx" ifdev="MX6SX">Loading U-boot</CMD>

  5. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx7d%7duboot%_sd.imx" ifdev="MX7D">Loading U-boot</CMD>

  6. <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%6uluboot%_emmc.imx" ifdev="MX6UL">Loading U-boot</CMD>

  7.  
  8. <CMD state="BootStrap" type="load" file="firmware/zImage" address="0x12000000"

  9. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Kernel.</CMD>

  10. <CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"

  11. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Kernel.</CMD>

  12.  
  13. <CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x12C00000"

  14. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Initramfs.</CMD>

  15. <CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"

  16. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL">Loading Initramfs.</CMD>

  17.  
  18. <CMD state="BootStrap" type="load" file="firmware/zImage-imx6q%plus%-%board%%ldo%.dtb" address="0x18000000"

  19. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q">Loading device tree.</CMD>

  20. <CMD state="BootStrap" type="load" file="firmware/zImage-imx6dl-%board%%ldo%.dtb" address="0x18000000"

  21. loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6D">Loading device tree.</CMD>

  22.  
  23. <CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>

  24.  
  25. <!-- create partition -->

  26. <CMD state="Updater" type="push" body="send" file="mksdcard-android%data_type%.sh.tar">Sending partition shell</CMD>

  27. <CMD state="Updater" type="push" body="$ tar xf $FILE "> Partitioning...</CMD>

  28. <CMD state="Updater" type="push" body="$ sh mksdcard-android%data_type%.sh /dev/mmcblk%mmc%"> Partitioning...</CMD>

  29. <CMD state="Updater" type="push" body="$ mkfs.ext4 -E nodiscard /dev/mmcblk%mmc%p5">Formatting system partition</CMD>

  30. <CMD state="Updater" type="push" body="$ mkfs.ext4 -E nodiscard /dev/mmcblk%mmc%p6">Formatting cache partition</CMD>

  31.  
  32. <CMD state="Updater" type="push" body="$ mkfs.ext4 -E nodiscard /dev/mmcblk%mmc%p7">Formatting device partition</CMD>

  33. <CMD state="Updater" type="push" body="$ mount -o remount,size=800M rootfs /">change size of tmpfs</CMD>

  34. <CMD state="Updater" type="push" body="send" file="files/android/%folder%/system.img" >Sending system.img</CMD>

  35. <CMD state="Updater" type="push" body="$ simg2img $FILE /dev/mmcblk%mmc%p5">writting sparse system.img</CMD>

  36. <CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>

  37.  
  38. </LIST>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值