以 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
通过第一节的分析可知,在烧录工具包中添加一个独立的烧录目录,只需添加一个vbs脚本文件并将需要烧录的固件内容放置于脚本中指定固件目录。
假设新固件需要烧录的开发板为Nand Flash,添加步骤如下
在04-mfgtools-imx6ull-update\Profiles\Linux\OS Firmware\files 目录下,新建一个名为 6ull-nand-firmware-test 的目录,在目录中添加需要烧录的uboot、kernel、dtb以及rootfs文件。
复制一份 “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
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!