Linux移植之系统烧写

直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81

本文仅作为个人笔记使用,方便进一步记录自己的实践总结。
前面我们已经移植好了 uboot 和 linux kernle,制作好了根文件系统。但是我们移植都是通过网络来测试的,在实际的产品开发中肯定不可能通过网络来运行,否则没网的时候产品岂不是就歇菜了。因此我们需要将 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 的文件夹,进入此文件夹,此文件夹的内容如图 39.1.1 所示:

从图 39.1.1 可以看出,有两个.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 文件,如图 39.1.2 所示:

我们只关心图 39.1.2 中 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 个烧写脚本:

其他的.vbs 烧写脚本用不到,因此可以删除掉,防止干扰我们的视线。本书用的是正点原子的 EMMC 版核心板,因此只会用到 mfgtool2-yocto-mx-evk-emmc.vbs 这个烧写脚本,如果用其他的核心板请参考相应的烧写脚本。

MfgTool 工作原理简介

MfgTool 只是个工具,具体的原理不需要去深入研究,大概来了解一下其工作原理就行了,知道它的工作流程就行了。

烧写方式

1、连接 USB 线

MfgTool 是通过 USB OTG 接口将系统烧写进 EMMC 中的,正点原子 I.MX6U-ALPHA 开发板 V2.4 版本以前的底板上 USB OTG 口如图 39.2.1.1 所示:

V2.4 及以后版本底板上 USB OTG 换为了 Type-C,接口如图 39.2.1.2 所示:

在烧写之前,需要先用 USB 线将图 39.2.1.1 或图 39.2.1.2 中的 USB_OTG1 接口与电脑连接起来。

2、拨码开关拨到 USB 下载模式

将拨码开关拨到"USB"模式,如图 39.2.1.3 所示:

如果插了 TF 卡,请弹出 TF 卡,否则电脑不能识别 USB!等识别出来以后再插上 TF 卡!一切准备就绪以后,按一下开发板的复位键,此时就会进入到 USB 模式,如果是第一次进入 USB 模式的话可能会久一点,这个是免驱的,因此不需要安装驱动。第一次进入 USB 模式会在电脑右下角有如图 39.2.1.4 所示提示:

一旦第一次设置好设备以后,后面每次连接都不会有任何提示了。到这里,我们的开发板已经和电脑连接好了,可以开始烧写系统了。

系统烧写原理

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

如果出现"符合 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

此目录中的文件如图 39.2.2.2 所示:

文件夹"OS Firmware"看名字就知道是存放系统固件的,我们重点关注 files、firmware 这两个文件夹,以及 ucl2.xml 这个文件。在具体看这三个文件和文件夹之前,我们先来简单了解一下 MfgTool 烧写的原理,MfgTool 其实是先通过 USB OTG 先将 uboot、kernel 和.dtb(设备树)这是三个文件下载到开发板的 DDR 中,注意不需要下载 rootfs。就相当于直接在开发板的 DDR上启动 Linux 系统,等 Linux 系统启动以后再向 EMMC 中烧写完整的系统,包括 uboot、linuxkernel、.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 开发板的设备树

这三个文件就是 I.MX6ULL EVK 开发板烧写系统的时候第一阶段所需的文件。如果要烧写我们的系统,就需要用我们编译出来的 zImage、u-boot.imx 和 imx6ull-alientek、emmc.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>"之间的是针对不同存储芯片的烧写命令。整体框架如下:

通过读取芯片的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/u
boot-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 中的跳转命令如下:

示例代码 39.2.2.5 跳转到 OS
<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>

启动 Linux 系统以后就可以在 EMMC 上创建分区,然后烧写 uboot、zImage、.dtb(设备树)和根文件系统。

这个就是 MfgTool 的整个烧写原理,弄懂了烧写原理以后就可以开始试着先将 NXP 官方的系统烧写到正点原子的 I.MX6U-ALPHA 开发板中。

烧写 NXP 官方系统

我们先试着将 NXP 官方的系统烧写到正点原子的 I.MX6U-ALPHA 开发板中,主要是先熟悉一下烧写过程。因为正点原子的 EMMC 核心版用的也是 512MB 的 DDR3 加 8G 的 EMMC,因此烧写 NXP 官方的系统是没有任何问题的。烧写步骤如下:

①、连接好 USB,拨码开关拨到 USB 下载模式。

②、弹出 TF 卡,然后按下开发板复位按键。

③、打开 SecureCRT。

③、双击"mfgtool2-yocto-mx-evk-emmc.vbs",打开下载软件,如果出现"符合 HID 标准的供应商定义设备"等字样就说明下载软件已经准备就绪。点击"Start"按钮开发烧写 NXP 官方系统,烧写过程如图 39.3.1 所示:

这个时候可以在 SecurCRT 上看到具体的烧写过程,如图 39.3.2 所示:

等待烧写完成,因为 NXP 官方的根文件系统比较大,因此烧写的时候耗时会久一点。烧写完成以后 MfgTool 软件如图 39.3.3 所示:

烧写完成以后点击"Stop"按钮停止烧写,然后点击"Exit"键退出。拔出 USB 线,将开发板上的拨码开关拨到 EMMC 启动模式,然后重启开发板,此时就会从 EMMC 启动。只是启动以后的系统是 NXP 官方给 I.MX6ULL EVK 开发板制作的,这个系统需要输入用户名,用户名为"root",没有密码,如图 39.3.3 所示:

在"imx6ul7d login:"后面输入"root"用户名,然后点击回车键即可进入系统中,进入系统以后就可以进行其他操作了。所以说,NXP 官方的系统其实是可以在正点原子的 EMMC 版核心板上运行的。

烧写自制的系统

1 系统烧写

上一小节我们试着将 NXP 官方提供的系统烧写到正点原子的 I.MX6U-ALPHA 开发板中,目的是体验一下通过 MfgTool 烧写系统的过程。本小节我们就来学习如何将我们做好的系统烧写到开发板中,首先是准备好要烧写的原材料:

①、自己移植编译出来的 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 系统中。

将上面提到的这 4 个"原材料"都发送到 Windows 系统中,如图 39.4.1 所示:

材料准备好以后还不能直接进行烧写,必须对其进行重命名,否则的话 ucl2.xml 是识别不出来的,前面讲解 ucl2.xml 语法的时候已经说过了,图 39.4.1 中的这四个文件重命名见表 39.4.1:

完成以后如图 39.4.2 所示:

接下来就是用我们的文件替换掉 NXP 官方的文件,先将图 39.4.2 中的 zImage、u-boot-imx6ull14x14evk_emmc.imx 和 zImage-imx6ull-14x14-evk-emmc.dtb 这三个文件拷贝到 mfgtools with-rootfs/mfgtools/Profiles/Linux/OS Firmware/firmware 目录中,替换掉原来的文件。然后将图39.4.2 中的所有 4 个文件都拷贝到 mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware/files目录中,这两个操作完成以后我们就可以进行烧写了。

双击"mfgtool2-yocto-mx-evk-emmc.vbs",打开烧写软件,点击"Start"按钮开始烧写,由于我们自己制作的 rootfs 比较小,因此烧写相对来说会快一点。烧写完成以后设置开发板从EMMC 启动,启动我们刚刚烧写进去的系统,测试有没有问题。

注意!一旦自己改造的 mfgtools 工 具 能 够 正 常 烧 写 系 统 , 那 么 mfgtools-with rootfs/mfgtools/Profiles/Linux/OS Firmware/firmware 目录下的文件以后就不能再修改!否则可能导致烧写失败!

2 网络开机自启动设置

大家在测试网络的时候可能会发现网络不能用,这并不是因为我们将系统烧写到 EMMC 中以后网络坏了。仅仅是因为网络没有打开,我们用 NFS 挂载根文件系统的时候因为要使用 NFS服务,因此 Linux 内核会打开 eth0 这个网卡,现在我们不使用 NFS 挂载根文件系统,因此 Linux内核也就不会自动打开 eth0 网卡了。我们可以手动打开网卡,首先输入"ifconfig -a"命令查看一下 eth0 和 eth1 是否都存在,结果如图 39.4.3 所示:

可以看出 eth0 好 eth1 都存在,既然存在我们就打开,以打开 eth0 网卡为例,输入如下命令打开 eth0:

ifconfig eth0 up

打开网卡的时候会有如图 39.4.4 所示的提示信息:

打开的时候会提示 eth0 连接成功,并且是 100Mpbs 全双工,eth0 链接准备就绪。这个时候输入"ifconfig"命令就会看到 eth0 这个网卡,如图 39.4.6 所示:

接下来就是个 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
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
......
12 #cd /drivers
13 #./hello &
14 #cd /

第 8 行,打开 eth0 网卡

第 9 行,通过路由器自动获取 IP 地址。

第 10 行,手动设置 eth0 的 IP 地址和子网掩码。

第 11 行,添加默认网关。

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

改造我们自己的烧写工具

改造 MfgTool

在上一小节中我们已经实现了将自己的系统烧写到开发板中,但是使用的是"借鸡生蛋"的方法。我们通过将 NXP 官方的系统更换成我们自己制作的系统来完成系统烧写,本节我们就来学习一下如何将 MfgTool 这个工具改造成我们自己的工具,让其支持我们自己的开发板。要改造 MfgTool,重点是三方面:

①、针对不同的核心版,确定系统文件相关名字。

②、新建我们自己的.vbs 文件。

③、修改 ucl2.xml 文件。

1、确定系统文件名字

确定系统文件名字完全是为了兼容不同的产品,比如某个产品有 NAND 和 EMMC 两个版本,那么 EMMC 和 NAND 这两个版本的 uboot、zImage、.dtb 和 rootfs 有可能不同。为了在MfgTool 工具中同时支持 EMMC 和 NAND 这两个版本的核心板,EMMC 版本的系统文件命名如图 39.5.1.1 所示:

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 文件我们仅仅保留了给 EMMC 烧写系统,如果要支持 NAND 的话可以自行参考原版的 ucl2.xml 文件,添加相关的内容。

烧写测试

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 启动,重启开发板,系统启动信息如图 39.5.2.1 所示:

从图 39.5.2.1 可以看出,出现"Starting kernel ..."以后就再也没有任何信息输出了,说明Linux 内核启动失败了。接下来就是解决为何 Linux 内核启动失败这个问题。

解决 Linux 内核启动失败

上一小节我们启动系统以后发现输出"Starting kernel ..."以后就再也没有任何信息了,难道是系统烧写错误了?可以确定的是 uboot 启动正常,就是在启动 Linux 的时候出问题了,仔细观察 uboot 输出的 log 信息,会发现如图 39.5.3.1 所示两行信息:

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

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

结果如图 39.5.3.2 所示:

从图 39.5.3.2 可以看出,此时 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 内核启动正常。
关于系统烧写就讲解到这里,本章我们使用 NXP 提供的 MfgTool 工具通过 USB OTG 口向开发板的 EMMC 中烧写 uboot、Linux kernel、.dtb(设备树)和 rootfs 这四个文件。在本章我们主要做了五个工作:

①、理解 MfgTool 工具的工作原理。

②、使用 MfgTool 工具将 NXP 官方系统烧写到 I.MX6U-ALPHA 开发板中,主要是为了体验一下 MfgTool 软件的工作流程以及烧写方法。

③、使用 MfgTool 工具将我们自己编译出来的系统烧写到 I.MX6U-ALPHA 开发板中。

④、修改 MfgTool 工具,使其支持我们所使用的硬件平台。

⑤、修改相应的错误。

关于系统烧写的方法就讲解到这里,本章内容不仅仅是为了讲解如何向 I.MX6ULL 芯片中烧写系统,更重要的是向大家详细的讲解了 MfgTool 的工作原理。如果大家在后续的工作或学习中使用 I.MX7 或者 I.MX8 等芯片,本章同样适用。

随着本章的结束,也宣告着本书第三篇的内容也正式结束了,第三篇是系统移植篇,重点就是 uboot、Linux kernel 和 rootfs 的移植,看似简简单单的"移植"两个字,引出的却是一篇300 多页的"爱恨情仇"。授人以鱼不如授人以渔,本可以简简单单的教大家修改哪些文件、添加哪些内容,怎么去编译,然后得到哪些文件。但是这样只能看到表象,并不能深入的了解其原理,为了让大家能够详细的了解整个流程,笔者义无反顾的选择了这条最难走的路,不管是uboot 还是 Linux kernel,从 Makefile 到启动流程,都尽自己最大的努力去阐述清楚。奈何,笔者水平有限,还是有很多的细节没有处理好,大家有疑问的地方可以到正点原子论坛www.openedv.com 上发帖留言,大家一起讨论学习。

相关推荐
长弓聊编程4 分钟前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
cherub.11 分钟前
深入解析信号量:定义与环形队列生产消费模型剖析
linux·c++
梅见十柒34 分钟前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
Koi慢热38 分钟前
路由基础(全)
linux·网络·网络协议·安全
传而习乎1 小时前
Linux:CentOS 7 解压 7zip 压缩的文件
linux·运维·centos
soulteary1 小时前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
我们的五年1 小时前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
爱吃青椒不爱吃西红柿‍️1 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
IT果果日记1 小时前
ubuntu 安装 conda
linux·ubuntu·conda
Python私教1 小时前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes