系统烧写之MfgTool(正点原子笔记)

声明:本文来自正点原子的笔记,如果有侵权,请联系我 ,我立刻删除,谢谢。

MfgTool 工具(正点原子笔记)

MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件,可以在 NXP 官网下载到。
系统烧写之MfgTool(正点原子笔记)_第1张图片
MfgTool2.exe 就是烧写软件,但是我们不会直接打开这个软件烧写,mfg_tools 不仅能烧写I.MX6U,而且也能给 I.MX7、I.MX6Q 等芯片烧写,所以在烧写之前必须要进行配置;
其他的.vbs 烧写脚本用不到,因此可以删除掉,防止干扰我们的视线。因此只会用到 mfgtool2-yocto-mx-evk-emmc.vbs 这个烧写脚本。

MfgTool 工作原理

1. 连接 USB 线,拨码开关拨到 USB 下载模式(TF卡事先弹出)

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

系统烧写之MfgTool(正点原子笔记)_第2张图片
点击“Start”按钮即可开始烧写,烧写 uboot、Linux kernel、.dtb 和 rootfs,那么这四个应该放到哪里 MfgTool 才能访问?
进入如下目录中:

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

系统烧写之MfgTool(正点原子笔记)_第3张图片

文件夹“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 的大概工作流程。

3.file文件夹

只关心:
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 开发板的设备树
如果要烧写我们的系统,就需要用我们编译出来的 zImage、u-boot.imx 和 imx6ull-alientek-emmc.dtb 这三个文件替换掉这三个文件。且名字需要一致。

4.files 文件夹

只关心:
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,因此要使用此根文件系统。

5.ucl2.xml 文件

files 和 firmware 目录下有众多的 uboot 和设备树,那么烧写的时候究竟选择哪一个呢?这个工作就是由 ucl2.xml 文件来完成的。
系统烧写之MfgTool(正点原子笔记)_第4张图片
通过读取芯片的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 烧写系统,要烧写的存储设备就这样确定下来了。
我们继续回到 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 官方系统

点击start,烧写完成以后点击“Stop”按钮停止烧写,然后点击“Exit”键退出。拔出 USB 线,将开发板上的拨码开关拨到 EMMC 启动模式,然后重启开发板,此时就会从 EMMC 启动。

烧写自制的系统

①、自己移植编译出来的 uboot 可执行文件:u-boot.imx。
②、自己移植编译出来的 zImage 镜像文件和开发板对应的.dtb(设备树),对于 I.MX6UALPHA 开发板来说就是 imx6ull-alientek-emmc.dtb。
③、自己构建的根文件系统 rootfs,这里我们需要对 rootfs 进行打包,进入到 Ubuntu 中的
rootfs 目录中,然后使用 tar 命令对其进行打包,命令如下:

cd rootfs/
tar -vcjf rootfs.tar.bz2 *

然后对其重命名
系统烧写之MfgTool(正点原子笔记)_第5张图片
zImage、u-bootimx6ull14x14evk_emmc.imx 和 zImage-imx6ull-14x14-evk-emmc.dtb 这三个文件拷贝到 mfgtoolswith-rootfs/mfgtools/Profiles/Linux/OS Firmware/firmware 目录中,替换掉原来的文件。然后将上图的四个文件都拷贝到 mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/files目录中。
双击“mfgtool2-yocto-mx-evk-emmc.vbs”,打开烧写软件,点击“Start”按钮开始烧写,烧写完成以后设置开发板从EMMC 启动,测试有没有问题。

网络开机自启动设置

在测试网络的时候可能会发现网络不能用,这并不是因为我们将系统烧写到 EMMC 中以后网络坏了。仅仅是因为网络没有打开,我们用 NFS 挂载根文件系统的时候因为要使用 NFS服务,因此 Linux 内核会打开 eth0 这个网卡。
现在我们不使用 NFS 挂载根文件系统,因此 Linux内核也就不会自动打开 eth0 网卡了。我们可以手动打开网卡,首先输入“ifconfig -a”命令查看一下 eth0 和 eth1 是否都存在:
系统烧写之MfgTool(正点原子笔记)_第6张图片
可以看出 eth0 好 eth1 都存在,既然存在我们就打开,以打开 eth0 网卡为例,输入如下命令打开 eth0:

ifconfig eth0 up

这个时候输入“ifconfig”命令就会看到 eth0 这个网卡,然后就是 eth0 设置 IP 地址,如果你的开发板连接的路由器,那么可以通过路由器自动分配 IP 地址,命令如下:

udhcpc -i eth0 //通过路由器分配 IP 地址

如果你的开发板连接着电脑,那么就可以手动设置 IP 地址,比如设置为 192.168.1.251,命令如下:

ifconfig eth0 192.168.1.251 netmask 255.255.255.0 //设置 IP 地址和子网掩码
route add default gw 192.168.1.1 //添加默认网关

推荐大家将开发板连接到路由器上,设置好 IP 地址以后就可以测试网络了,比如 ping 一下电脑 IP 地址,或者 ping 一下百度官网。每次开机以后都要自己手动打开网卡,然后手动设置 IP 地址也太麻烦了,有没有开机以后自动启动网卡并且设置 IP 地址的方法呢?肯定有的,我们将打开网卡,设置网卡 IP 地址的命令添加到/etc/init.d/rcS 文件中就行了,完成以后的 rcS 文件内容如下所示:

1 #!/bin/sh
2 
3 PATH=/sbin:/bin:/usr/sbin:/usr/bin
4 LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
5 export PATH LD_LIBRARY_PATH runlevel
6 
7 #网络开机自启动设置
8 ifconfig eth0 up
9 #udhcpc -i eth0 
10 ifconfig eth0 192.168.1.251 netmask 255.255.255.0
11 route add default gw 192.168.1.1
......

修改好 rcS 文件以后保存并退出,重启开发板,这个时候 eth0 网卡就会在开机的时候自动启动了,我们也就不用手动添加相关设置。

如何设计自己的烧写工具?

1、确定系统文件名字

系统烧写之MfgTool(正点原子笔记)_第7张图片

2、新建.vbs 文件

直接复制 mfgtool2-yocto-mx-evk-emmc.vbs 文件即可,将新复制的文件重命名为 mfgtool2-alientek-alpha-emmc.vbs,文件内容不要做任何修改。

3. 新建ucl2.xml

在修改 ucl2.xml 文件之前,先保存一份原始的 ucl2.xml。将 ucl2.xml 文件改为如下所示内容:


 
 
 
 
 
 
 
 Loading Uboot
 Loading Kernel.
 Loading Initramfs.
 Loading device tree.
  Jumping to OS image. 
 
 Sending partition shell
 
Partitioning...
  Partitioning...
 
 clear u-boot 
arg
 
 access boot partition 1
 Sending u-boot.bin
 write U-Boot to sd card
  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 sd card
 Unmounting vfat partition
 
 Formatting rootfs partition
 
 
 Sending and writting rootfs
 Finishing rootfs 
write
 Unmounting rootfs partition
 Done
 

ucl2.xml 仅仅保留了给 EMMC 烧写系统。

4.烧写测试

MfgTool 工具修改好以后就可以进行烧写测试了,将 imx6ull-alientek-emmc.dtb、u-boot-alientek-emmc.imx 和 zImage-alientek-emmc 这 三 个 文 件 复 制 到 mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/firmware 目录中。将imx6ull-alientek-emmc.dtb、u-boot-alientek-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 启动,重启开发板。
系统烧写之MfgTool(正点原子笔记)_第8张图片

5. 解决 Linux 内核启动失败

在读取“imx6ull-14x14-evk.dtb”这个设备树文件的时候出错了。重启 uboot,进入到命令行模式,输入如下命令查看 EMMC 的分区 1 里面有没有设备树文件:

mmc dev 1 //切换到 EMMC
ls mmc 1:1 //输出 EMMC1 分区 1 中的所有文件

系统烧写之MfgTool(正点原子笔记)_第9张图片
此时 EMMC 的分区 1 中是存在设备树文件的,只是文件名字为:imx6ull-alientek-emmc.dtb,因此读取 imx6ull-14x14-evk.dtb 肯定会出错的,因为根本就不存在这个文件。之所以出现这个错误的原因是因为 uboot 里面默认的设备树名字就是 imx6ull-14x14-evk.dtb,这个我们在讲解 uboot 的时候就已经说过了。解决方法很简单,有两种方法:

1.重新设置 bootcmd 环境变量值

setenv bootcmd 'mmc dev 1;fatload mmc 1:1 80800000 zImage;fatload mmc 1:1 83000000 
imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000'
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv

2.修改 uboot 源码

第 1 种方法每次重新烧写系统以后都要先手动设置一下 bootcmd 的值,这样有点麻烦。因此需要修改源代码:
打开 uboot 源码中的文件include/configs/mx6ull_alientek_emmc.h,在宏 CONFIG_EXTRA_ENV_SETTINGS 中找到如下所
示内容:

194 "findfdt="\
195 "if test $fdt_file = undefined; then " \
196 "if test $board_name = EVK && test $board_rev = 9X9; then " \
197 "setenv fdt_file imx6ull-9x9-evk.dtb; fi; " \
198 "if test $board_name = EVK && test $board_rev = 14X14; then " \
199 "setenv fdt_file imx6ull-14x14-evk.dtb; fi; " \
200 "if test $fdt_file = undefined; then " \
201 "echo WARNING: Could not determine dtb to use; fi; " \
202 "fi;\0" \

修改为

194 "findfdt="\
195 "if test $fdt_file = undefined; then " \
196 "setenv fdt_file imx6ull-alientek-emmc.dtb; " \
197 "fi;\0" \

你可能感兴趣的:(linux)