IDO-EVB6Y09
MfgTool是NXP官方提供的 PC 端在线烧写系统工具,本文主要介绍 Mfgtool 烧录时文件加载流程,以及如何添加一个自定义的烧录目录。
1. Mfgtool 烧录过程分析
以 EVB6Y09 开发板提供的 Mfgtools 工具包,烧录 DDR256+Nand Flash 配置开发板 Qt4.8.7 固件为例。
固件烧录的入口是双击 “mfgtool2-evb6y09-nand-qt4.8.7.vbs”脚本文件打开软件,使用USB数据线连接好开发板后,软件显示识别到“符合HID标准的供应商定义设备”,点击“start”按键即可将指定配置的固件烧录至开发板存储中。
那么这个过程中,mfgtool 工具是如何定位到我们要烧录的固件包呢?答案就在 vbs 文件中。
使用文本编辑器打开 “mfgtool2-evb6y09-nand-qt4.8.7.vbs”文件,文件内容如下:
Set wshShell = CreateObject("WScript.shell")
wshShell.run "mfgtool2.exe -c ""linux"" -l ""NAND Flash"" -s ""sxuboot=sabreauto"" -s ""sxdtb=sabreauto"" -s ""6uluboot=14x14evk"" -s ""6uldtb=14x14-evk"" -s ""6ulldtb=14x14"" -s ""board=14x14evk"" -s ""nand=nand"" -s ""nanddtb=gpmi-weim"" -s ""part_uboot=0"" -s ""part_kernel=1"" -s ""part_dtb=2"" -s ""part_rootfs=3"" -s ""folder=6ull-evb6y09-nand-qt4.8.7"" "
Set wshShell = Nothing
Visual Basic 脚本中,调用了window shell 启动了烧录工具包根目录下的 mfgtool2.exe 软件,并附带了很多参数,此处列出我们需要关注的参数及键值对内容:
NAND Flash #指定烧录NAND Flash 存储介质
6uluboot=14x14evk #uboot文件名字参数
board=14x14evk #开发板名称,用于指定文件名字参数
nand=nand #用指定文件名称
nanddtb=gpmi-weim #dtb 文件名字参数,用于指定文件名称
part_uboot=0 #Nand Flash uboot分区号
part_kernel=1 #Nand Flash kernel分区号
part_dtb=2 #Nand Flash dtb 烧录的分区号
part_rootfs=3 #Nand Flash rootfs 烧录的分区号
folder=6ull-evb6y09-nand-qt4.8.7 #烧录固件所在目录
mfgtool2.exe 执行过程会解析 04-mfgtools-imx6ull-update\Profiles\Linux\OS Firmware\ucl2.xml 文件中的语句,并逐语句运行,并使用运行前传递的参数值替换语句中的变量,根据这些变量的值代入从而找到指定的文件。软件通过参数“NAND Flash” 在ucl2.xml文件中匹配到了烧录所需要执行的语句如下:
<LIST name="NAND Flash" desc="Choose NAND as media">
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%lite%%6uluboot%_%nand%.imx" ifdev="MX6ULL">Loading U-boot</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.</CMD>
<CMD state="BootStrap" type="load" file="firmware/%initramfs%" address="0x83800000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Initramfs.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6ul%lite%-%6uldtb%-%nanddtb%.dtb" address="0x83000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading device tree.</CMD>
<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>
<!--burn the uboot to NAND: -->
<!-- <CMD state="Updater" type="push" body="$ ls -l /dev/*">dev list</CMD> -->
<CMD state="Updater" type="push" body="$ mount -t debugfs debugfs /sys/kernel/debug">Mounting debugfs</CMD>
<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd%part_uboot% 0 0">Erasing Boot partition</CMD>
<!--<CMD state="Updater" type="push" body="send" file="files/%folder%/u-boot-imx6ul%lite%%6uluboot%_%nand%.imx" ifdev="MX6ULL">Sending u-boot.bin</CMD> -->
<CMD state="Updater" type="push" body="send" file="files/%folder%/u-boot-imx6ull14x14evk.imx-nand" ifdev="MX6ULL">Sending u-boot.bin</CMD>
<CMD state="Updater" type="push" body="$ kobs-ng init -x -v --chip_0_device_path=/dev/mtd%part_uboot% $FILE">Flashing Bootloader</CMD>
<!--burn the kernel to NAND: -->
<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd%part_kernel% 0 0">Erasing Kernel partition</CMD>
<CMD state="Updater" type="push" body="send" file="files/%folder%/zImage">Sending kernel zImage</CMD>
<CMD state="Updater" type="push" body="$ nandwrite -p /dev/mtd%part_kernel% $FILE">Flashing Kernel</CMD>
<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd%part_dtb% 0 0">Erasing dtb partition</CMD>
<CMD state="Updater" type="push" body="send" file="files/%folder%/zImage-imx6ul%lite%-%6uldtb%-%nanddtb%.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
<CMD state="Updater" type="push" body="$ nandwrite -p /dev/mtd%part_dtb% $FILE">Flashing dtb</CMD>
<!--burn the rootfs to NAND: -->
<CMD state="Updater" type="push" body="$ flash_erase /dev/mtd%part_rootfs% 0 0">Erasing rootfs partition</CMD>
<CMD state="Updater" type="push" body="$ ubiformat /dev/mtd%part_rootfs%"/>
<CMD state="Updater" type="push" body="$ ubiattach /dev/ubi_ctrl -m %part_rootfs%">Attaching UBI partition</CMD>
<CMD state="Updater" type="push" body="$ ubimkvol /dev/ubi0 -Nrootfs -m"/>
<CMD state="Updater" type="push" body="$ mkdir -p /mnt/mtd%part_rootfs%"/>
<CMD state="Updater" type="push" body="$ mount -t ubifs ubi0:rootfs /mnt/mtd%part_rootfs%"/>
<CMD state="Updater" type="push" body="pipe tar -xv -C /mnt/mtd%part_rootfs%" file="files/%folder%/rootfs.tar" ifdev="MX6UL MX7D MX6ULL">Sending and writting rootfs</CMD>
<CMD state="Updater" type="push" body="frf">Finishing rootfs write</CMD>
<CMD state="Updater" type="push" body="$ umount /mnt/mtd%part_rootfs%">Unmounting rootfs partition</CMD>
<CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
</LIST>
分析这段xml,可知烧录过程共有两个阶段,分别为BootStrap(加载引导文件)和Updater(下载烧录固件)。
其中BootStrap阶段是将位于 04-mfgtools-imx6ull-update\Profiles\Linux\OS Firmware\firmware 目录下的uboot、zImage、dtb和rootfs文件加载至内存的指定地址用于启动系统,用加载至内存中的资源将系统启动起来后进入Updater阶段。在Updater过程中,逐语句的执行擦除、格式化和解包等命令,分别将位于 Profiles\Linux\OS Firmware\files\6ull-evb6y09-nand-qt4.8.7 目录的uboot、zImage、dtb和rootfs文件烧写至 Nand Flash 对应的分区中。
在语句的匹配过程中,运行前传递的参数值将会替换语句中的变量名作为实际使用的文件。
例如:
files/%folder%/zImage-imx6ul%lite%-%6uldtb%-%nanddtb%.dtb
在参数值替换后,读取到的文件为
files/6ull-evb6y09-nand-qt4.8.7/zImage-imx6ull-14x14-evk-gpmi-weim.dtb
2. 添加新的烧录固件和目录
通过第一节的分析可知,在烧录工具包中添加一个独立的烧录目录,只需添加一个vbs脚本文件并将需要烧录的固件内容放置于脚本中指定固件目录。
假设新固件需要烧录的开发板为Nand Flash,添加步骤如下:
1. 添加烧录固件目录
在04-mfgtools-imx6ull-update\Profiles\Linux\OS Firmware\files 目录下,新建一个名为 6ull-nand-firmware-test 的目录,在目录中添加需要烧录的uboot、kernel、dtb以及rootfs文件。
2. 添加vbs文件
复制一份 “mfgtool2-evb6y09-nand-qt4.8.7.vbs” 文件,重命名为“mfgtool2-nand-test.vbs”,使用文本编辑器打开“mfgtool2-nand-test.vbs”文件,将文件中的 folder 参数的值修改为固件存放目录 6ull-nand-firmware-test,根据固件的名称修改参数以适配固件的文件名。如果固件名称与原来的一致,其它参数无需修改。
Set wshShell = CreateObject("WScript.shell")
wshShell.run "mfgtool2.exe -c ""linux"" -l ""NAND Flash"" -s ""sxuboot=sabreauto"" -s ""sxdtb=sabreauto"" -s ""6uluboot=14x14evk"" -s ""6uldtb=14x14-evk"" -s ""6ulldtb=14x14"" -s ""board=14x14evk"" -s ""nand=nand"" -s ""nanddtb=gpmi-weim"" -s ""part_uboot=0"" -s ""part_kernel=1"" -s ""part_dtb=2"" -s ""part_rootfs=3"" -s ""folder=6ull-nand-firmware-test"" "
Set wshShell = Nothing