系统烧写

前面我们已经移植好了 uboot 和 linux kernel,制作好了根文件系统。但是我们移植都是通
过网络来测试的,在实际的产品开发中肯定不可能通过网络来运行,否则没网的时候产品岂不
是就歇菜了。因此我们需要将 uboot、 linux kernel、 .dtb(设备树)和 rootfs 这四个文件烧写到板子
上的 EMMC、 NAND 或 QSPI Flash 等其他存储设备上,这样不管有没有网络我们的产品都可以
正常运行。本章我们就来学习一下如何使用 NXP 官方提供的 MfgTool 工具通过 USB OTG 口来
烧写系统。

MfgTool 工具简介

MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件,可以在 NXP 官
网下载到。此工具已经放到了开发板光盘中,路劲为:5、开发工具->3、NXP官方原版 MFG_TOOL
烧写工具->L4.1.15_2.0.0-ga_mfg-tools.tar.gz。此软件在 Windows 下使用,对于我们来说太友好
了。将此压缩包进行解压,解压完成以后会出现一个名为 L4.1.15_2.0.0-ga_mfg-tools 的文件夹。
“ without-rootfs”和“ with-rootfs”,
一个是带 rootfs 和一个是不带 rootfs。 mfg_tools 这个工具本意是给 NXP 自己的开发板设计的烧
写软件,所以肯定带有自家开发板对应的 uboot、 linux kernel 和 rootfs 的文件。我们肯定是要烧
写文件系统的,所以选择 mfgtools-with-rootfs.tar.gz 这个压缩包。
进入目录 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 烧写系统,因此需要参考表 39.1.1 所示的 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 卡,这两个文件分
mfgtool2-yocto-mx-evk-sdcard-sd2.vbs 别向 SD1 和 SD2 上的 SD 卡烧写系统。
表 39.1.1 I.MX6U 使用的烧写脚本
其他的.vbs 烧写脚本用不到,因此可以删除掉,防止干扰我们的视线。

MfgTool 工作原理简介

39.2.1 烧写方式
1、连接 USB 线
MfgTool 是通过 USB OTG 接口将系统烧写进 EMMC 中的
2、拨码开关拨到 USB 下载模式
如果插了 TF 卡,请弹出 TF 卡,否则电脑不能识别 USB!等识别出来以后再插上 TF 卡!
一切准备就绪以后,按一下开发板的复位键,此时就会进入到 USB 模式,如果是第一次进
入 USB 模式的话可能会久一点,这个是免驱的,因此不需要安装驱动。

39.2.2 系统烧写原理
开发板连接电脑以后双击“ 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 的大概工作流程。
1、 firmeare 文件夹
打开 firmware 文件夹,里面有很多的.imx 结尾的 uboot 文件、一个 zImage 镜像文件、很
多.dtb结尾的设备树文件。这些文件都是 NXP官方开发板使用的,不同的板子使用不同的文件,
其中我们需要关心的只有表 39.2.2.1 中的这三个文件:
脚本文件 描述
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 开发板的设备树
表 39.2.2.1 I.MX6ULL EVK 开发板使用的系统文件
表 39.2.2.1 中的这三个文件就是 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。
2、 files 文件夹
将表 39.2.2.1 中的这三个文件下载到开发板的 DDR 上以后烧写的第一阶段就完成了,第二
阶段就是从 files 目录中读取整个系统文件,并将其烧写到 EMMC 中。 files 目录中的文件和
firmware 目录中的基本差不多,都是不同板子对应的 uboot、设备树文件,同样,我们只关心表
39.2.2.2 中的四个文件:
脚本文件 描述
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,因此要使用此根文件系统
表 39.2.2.2 I.MX6ULL EVK 开发板烧写文件
如果要烧写我们自己编译出来的系统,就需要用我们编译出来的 zImage、 u-boot.imx 和
imx6ull-alientek-emmc.dtb 和 rootfs 这四个文件替换掉表 39.2.2.2 中这四个文件。
3、 ucl2.xml 文件
files 和 firmware 目录下有众多的 uboot 和设备树,那么烧写的时候究竟选择哪一个呢?这
个工作就是由 ucl2.xml 文件来完成的。ucl2.xml 以“ <UCL>”开始,以“ </UCL>”结束。“ <CFG>”
和“ </CFG>”之间是配置相关内容,主要是判断当前是给 I.MX 系列的哪个芯片烧写系统。
“ <LIST>”和“ </LIST>”之间的是针对不同存储芯片的烧写命令。整体框架如下:
示例代码 39.2.2.1 ucl2.xml 框架
<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 系列的哪个芯片烧写系统,代码如下:
示例代码 39.2.2.2 判断要烧写的处理器型号
21 <CFG>
22 <STATE name="BootStrap" dev="MX6SL" vid="15A2" pid="0063"/>
23 <STATE name="BootStrap" dev="MX6D" vid="15A2" pid="0061"/>
24 <STATE name="BootStrap" dev="MX6Q" vid="15A2" pid="0054"/>
25 <STATE name="BootStrap" dev="MX6SX" vid="15A2" pid="0071"/>
26 <STATE name="BootStrap" dev="MX6UL" vid="15A2" pid="007D"/>
27 <STATE name="BootStrap" dev="MX7D" vid="15A2" pid="0076"/>
28 <STATE name="BootStrap" dev="MX6ULL" vid="15A2" pid="0080"/>
29 <STATE name="Updater" dev="MSC" vid="066F" pid="37FF"/>
30 </CFG>
通过读取芯片的 VID 和 PID 即可判断出当前要烧写什么处理器的系统,如果 VID=0X15A2,
PID=0080,那么就表示要给 I.MX6ULL 烧写系统。确定了处理器以后就要确定向什么存储设备
烧写系统,这个时候就要有请 mfgtool2-yocto-mx-evk-emmc.vbs 再次登场,此文件内容如下:
示例代码 39.2.2.3 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 的命令如下:
示例代码 39.2.2.4 通过 USB OTG 下载 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.i
ni 文件,该文件里包含了开发板的一些信息,查看 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 中的跳转命令如下:
示例代码 39.2.2.5 跳转到 OS
<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>
启动 Linux 系统以后就可以在 EMMC 上创建分区,然后烧写 uboot、 zImage、 .dtb(设备树)
和根文件系统。
这个就是 MfgTool 的整个烧写原理。

烧写 NXP 官方系统

正点原子的 EMMC 核心版用的也是 512MB 的 DDR3 加 4G 的 EMMC,
因此烧写 NXP 官方的系统是没有任何问题的。烧写步骤如下:
①、连接好 USB,拨码开关拨到 USB 下载模式。
②、 弹出 TF 卡,然后按下开发板复位按键。
③、打开 SecureCRT。
③、双击“ mfgtool2-yocto-mx-evk-emmc.vbs”,打开下载软件,如果出现“符合 HID 标准
的供应商定义设备”等字样就说明下载软件已经准备就绪。点击“ Start”按钮开发烧写 NXP 官
方系统。
烧写完成以后点击“ Stop”按钮停止烧写,然后点击“ Exit”键退出。拔出 USB 线,将开
发板上的拨码开关拨到 EMMC 启动模式,然后重启开发板,此时就会从 EMMC 启动。只是启
动以后的系统是 NXP 官方给 I.MX6ULL EVK 开发板制作的,这个系统需要输入用户名,用户
名为“ root”,没有密码。

烧写自制的系统

39.4.1 系统烧写
首先是准备好要烧写的原材料:
①、自己移植编译出来的 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 系统中。
材料准备好以后还不能直接进行烧写,必须对其进行重命名,否则的话 ucl2.xml 是识别不
出来的,前面讲解 ucl2.xml 语法的时候已经说过了,图 39.4.1 中的这四个文件重命名见表 39.4.1:
原名字 重命名
u-boot.imx u-boot-imx6ull14x14evk_emmc.imx
zImage zImage(不需要重命名)
imx6ull-alientek-emmc.dtb zImage-imx6ull-14x14-evk-emmc.dtb
rootfs.tar.bz2 rootfs_nogpu.tar.bz2
表 39.4.1 文件重命名表
接下来就是用我们的文件替换掉 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”按钮开始烧写,由
于我们自己制作的 rootfs 比较小,因此烧写相对来说会快一点。烧写完成以后设置开发板从
EMMC 启动,启动我们刚刚烧写进去的系统。

39.4.2 网络开机自启动设置
大家在测试网络的时候可能会发现网络不能用,这并不是因为我们将系统烧写到 EMMC 中
以后网络坏了。仅仅是因为网络没有打开,我们用 NFS 挂载根文件系统的时候因为要使用 NFS
服务,因此 Linux 内核会打开 eth0 这个网卡,现在我们不使用 NFS 挂载根文件系统,因此 Linux
内核也就不会自动打开 eth0 网卡了。我们可以手动打开网卡,首先输入“ ifconfig -a”命令查看
一下 eth0 和 eth1 是否都存在。
输入如下命令打开 eth0:
ifconfig eth0 up
打开的时候会提示使用 LAN8710/LAN8720 的网络芯片, eth0 连接成功,并且是 100Mpbs
全双工, eth0 链接准备就绪。这个时候输入“ 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 文件内容如下所示:
//示例代码 39.4.2.1 网络开机自启动
1 #!/bin/sh
2 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 #网络开机自启动设置
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
......
12 #cd /drivers
13 #./hello &
14 #cd /8 行,打开 eth0 网卡
第 9 行,通过路由器自动获取 IP 地址。
第 10 行,手动设置 eth0 的 IP 地址和子网掩码。
第 11 行,添加默认网关。
修改好 rcS 文件以后保存并退出,重启开发板,这个时候 eth0 网卡就会在开机的时候自动
启动了,我们也就不用手动添加相关设置了。

改造我们自己的烧写工具

39.5.1 改造 MfgTool
本节我们就来学习一下如何将 MfgTool 这个工具改造成我们自己的工具,让其支持我们自己的开发板。要
改造 MfgTool,重点是三方面:
①、针对不同的核心版,确定系统文件相关名字。
②、新建我们自己的.vbs 文件。
③、 修改 ucl2.xml 文件。
1、确定系统文件名字
确定系统文件名字完全是为了兼容不同的产品,比如某个产品有 NAND 和 EMMC 两个版
本,那么 EMMC 和 NAND 这两个版本的 uboot、 zImage、 .dtb 和 rootfs 有可能不同。
2、新建.vbs 文件
直接复制 mfgtool2-yocto-mx-evk-emmc.vbs 文件即可,将新复制的文件重命名为 mfgtool2-
alientek-alpha-emmc.vbs,文件内容不要做任何修改, .vbs 文件我们就新建好了。
3、修改 ucl2.xml 文件
在修改 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>
...
ucl2.xml 文件我们仅仅保留了给 EMMC 烧写系统,如果要支持 NAND 的话可以自行参考
原版的 ucl2.xml 文件,添加相关的内容。

39.5.2 烧写测试
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 启动,重启开发板

39.5.3 解决 Linux 内核启动失败
上一小节我们启动系统以后发现输出“ Starting kernel ...”以后就再也没有任何信息了,难
道是系统烧写错误了?可以确定的是 uboot 启动正常,就是在启动 Linux 的时候出问题了,仔
细观察 uboot 输出的 log 信息
在读取“ 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 环境变量值
进入 uboot 的命令行,重新设置 bootcmd 和 bootargs 这两个环境变量的值,这里要注意的
是 bootargs 的值也要重新设置一下,命令如下:
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
设置好 bootcmd 和 bootargs 这两个环境变量以后重启开发板, Linux 系统就可以正常启动。
2、修改 uboot 源码
第 1 种方法每次重新烧写系统以后都要先手动设置一下 bootcmd 的值,这样有点麻烦,有
没有一劳永逸的方法呢?肯定是有的,就是直接修改 uboot 源码。打开 uboot 源码中的文件
include/configs/mx6ull_alientek_emmc.h,在宏 CONFIG_EXTRA_ENV_SETTINGS 中找到如下所
示内容:
示例代码 39.5.3.1 查找设备树文件
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" \
findfdt 就是用于确定设备树文件名字的环境变量, fdt_file 环境变量保存着设备树文件名。
第 196 行和 197 行用于判断设备树文件名字是否为 imx6ull-9x9-evk.dtb,第 198 行和 199 行用
于判断设备树文件名字是否为 imx6ull-14x14-evk.dtb。这两个设备树都是 NXP 官方开发板使用
的, I.MX6U-ALPHA 开发板用不到,因此直接将示例代码 39.5.3.1 中 findfdt 的值改为如下内
容:
示例代码 39.5.3.1 查找设备树文件
194 "findfdt="\
195 "if test $fdt_file = undefined; then " \
196 "setenv fdt_file imx6ull-alientek-emmc.dtb; " \
197 "fi;\0" \
第 196 行,如果 fdt_file 未定义的话,直接设置 fdt_file= imx6ull-alientek-emmc.dtb,简单直
接,不需要任何的判断语句。修改后以后重新编译 uboot,然后用将新的 uboot 烧写到开发板中,
烧写完成以后重启测试, Linux 内核启动正常。

参考文献

【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.3.pdf

猜你喜欢

转载自blog.csdn.net/liurunjiang/article/details/107401596