目录
前言
我们现在已经移植好了 uboot 和 linux kernle,制作好了根文件系统,那么怎么将 uboot、 linux kernel、 .dtb(设备树)和 rootfs 这四个文件烧写到板子上的 EMMC等存储设备上呢?
我使用的正点原子imx6ull开发板,本讲我们就来学习一下如何使用 NXP 官方提供的 MfgTool 工具通过 USB OTG 口来烧写系统。
MfgTool 工具
MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件,可以在 NXP 官网下载到。
此软件在 Windows 下使用,解压后,L4.1.15_2.0.0-ga_mfg-tools 的文件夹内容如图:
可以看出,有两个.txt 文件和两个.gz 压缩包。
其中,压缩包里,without-rootfs”和“with-rootfs”,一个是带 rootfs 和一个是不带 rootfs。
我们需要烧写带文件系统的,所以选择 mfgtools-with-rootfs.tar.gz 这个压缩包,继续对其解压, 解压出一个名为 mfgtools-with-rootfs 的文件夹,此文件夹就包含有我们需要的烧写工具。
进入目录 mfgtools-with-rootfs\mfgtools 中,在此目录下有几个文件夹和很多的.vbs 文件,如图:
Profiles 这个文件夹,后面要烧写的文件可以放到这个文件夹中。
MfgTool2.exe 就是烧写软件。
mfg_tools工具烧写之前必须要进行配置,指定烧写的芯片。.vbs 文件就是配置脚本,烧写的时候通过双击这些.vbs 文件来打开烧写工具。
I.MX6U 烧写脚本如下:
我们开发板是EMMC 版本的,所以烧写脚本选择:mfgtool2-yocto-mx-evk-emmc.vbs。
MfgTool 工作原理
烧写方式
连接 USB 线
MfgTool 是通过 USB OTG 接口将系统烧写进 EMMC 中的。
正点原子 I.MX6U-ALPHA 开发板V2.4 及以后版本底板上 USB OTG 换为了 Type-C,接口如图:
在烧写之前,需要先用 USB 线将图中的 USB_OTG1 接口与电脑连接起来。
切换拨码开关
将拨码开关拨到“USB”模式,如图:
一切准备就绪以后,按一下开发板的复位键,此时就会进入到 USB 模式。
如果是第一次进入 USB 模式的话可能会久一点,不需要安装驱动。第一次进入 USB 模式会在电脑右下角有如图:
到这里,我们的开发板已经和电脑连接好了,可以开始烧写系统了。
系统烧写原理
原理
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 中。
开发板连接电脑以后,双击“ 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 这个文件。
firmeare 文件夹
打开 firmware 文件夹,里面有很多的.imx 结尾的 uboot 文件、一个 zImage 镜像文件、很多.dtb结尾的设备树文件。
这些文件都是NXP官方开发板使用的,不同的板子使用不同的文件,其中我们需要关心的如下:
如果要烧写我们的系统,就需要用我们编译出来的 zImage、 u-boot.imx 和 imx6ull-alientekemmc.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>
<LIST name="SDCard-Brillo" desc="Choose SD Card as media">
<!-- 向 SD 卡烧写 Brillo 系统 -->
</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="066F" pid="37FF"/>
</CFG>
通过读取芯片的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
其中就有“eMMC”字样,说明是向 EMMC 烧写系统。
那么回到ucl2.xml 中,找到相应的烧写命令。
其中,通过 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>
可以看出,这里向 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(设备树)和根文件系统。
烧写 NXP 官方系统
我们先试着将 NXP 官方的系统烧写到正点原子的 I.MX6U-ALPHA 开发板中,烧写步骤如下:
- 连接好 USB,拨码开关拨到 USB 下载模式。
- 弹出 TF 卡,然后按下开发板复位按键。
- 打开串口工具。
- 双击“mfgtool2-yocto-mx-evk-emmc.vbs”,打开下载软件,如果出现“符合 HID 标准的供应商定义设备”等字样就说明下载软件已经准备就绪。
- 点击“Start”按钮开发烧写 NXP 官方系统。
烧写过程如图:
可以在 串口工具SecurCRT 上看到具体的烧写过程,如图:
等待烧写完成,因为 NXP 官方的根文件系统比较大,因此烧写的时候耗时会久一点。
烧写完成以后 MfgTool 软件如图:
烧写完成以后点击“Stop”按钮停止烧写,然后点击“Exit”键退出。
拔出 USB 线,将开发板上的拨码开关拨到 EMMC 启动模式,然后重启开发板,此时就会从EMMC 启动。
系统起来后,需要输入用户名,用户名为“root”,没有密码,如图:
烧写自制的系统
将我们做好的系统烧写到开发板中,首先是准备好要烧写的文件:
- 自己移植编译出来的 uboot 可执行文件: u-boot.imx。
- 自己移植编译出来的 zImage 镜像文件和开发板对应的.dtb(设备树),对于 I.MX6UALPHA 开发板来说就是 imx6ull-alientek-emmc.dtb。
- 自己构建的根文件系统 rootfs。
这里我们需要对 rootfs 进行打包,进入到 Ubuntu 中的rootfs 目录中,然后使用 tar 命令对其进行打包,命令如下:
cd rootfs/
tar -vcjf rootfs.tar.bz2 *
完成以后会在 rootfs 目录下生成一个名为 rootfs.tar.bz2 的压缩包,将 rootfs.tar.bz2 发送到windows 系统中。
我们需要的文件如下:
按照MfgTool工具的风格对这几个文件重命名:
然后用我们的文件替换掉 NXP 官方的文件:
- zImage、 u-bootimx6ull14x14evk_emmc.imx 和 zImage-imx6ull-14x14-evk-emmc.dtb 这三个文件拷贝到 mfgtoolswith-rootfs/mfgtools/Profiles/Linux/OS Firmware/firmware 目录中。
- 所有 4 个文件都拷贝到 mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/files目录中。
这两个操作完成以后我们就可以进行烧写了。
双击“mfgtool2-yocto-mx-evk-emmc.vbs”,打开烧写软件,点击“Start”按钮开始烧写。
烧写完成以后设置开发板从EMMC 启动,启动我们刚刚烧写进去的系统,测试有没有问题。
网络开机自启动设置
在测试网络的时候发现网络不能用,可能是网卡没有打开。
以打开 eth0 网卡为例,输入如下命令打开 eth0:
ifconfig eth0 up
接下来就设置 eth0 设置 IP 地址:
开发板连接的路由器:
udhcpc -i eth0 //通过路由器分配 IP 地址
开发板连接着电脑,可以手动设置 IP 地址:
ifconfig eth0 192.168.1.251 netmask 255.255.255.0 //设置 IP 地址和子网掩码
route add default gw 192.168.1.1 //
设置好 IP 地址以后就可以测试网络了,比如 ping 一下电脑 IP 地址。
开机以后自动启动网卡并且设置 IP 地址,应该怎么设置?
将打开网卡,设置网卡 IP 地址的命令添加到/etc/init.d/rcS 文件中就行了,完成以后的 rcS 文件内容如下所示:
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH runlevel
#网络开机自启动设置
ifconfig eth0 up
#udhcpc -i eth0
ifconfig eth0 192.168.1.251 netmask 255.255.255.0
route add default gw 192.168.1.1
......
#cd /drivers
#./hello &
#cd /
修改好 rcS 文件以后保存并退出,重启开发板,这个时候 eth0 网卡就会在开机的时候自动启动了,我们也就不用手动添加相关设置了。