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

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

3天内不再提示

System Boot启动的分析

汽车电子技术 来源:程序猿搬砖 作者:程序猿搬砖 2023-03-02 16:29 次阅读

Boot Mode

I.MX6ULL使用BOOT_MODE[1:0]两个寄存器来确定通电或者复位时的启动方式,下面这个表格列举了具体的四种启动方式:

图片Boot From Fuses: 从熔丝引导启动,这个启动与Internal Boot模式很像,但这种方式对于GPIO配置的启动参数无效,需要使用eFuses专用的配置进行引导。它的配置只能修改一次,后面就不能再修改了,所以这种方式基本不用。

Serial Downloader: 通过USB或者UART下载一个镜像引导程序到内部的RAM中启动。

Internal Boot: 从内部boot code启动。boot code是固定在SOC上面的一段代码,boot code还会对硬件进行初始化(如果初始化系统时钟频率)。根据BOOT_CFG的配置选择从启动设备进行启动,跳转到指定的镜像文件地址开始执行。如果在启动过程中遇到了错误,则会从Serial Downloader进行启动。

开发板开关电路图分析

下面这张图展示了开发板上面连接的具体引脚图片以BOOT_MODE0为例,管脚芯片内部接了一个100K的下拉电阻,默认状态是低电平(值0),当把开关拨到ON后电源接通,引脚通过一个10K的电阻接到了一个3.3V的电源,通过计算可得到引脚上分到了3V的电压为高电平,则引用值是1。

Internal Boot 配置

I.MX6ULL提供BOOT_MODE[1:0]与其它的24根LCD引脚共通组成了复杂的启动配置选项,但是在使用时能用到的只有其中少部分,其它大部分都是默认下拉接地(即值是0)不需要额外配置,如下图:图片其中BT_CFG4全部下拉接地了,这一组就忽略它。下面这张图给出了BT_CFG1BT_CFG2的配置与其功能:图片

BT_CFG2[4:3]: I.MX6ULL支持两个SD/eMMC,00是SD1/eMMC1,01是SD2/eMMC2。10与11是保留未使用,可见实际起作用的是BT_CFG2[3]这个引用的值决定了从哪一张SD卡启动。BT_CFG2[3]对应了I.MX6ULL手册中的LCD_DATA11引用。I.MX6ULL开发板上面0用于外接SDK卡,1用于板载的eMMC。

BOOT_CFG1[3]: 当从 SD/EMMC 启动的时候设置启动速度,当从 NAND 启动的话设置 NAND 数量。图片

BOOT_CFG1[7:4]的配置如下图:图片图中某些位是用x来表示的,即这个位不管是0还是1都是同等的启动效果。

更完整的详解表格如下图:图片

实例启动配置表:

启动方式 BOOT_MODE0 BOOT_MODE1 BOOT_CFG2[3] BOOT_CFG1[3] BOOT_CFG1[7:4]
USB 0 1 0 0 0000
SD 1 0 0 0 010x
eMMC 1 0 1 0 011x
NAND 1 0 0 0 100x

通过以上的配置可将指定具体的启动设备,如果了启动设备之后,boot code会从指定设备中读取镜像文件来执行。

镜像文件分析

I.MX6ULL使用的是小端模式,手册中使用大端模式的地方会特意说明。

通过对LED驱动实现最终烧写的load.mix文件得到如下图表:图片

IVT(Image Vector Table)

图片上面这个表格详细的描述了IVT+BOOT DATA+DCD在不同启动设备中的固定位置(相对设备起始地址的偏移量)以及从起始地址开始可用的初始化加载范围,SD/eMMC启动模式偏移量为1KB,整个初始化加载范围是4KB,则IVT+BOOT DATA+DCD可使用的范围是3KB。

图片

  • header: 描述了整个IVT
Tag Length Version
0xD1 0x0020(32) 0x40
  • entry: 0x87800000,bin文件第一条指令地址,这个地址是在DDR中的地址。
  • boot data: 0x877FF420,相对于IVT的起始地址: 0x877FF400偏移了32个字节。
  • dcd: 0x877FF42C,即dcd的数据在DDR中的地址。entry的地址是0x87800000,那可以计算(减去3KB: 0xC00)得到IVT的起始地址是: 0x877FF400。dcd的起始地址相对于IVT起始地址偏移了44个字节(ivt+boot data结构,即: 0x2C), IVT的地址加上0x2C得到dcd的地址是: 0x877FF42C。
BOOT DATA
  • start: 描述了整个load.mix(烧写到SD卡中的文件)的起始地址(在DDR中),包括了偏移的1KB,entry地址(链接起始地址)为:0x87800000 - 0x1000(4KB) = 0x877FF000。
  • length: 描述了整个load.mix的大小,在烧写的时候写入的是0x00200000,即2MB大小,整个镜像文件的大小不能超过2MB。
  • plugin: 0x00000000,没有插件设置成0
DCD(Device Configuration Data)

DCD数据的作用则是在boot code启动加载的时候对三件设备进行配置以及检查,通过配置寄存器的写入数据可快速高效的实现寄存器或者DDR的初始化。

  • header: 头部结构描述了整个DCD的长度
Tag Length Version
0xD2 0x01E8(488) 0x40
  • Write Data Command: 对指定寄存器进行数据写入操作 每一个Command的都有一个头部,描述了这个Command需要执行的指令长度, Parameter的第0、1、2三位描述了指定目标的长度,0x04(100)表示指令目标(指令对应的Value)的长度是4字节。Length描述了整个Command有484个字节的指令数量,包含了头信息,那实际操作的指令是: (484 - 4) / 8 = 60,即当前Command有60条写寄存器数据的操作指令。
Tag Length Parameter
0xCC 0x01E4(484) 0x04

除了Write Data Command还有Check data commandNOP command以及Unlock command指令块。

boot code根据启动设备的不同从固定的地址开始加载镜像文件之后并对镜像文件进行解析,通过IVT中的地址将数据拷贝到DDR中指定的地址,读取DCD初始化硬件(比如DDR)之后,开始执行bin文件0x87800000的第一条指令。这样就实现了从SD/eMMC/NAND等设备的启动了。

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

    关注

    30

    文章

    5028

    浏览量

    117719
  • 启动
    +关注

    关注

    0

    文章

    27

    浏览量

    13794
  • 复位
    +关注

    关注

    0

    文章

    159

    浏览量

    24047
收藏 人收藏

    评论

    相关推荐

    u-boot启动流程分析

    今天给大家全面的分析一下u-boot启动流程。整理这篇文章花费时间较长,中间很长时间未更新,希望这篇文章对大家有所帮助。
    发表于 07-12 15:16 453次阅读
    u-<b class='flag-5'>boot</b><b class='flag-5'>启动</b>流程<b class='flag-5'>分析</b>

    U-BOOT启动流程分享

    Bootloader移植(下)U-BOOT 启动流程u-boot启动三个2启动步骤(重点)U-boot
    发表于 01-18 10:17

    基于S3C44B0的U-Boot启动分析和移植实现

    U-Boot 是sourceforge网站上的一个开源项目,是当今比较流行、功能强大的BootLoader,能支持多种体系结构。本文在阐述U-Boot启动过程之后,对其在S3C44B0上移植过程中的要点加以
    发表于 08-27 09:08 37次下载

    U-Boot启动及移植分析

    bootloader 开发是嵌入式系统必不可少而且十分重要的部分,U-Boot 为功能强大的bootloader 开发软件。本文详细分析了U-Boot启动流程,并结合其源码,阐述了
    发表于 09-01 16:34 27次下载

    Porting U-Boot to the Control

    in details. As the development of the embedded system, the U-Boot is getting more andmore useful of the boot load
    发表于 01-25 15:45 13次下载

    适于OMAP的多级启动Boot Loader

    通过对OMAP启动方式的分析,针对OMAP需要从外部Flash启动、耗时大、风险高的缺点,提出了一种多级启动Boot Loader设计方案
    发表于 10-25 17:04 0次下载

    STM32F09x不使用BOOT脚实现System Bootlo

    STM32F09x不使用BOOT脚实现System Bootloader升级代码
    发表于 12-07 18:17 0次下载

    适于OMAP多级启动Boot Loader

    适于OMAP多级启动Boot Loader
    发表于 10-27 10:21 5次下载
    适于OMAP多级<b class='flag-5'>启动</b><b class='flag-5'>Boot</b> Loader

    STM32的三种Boot模式及验证

    BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。2. 三种Boot模式的比较主闪存器(Main Flash memory)是STM32内置的Flash,一般我们使用JTAG
    发表于 11-26 19:51 88次下载
    STM32的三种<b class='flag-5'>Boot</b>模式及验证

    HAB boot启动流程与实现步骤

    在《深扒HAB boot 启动安全性》中,小编介绍了HAB boot启动流程(如图1所示),其中的1、2、3验证步骤本质上就是验签过程。
    的头像 发表于 08-12 09:39 1175次阅读

    聊一聊汽车控制器的启动——BOOT

    你有没有遇到过电脑新安装了软件,然后提示你Reboot的场景?这里的Reboot,大家都知道是重启,而Boot就是启动的意思。但你有没有想过为什么电脑启动会叫做Boot?
    的头像 发表于 02-03 17:34 1471次阅读

    STM32F09x不使用BOOT脚实现System Bootloader升级代码

    电子发烧友网站提供《STM32F09x不使用BOOT脚实现System Bootloader升级代码.pdf》资料免费下载
    发表于 09-25 15:08 1次下载
    STM32F09x不使用<b class='flag-5'>BOOT</b>脚实现<b class='flag-5'>System</b> Bootloader升级代码

    Spring Boot启动 Eureka流程

    在上篇中已经说过了 Eureka-Server 本质上是一个 web 应用的项目,今天就来看看 Spring Boot 是怎么启动 Eureka 的。 Spring Boot 启动 E
    的头像 发表于 10-10 11:40 418次阅读
    Spring <b class='flag-5'>Boot</b><b class='flag-5'>启动</b> Eureka流程

    Spring Boot启动原理

    来指定依赖,才能够运行。我们今天就来分析讲解一下 Spring Boot启动原理。 1. Spring Boot 打包插件 Spring Boo
    的头像 发表于 10-13 11:44 369次阅读
    Spring <b class='flag-5'>Boot</b>的<b class='flag-5'>启动</b>原理

    安全启动Secure Boot流程

    安全启动-Secure Boot 除了NSPE和SPE两个环境的沟通流程之外,secure boot也是Trusted Firmware很重要的设计环节。 Secure boot最主要
    的头像 发表于 11-02 16:45 614次阅读
    安全<b class='flag-5'>启动</b>Secure <b class='flag-5'>Boot</b>流程