linux 系统移植(第二十六期)---- MfgTool 工具烧写系统的原理---- Ubuntu20.04

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

[一、MfgTool 烧写原理简介](#一、MfgTool 烧写原理简介)

[二、firmeare 文件夹](#二、firmeare 文件夹)

[三、files 文件夹](#三、files 文件夹)

[四、ucl2.xml 文件](#四、ucl2.xml 文件)

总结



前言

上一期我们使用 MfgTool 工具测试将 NXP 官方提供的系统烧写到 I.MX6U-ALPHA 开发板中,了解一下MfgTool烧写系统的过程。本次博客我们将介绍一下系统烧写原理的原理。


一、MfgTool 烧写原理简介

开发板连接电脑以后双击"mfgtool2-yocto-mx-evk-emmc.vbs",打开下载对话框,如下图所示:

如果出现"符合 HID 标准的供应商定义设备"就说明连接正常,可以进行烧写,如果出现

其他的字符那么就要检查连接是否正确。点击"Start"按钮即可开始烧写,烧写 uboot、Linux kernel、.dtb 和 rootfs,那么这四个应该放到哪里 MfgTool 才能访问到呢?进入如下目录中:

复制代码
L4.1.15_2.0.0-ga_mfg-tools/mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware

此目录中的文件如下图 所示:

这个文件夹是存放系统固件的,我们重点关注 files、firmware 这两个文件夹,以及 ucl2.xml 这个文件。

在具体看这三个文件和文件夹之前,先简单了解 一下 MfgTool 烧写的原理。

MfgTool 其实是先通过 USB OTG 先将 uboot、kernel 和.dtb(设备树) 这是三个文件下载到开发板的 DDR 中,注意不需要下载 rootfs。就相当于直接在开发板的 DDR 上启动 Linux 系统。

等 Linux 系统启动以后再向 EMMC 中烧写完整的系统,包括 uboot、linux kernel、.dtb(设备树)和 rootfs,因此 MfgTool 工作过程主要分两个阶段:

①、将 firmware 目录中的 uboot、linux kernel 和.dtb(设备树),然后通过 USB OTG 将这个

文件下载到开发板的 DDR 中,目的就是在 DDR 中启动 Linux 系统,为后面的烧写做准备。

②、经过第①步的操作,此时 Linux 系统已经运行起来了,系统运行起来以后就可以很方便的完成对 EMMC 的格式化、分区等操作。EMMC 分区建立好以后就可以从 files 中读取要烧写的 uboot、linux kernel、.dtb(设备树)和 rootfs 这 4 个文件,然后将其烧写到 EMMC 中。

这个就是 MfgTool 的大概工作流程。

接下来就看看files、firmware 这两个文件夹,以及 ucl2.xml 这个文件。

二、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。

三、files文件夹

将上一小节提到的这三个文件下载到开发板的 DDR 上以后烧写的第一阶段就完成了,第二阶段就是从 files 目录中读取整个系统文件,并将其烧写到 EMMC 中。files 目录中的文件和firmware 目录中的基本差不多,都是不同板子对应的 uboot、设备树文件,同样,我们只关心下表中的四个文件:

如果要烧写我们自己编译出来的系统,就需要用我们编译出来的 zImage、u-boot.imx 和

imx6ull-alientek-emmc.dtb 和 rootfs 这四个文件替换掉上表中这四个文件。

四、ucl2.xml文件

files 和 firmware 目录下有众多的 uboot 和设备树,那么烧写的时候究竟选择哪一个呢?这

个工作就是由 ucl2.xml 文件来完成的。ucl2.xml 以"<UCL>"开始,以"</UCL>"结束。"<CFG>"

和"</CFG>"之间是配置相关内容,主要是判断当前是给 I.MX 系列的哪个芯片烧写系统。

"<LIST>"和"</LIST>"之间的是针对不同存储芯片的烧写命令。整体框架如下:

复制代码
<UCL>
    <CFG>
        ......
        <!-- 判断向I.MX系列的哪个芯片烧写系统 -->
        ......
    </CFG>

    <LIST name="SDCard" desc="Choose SD Card as media">
        <!-- 向 SD 卡烧写 Linux 系统 -->
    </LIST>

    <LIST name="eMMC" desc="Choose eMMC as media">
        <!-- 向 eMMC 烧写 Linux 系统 -->
    </LIST>

    <LIST name="Nor Flash" desc="Choose Nor flash as media">
        <!-- 向 Nor Flash 烧写 Linux 系统 -->
    </LIST>

    <LIST name="Quad Nor Flash" desc="Choose Quad Nor flash as media">
        <!-- 向 Quad Nor Flash 烧写 Linux 系统 -->
    </LIST>

    <LIST name="NAND Flash" desc="Choose NAND as media">
        <!-- 向 NAND Flash 烧写 Linux 系统 -->
    </LIST>

    <LIST name="SDCard-Android" desc="Choose SD Card as media">
        <!-- 向 SD 卡烧写 Android 系统 -->
    </LIST>

    <LIST name="eMMC-Android" desc="Choose eMMC as media">
        <!-- 向 eMMC 烧写 Android 系统 -->
    </LIST>

    <LIST name="Nand-Android" desc="Choose NAND as media">
        <!-- 向 NAND Flash 烧写 Android 系统 -->
    </LIST>
</UCL>

ucl2.xml 首先会判断当前要向 I.MX 系列的哪个芯片烧写系统,代码如下:

复制代码
<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="006F" pid="37FF"/>
</CFG>

通过读取芯片的VID和 PID 即可判断出当前要烧写什么处理器的系统。

确定了处理器以后就要确定向什么存储设备烧写系统,这个时候mfgtool2-yocto-mx-evk-emmc.vbs 再次登场,此文件内容如下:

复制代码
Set wshShell = CreateObject("WScript.shell")
wshShell.run "mfgtool2.exe -c ""linux"" -l ""eMMC"" -s ""board=sabresd"" -s ""mmc=1"" -s ""6uluboot=14x14evk"" -s ""6uldtb=14x14-evk"""
Set wshShell = Nothing

重点是"wshShell.run"这一行,这里一行调用了 mfgtool2.exe 这个软件,并且还给出了一堆的参数,其中就有"eMMC"字样,说明是向 EMMC 烧写系统,要烧写的存储设备就这样确定下来了。"wshShell.run"后面还有一堆的其他参数,这些参数都有对应的值,如下所示:

复制代码
board=sabresd
mmc=1
6uluboot=14x14evk
6uldtb=14x14-evk

我们继续回到 ucl2.xml 中,既然现在已经知道了是向 I.MX6ULL 的 EMMC 中烧写系统, 那么直接在 ucl2.xml 中找到相应的烧写命令就行了。

这里以uboot 的烧写为例讲解一下。前面说了烧写分两个阶段,第一步是通过 USB OTG 向 DDR

中下载系统,第二步才是正常的烧写。通过 USB OTG 向 DDR 下载 uboot 的命令如下:

复制代码
<CMD state="BootStrap" type="boot" body="BootStrap" file="firmware/u-boot-imx6ul%lite%%6uluboot%_emmc.imx" ifdev="MX6ULL">Loading U-boot</CMD>

上面的命令就是BootStrap阶段,也就是第一阶段,"file"表示要下载的文件位置,在firmware 目录下,文件名字为

复制代码
u-boot-imx6ul%lite%%6uluboot%_emmc.imx

其实这里向 DDR 中下载的是 firmware/ u-boot-imx6ull14x14evk _emmc.imx 这个 uboot 文

件。同样的方法将.dtb(设备树)和 zImage 都下载到 DDR 中以后就会跳转去运行 OS,这个时候

会在 MfgTool 工具中会有"Jumping to OS image"提示语句,ucl2.xml 中的跳转命令如下:

复制代码
<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>

启动 Linux 系统以后就可以在 EMMC 上创建分区,然后烧写 uboot、zImage、.dtb(设备树)和根文件系统。 这个就是 MfgTool 的整个烧写原理。


总结

本期博客介绍了 MfgTool 工具烧写系统的原理。

相关推荐
funnycoffee1234 小时前
linux系统DNS修改命令
linux·运维·服务器·linux dns
想放学的刺客4 小时前
整理了120道单片机嵌入式面试题与答案,覆盖了硬件电路和C语言等核心领域。
c语言·c++·stm32·单片机·嵌入式硬件·mcu·51单片机
Decksweeper5 小时前
【大一做毕设?十二天四人从零开始手搓智能小车!(基于rdk x5、stm32与yolo v5,小车可实现巡线,避障,识别与夹取特定物块)】
stm32·嵌入式硬件·yolo·课程设计
回不去的bug5 小时前
【STM32】玩转IIC之驱动MPU6050及姿态解算
stm32·单片机·嵌入式硬件·mpu6050
weixin_1122335 小时前
基于单片机的塑料厂房气体检测系统设计
单片机·嵌入式硬件
小哈里5 小时前
【工具】Linux远程开发核心工具,Git命令缩写与SSH常用命令
linux·git·ssh·工具·远程开发
夏乌_Wx5 小时前
深入理解x86内存寻址:从8086实模式到IA-32段页式映射&Linux内核实现
linux
czxyvX5 小时前
012-Linux简易Shell编写
linux
S-码农6 小时前
Linux 进程核心知识
linux
努力努力再努力wz6 小时前
【Linux网络系列】:TCP 的秩序与策略:揭秘传输层如何从不可靠的网络中构建绝对可靠的通信信道
java·linux·开发语言·数据结构·c++·python·算法