一. 简介
MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件,可以在 NXP 官网下载到。运行在windows下。可以烧写uboot.imx、zImage、dtb,rootfs。通过 USB口进行烧写。
上一篇文章简单了解了 烧录工具MfgTool (针对ALPHA开发板的)烧写的方法。文章地址如下:
ALPHA开发板烧录工具MfgTool烧写过程-CSDN博客
本文简单了解一下 烧录工具MfgTool的工作原理就行了。MfgTool 只是个工具,具体的原理不需要去深入研究。
二. ALPHA开发板烧录工具MfgTool烧写原理
MfgTool工具都烧录哪些文件呢?
肯定是烧写 uboot、Linux kernel、.dtb 和 rootfs。
那么,uboot、Linux kernel、.dtb 和 rootfs 这四个应该放到哪里 MfgTool 才能访问到呢?
进入如下目录中:
L4.1.15_2.0.0-ga_mfg-tools/mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware
此目录中的文件如下所示:
文件夹“
OS Firmware
”看名字就知道是存放系统固件的,我们重点关注
files
、
firmware
这两个文件夹,以及
ucl2.xml
这个文件。
MfgTool 烧写的原理:
在具体看这三个文件和文件夹之前,我们先来简单了解一下
MfgTool
烧写的原理。
MfgTool
其实是先通过
USB OTG
先将
uboot
、
kernel
和
.dtb(
设备树
) 这三个文件下载到开发板的
DDR
中,注意不需要下载
rootfs
。就相当于直接在开发板的
DDR
上启动
Linux
系统,等
Linux
系统启动以后再向
Nand-Flash
中烧写完整的系统,包括
uboot
、
kernel
、
.dtb(
设备树
)
和
rootfs。
MfgTool 工作过程主要分两个阶段:
1. 将
firmware
目录中的
uboot
、
linux kernel
和
.dtb(
设备树
)
,然后通过
USB OTG
将这个
文件下载到开发板的
DDR
中,目的就是在
DDR
中启动
Linux
系统,为后面的烧写做准备。
2. 经过第 1 步的操作,此时
Linux
系统已经运行起来了,系统运行起来以后,就可以很方
便的完成对
Nand-Flash
的格式化、分区等操作。
Nand-Flash
分区建立好以后,就可以从
files
中读取要烧
写的
uboot
、
linux kernel
、
.dtb(
设备树
)
和
rootfs
这
4
个文件,然后将其烧写到 Nand-Flash中。
三. MfgTool工具中几个文件或文件夹
注意:下面介绍 MFGTool工具的几个文件或文件夹,以 EMMC 版开发板所使用的文件为例进行说明!!!
1. firmeare 文件夹
打开
firmware
文件夹,里面有很多的以
.imx
结尾的
uboot
文件、一个
zImage
镜像文件、很多
.dtb
结尾的设备树文件。这些文件都是
NXP
官方开发板使用的,不同的板子使用不同的文件,
其中我们需要关心的只有下面
的这三个文件:
上表
中的这三个文件就是
I.MX6ULL EVK
开发板烧写系统的时候第一阶段所需的文
件。如果要烧写我们的系统,就需要用我们编译出来的
zImage
、
u-boot.imx
和
imx6ull-alientek-
emmc.dtb
这三个文件替换掉上表中的
这三个文件。但是名字要和上表中
的一致,因
此,需要将
u-boot.imx
重命名为
u-boot-imx6ull14x14evk_emmc.imx
,将
imx6ull-alientek-emmc.dtb
重命名为
zImage-imx6ull-14x14-evk-emmc.dtb
。
2. files 文件夹
将上表
中的这三个文件下载到开发板的
DDR
上以后烧写的第一阶段就完成了。
第二阶段就是从
files
目录中读取整个系统文件,并将其烧写到
EMMC
中。
files
目录中的文件和
firmware
目录中的基本差不多,都是不同板子对应的
uboot
、设备树文件,同样,我们只关心表 下表
中的四个文件:
![](https://img-blog.csdnimg.cn/direct/de8e33a15b7b4cf883898c8c02da1815.jpeg)
如果要烧写我们自己编译出来的系统,就需要用我们编译出来的
zImage
、
u-boot.imx
和
imx6ull-alientek-emmc.dtb
和
rootfs
这四个文件替换掉上表
中这四个文件。 同样的,名字也需要跟上表中名字都保持一致。
3. ucl2.xml 文件
files
和
firmware
目录下有众多的
uboot
和设备树,那么烧写的时候究竟选择哪一个呢?这个工作就是由
ucl2.xml
文件来完成的。
ucl2.xml
以“
<UCL>
”开始,以“
</UCL>
”结束。“
<CFG>
” 和 “
</CFG>
” 之间是配置相关内容,主要是判断当前是给
I.MX
系列的哪个芯片烧写系统。
<UCL>
<CFG>
<STATE name="BootStrap" dev="MX6SL" vid="15A2" pid="0063"/>
<STATE name="BootStrap" dev="MX6D" vid="15A2" pid="0061"/>
<STATE name="BootStrap" dev="MX6Q" vid="15A2" pid="0054"/>
<STATE name="BootStrap" dev="MX6SX" vid="15A2" pid="0071"/>
<STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>
<STATE name="BootStrap" dev="MX7D" vid="15A2" pid="0076"/>
<STATE name="BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/>
<STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/>
</CFG>
“
<LIST>
”和“
</LIST>
”之间的是针对不同存储芯片的烧写命令。例如,如下是针对 Nand-Flash版芯片的烧录命令:
<LIST name="NAND Flash" desc="Choose NAND as media">
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6q%plus%%board%_%nand%.imx" ifdev="MX6Q">Loading U-boot</CMD>
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6dl%board%_%nand%.imx" ifdev="MX6D">Loading U-boot</CMD>
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6sx%sxuboot%_%nand%.imx" ifdev="MX6SX">Loading U-boot</CMD>
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx7d%7duboot%_%nand%.imx" ifdev="MX7D">Loading U-boot</CMD>
<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%6uluboot%_%nand%.imx" ifdev="MX6UL">Loading U-boot</CMD>
<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="0x12000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Kernel.</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="0x12C00000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6D">Loading Initramfs.</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-imx6q%plus%-%board%-%nanddtb%.dtb" address="0x18000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q">Loading device tree.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6dl-%board%-%nanddtb%.dtb" address="0x18000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6D">Loading device tree.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6sx-%sxdtb%-%nanddtb%.dtb" address="0x83000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SX">Loading device tree.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx7d-%7ddtb%-%nanddtb%.dtb" address="0x83000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX7D">Loading device tree.</CMD>
<CMD state="BootStrap" type="load" file="firmware/zImage-imx6ul-%6uldtb%-%nanddtb%.dtb" address="0x83000000"
loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6UL">Loading device tree.</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="$ 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>
..............................................
</LIST>
MfgTool工具烧录原理简单介绍到这里。后面使用 MfgTool烧录我们自制系统。