0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

码农爱学习 来源:码农爱学习 作者:码农爱学习 2022-03-17 09:17 次阅读

前面几篇文章,已经搞定了Linux移植三巨头:uboot、kernel(包含dtb)和rootfs,除了uboot是烧写在SD中的,其它的都是在ubuntu虚拟机的nfs服务器中,运行时必须通过网络将这些文件加载到开发板的内存中运行。

本篇就来研究,将这几个文件打包烧写到板子的eMMC中,实现嵌入式Linux系统的烧写,这样,在没有网络的情况下,板子也可以正常运行。系统烧写使用的是NXP官方的MfgTool工具,通过USB OTG口来烧写。

1 MfgTool介绍

MfgTool是NXP官方提供的用于烧写i.MX系列CPU的系统烧写工具,该软件需要在Windows环境下使用。

这是使用正点原子提供的已经下载好的NXP烧写工具:L4.1.15_2.0.0-ga_mfg-tools.tar.gz。

将软件包解压,里面还有2个.gz 压缩包,一个是带rootfs,一个是不带rootfs,我们是需要烧写文件系统的,所以选择 mfgtools-with-rootfs.tar.gz 这个压缩包,继续解压。

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

进入目录 mfgtools-with-rootfs\mfgtools 中, 在此目录下有几个文件夹和很多的.vbs 文件:

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

Profiles文件夹:要烧写的文件就放到这个文件夹中。

MfgTool2.exe:烧写软件,但不需要直接打开这个软件烧写。

众多的.vbs 文件:烧写配置脚本,指定烧写的芯片和地址,烧写的时候通过双击这些.vbs文件来打开烧写工具。因为我的这块开发板是EMMC版本的,所以只需要关注mfgtool2-yocto-mx-evk-emmc.vbs这个vbs文件。

2 MfgTool烧写步骤

2.1 连接USB OTG

MfgTool是通过USB OTG接口将系统烧写进EMMC中的,我这块野火板子的OTG接口在板子右侧,使用USB线连接电脑(使用USB OTG连接时,需要先把SD卡拔出)。

2.2 切换拨码开关模式

将拨码开关拨到USB下载模式

拨码编号 NAND EMMC SD USB
1 0 0 0 1
2 1 1 1 0
3 1 0 0 x
4 0 1 0 x
5 0 1 1 x
6 1 0 0 x
7 0 1 0 x
8 0 0 1 x

连接电源,进入USB模式,连接成功后电脑右下角会有提示

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

2.3 系统烧写

双击“mfgtool2-yocto-mx-evk-emmc.vbs” ,出现如下窗口:

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

如果出现“符合HID标准的供应商定义设备”就说明连接正常,可以进行烧写。若硬件连接完毕,烧写文件也配置好了,点击Start按钮即可一键烧写。

3 MfgTool烧写原理

我们需要烧写uboot、kernel、.dtb 和 rootfs这四个文件,它们一起构成了linux系统。

进入如下的系统固件目录中:

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

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

我们重点关注files、firmware这两个文件夹,以及ucl2.xml这个文件。

MfgTool烧写的工作过程主要分两个阶段

第一阶段:MfgTool先通过USB OTG先将firmware目录uboot、kernel和.dtb这是三个文件下载到开发板的DDR内存中(注意不需要下载 rootfs),就相当于直接在开发板的内存上启动Linux系统。

第二阶段:等Linux 系统启动以后(这时可以方便的完成对EMMC的格式化、分区等操作),再向EMMC中烧写完整的系统,包括files目录中的uboot、linux kernel、.dtb和rootfs这4个文件

3.1 firmeare文件夹

mfgtools/Profiles/Linux/OS Firmware/firmware文件夹里有很多NXP官方开发板使用的文件,包括.imx 结尾的uboot文件、一个zImage镜像文件、很多.dtb结尾的设备树文件,我们需要注意其中三个文件:

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开发板的设备树

这3个文件即第一阶段需要烧写的文件,如果要烧写我们的系统,就要用自己编译的文件替换这3个文件。

3.2 files文件夹

mfgtools/Profiles/Linux/OS Firmware/files目录中的文件和firmware 目录中的基本差不多,这里就要注意下面4个文件

zImage:同上

u-boot-imx6ull14x14evk_emmc.imx:同上

zImage-imx6ull-14x14-evk-emmc.dtb:同上

rootfs_nogpu.tar.bz2根文件系统(nogpu表示不包含GPU的内容)

这4个文件即第二阶段需要烧写的文件,如果要烧写我们的系统,就要用自己编译的文件替换这4个文件。

3.3 ucl2.xml文件

mfgtools/Profiles/Linux/OS Firmware/ucl2.xml是一种XML格式的文件,用来指定files和firmware目录要烧写的uboot和设备树文件。

ucl2.xml 以 “” 开始, 以 “” 结束。 “”和“”之间是配置相关内容,“”和“”之间的是针对不同存储芯片的烧写命令。

ucl2.xml文件有600多行,这里抽取主干结构来看一个该文件的主要运行流程:

Loading U-bootLoading Kernel.Loading Initramfs.Loading device tree. Jumping to OS image. 

ucl2.xml 首先会判断当前要向I.MX系列的哪个型号的芯片烧写系统:

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

通过读取芯片的VID和PID,即可判断要烧什么处理器的系统, 如VID=0X15A2,PID=0080,就表示要给I.MX6ULL烧写系统。

3.4 xxx.vbs文件

ucl2.xml文件中确定了要烧写的处理器型号以后,还要确定向什么存储设备烧写系统,这是在mfgtools/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文件中的烧写过程

前面说了烧写分两个阶段, 第一步是通过 USB OTG 向 DDR中下载系统,第二步才是正常的烧写。

根据当前是EMMC的板子,第1步烧写uboot的命令如下:

Loading U-boot 

file” 表示要下载的文件位置:

firmware/u-boot-imx6ul%lite%%6uluboot%_emmc.imx 

“%lite%”“%6uluboot%”分别表示取lite6uluboot的值, 那lite和6uluboot的值是多少呢?在cfg.ini文件中有定义。

3.5 cfg.ini文件

mfgtools/cfg.ini文件是一个配置文件,内容如下:

[profiles]
chip = Linux

[platform]
board = SabreSD

[LIST]
name = SDCard

[variable]
board = sabresd
mmc = 0
sxuboot=sabresd
sxdtb=sdb
7duboot=sabresd
7ddtb=sdb
6uluboot=14x14ddr3arm2
6uldtb=14x14-ddr3-arm2
6ulldtb=14x14-ddr3-arm2
ldo=
plus=
lite=l
initramfs=fsl-image-mfgtool-initramfs-imx_mfgtools.cpio.gz.u-boot
seek = 1
sxnor=qspi2
7dnor=qspi1
6ulnor=qspi1
nor_part=0

可以看到,lite=l,6uluboot=14x14evk。

继续分析ucl2.xml文件中的烧写过程,将lite和6uluboot的值代入以后,要烧写的uboot文件名就是:

firmware/u-boot-imx6ull14x14evk _emmc.imx

同样的方法将.dtb(设备树)和zImage都下载到DDR中以后就会跳转去运行OS,这个时候会在MfgTool工具中会有“Jumping to OS image”提示语句,ucl2.xml中的跳转命令如下:

 Jumping to OS image. 

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

4 系统烧写实践

4.1 烧写NXP官方系统

因为我的板子是512MB的DDR3+8G的EMMC,与NXP官方开发板类似,可以先试着烧写NX官方的系统,熟悉烧写流程:

拨码开关拨到USB模式,拔出SD卡,连接USB

板子上电,连接串口(用于查看具体的下载信息

按下开发板复位按键。

双击打开“mfgtool2-yocto-mx-evk-emmc.vbs” ,确认出现“符合 HID 标准的供应商定义设备”等字样,点击Start按钮。

注:烧录开始时,会弹出大容量存储器之类的窗口,并会出现短暂的No Device Connet的提示,不用理会。

注:官方的系统文件较大,烧录时间较长。另外,若烧录失败,串口也没打印信息,我刚开始就遇到了这种情况,然后我用野火提供的软件包(系统文件比较小,烧录在1分钟左右)烧录成功后,再回过头来继续烧录NXP官方的就有串口输出信息了。

我的板子烧录官方系统时,不知什么原因一直烧录不成功,如下图,因为用不到官方的系统,就先不管它,有时间再查。

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

4.2 烧写自己的系统

准备要烧写的文件:

自己移植编译出来的uboot文件:u-boot.imx(位于u-boot源码主目录中)

自己移植编译出来的zImage镜像文件(位于Kernel源码的arch/arm/boot目录中)和开发板对应的.dtb(设备树)mx6ull-myboard.dtb(位于Kernel源码的arch/arm/boot/dts目录中)

自己构建的根文件系统rootfs

rootfs需要先打包成rootfs.tar.bz2,进入Ubuntu中的nfs目录下的rootfs目录,使用tar命令打包:

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

将这4个文件复制到Windows系统中准备烧录。

总结一下要准备的文件,如下图:

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

烧写时,这里有两种修改方式进行烧写,一种是将自己的4个文件按照NXP官方的文件进行重命名,并替换掉官网的文件,即可直接烧录。另一种是改造MfgTool烧写工具,使得该烧写工具能够兼容自己板子的文件名。因为第2种修改比较麻烦,先使用第1种简单的方式进行烧写,只需要修改文件名即可。

需要替换的名称为:

原名称 修改替换的名称
u-boot.imx u-boot-imx6ull14x14evk_emmc.imx
zImage zImage(不需要重命名)
imx6ull-myboard.dtb zImage-imx6ull-14x14-evk-emmc.dtb
rootfs.tar.bz2 rootfs_nogpu.tar.bz2

点击Start开始烧写,等待烧写完成:

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

烧录完,点击Stop退出即可。

然后切换板子为EMMC启动,复位重启开发板,正常情况下应该就可以看到烧录的系统正常启动了。

但是,我这里出现了一点小差错。

4.3 解决内核无法启动的错误

在烧录完系统,切换到EMMC启动时,我板子的内核没有运行起来,提示“MMC:no card present”的错误:

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

好像是EMMC没有找到,就无法启动内核。

网上查找相关问题,根据这篇:https://blog.csdn.net/qq_43605009/article/details/113646312的描述,应该是uboot的里一个配置项搞错了,就是这里:

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

我们的defconfig配置文件中,第一行最后那个不需要改,要改回默认的MX6ULL_EVK_EMMC_REWORK,改完,重新编译uboot生成u-boot.imx,再次进行烧录就能正常启动内核了。(这里的MX6ULL_EVK_EMMC_REWORK的具体作用我还没搞明白,有时间再研究)

正常启动后,就可以看到和之前使用nfs网络方式启动一样的效果了:

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

4.4 解决网络没有启动的问题

板子插上网线,使用ifconfig命令查看网络信息,发现没有连接网络,这是因为板子的网络功能没有打开。之前使用nfs挂载根文件系统的时候因为要使用nfs服务,Linux内核会打开eth0这个网卡,现在我们不使用nfs挂载根文件系统, Linux内核就没有自动打开eth 网卡。

i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

我们可以手动打开,以打开eth1网卡为例,输入如下命令打开 eth1:

ifconfig eth1 up 

然后可以为板子分配IP:

ifconfig eth1 192.168.5.108 netmask 255.255.255.0  //设置 IP 地址和子网掩码 

route add default gw 192.168.5.1     //添加默认网关
i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

目前这种手动修改的方式,每次开机以后就没有了,还需要重新设置。可以将设置网卡IP地址的命令添加到/etc/init.d/rcS开机启动文件中,添加如下内容:

#config eth1
ifconfig eth1 up 
ifconfig eth1 192.168.5.108 netmask 255.255.255.0 
route add default gw 192.168.5.1 
i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC

然后保存,reboot命令重启开发板,重启后就自动连上网了。

5 总结

本篇主要介绍了Linux移植的系统打包烧录的EMMC的方法,使用MfgTool工具,将uboot、linux kernel、.dtb和rootfs这4个文件烧写到板子的EMMC中。烧录过程中,发现了之前修改uboot配置时的一个问题,导致内核无法启动,修改后可以正常启动。另外,还修改开机启动文件,使得网络能够开机自动连接。
审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5082

    文章

    19104

    浏览量

    304798
  • Linux
    +关注

    关注

    87

    文章

    11292

    浏览量

    209323
  • 文件
    +关注

    关注

    1

    文章

    565

    浏览量

    24727
收藏 人收藏

    评论

    相关推荐

    i.MX6ULL嵌入式Linux开发1-uboot移植初探

    本系列教程以i.MX6ULL处理器的ARM开发板为实验基础,学习记录嵌入式Linux开发的各种知识与经验,主要内容包括
    的头像 发表于 03-07 08:57 3880次阅读
    <b class='flag-5'>i.MX6ULL</b><b class='flag-5'>嵌入式</b><b class='flag-5'>Linux</b><b class='flag-5'>开发</b>1-uboot移植初探

    如何在嵌入式Linux开发板上配置Qt运行环境

    本文基于I.MX6ULL芯片的Linux开发板,介绍如何在嵌入式Linux开发板上配置Qt运行环
    发表于 10-10 09:56 2608次阅读

    使用i.MX6ULL开发板进行Linux根文件系统的完善

    上一篇推文讲了怎么移植根文件系统,并在i.MX6ULL开发板中运行起来,但是会出现一些提示,现在来进行根文件的完善。
    发表于 10-17 11:13 790次阅读

    移植NXP官方linux 5.4内核到i.MX6ULL开发

    本文描述移植NXP官方 linux 5.4 内核到i.MX6ULL开发板。
    发表于 12-19 11:10 2033次阅读

    移植5.4内核到迅为I.MX6ULL开发

    图所示:接下来我们开始写编译生成的镜像到i.MX6ULL终结者开发板。Uboot我们依然使用开发板光盘资料里面的“i.MX6UL终结者光盘
    发表于 06-29 10:13

    编译IMX6ULL开发板的Uboot和Linux内核

    `迅为I.MX6ULL终结者开发板对应的Uboot源码在光盘资料的“i.MX6UL终结者光盘资料5_uboot linux源码终结者Uboot和Li
    发表于 07-15 10:47

    i.MX6ULL开发板硬件资源

    迅为i.MX6ULL 终结者开发板硬件资源非常丰富,几乎将 i.MX6ULL 芯片的所有资源都扩展引出到底板上了,底板提供了丰富的外设接口,开发板的尺寸是 190mm*125mm,充分
    发表于 12-29 06:18

    i.MX6ULL核心板资源

    操作系统镜像&写工具提供资料提供相关的 BSP 源代码、文件系统源代码其它默认配置i.MX6ULL、512MB DDR3、4GB EMMC
    发表于 07-12 17:50

    初识 i.MX6ULL 寄存器

    裸机开发_L1_汇编LED实验0. 本节目标1. 硬件层电路2. 初识 i.MX6ULL 寄存器2.1 i.MX6ULL 时钟控制寄存器2.2 i.MX6ULL IO复用寄存器2.3
    发表于 12-20 07:13

    i.MX6ULL的相关资料下载

    i.MX6ULL终结者三大手册,加速学习和开发速度,一秒化无形!《嵌入式Linux开发指南》+《开发
    发表于 12-27 06:13

    飞凌i.MX6ULL开发板的评测,再次进阶拥有更高的性价比

    处理器MCIMX6Y2开发设计,采用先进的ARMCortex-A7内核,运行速度高达800MHz。i.MX6ULL应用处理器包括一个集成的电源管理模块,降低了外接电源的复杂性,并简化了上电时序。
    发表于 10-27 11:55 1484次阅读
    飞凌<b class='flag-5'>i.MX6ULL</b><b class='flag-5'>开发</b>板的评测,再次进阶拥有更高的性价比

    【北京迅为】i.MX6ULL开发板移植 Debian 文件系统

    【北京迅为】i.MX6ULL开发板移植 Debian 文件系统
    的头像 发表于 02-10 15:34 1142次阅读
    【北京迅为】<b class='flag-5'>i.MX6ULL</b><b class='flag-5'>开发</b>板移植 Debian 文件<b class='flag-5'>系统</b>

    基于i.MX6ULL的掉电检测设计与软件测试

    基于i.MX6ULL的掉电检测设计与软件测试基于i.MX6ULL平台设计实现掉电检测功能,首先选择一路IO,利用IO电平变化触发中断,在编写驱动时捕获该路GPIO的中断,然后在中断响应函数中发
    的头像 发表于 11-09 10:40 839次阅读
    基于<b class='flag-5'>i.MX6ULL</b>的掉电检测设计与软件测试

    【新品】i.MX6ULL工业嵌入式核心板!NXP低功耗MPU,LCD显示

    核心板新品上市ECK20-6Y2XA系列核心板是亿佰特基于NXPCortex-A7内核i.MX6ULL处理器精心设计的,采用邮票孔连接的低成本、低功耗、高性价比、高可靠性的嵌入式核心板。可广泛应用于工业控制、HMI、IoT等领域
    的头像 发表于 11-15 01:04 180次阅读
    【新品】<b class='flag-5'>i.MX6ULL</b>工业<b class='flag-5'>嵌入式</b>核心板!NXP低功耗MPU,LCD显示

    【迅为电子】i.MX6UL和i.MX6ULL芯片区别与开发板对比

    【迅为电子】i.MX6UL和i.MX6ULL芯片区别与开发板对比
    的头像 发表于 11-28 14:31 318次阅读
    【迅为电子】<b class='flag-5'>i.MX6</b>UL和<b class='flag-5'>i.MX6ULL</b>芯片区别与<b class='flag-5'>开发</b>板对比