Linux--系统烧写

news2024/11/17 7:19:22

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

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

一、MfgTool工具简介

MfgTool 工具是 NXP 提供的专门用于给 I.MX 系列 CPU 烧写系统的软件,可以在 NXP 官网下载到。该软件需要在Windows环境下使用。

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

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

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

  • Profiles文件夹:要烧写的文件就放到这个文件夹中。
  • MfgTool2.exe:烧写软件,但不需要直接打开这个软件烧写。
  • 众多的.vbs 文件:烧写配置脚本,指定烧写的芯片和地址,烧写的时候通过双击这些.vbs文件来打开烧写工具。这些.vbs 烧写脚本既可以根据处理器的不同,由用户选择向 I.MX6D、I.MX6Q、I.MX6S、I.MX7、I.MX6UL 和 I.MX6ULL 等的哪一款芯片烧写系统。也可以根据存储芯片的不同,选择向 EMMC、NAND 或 QSPI Flash 等的哪一种存储设备烧写,功能非常强大。
我们先来简单了解一下 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 的大概工作流程。

二、 MfgTool烧写步骤

2.1 连接USB OTG

MfgTool是通过USB OTG接口将系统烧写进EMMC中的,使用USB线连接电脑(使用USB OTG连接时,需要先把SD卡拔出)。

2.2 切换拨码开关模式

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

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

2.3 系统烧写

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

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

我们重点关注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 以 “<UCL>” 开始, 以 “</UCL>” 结束。 “<CFG>”和“</CFG>”之间是配置相关内容,“<LIST>”和“</LIST>”之间的是针对不同存储芯片的烧写命令。

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

<UCL>
  <CFG>
    <!-- 判断向 I.MX 系列的哪个芯片烧写系统 --> 
    <STATE name="BootStrap" dev="MX6SL" vid="15A2" pid="0063"/>
    <!-- ...省略若干行参数配置 -->
  </CFG>
​
  <LIST name="SDCard" desc="Choose SD Card as media">
    <!-- 向 SD 卡烧写 Linux 系统 --> 
    <!-- ...省略若干行烧写配置 -->
  </LIST>
  <LIST name="eMMC" desc="Choose eMMC as media">
    <!-- [1]向 EMMC 烧写 uboot(.imx) -->
    <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%lite%%6uluboot%_emmc.imx" ifdev="MX6ULL">Loading U-boot</CMD>
    <!-- [2]向 EMMC 烧写 Kernel(zImage) -->
    <CMD state="BootStrap" type="load" file="firmware/zImage" address="0x80800000"
        loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6SL MX6SX MX7D MX6UL MX6ULL">Loading Kernel.</CMD>
    <!-- [3]向 EMMC 烧写 initramfs -->
    <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>
    <!-- [4]向 EMMC 烧写 device tree(.dtb) -->
    <CMD state="BootStrap" type="load" file="firmware/zImage-imx6ul%lite%-%6uldtb%-emmc.dtb" address="0x83000000"
        loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6ULL">Loading device tree.</CMD>
    <!-- ...省略若干行烧写配置 -->
      
    <!-- [5]跳转到系统镜像 -->
    <CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD>
  </LIST>
​
  <!-- burn uboot only because spi-nor flash is small (4M). kernel is beyond 5M now -->
  <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>
  
  <!-- ...省略若干行其它存储位置的烧写 -->
</UCL>

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

通过读取芯片的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的命令如下:

<CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot-imx6ul%lite%%6uluboot%_emmc.imx" ifdev="MX6ULL">Loading U-boot </CMD>  

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中的跳转命令如下:

<CMD state="BootStrap" type="jump" > Jumping to OS image. </CMD> 

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

三、烧写自己的系统

准备要烧写的文件:

  • 自己移植编译出来的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系统中准备烧录。

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

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

需要替换的名称为:

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

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

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

转载来源:i.MX6ULL嵌入式Linux开发6-系统烧写到eMMC与遇到的坑! - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1621577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JAVAEE—HTTP

文章目录 HTTP导读HTTP解析HTTP的格式分析环境准备 HTTP请求格式首行headerHostContent-LengthContent-TypeUser-Agent (简称 UA)RefererCookie 空行body HTTP响应格式认识HTTP的方法POST方法POST和GET的区别第一&#xff1a;用处第二&#xff1a;传递数据第三&#xff1a;GET不…

QWidget | Qt::WindowType 枚举的取值及意义QFlags 模板类详解

01 与 QWidget 类有关的部分类的继承图 3、QObject 是所有 Qt 对象的基类,QPaintDevie 是所有可绘制对象的基类。 4、QWidget 类是所有用户界面对象的基类,QWidget 及其子类是开发桌面应用的核心,这些类都位于 QtWidgets 模块内,注意:QtWidgets 是模块,QWidget 是类(少一…

装饰模式【结构型模式C++】

1.概述 装饰模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 2.结构 抽象构件&#xff08;Component&#xff09;角色&#xff1a;定义一个抽象接口以规范准备接收附加责任的对象。具体构件&#xff08;Concrete…

区块链安全应用------压力测试

测试要求&#xff1a; 1. 对以下AccountManager智能合约进行压测(基础要求set函数测试&#xff0c;balanceOf涵为20分加分项)2. 在本地链进行测试&#xff0c;需要监控本地进程的资源使用情况。每个进程的multiOutput属性为Avg3. 需要将每一个更改的配置文件截图&#xff0c;和…

指针(5)

前言 本节是有关指针内容的最后一节&#xff0c;本节的内容以讲解指针习题为主&#xff0c;那么就让我们一起来开启本节的学习吧&#xff01; sizeof和strlen的对比 1.sizeof 我们在学习操作符的时候&#xff0c;学习了sizeof。sizeof存在的意义是用来计算变量所占用的内存空…

智慧火电厂合集 | 数字孪生助推能源革命

火电厂在发电领域中扮演着举足轻重的角色。主要通过燃烧如煤、石油或天然气等化石燃料来产生电力。尽管随着可再生能源技术的进步导致其比重有所减少&#xff0c;但直至 2023 年&#xff0c;火电依然是全球主要的电力来源之一。 通过图扑软件自主研发 HT for Web 产品&#xf…

百度智能云千帆 ModelBuilder 技术实践系列:通过 SDK 快速构建并发布垂域模型

​百度智能云千帆大模型平台&#xff08;百度智能云千帆大模型平台 ModelBuilder&#xff09;作为面向企业开发者的一站式大模型开发平台&#xff0c;自上线以来受到了广大开发者、企业的关注。至今已经上线收纳了超过 70 种预置模型服务&#xff0c;用户可以快速的调用&#x…

企业微信hook接口协议,开放平台id转企业用户id

开放平台id转企业用户id 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid":"3240fde0-45e2-48c0-90e8-cb098d0ebe43","openid":["woO9o4EAAAUg47yCUh1mDYVh71AJ8R3w"] } …

陪诊小程序的市场潜力与发展趋势研究

随着社会的快速发展和人口老龄化的加剧&#xff0c;医疗服务需求日益增长&#xff0c;而陪诊服务作为医疗服务的重要补充&#xff0c;正逐渐受到人们的关注和青睐。陪诊小程序作为一种便捷、高效的陪诊服务平台&#xff0c;其市场潜力和发展趋势值得关注。 一、市场潜力分析 人…

【现代交换原理与通信网技术】期末突击

文章目录 自己老师画的重点1. 程控交换机结构2. 测试模拟电路的七项功能3.中继电路的六项功能4.数字用户电路和模拟用户电路比较5.路由规划的基本原则6.七路信令的结构7.随路信令和公共信道信令8.软交换9.无极网和分级网10.路由选择.流量控制的原则/方法11.电路交换&&分…

微软Phi-3,3.8亿参数能与Mixtral 8x7B和GPT-3.5相媲美,量化后还可直接在IPhone中运行

Phi-3系列 Phi-3是一系列先进的语言模型&#xff0c;专注于在保持足够紧凑以便在移动设备上部署的同时&#xff0c;实现高性能。Phi-3系列包括不同大小的模型&#xff1a; Phi-3-mini&#xff08;38亿参数&#xff09; - 该模型在3.3万亿个令牌上进行训练&#xff0c;设计得足…

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域

解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务&#xff08;Spring MVC Springboot&#xff09;同时允许跨域 Tomcat 配置允许跨域Web 项目配置允许跨域Tomcat 同时允许静态文件和 Web 服务跨域 偶尔遇到一个 Tomcat 部署项目跨域问题&#xff0c;因为已经处理过…

如何调节电脑屏幕亮度?让你的眼睛更舒适!

电脑屏幕亮度的调节对于我们的视力保护和使用舒适度至关重要。不同的环境和使用习惯可能需要不同的亮度设置。可是如何调节电脑屏幕亮度呢&#xff1f;本文将介绍三种不同的电脑屏幕亮度调节方法&#xff0c;帮助您轻松调节电脑屏幕亮度&#xff0c;以满足您的需求。 方法1&…

超级好看动态视频官网源码

源码介绍 超级好看动态视频引导页源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 超级好看动态…

4.26日学习记录

[湖湘杯 2021 final]Penetratable SUID提权 SUID是一种对二进制程序进行设置的特殊权限&#xff0c;可以让二进制程序的执行者临时拥有属主的权限 SUID具有一定的限制&#xff1a; 1.仅对于二进制有效&#xff1b; 2.执行者在程序中有可以执行的权限&#xff1b; 3.权限仅在程序…

2024腾讯游戏安全技术竞赛-机器学习赛道

决赛赛题链接https://gss.tencent.com/competition/2024/doc/2024%E8%85%BE%E8%AE%AF%E6%B8%B8%E6%88%8F%E5%AE%89%E5%85%A8%E6%8A%80%E6%9C%AF%E7%AB%9E%E8%B5%9B-%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0-%E5%86%B3%E8%B5%9B.zip 今年的题目是游戏跨语言恶意内容识别 ,题目比较…

C++核心编程——4.5 运算符重载

4.5.0 运算符重载概念 对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型 4.5.1 加号运算符重载 作用&#xff1a;实现两个自定义数据类型相加的运算 class Person { public:Person() {};Person(int a, int b){this->m_A a;this…

如何设计一个安全的系统架构?

本文转自 公众号 ByteByteGo&#xff0c;如有侵权&#xff0c;请联系&#xff0c;立即删除 如何设计一个安全的系统架构&#xff1f; 如何设计安全的系统&#xff1f;我们总结了 12 条原则供架构师们参考。 设计安全的系统非常重要&#xff0c;原因有很多&#xff0c;从保护敏…

大模型预训练Pretrain

选基座 —> 扩词表 —> 采样&切分数据 —> 设置学习参数 —> 训练 —> 能力测评&#xff09; 基座google/flan-t5 T5 模型&#xff1a;NLP Text-to-Text 预训练模型超大规模探索 - 知乎相信大多 NLP 相关者&#xff0c;在时隔 BERT 发布近一年的现在&…