嵌入式Linux学习第四天启动方式学习

嵌入式Linux学习第四天

今天学习I.MX6U 启动方式详解。I.MX6U有多种启动方式,可以从 SD/EMMC、NAND Flash、QSPI Flash等启动。

启动方式选择

BOOT 的处理过程是发生在 I.MX6U 芯片上电以后,芯片会根据 BOOT_MODE[1:0]的设置来选择 BOOT 方式。BOOT_MODE[1:0]的值是可以改变的,I.MX6U-ALPHA 开发板的这两个引脚原理图如图所示:在这里插入图片描述
I.MX6U 有四个 BOOT 模式,这四个 BOOT 模式由 BOOT_MODE[1:0]来控制,也就是BOOT_MODE1 和 BOOT_MODE0 这两个 IO,具体模式如下图所示:
在这里插入图片描述

串行下载

当 BOOT_MODE1 为 0,BOOT_MODE0 为 1 的时候此模式使能,串行下载的意思就是可以通过 USB 或者 UART 将代码下载到板子上的外置存储设备中,我们可以使用 OTG1 这个 USB口向开发板上的 SD/EMMC、NAND 等存储设备下载代码。我们需要将 BOOT_MODE1 拨到“OFF”,将 BOOT_MODE0 拨到“ON”。这个下载是需要用到 NXP 提供的一个软件,一般用来最终量产的时候将代码烧写到外置存储设备中的。

内部 BOOT 模式

当 BOOT_MODE1 为 1,BOOT_MODE0 为 0 的时候此模式使能,在此模式下,芯片会执行内部的 boot ROM 代码,这段 boot ROM 代码会进行硬件初始化(一部分外设),然后从 boot 设备(就是存放代码的设备、比如 SD/EMMC、NAND)中将代码拷贝出来复制到指定的 RAM 中,一般是 DDR。

内部 BOOT 模式分析

BOOT ROM 初始化内容

当初始化为内部boot模式时候,在电源上电或重置后,i.MX6UL 会首先执行内置的 Boot ROM 程序。这个 Boot ROM 是固化在处理器内部的一段启动代码,它负责系统的初步设置和引导过程。首先肯定是初始化时钟,具体如下图所示。
在这里插入图片描述
BT_FREQ 模式为 0,可以看到,boot ROM 会将 I.MX6U 的内核时钟设置为396MHz,也就是主频为 396Mhz。System PLL=528Mhz,USB PLL=480MHz,AHB=132MHz,IPG=66MHz。关于 I.MX6U 的系统时钟,我们后面会详细讲解。内部 boot ROM 为了加快执行速度会打开 MMU 和 Cache,下载镜像的时候 L1 ICache 会打开,验证镜像的时候 L1 DCache、L2 Cache 和 MMU 都会打开。一旦镜像验证完成,boot ROM就会关闭 L1 DCache、L2 Cache 和 MMU。

内核时钟(CPU Clock)为 396 MHz:这意味着处理器的主频设置为396 MHz,这是处理器执行指令的速度。
System PLL(系统相位锁定环)为 528 MHz:PLLs(Phase-Locked Loops)是一种电子电路,用于产生一个精确的时钟信号。在这里,528 MHz 是一个重要的时钟源,用于生成其他系统时钟。 USB PLL为 480 MHz:这个时钟专门为 USB 接口提供时钟信号,确保USB通信的稳定性和性能。
AHB(高性能总线)为 132 MHz:AHB是用于高速访问核心模块如RAM和ROM的总线。132 MHz 的速度是为了平衡性能和功耗。
IPG(外设总线)为 66MHz:IPG是连接低速外设的总线,66 MHz 提供了足够的速度来支持这些外设的操作。

MMU 和 Cache 的作用

MMU(内存管理单元):MMU负责虚拟内存和物理内存之间的映射。在系统启动和引导过程中启用MMU可以提高内存访问的效率和安全性。
Cache(缓存):Cache是一种快速存储器,用于减少访问主内存的次数,从而加快数据访问速度。在i.MX6U的启动过程中,Cache被用来加快引导程序的执行速度。
L1 ICache(一级指令缓存):在下载镜像时开启,加快指令的读取速度。
L1 DCache(一级数据缓存)和 L2 Cache(二级缓存):在验证镜像时开启,加快数据的读写速度。

镜像下载与验证

在系统启动过程中,Boot ROM 首先会下载引导镜像到内存中,并开启 L1 ICache 来加速这一过程。一旦下载完成,为了确保引导镜像的完整性和安全性,Boot ROM 会进行镜像验证,这时会开启 L1 DCache、L2 Cache 和 MMU 来加速验证过程。
镜像验证后的操作
一旦镜像验证完成,为了将系统转入一个更安全、更可控的状态,Boot ROM 会关闭 L1 DCache、L2 Cache 和 MMU。这样做的目的是为了在将控制权交给引导加载程序(如U-Boot)之前,清除所有的缓存和状态,确保系统的干净启动。

启动设备

启动设备是指系统上电或重置后第一个被执行的代码所在的存储设备。这个设备包含了启动系统所需的初始程序代码,通常被称为引导加载程序(Bootloader)。引导加载程序是系统启动过程中至关重要的一部分,它负责初始化硬件设备、设置内存、加载操作系统内核等任务,从而使系统进入可操作状态。
当 BOOT_MODE 设置为内部 BOOT 模式以后,可以从以下设备中启动:
①、接到 EIM 接口的 CS0 上的 16 位 NOR Flash。
②、接到 EIM 接口的 CS0 上的 OneNAND Flash。
③、接到 GPMI 接口上的 MLC/SLC NAND Flash,NAND Flash 页大小支持 2KByte、4KByte
和 8KByte,8 位宽。
④、Quad SPI Flash。
⑤、接到 USDHC 接口上的 SD/MMC/eSD/SDXC/eMMC 等设备。
⑥、SPI 接口的 EEPROM。
这些启动设备如何选择呢?I.MX6U 同样提供了 eFUSE 和 GPIO 配置两种,eFUSE 就不讲解了。我们重点看如何通过 GPIO 来选择启动设备,因为所有的 I.MX6U 开发板都是通过 GPIO来配置启动设备的。正如启动模式由 BOOT_MODE[1:0]来选择一样,**启动设备是通过BOOT_CFG1[7:0]、BOOT_CFG2[7:0]和 BOOT_CFG4[7:0]这 24 个配置 IO,这 24 个配置 IO 刚好对应着 LCD 的 24 根数据线 LCD_DATA0~LCDDATA23,当启动完成以后这 24 个 IO 就可以作为 LCD 的数据线使用。**这 24 根线和 BOOT_MODE1、BOOT_MODE0 共同组成了 I.MX6U的启动选择引脚。

在这里插入图片描述
虽然有 24 个 IO,但是实际需要调整的只有那几个 IO,其它的 IO 全部下拉接地即可,也就是设置为 0。打开 I.MX6U-ALPHA 开发板的核心板原理图,这 24 个 IO 的默认设置如图所示:

在这里插入图片描述
大部分的 IO 都接地了,只有几个 IO 接高,尤其是 BOOT_CFG4[7:0]这 8 个 IO 都 10K 电阻下拉接地,所以我们压根就不需要去关注 BOOT_CFG4[7:0]。我们需要重点关注的就只剩下了 BOOT_CFG2[7:0]和 BOOT_CFG1[7:0]这 16 个 IO。这 16 个配置 IO 含义在原理图的左侧已经贴出来了,如图所示:
在这里插入图片描述

打开 I.MX6U-ALPHA 开发板的底板原理图,底板上启动设备选择拨码开关原理图如图所示:
在这里插入图片描述
在这里插入图片描述
根据图中的 BOOT IO 含义,I.MX6U-ALPHA 开发板从 SD 卡、EMMC、NAND 启动的时候拨码开关各个位设置方式如下图所示:
在这里插入图片描述
上节课我们编写完汇编程序要把程序编译后烧写到sd卡,然后从sd卡启动。那么镜像烧写的过程是啥呢。究竟。原子的文档很清楚了介绍了这一块。

镜像烧写

我们设置好 BOOT 以后就能从指定的设备启动了,但是你的设备里面得有代码啊,在第八章中我们使用 imxdownload 这个软件将 led.bin 烧写到了 SD 卡中。imxdownload 会在 led.bin前面添加一些头信息,重新生成一个叫做 load.imx 的文件,最终实际烧写的是 laod.imx。
在嵌入式系统的开发过程中,不同的微处理器或微控制器有着不同的启动和程序加载机制。对于STM32这样的微控制器,通常可以直接将编译生成的.bin文件烧写到内部Flash中,因为STM32的启动加载(Bootloader)设计成可以直接识别和加载裸机二进制文件。然而,对于更复杂的处理器如NXP的i.MX6UL(以下简称i.MX6U),情况就有所不同。i.MX6U等处理器的启动流程设计得更为复杂和灵活,以支持多种启动媒体和复杂的应用场景,比如从SD卡、NAND Flash或者通过网络启动。因此,仅有裸机的.bin文件是不够的,需要在文件前添加特定的头信息,构成一个适合i.MX6U处理器识别和加载的格式。这个最终的可烧写文件,通常包含以下几个部分:

  1. 启动头信息(Boot Header):这是文件的最开始部分,包含了启动时必需的信息,例如程序的起始地址、加载到内存中的位置、需要加载的数据长度等。对于i.MX6U,这个头信息还可能包含签名或加密信息,用于安全启动。

  2. IVT(Image Vector Table):图像向量表,是一个固定格式的表,包含了启动过程中需要的各种地址,如启动入口地址、D-CD(Device Configuration Data)的地址、Boot Data的地址等。IVT使得处理器能够知道从哪里获取必要的信息来加载和执行程序。

  3. Boot Data:包含了关于映像的一些基本信息,如映像的大小和加载到内存中的目标地址。这些信息用于引导程序正确地将应用程序加载到内存中。

  4. D-CD(Device Configuration Data):这部分数据包含了特定的配置信息,用于初始化处理器的某些外设或接口。这对于确保应用程序能在特定的硬件设置下正常运行是必需的。

  5. 应用程序代码(Application Code):这是编译生成的.bin文件,即实际的应用程序代码。它紧随上述头信息和配置数据之后。

  6. CSF(Command Sequence File):对于需要安全启动的场景,CSF包含了用于验证程序完整性和真实性的命令和数据,如数字签名验证。

构建这样一个文件通常需要使用特定的工具或脚本,这些工具会按照i.MX6U的要求将上述各个部分组合成一个单一的可烧写文件。可以看出最终烧写到 I.MX6U 中的程序其组成为:IVT+Boot data+DCD+.bin。所以第八章中的 imxdownload 所生成的 load.imx 就是在 led.bin 前面加上 IVT+Boot data+DCD。内部 BootROM 会将 load.imx 拷贝到 DDR 中,用户代码是要一定要从 0X87800000 这个地方开始的,因为链接地址为 0X87800000,load.imx 在用户代码前面又有 3KByte 的 IVT+Boot Data+DCD 数 据,下面会讲为什么是 3KByte,因此 load.imx 在 DDR 中的起始地址就是 0X87800000-3072=0X877FF400。
接下来具体分析下IVT 和 Boot Data 数据:
load.imx 最前面的就是 IVT 和 Boot Data,IVT 包含了镜像程序的入口点、指向 DCD 的指针和一些用作其它用途的指针。内部 Boot ROM 要求 IVT 应该放到指定的位置,不同的启动设备位置不同,而 IVT 在整个 load.imx 的最前面,其整个位置都是相对于存储设备的起始地址的偏移。

以 SD/EMMC 为例,IVT 偏移为 1Kbyte,IVT+Boot data+DCD 的总大小为 4KByte-1KByte=3KByte。为啥这样去计算,这里我的理解是:SD/EMMC模式下IVT偏移地址为1KB,因为偏移是相对于存储地址的偏移量。所以IVT是相当于从1KB的地址的开始的。而原始的Initial Load Region Size为4KB。所以IVT+Boot data+DCD 的总大小为 4KByte-1KByte=3KByte。假如 SD/EMMC 每个扇区为 512 字节,那么 load.imx 应该从第三个扇区开始烧写,前两个扇区要留出来。load.imx 从IVT开始的第 3KByte 开始才是真正的.bin 文件(如果IVT、Boot Data和DCD总共占用了3KB,那么load.imx的程序数据部分(也就是.bin部分)实际上是从这3KB之后开始的)。
下图为IVT中存放的内容:
在这里插入图片描述
第一个存放的就是 header(头),header 格式如图所示:
在这里插入图片描述
Tag 为一个字节长度,固定为 0XD1,Length 是两个字节,保存着 IVT 长度,为大端格式,也就是高字节保存在低内存中。最后的 Version 是一个字节,为 0X40 或者0X41。
Boot Data 的数据格式如图所示:
在这里插入图片描述

接下来用winhex软件分析Load.imx的具体对应二进制格式数据。具体如下图9.4.1.4所示。
图1

我们将前 44 个字节的数据按照 4 个字节一组组合在一起就是:0X402000D1、0X87800000、0X00000000、0X877FF42C、0X877FF420、0X877FF400、0X00000000、0X00000000、0X877FF000、0X00200000、0X00000000。这 44 个字节的数据就是 IVT 和 Boot Data 数据,按照 IVT 和 Boot Data 所示的格式对应起来如下图所示:

在这里插入图片描述
在这里插入图片描述

DCD 数据:
I.MX6U 片内的所有寄存器都会复位为默认值,但是这些默认值往往不是我们想要的值,而且有些外设我们必须在使用之前初始化它。为此 I.MX6U 提出了一个 DCD(Device Config Data)的概念,和 IVT、Boot Data 一样,DCD 也是添加到 load.imx 里面的,紧跟在 IVT和 Boot Data 后面,IVT 里面也指定了 DCD 的位置。DCD 其实就是 I.MX6U 寄存器地址和对应的配置信息集合,Boot ROM 会使用这些寄存器地址和配置集合来初始化相应的寄存器,比如开启某些外设的时钟、初始化 DDR 等等。DCD 区域不能超过 1768Byte,DCD 区域结构如图:
在这里插入图片描述
DCD 的 header 和 IVT 的 header 类似,结构如图所示:
在这里插入图片描述
图中 Tag 为一个字节,固定为 0XCC。Length 是两个字节,包含写入的命令数据长度,包含 header,同样是大端模式。Parameter 为一个字节,这个字节的每个位含义如下图所示:Address 和 Vlalue/Mask 就是要初始化的寄存器地址和相应的寄存器值,注意采用的是大端模式!
在这里插入图片描述
在这里插入图片描述

bytes 表示是目标位置宽度,单位为 byte,可以选择 1、2、和 4 字节。flags是命令控制标志位。
DCD
数据是从图 0X2C 地址开始的。根据我们分析的 DCD 结构可以得到 load.imx 的 DCD数据如图所示
在这里插入图片描述
在这里插入图片描述
从表 9.4.2.1 中可以看出,DCD 里面的初始化配置主要包括三方面:
①、设置 CCGR0~CCGR6 这 7 个外设时钟使能寄存器,默认打开所有的外设时钟。
②、配置 DDR3 所用的所有 IO。
③、配置 MMDC 控制器,初始化 DDR3。

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

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

相关文章

Linux——基础IO2

引入 之前在Linux——基础IO(1)中我们讲的都是(进程打开的文件)被打开的文件 那些未被打开的文件呢? 大部分的文件都是没有被打开的文件,这些文件在哪保存?磁盘(SSD) OS要不要管理磁盘上的文件?(如何让OS快速定位一个文件) 要…

数据仓库与数据挖掘实验练习3-4(实验二2024.5.8)

练习3 1.简单文件操作练习 import pandas as pd # 读取文件 pd.read_csv(pokemon.csv) # 读取 CSV 文件的函数调用,它将文件中的数据加载到 DataFrame 中,并指定了 Pokemon 列作为索引列。 pd.read_csv(pokemon.csv,index_colPokemon)#查看类型 type(p…

React:Router-2. createBrowserRouter函数式

参考文档:ReactRouter官网 前边的文章 BrowserRouter组件式路由 提供了组件式路由的方式,在react-router6.4.0及以上版本,提供了 createBrowserRouter 函数式路由创建方式。 一、创建路由 1. 新建router.js文件,使用createBrow…

十二届蓝桥杯Python组1月中/高级试题 第五题

** 十二届蓝桥杯Python组1月中/高级试题 第五题 ** 第五题(难度系数 5,35 个计分点) 提示信息: 平均数:是指在一组数据中所有数据之和再除以这组数据的个数。 如:“1,2,3&#xf…

命令行方式将mysql数据库迁移到达梦数据库(全步骤)

因项目需求,需要将mysql数据库转换为国产达梦数据库,但由于安全问题,正式环境只能用命令行方式连接,下列是操作全步骤 目录 一、操作逻辑二、操作步骤1、本地安装达梦相关工具2、将服务器mysql导出到本地a) 服务器命令行导出mysql…

如何添加、编辑、调整WordPress菜单

我们最近在使用WordPress建站建设公司网站。我们是使用的hostease的主机产品建设的WordPress网站。在建设网站使用遇到了一些WordPress菜单使用方面的问题。好在hostease提供了不少帮助。 下面把WordPress菜单使用心得分享一下。 本文将详细介绍WordPress菜单的各种功能&#x…

音频录制软件有哪些?这2种推荐给你

音频在当今数字化世界中扮演着至关重要的角色。无论是音乐创作、语音记录、会议记录还是其他任何需要捕捉声音的场景,音频录制软件都是能为我们提供强大功能的工具。 那么到底哪一种软件才最适合您呢?下面小编将为您介绍2款音频录制软件。 方法一&#…

Ansys Mechanical|绳索仿真技术

绳索,俗称绳子,是通过扭或编等方式加强后,连成一定长度的纤维。其拉伸强度很好但没有压缩强度,可用来做连接、牵引的工具。绳索的用途数不胜数:从建筑中的材料固定、到岩土工程中的柔性锚索、汽车门窗的升降拉索、电缆…

在系统学习C语言之前所需要了解的知识

C语言常见概念 前言1. C语言是什么2. C语言的历史和辉煌3. 编译器的选择VS20223.1 编译和链接3.2 编译器的对比3.3 VS2022的优缺点优点:缺点: 4. VS项目和源文件、头文件介绍5. 第⼀个C语言程序6. main函数7. printf和库函数8. 关键字介绍9. 字符和ASCII…

Spring Cloud Kubernetes 本地开发环境调试

一、Spring Cloud Kubernetes 本地开发环境调试 上面文章使用 Spring Cloud Kubernetes 在 k8s 环境中实现了服务注册发现、服务动态配置,但是需要放在 k8s 环境中才能正常使用,在本地开发环境中可能没有 k8s 环境,如何本地开发调试呢&#…

【优选算法】—Leetcode—11—— 盛最多水的容器

1.题目 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#…

探索MySQL数学宝库:常用数学函数的秘密操作

欢迎来到我的博客,代码的世界里,每一行都是一个故事 探索MySQL数学宝库:常用数学函数的秘密操作 前言ABS函数(绝对值)ROUND函数(四舍五入)CEIL和FLOOR函数(向上取整和向下取整&#…

酷开科技AI技术支持,酷开系统根据你的喜好量身定制节目

在当今数字化时代,个性化推荐已成为提升消费者体验的关键因素。酷开科技的智慧AI,为消费者提供了精彩的内容推荐服务,更大地丰富了消费者的娱乐生活。 酷开系统中的AI推荐引擎通过学习消费者的观看习惯和偏好,能够快速识别其兴趣…

【C++】-【QT】类库使用-001

1主窗口创建 1.1【makefile】配置 1 源码 QT widgetsSOURCES main.cpp2 图示 1.2源码 1 源码 #include <QWidget> #include <QApplication>using namespace std;int main(int argc,char *argv[]) {QApplication a(argc,argv);QWidget w;w.show();return a…

nginx代理原理(端口复用)探究

前言&#xff1a;对于一些常用的插件&#xff0c;我们应该学会如何使用。同时&#xff0c;其实现原理也要进行深究&#xff0c;可以为其他的项目开发做借鉴。 探究方案&#xff1a; 一、发布两个不同的服务&#xff0c;这两个服务的端口不致 二、配置nginx&#xff0c;让这两…

C语言——文件描述符、系统调用操作文件

文件描述符 在Unix-like操作系统中&#xff0c;文件描述符&#xff08;file descriptor&#xff09;是一个用于标识打开文件或I/O设备的整数值。它是对底层文件系统的抽象&#xff0c;用于在应用程序和操作系统之间传递文件信息。 文件描述符是一个非负整数&#xff0c;通常是…

透明桌面便签便笺怎么设置 透明的便签在哪

在繁忙的工作与生活中&#xff0c;我一直渴望找到一种能够轻松管理待办事项的方式。最近&#xff0c;我发现了一个让我爱不释手的工具。它不仅有着出色的提醒功能&#xff0c;更独特的是&#xff0c;它提供了透明便签的设计。 那么&#xff0c;透明便签的好处究竟有哪些呢&…

第十三届蓝桥杯决赛(国赛)真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 火柴棒数字试题 B: 小蓝与钥匙试题 C: 内存空间试题 D: 斐波那契数组试题 E: 交通信号试题 F: 数组个数试题 G: 六六大顺试题 H : \mathrm{H}: H: 选素数试题 I: 图书借阅试题 J \mathrm{J} J : 括号序列树 发现宝藏 前些天发现了一个…

EPSON推出可定制晶振技术支持

什么叫做定制晶振呢?定制晶振又可以称为订制&#xff0c;订做晶振&#xff0c;爱普生可编程晶振可在0.67MHz~166MHz频率范围内实现任意频率烧录订制。定制频率晶振是基于PLL技术的一次频率烧录的振荡器&#xff0c;在没有温补的情况下也能够产生稳定的频率输出。单CMOS频率输出…

什么才是正确的领域驱动实现架构?

作为一种系统建模方法&#xff0c;DDD同样涉及系统的体系架构设计。区别于分布式、事件驱动、消息总线等架构设计方法&#xff0c;DDD中的架构设计关注前面各章所介绍的聚合、实体、值对象、领域事件、应用服务以及资源库之间的交互方式和风格&#xff0c;并在设计思想上有其独…