IMX6ULL Mfgtool 固件烧录分析

图片

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Industio_触觉智能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值