电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC与遇到的坑! 码农爱学习
分 享
扫描二维码分享
i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC与遇到的坑! 码农爱学习
i.MX6ULL
嵌入式
linux
码农爱学习
关注
发布时间: 2021-08-20
丨
阅读: 1630
前进几篇文章,已经搞定了Linux移植三巨头:**uboot、kernel(包含dtb)和rootfs**,除了uboot是烧写在SD中的,其它的都是在ubuntu虚拟机的nfs服务器中,运行时必须通过网络将这些文件加载到开发板的内存中运行。 ![](https://cf04.ickimg.com/bbsimages/202108/887f7e2ee5f9abdae33395025891ecef.png) 本篇就来研究,将这几个文件**打包烧写到板子的eMMC中**,实现嵌入式Linux系统的烧写,这样,在没有网络的情况下,板子也可以正常运行。系统烧写使用的是NXP官方的MfgTool工具,通过USB OTG口来烧写。 [TOC] # 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 这个压缩包,继续解压。 ![](https://cf04.ickimg.com/bbsimages/202108/93c4af493e823e529639118f4e775c08.png) 进入目录 mfgtools-with-rootfs\mfgtools 中, 在此目录下有几个文件夹和很多的.vbs 文件: ![](https://cf04.ickimg.com/bbsimages/202108/7633a431ec4e0549a54cbe8214d2d942.png) - `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卡拔出)。 ![](https://cf04.ickimg.com/bbsimages/202108/afbfbe3f52e9e5709ca66aaed6ea46ee.jpg) ## 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模式,连接成功后电脑右下角会有提示 ![](https://cf04.ickimg.com/bbsimages/202108/d5741d67b69e6ae5f7d5a0b056f20eb2.jpg) ## 2.3 系统烧写 双击“mfgtool2-yocto-mx-evk-emmc.vbs” ,出现如下窗口: ![](https://cf04.ickimg.com/bbsimages/202108/8f40f775e8d9819d54ba0dbe444239ee.png) 如果出现“**符合HID标准的供应商定义设备**”就说明连接正常,可以进行烧写。若硬件连接完毕,烧写文件也配置好了,点击Start按钮即可一键烧写。 # 3 MfgTool烧写原理 我们需要烧写**uboot、kernel、.dtb 和 rootfs**这四个文件,它们一起构成了linux系统。 进入如下的系统固件目录中: ```sh L4.1.15_2.0.0-ga_mfg-tools/mfgtools-with-rootfs/mfgtools/Profiles/Linux/OS Firmware ``` ![](https://cf04.ickimg.com/bbsimages/202108/fe7a3d88154f0d2eca4569ec80a52d23.png) 我们重点关注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多行,这里抽取主干结构来看一个该文件的主要运行流程: ```xml
Loading U-boot
Loading Kernel.
Loading Initramfs.
Loading device tree.
Jumping to OS image.
``` ucl2.xml 首先会判断当前要向I.MX系列的**哪个型号的芯片**烧写系统: ![](https://cf04.ickimg.com/bbsimages/202108/91cc4a93b9a7bfc4cee8e808a0784f94.png) 通过读取芯片的VID和PID,即可判断要烧什么处理器的系统, 如VID=0X15A2,PID=0080,就表示要给I.MX6ULL烧写系统。 ## 3.4 xxx.vbs文件 ucl2.xml文件中确定了要烧写的处理器型号以后,还要确定**向什么存储设备烧写**系统,这是在mfgtools/mfgtool2-yocto-mx-evk-emmc.vbs中配置,右键,用文本编辑器打开这个文件(不要双击哦): ```vb 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**的命令如下: ```sh
Loading U-boot
``` “**file**” 表示要下载的文件位置: ```sh firmware/u-boot-imx6ul%lite%%6uluboot%_emmc.imx ``` `“%lite%”`和`“%6uluboot%” `分别表示取**lite**和**6uluboot**的值, 那lite和6uluboot的值是多少呢?在cfg.ini文件中有定义。 ## 3.5 cfg.ini文件 mfgtools/cfg.ini文件是一个配置文件,内容如下: ```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文件名就是: ```sh firmware/u-boot-imx6ull14x14evk _emmc.imx ``` 同样的方法将**.dtb(设备树)和zImage**都下载到DDR中以后就会跳转去运行OS,这个时候会在MfgTool工具中会有“**Jumping to OS image**”提示语句,ucl2.xml中的跳转命令如下: ```sh
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官方的就有串口输出信息了。 我的板子烧录官方系统时,不知什么原因一直烧录不成功,如下图,因为用不到官方的系统,就先不管它,有时间再查。 ![](https://cf04.ickimg.com/bbsimages/202108/fba0eabbd5bfe6ad49c4e992a90365f3.png) ## 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命令打包: ```sh cd rootfs/ tar -vcjf rootfs.tar.bz2 * ``` 将这4个文件复制到Windows系统中准备烧录。 总结一下要准备的文件,如下图: ![](https://cf04.ickimg.com/bbsimages/202108/8351900e1dd28350691257c163753b21.png) 烧写时,这里有两种修改方式进行烧写,一种是将自己的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开始烧写,等待烧写完成: ![](https://cf04.ickimg.com/bbsimages/202108/fd565658505728a9abf6195fdf794184.png) 烧录完,点击Stop退出即可。 然后切换板子为EMMC启动,复位重启开发板,正常情况下应该就可以看到烧录的系统正常启动了。 但是,我这里出现了一点小差错。 ## 4.3 解决内核无法启动的错误 在烧录完系统,切换到EMMC启动时,我板子的内核没有运行起来,提示“MMC:no card present”的错误: ![](https://cf04.ickimg.com/bbsimages/202108/cb7ca435e3197978ae4cfd8a23dd9279.png) 好像是EMMC没有找到,就无法启动内核。 网上查找相关问题,根据这篇:
的描述,应该是uboot的里一个配置项搞错了,就是这里: ![](https://cf04.ickimg.com/bbsimages/202108/6163d511c44e0e8b5f0386aa7425a29f.png) 我们的defconfig配置文件中,第一行最后那个不需要改,要改回默认的MX6ULL_EVK_EMMC_REWORK,改完,重新编译uboot生成u-boot.imx,再次进行烧录就能正常启动内核了。(这里的MX6ULL_EVK_EMMC_REWORK的具体作用我还没搞明白,有时间再研究) 正常启动后,就可以看到和之前使用nfs网络方式启动一样的效果了: ![](https://cf04.ickimg.com/bbsimages/202108/1719d5c8bdf9eb536bbfd862bc38b78e.png) ## 4.4 解决网络没有启动的问题 板子插上网线,使用ifconfig命令查看网络信息,发现没有连接网络,这是因为板子的网络功能没有打开。之前使用nfs挂载根文件系统的时候因为要使用nfs服务,Linux内核会打开eth0这个网卡,现在我们不使用nfs挂载根文件系统, Linux内核就没有自动打开eth 网卡。 ![](https://cf04.ickimg.com/bbsimages/202108/756e8aee4c2601c08058ccf649ccb454.png) 我们可以手动打开,以打开eth1网卡为例,输入如下命令打开 eth1: ```sh ifconfig eth1 up ``` 然后可以为板子分配IP: ``` ifconfig eth1 192.168.5.108 netmask 255.255.255.0 //设置 IP 地址和子网掩码 route add default gw 192.168.5.1 //添加默认网关 ``` ![](https://cf04.ickimg.com/bbsimages/202108/8b9bce952a20b7686c1e7cc7a735bc68.png) 目前这种手动修改的方式,每次开机以后就没有了,还需要重新设置。可以将设置网卡IP地址的命令添加到/etc/init.d/rcS开机启动文件中,添加如下内容: ```sh #config eth1 ifconfig eth1 up ifconfig eth1 192.168.5.108 netmask 255.255.255.0 route add default gw 192.168.5.1 ``` ![](https://cf04.ickimg.com/bbsimages/202108/287e5cf9a8d8ca61cbb27667685c7540.png) 然后保存,reboot命令重启开发板,重启后就自动连上网了。 # 5 总结 本篇主要介绍了Linux移植的系统打包烧录的EMMC的方法,使用MfgTool工具,将**uboot、linux kernel、.dtb和rootfs这4个文件**烧写到板子的EMMC中。烧录过程中,发现了之前修改uboot配置时的一个问题,导致内核无法启动,修改后可以正常启动。另外,还修改开机启动文件,使得网络能够开机自动连接。
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
码农爱学习
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交