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

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

MfgTool 工具(正点原子笔记)

MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件,可以在 NXP 官网下载到。
在这里插入图片描述
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”,打开下载对话框,如下图所示:

在这里插入图片描述
点击“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 的大概工作流程。

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 文件来完成的。
在这里插入图片描述
通过读取芯片的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 的命令如下:

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

上面的命令就是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 中的跳转命令如下:

<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>

启动 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 *

然后对其重命名
在这里插入图片描述
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 是否都存在:
在这里插入图片描述
可以看出 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、确定系统文件名字

在这里插入图片描述

2、新建.vbs 文件

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

3. 新建ucl2.xml

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

<UCL>
 <CFG>
 <STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>
 <STATE name="BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/>
 <STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/>
 </CFG>
 <!-- 向 EMMC 烧写系统 -->
 <LIST name="eMMC" desc="Choose eMMC as media">
 <CMD state="BootStrap" type="boot" body="BootStrap" file
="firmware/u-boot-alientek-emmc.imx" ifdev="MX6ULL">Loading Uboot</CMD>
 <CMD state="BootStrap" type="load" file="firmware/zImage-alientekemmc" 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/imx6ull-alientekemmc.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>
 <!-- create partition -->
 <CMD state="Updater" type="push" body="send"
file="mksdcard.sh.tar">Sending partition shell</CMD>
 <CMD state="Updater" type="push" body="$ tar xf $FILE ">
Partitioning...</CMD>
 <CMD state="Updater" type="push" body="$ sh mksdcard.sh 
/dev/mmcblk%mmc%"> Partitioning...</CMD>
 <!-- burn uboot -->
 <CMD state="Updater" type="push" body="$ dd if=/dev/zero 
of=/dev/mmcblk%mmc% bs=1k seek=768 conv=fsync count=8">clear u-boot 
arg</CMD>
 <!-- access boot partition -->
 <CMD state="Updater" type="push" body="$ echo 0 > 
/sys/block/mmcblk%mmc%boot0/force_ro">access boot partition 1</CMD>
 <CMD state="Updater" type="push" body="send" file="files/u-bootalientek-emmc.imx" ifdev="MX6ULL">Sending u-boot.bin</CMD>
 <CMD state="Updater" type="push" body="$ dd if=$FILE 
of=/dev/mmcblk%mmc%boot0 bs=512 seek=2">write U-Boot to sd card</CMD>
 <CMD state="Updater" type="push" body="$ echo 1 > 
/sys/block/mmcblk%mmc%boot0/force_ro"> re-enable read-only access 
</CMD>
 <CMD state="Updater" type="push" body="$ mmc bootpart enable 1 1 
/dev/mmcblk%mmc%">enable boot partion 1 to boot</CMD>
 <!-- create fat partition -->
 <CMD state="Updater" type="push" body="$ while [ ! -e 
/dev/mmcblk%mmc%p1 ]; do sleep 1; echo \"waiting...\"; done ">Waiting 
for the partition ready</CMD>
 <CMD state="Updater" type="push" body="$ mkfs.vfat 
/dev/mmcblk%mmc%p1">Formatting rootfs partition</CMD>
 <CMD state="Updater" type="push" body="$ mkdir -p 
/mnt/mmcblk%mmc%p1"/>
 <CMD state="Updater" type="push" body="$ mount -t vfat 
/dev/mmcblk%mmc%p1 /mnt/mmcblk%mmc%p1"/>
 <!-- burn zImage -->
 <CMD state="Updater" type="push" body="send" file="files/zImagealientek-emmc">Sending kernel zImage</CMD>
 <CMD state="Updater" type="push" body="$ cp $FILE 
/mnt/mmcblk%mmc%p1/zImage">write kernel image to sd card</CMD>
 <!-- burn dtb -->
 <CMD state="Updater" type="push" body="send" file="files/imx6ullalientek-emmc.dtb" ifdev="MX6ULL">Sending Device Tree file</CMD>
 <CMD state="Updater" type="push" body="$ cp $FILE 
/mnt/mmcblk%mmc%p1/imx6ull-alientek-emmc.dtb" ifdev="MX6ULL">write 
device tree to sd card</CMD>
 <CMD state="Updater" type="push" body="$ umount 
/mnt/mmcblk%mmc%p1">Unmounting vfat partition</CMD>
 <!-- burn rootfs -->
 <CMD state="Updater" type="push" body="$ mkfs.ext3 -F -E nodiscard 
/dev/mmcblk%mmc%p2">Formatting rootfs partition</CMD>
 <CMD state="Updater" type="push" body="$ mkdir -p 
/mnt/mmcblk%mmc%p2"/>
 <CMD state="Updater" type="push" body="$ mount -t ext3 
/dev/mmcblk%mmc%p2 /mnt/mmcblk%mmc%p2"/>
 <CMD state="Updater" type="push" body="pipe tar -jxv -C 
/mnt/mmcblk%mmc%p2" file="files/rootfs-alientek-emmc.tar.bz2"
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/mmcblk%mmc%p2">Unmounting rootfs partition</CMD>
 <CMD state="Updater" type="push" body="$ echo Update 
Complete!">Done</CMD>
 </LIST>
</UCL>

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 启动,重启开发板。
在这里插入图片描述

5. 解决 Linux 内核启动失败

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

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

在这里插入图片描述
此时 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" \
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值