前面我们已经移植好了 uboot 和 linux kernle,制作好了根文件系统。但是我们移植都是通过网络来测试的,在实际的产品开发中肯定不可能通过网络来运行,因此我们需要将 uboot、 linux kernel、 .dtb(设备树)和 rootfs 这四个文件烧写到板子上的 EMMC、 NAND 或 QSPI Flash 等其他存储设备上,这样不管有没有网络我们的产品都可以正常运行。本章我们就来学习一下如何使用 NXP 官方提供的 MfgTool 工具通过 USB OTG 口来烧写系统。
MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件,可以在 NXP 官网下载到。L4.1.15_2.0.0-ga_mfg-tools.tar.gz。此软件在 Windows 下使用,对于我们来说太友好
了。将此压缩包进行解压,解压完成以后会出现一个名为 L4.1.15_2.0.0-ga_mfg-tools 的文件夹,进入此文件夹,此文件夹的内容如图所示:
从图中可以看出,有两个.txt 文件和两个.gz 压缩包。 .txt 文档就不去看了,重点是这两个.gz 压缩包,这两个压缩包的区别在名字上已经写的很详细了。“without-rootfs”和“with-rootfs”,一个是带 rootfs 和一个是不带 rootfs。 mfg_tools 这个工具本意是给 NXP 自己的开发板设计的烧写软件,所以肯定带有自家开发板对应的 uboot、 linux kernel 和 rootfs 的文件。我们肯定是要烧写文件系统的,所以选择 mfgtools-with-rootfs.tar.gz 这个压缩包,继续对其解压, 解压出一个名为 mfgtools-with-rootfs 的文件夹,此文件夹就包含有我们需要的烧写工具。进入目录 mfgtools-with-rootfs\mfgtools 中,在此目录下有几个文件夹和很多的.vbs 文件,如图所示:
我们只关心图中 Profiles 这个文件夹,因为后面要烧写文件就放到这个文件夹中。MfgTool2.exe 就是烧写软件,但是我们不会直接打开这个软件烧写, mfg_tools 不仅能烧写I.MX6U,而且也能给 I.MX7、 I.MX6Q 等芯片烧写,所以在烧写之前必须要进行配置,指定烧写的是什么芯片,烧写到哪里去?下面的这些众多的.vbs 文件就是配置脚本,烧写的时候通过双击这些.vbs 文件来打开烧写工具。这些.vbs 烧写脚本既可以根据处理器的不同,由用户选择向 I.MX6D、 I.MX6Q、 I.MX6S、 I.MX7、 I.MX6UL 和 I.MX6ULL 等的哪一款芯片烧写系统。也可以根据存储芯片的不同,选择向 EMMC、 NAND 或 QSPI Flash 等的哪一种存储设备烧写,功能非常强大!!我们现在需要向 I.MX6U 烧写系统,因此需要参考表所示的 5 个烧写脚本:
脚本文件 | 描述 |
mfgtool2-yocto-mx-evk-emmc.vbs | EMMC 烧写脚本。 |
mfgtool2-yocto-mx-evk-nand.vbs | NAND 烧写脚本 |
mfgtool2-yocto-mx-evk-qspi-nor-n25q256a.vbs | QSPI Flash 烧写脚本,型号为 n25q256a |
mfgtool2-yocto-mx-evk-sdcard-sd1.vbs | 如果 SD1 和 SD2 接的 SD 卡,这两个文件分 别向 SD1 和 SD2 上的 SD 卡烧写系统。 |
mfgtool2-yocto-mx-evk-sdcard-sd2.vbs |
其他的.vbs 烧写脚本用不到,因此可以删除掉,防止干扰我们的视线。本文用的是正点原子的 EMMC 版核心板,因此只会用到 mfgtool2-yocto-mx-evk-emmc.vbs 这个烧写脚本,如果用其他的核心板请参考相应的烧写脚本。
开发板连接电脑以后双击“ 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
文件夹“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 的大概工作流程。
打开 firmware 文件夹,里面有很多的.imx 结尾的 uboot 文件、一个 zImage 镜像文件、很多.dtb结尾的设备树文件。这些文件都是NXP官方开发板使用的,不同的板子使用不同的文件,其中我们需要关心的只有表中的这三个文件:
脚本文件 | 描述 |
zImage | NXP 官方 I.MX6ULL EVK 开发板的 Linux 镜像文件。 |
u-boot-imx6ull14x14evk_emmc.imx | NXP 官方 I.MX6ULL EVK 开发板的 uboot 文件。 |
zImage-imx6ull-14x14-evk-emmc.dtb | NXP 官方 I.MX6ULL EVK 开发板的设备树 |
表中的这三个文件就是 I.MX6ULL EVK 开发板烧写系统的时候第一阶段所需的文件。如果要烧写我们的系统,就需要用我们编译出来的 zImage、 u-boot.imx 和 imx6ull-alientekemmc.dtb 这三个文件替换掉表 39.2.2.1 中这三个文件。但是名字要和表 39.2.2.1 中的一致,因此需要将 u-boot.imx 重命名为 u-boot-imx6ull14x14evk_emmc.imx,将 imx6ull-alientek-emmc.dtb重命名为 zImage-imx6ull-14x14-evk-emmc.dtb。
将表中的这三个文件下载到开发板的 DDR 上以后烧写的第一阶段就完成了,第二阶段就是从 files 目录中读取整个系统文件,并将其烧写到 EMMC 中。 files 目录中的文件和firmware 目录中的基本差不多,都是不同板子对应的 uboot、设备树文件,同样,我们只关心表中的四个文件:
脚本文件 | 描述 |
zImage | NXP 官方 I.MX6ULL EVK 开发板的 Linux 镜像文件。 |
u-boot-imx6ull14x14evk_emmc.imx | NXP 官方 I.MX6ULL EVK 开发板的 uboot 文件。 |
zImage-imx6ull-14x14-evk-emmc.dtb | NXP 官方 I.MX6ULL EVK 开发板的设备树 |
rootfs_nogpu.tar.bz2 | 根文件系统,注意和另外一个 rootfs.tar.bz2 根文件系 统区分开。 nogpu 表示此根文件系统不包含 GPU 的内 容, I.MX6ULL 没有 GPU,因此要使用此根文件系统 |
如果要烧写我们自己编译出来的系统,就需要用我们编译出来的 zImage、 u-boot.imx 和imx6ull-alientek-emmc.dtb 和 rootfs 这四个文件替换掉表中这四个文件。
files 和 firmware 目录下有众多的 uboot 和设备树,那么烧写的时候究竟选择哪一个呢?这个工作就是由 ucl2.xml 文件来完成的。 ucl2.xml 以“
和“”和“
”之间的是针对不同存储芯片的烧写命令。整体框架如下:
......
......
ucl2.xml 首先会判断当前要向 I.MX 系列的哪个芯片烧写系统,代码如下:
21
22
23
24
25
26
27
28
29
30
通过读取芯片的VID 和PID 即可判断出当前要烧写什么处理器的系统,如果VID=0X15A2,PID=0080,那么就表示要给 I.MX6ULL 烧写系统。确定了处理器以后就要确定向什么存储设备烧写系统,这个时候就要有请 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 的命令如下:
Loading U-boot
上面的命令就是BootStrap阶段,也就是第一阶段,“file”表示要下载的文件位置,在firmware目录下,文件名字为
u-boot-imx6ul%lite%%6uluboot%_emmc.imx
在 L4.1.15_2.0.0-ga_mfg-tools\mfgtools-with-rootfs\mfgtools-with-rootfs\mfgtools 下找到 cfg.ini 文件,该文件里包含了开发板的一些信息,查看 cfg.ini 文件可得 lite=l 以及一些字符串代表的值。
“%lite%”和“%6uluboot%”分别表示取 lite 和 6uluboot 的值,而 lite=l, 6uluboot=14x14evk,因此将这个值代入以后就是:
u-boot-imx6ull14x14evk _emmc.imx
所以,这里向 DDR 中下载的是 firmware/ u-boot-imx6ull14x14evk _emmc.imx 这个 uboot 文件。同样的方法将.dtb(设备树)和 zImage 都下载到 DDR 中以后就会跳转去运行 OS,这个时候
会在 MfgTool 工具中会有“Jumping to OS image”提示语句, ucl2.xml 中的跳转命令如下:
Jumping to OS image.
启动 Linux 系统以后就可以在 EMMC 上创建分区,然后烧写 uboot、 zImage、 .dtb(设备树)和根文件系统。这个就是 MfgTool 的整个烧写原理,弄懂了烧写原理以后就可以开始试着先将 NXP 官方的系统烧写到正点原子的 I.MX6U-ALPHA 开发板中。
在上一小节中我们已经实现了将自己的系统烧写到开发板中,我们通过将 NXP 官方的系统更换成我们自己制作的系统来完成系统烧写,本节我们就来学习一下如何将 MfgTool 这个工具改造成我们自己的工具,让其支持我们自己的开发板。要改造 MfgTool,重点是三方面:
①、针对不同的核心版,确定系统文件相关名字。
②、新建我们自己的.vbs 文件。
③、修改 ucl2.xml 文件。
确定系统文件名字完全是为了兼容不同的产品,比如某个产品有 NAND 和 EMMC 两个版本, 那么 EMMC 和 NAND 这两个版本的 uboot、 zImage、 .dtb 和 rootfs 有可能不同。为了在MfgTool 工具中同时支持 EMMC 和 NAND 这两个版本的核心板, EMMC 版本的系统文件命名如图所示:
直接复制 mfgtool2-yocto-mx-evk-emmc.vbs 文件即可,将新复制的文件重命名为 mfgtool2-alientek-alpha-emmc.vbs,文件内容不要做任何修改, .vbs 文件我们就新建好了。
在修改 ucl2.xml 文件之前,先保存一份原始的 ucl2.xml。将 ucl2.xml 文件改为如下所示内容:
Loading U-boot Loading Kernel. Loading Initramfs. Loading device tree. Jumping to OS image. Sending partition shell Partitioning... Partitioning... clear u-boot env Sending u-boot.bin write u-boot.bin to sd card Waiting for the partition ready Formatting rootfs partition Sending kernel write kernel image to sd card Sending Device Tree file write device tree to sd card Sending Device Tree file write device tree to sd card Sending Device Tree file write device tree to sd card Sending Device Tree file write device tree to sd card Sending Device Tree file write device tree to sd card Sending Device Tree file write device tree to sd card Sending Device Tree file write device tree to sd card delay Sync... Unmounting vfat partition Formatting rootfs partition Sending and writting rootfs Finishing rootfs write Mkdir -p /mnt/mmcblk0p2/lib/modules Sending Modules file tar Modules file delay Sync... Unmounting rootfs partition Done
Loading U-boot Loading Kernel. Loading Initramfs. Loading device tree. Jumping to OS image. Sending partition shell Partitioning... Partitioning... clear u-boot env /sys/block/mmcblk1boot0/force_ro">access boot partition 1 Sending u-boot.bin write U-Boot to sd card /sys/block/mmcblk1boot0/force_ro"> re-enable read-only access enable boot partion 1 to boot Waiting for the partition ready Formatting rootfs partition Sending kernel zImage write kernel image to sd card Sending Device Tree file write device tree to eMMC card Sending Device Tree file write device tree to eMMC card Sending Device Tree file write device tree to eMMC card Sending Device Tree file write device tree to eMMC card Sending Device Tree file write device tree to eMMC card Sending Device Tree file write device tree to eMMC card Sending Device Tree file write device tree to eMMC card delay Sync... Unmounting vfat partition Formatting rootfs partition Sending and writting rootfs Finishing rootfs write Sending Modules file Mkdir -p /mnt/mmcblk1p2/lib/modules tar Modules file delay Sync... Unmounting rootfs partition Done
Loading U-boot Loading Kernel. Loading Initramfs. Loading device tree. Jumping to OS image. Mounting debugfs Erasing Boot partition Sending u-boot.bin Flashing Bootloader Erasing Env partition Erasing dtb partition Sending Device Tree file Flashing dtb Sending Device Tree file Flashing dtb Sending Device Tree file Flashing dtb Sending Device Tree file Flashing dtb Sending Device Tree file Flashing dtb Sending Device Tree file Flashing dtb Sending Device Tree file Flashing dtb Erasing Kernel partition Sending kernel zImage Flashing Kernel Erasing rootfs partition Attaching UBI partition Sending and writting rootfs Finishing rootfs write Sending Modules file mkdir -p /mnt/mtd5/lib/modules tar Modules file delay Sync... Unmounting rootfs partition Done
MfgTool 工具修改好以后就可以进行烧写测试了,将 imx6ull-alientek-emmc.dtb、 u-bootalientek-emmc.imx 和 zImage-alientek-emmc 这 三 个 文 件 复 制 到 mfgtools-withrootfs/mfgtools/Profiles/Linux/OS Firmware/firmware 目录中。将 imx6ull-alientek-emmc.dtb、u-bootalientek-emmc.imx、 zImage-alientek-emmc 和 rootfs-alientek-emmc.tar.bz2 这四个文件复制到mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/files 目录中。点击“mfgtool2-alientek-alpha-emmc.vbs”打开 MfgTool 烧写系统,等待烧写完成,然后设置拨码开关为 EMMC 启动,重启开发板。
下一篇:通用权限系统-2023V1