MYS-6ULX 系列板卡提供两种系统更新的方法:
本文主要介绍使用 MfgTool 工具更新 MYS-6ULX-IOT 的方法。MfgTool 是 Freescale 官方推荐的一个使用 OTG 来烧录、升级系统镜像的软件工具。MfgTool 工具功能强大、可塑性高,简单来说,有如下特点:
- 可以用来升级 Linux,也可以升级 Android;
- 允许单独刷写某一系统分区,如 Android 的 boot.img;
- 支持独立刷写 SPI NOR、Nand、eMMC 等;
- 支持多通道刷写,可作为量产工具;
MfgTool 工具的亮点是它的可拓展性和可塑性,下面我们来看一下这些特性是怎么体现的,以及该如何使用 MfgTools。
先来看看 MfgTool 的目录结构,下载并解压 03-Tools/ManufactoryTool/MYS-6ULX-mfgtools-20170919.zip,进入 MfgTool 主目录,我们会看到很多文件和子目录,其中较为重要的一些文件结构如下图所示。
其中,MfgTool2.exe 是可执行文件,双击它即可打开烧写工具,但我们这里并不直接运行它,而是通过运行 vbs 脚本文件来启动;cfg.ini、UICfg.ini、ucl2.xml 都是配置文件,后面会详细介绍;Profile里面定义了几层目录,分别存放镜像文件及配置文件。
需要注意的是,Profile 里面的镜像文件分为两种:第一种是作为媒介用途的镜像,在 Yocto 下包括 “uboot”、“dtb”、“zImage”;第二种是真正烧录到 eMMC、Nand Flash 或者 sdCard 的镜像文件。对于我们这个项目,媒介镜像存放于 firmware 目录,实际烧写的镜像存放于 files 目录。之所以需要两种镜像,是因为 MfgTool 的烧写原理是先烧录媒介镜像到 DDR,然后启动该媒介系统,接着通过该系统把目标镜像固化到 eMMC、Nand Flash 或者 sdCard 里面。
可以把烧录过程分为两部分:第一部分是烧录前的准备工作;第二部分是 MfgTool 开始烧录到结束烧录的过程。整个烧录过程如下图所示。值得一提的是,第二部分的烧录过程是严格根据 ucl2.xml 文件来进行的。
接下来我们分析一下 MfgTool 的配置文件:
(1)UICfg.ini文件
[UICfg]
PortMgrDlg=1 // 表示同时支持升级的最大设备数,可按需调整
(2)cfg.ini文件
[profiles]
chip = Linux // 目标平台,对应 Profile/Linux 目录,可根据自己的需求定义 profile
[platform]
board = SabreSD // 预留,暂时没什么实际的作用
[LIST]
name = SDCard // Profiles/Linux/OS Firmware/ucl2.xml 里面目标操作列表的名字
[variable] // ucl2.xml 中对应 name 的 list 会引用到的环境变量
board = sabresd // 引用模式是 %board%,要和平台的名字一样,否则可能会出错
mmc = 0 // 引用模式是 %mmc%
sxuboot=sabresd
sxdtb=sdb
7duboot=sabresd
7ddtb=sdb
6uluboot=14x14ddr3arm2
6uldtb=14x14-ddr3-arm2
6ulldtb=14x14-ddr3-arm2
ldo=
plus=
lite=l
initramfs=fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot
seek = 1
sxnor=qspi2
7dnor=qspi1
6ulnor=qspi1
nor_part=0
(3)ucl2.xml文件
ucl2.xml 是系统升级时的操作文件,MfgTool 会根据文件里面 list 的内容进行相应的升级。文件以如下一行为界线,可以分为上阶段和下阶段。
"BootStrap" type="jump" > Jumping to OS image.
上阶段是把“媒介镜像”烧录到DDR里面并启动,下阶段是烧录“file”目录里面的文件到emmc上。我们以 Nand Flash 为例,抽取以下第二阶段内容,需要注意其中的注释:
<CMD state="Updater" type="push" body="send" file="files/u-boot-imx6ul%lite%%6uluboot%_%nand%.imx" ifdev="MX6ULL">Sending u-boot.binCMD>
<CMD state="Updater" type="push" body="send" file="files/zImage-imx6ul%lite%" ifdev="MX6ULL">Sending kernel zImageCMD>
<CMD state="Updater" type="push" body="send" file="files/zImage-imx6ul%lite%-%6uldtb%-%nanddtb%.dtb" ifdev="MX6ULL">Sending Device Tree fileCMD>
<CMD state="Updater" type="push" body="pipe tar -jxv -C /mnt/mtd%part_rootfs%" file="files/core-image-base-mys6ull14x14.rootfs.tar.bz2" ifdev="MX6ULL">Sending and writting rootfsCMD>
注释下的内容严格规定了MFG Tools的烧录过程,即:“分区 –> 烧写uboot –> 烧写zImage –> 烧写dtb –> 烧写rootfs”。
顺便分析下 VB Script 脚本的内容吧,对应 Nand Flash 的是 mfgtool2-yocto-mx-evk-nand.vbs,内容如下:
Set wshShell = CreateObject("WScript.shell")
wshShell.run "mfgtool2.exe -c ""linux"" -l ""NAND Flash"" -s ""board=sabreauto"" -s ""lite=l"" -s ""6uluboot=14x14evk"" -s ""nand=nand"" -s ""6uldtb=14x14-evk"" -s ""nanddtb=gpmi-weim"" -s ""part_uboot=0"" -s ""part_kernel=1"" -s ""part_dtb=2"" -s ""part_rootfs=3"" "
Set wshShell = Nothing
显然,该脚本的作用就是启动 mfgtool2.exe,并且传入一些变量,这些变量会覆盖 cfg.ini 文件中的变量,从而达到执行不同脚本更新不同板卡的目的。
好啦,赶紧在 MYS-6ULX-IOT 上实际操作下吧~
事先提醒一下:请勿将 DV 5V 电源适配器和 Micro USB 接口同时供电!
使用 MfgTool 更新系统的流程如下:
(1)设置拨码开关(SW1)的第3位为 ON,第4位为 OFF;
(2)使用 USB 转接线(Type-A 转 Micro-B)连接 PC 机 USB 端口与开发板(J7);
(3)进入 MfgTool 目录,双击执行 mfgtool2-yocto-mx-evk-nand.vbs 脚本(因为 MYS-6ULX-IOT 默认焊接的是 Nand Flash);
(4)一切正常的话,在设备管理器或 MfgTool 界面可以看到已识别开发板;
(5)点击 MfgTool 界面上的 Start 按钮,MfgTool 就开始自动更新系统至板载存储设备;
(6)更新成功后底部的总进度条显示为绿色,若失败则为红色,MfgTool.log 文件会记录错误提示信息。
更新完毕,断开 USB 电源,将拨码开关(SW1)的第3位拨回 OFF,第4位拨回 ON,重新上电即可进入新系统。
再啰嗦几句~
媒介镜像主要关注的是 zImage,因为“媒介uboot”在编译 yocto 的时候已经打包好了,具体是“build/tmp/deploy/images/$MACHINE/u-boot-$MACHINE.imx
”文件,直接拿来使用就好。dtb 文件也使用编译好的就可以了,没什么特殊要求。zImage 有所要求,但 Freescale 也帮我们铺好路了。看到“arch/arm/configs/ imx_v7_mfg_defconfig
”配置文件,使用此配置文件编译出来的 zImage 就是“媒介zImage”。然后把这些媒介的 image 放到 MfgTool 的目录下 Profiles/Linux/OS Firmware/firmware 目录里面即可,不同版本的 MfgTool 路径可能有区别。
对于 imx_v7_mfg_defconfig
与其他 config 文件不一样的地方就是 CONFIG_FSL_UTP
。对应的内核源码在“drivers/usb/gadget/f_mas_stotage.c
”里面,具体的作用也就是接收并处理来自 OTG 的 image、script 和 command。