【Linux 裸机篇(三)】I.MX6ULL 启动方式

news2024/11/16 1:17:20

目录

  • 一、启动方式选择
    • 1. 串行下载
    • 2. 内部 BOOT 模式
      • 2.1 BOOT ROM 初始化内容
      • 2.2 启动设备
  • 二、镜像烧写
    • 1. IVT
    • 2. Boot data
    • 3. DCD数据

一、启动方式选择

I.MX6ULL 芯片上电后,芯片会根据 BOOT_MODE[1:0]的设置来选择 BOOT 方式。BOOT_MODE[1:0]的值是可以改变的,有两种方式,一种是改写 eFUSE(熔丝),一种是修改相应的 GPIO 高低电平。第一种修改 eFUSE 的方式只能修改次,后面就不能再修改了,所以我们不使用。我们使用的是通过修改 BOOT_MODE[1:0]对应的 GPIO 高低电平来选择启动方式。

在这里插入图片描述


1. 串行下载

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


2. 内部 BOOT 模式

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


2.1 BOOT ROM 初始化内容

当我们设置 BOOT 模式为“内部 BOOT 模式”以后, I.MX6U 内部的 boot ROM 代码就会执行。首先初始化时钟,boot ROM 设置的系统时钟如下图,BT_FREQ 模式为 0,可以看到, boot ROM 会将 I.MX6U 的内核时钟设置为396MHz, 也就是主频为 396Mhz。 System PLL=528Mhz, USB PLL=480MHz, AHB=132MHz,IPG=66MHz。

在这里插入图片描述
  内部 boot ROM 为了加快执行速度会打开 MMU 和 Cache,下载镜像的时候 L1 ICache 会打开,验证镜像的时候 L1 DCache、 L2 Cache 和 MMU 都会打开。一旦镜像验证完成, boot ROM就会关闭 L1 DCache、 L2 Cache 和 MMU。
  中断向量偏移会被设置到 boot ROM 的起始位置,当 boot ROM 启动了用户代码以后就可以重新设置中断向量偏移了。一般是重新设置到我们用户代码的开始地方。


2.2 启动设备

当 BOOT_MODE 设置为内部 BOOT 模式以后,可以从以下设备中启动:

  1. 接到 EIM 接口的 CS0 上的 16 位 NOR Flash。
  2. 接到 EIM 接口的 CS0 上的 OneNAND Flash。
  3. 接到 GPMI 接口上的 MLC/SLC NAND Flash, NAND Flash 页大小支持 2KByte、 4KByte和 8KByte, 8 位宽。
  4. Quad SPI Flash。
  5. 接到 USDHC 接口上的 SD/MMC/eSD/SDXC/eMMC 等设备。
  6. SPI 接口的 EEPROM。

启动设备是通过 BOOT_CFG1[7:0]、 BOOT_CFG2[7:0]和 BOOT_CFG4[7:0] 这 24 个配置 IO 进行设备选择。


二、镜像烧写

I.MX6ULL 不能直接烧写 .bin 文件,需要在 .bin 文件前面添加头部信息生成 .imx 文件才能烧入。
.imx = IVT + Boot data + DCD + .bin

  • IVT:里面包含了一系列的地址信息,这些地址信息在ROM 中按照固定的地址存放着。
  • Boot data:启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等。
  • DCD:设备配置信息,重点是 DDR3 的初始化配置。
  • .bin:用户代码可执行文件,比如 led.bin。

烧写文件后,内部 Boot ROM 会将 .imx 文件拷贝到 DDR 中,.imx 文件如下:

在这里插入图片描述

1. IVT

IVT 包含了镜像程序的入口点、指向 DCD 的指针和一些用作其它用途的指针。内部 Boot ROM 要求 IVT 应该放到指定的位置,不同的启动设备位置不同,而 IVT 在整个 .imx 文件的最前面,其实就相当于要求 .imx 文件在烧写的时候应该烧写到存储设备的指定位置去。整个位置都是相对于存储设备的起始地址的偏移,如图:

在这里插入图片描述以 SD/EMMC 为例, IVT 偏移为 1Kbyte, IVT+Boot data+DCD 的总大小为 4KByte-1KByte=3KByte。
如 .bin 文件的链接地址为 0x87800000,那么 .bin 文件添加头部信息后的 .imx 文件在 DDR 中链接地址为:0x87800000 - (4 * 1024) = 877FF000,IVT 在 DDR 中的链接地址为:0x87800000 - (3 * 1024) = 0x877FF400。

IVT结构数据描述
header0X402000D1根第一个字节 Tag 为0XD1,第二三这两个字节为 IVT 大小,为大端模式,所以 IVT 大小为 0X20=32 字节。第四个字节为 0X40。
entry0X87800000入口地址,也就是镜像第一行指令所在的位置。0X87800000 就是我们的链接地址。
reserved10X00000000未使用,保留。
dcd0X877FF42CDCD 地址,镜像地址为 0X87800000, IVT+Boot Data+DCD 整个大小为 3KByte。因此 load.imx 的起始地址就是 0X87800000-0XC00=0X877FF400。因此 DCD 起始地址相对于 load.imx 起始地址的偏移就是0X877FF42C-0X877FF400=0X2C。
boot data0X877FF420boot 地址, header 里面已经设置了 IVT 大小是 32个 字 节 , 所 以 boot data 的 地 址 就 是0X877FF400+32=0X877FF420。
self0X877FF400IVT 复制到 DDR 中以后的首地址。
csf0X00000000CSF 地址。
reserved20X00000000保留,未使用。

2. Boot data

Boot data 结构数据描述
start0X877FF000整个 load.imx 的起始地址,包括前面 1KByte 的地址偏移。
length0X00200000镜像大小,这里设置 2MByte。镜像大小不能超过2MByte。
plugin0X00000000插件。

3. DCD数据

复位以后, I.MX6ULL 片内的所有寄存器都会复位为默认值,但是这些默认值往往不是我们想要的值,而且有些外设我们必须在使用之前初始化它。为此 I.MX6ULL 提出了一个 DCD(Device Config Data)的概念,和 IVT、 Boot data 一样, DCD 也是添加到 .imx 文件里面的,紧跟在 IVT和 Boot data 后面, IVT 里面也指定了 DCD 的位置。 DCD 其实就是 I.MX6ULL 寄存器地址和对应的配置信息集合, Boot ROM 会使用这些寄存器地址和配置集合来初始化相应的寄存器,比如开启某些外设的时钟、初始化 DDR 等等。 DCD 区域不能超过 1768Byte。

DCD 结构数据描述
header0X40E801D2第一个字节 Tag 为 0XD2,第二和三这两个字节为 DCD 大小,为大端模式,所以 DCD 大小为 0X01E8=488 字节。第四个字节为 0X40。
Write Data Command0X04E401CC第一个为 Tag,固定为 0XCC,第二和三这两个字节是大端模式的命令总长度,为0X01E4=484 个字节。第四个字节是 Parameter,为 0X04,表示目标位置宽度为 4 个字节。
Address0X020C4068寄存器 CCGR0 地址
Value0XFFFFFFFF要写入寄存器 CCGR0 的值,表示打开 CCGR0 控制的所有外设时钟。
…………CCGR1~CCGR5 这些寄存器的地址和值。
Address0X020C4080寄存器 CCGR6 地址
Value0XFFFFFFFF要写入寄存器 CCGR6 的值,表示打开 CCGR6 控制的所有外设时钟。
Address0X020E04B4寄存器 IOMUXC_SW_PAD_CTL_GRP_DDR_TYPE 寄存器地址。
Value0X000C0000设置 DDR 的所有 IO 为 DDR3 模式。
Address0X020E04AC寄存器 IOMUXC_SW_PAD_CTL_GRP_DDRPKE 地址。
Value0X00000000所有 DDR 引脚关闭 Pull/Keeper 功能。
Address0X020E027C寄存器 IOMUXC_SW_PAD_CTL_PAD_DRAM_SDCLK0_P
Value0X00000030DRAM_SDCLK0_P 引脚为 R0/6。
…………全部是 DDR 引脚设置
Address0X020E0248寄存器 IOMUXC_SW_PAD_CTL_PAD_DRAM_DQM1
Value0X00000030DRAM_DQM1 引脚驱动能力为 R0/6
Address0X021B001CMMDC_MDSCR 寄存器
Value0X00008000MMDC_MDSCR 寄存器值
…………MMDC 相关寄存器地址及其寄存器值。
Address0X021B0404MMDC_MAPSR 寄存器
Value0X00011006MMDC_MAPSR 寄存器配置值
Address0X021B001CMMDC_MDSCR 寄存器
Value0X00000000MMDC_MDSCR 寄存器清零

从表中可以看出, DCD 里面的初始化配置主要包括三方面:

①设置 CCGR0~CCGR6 这 7 个外设时钟使能寄存器,默认打开所有的外设时钟。

②配置 DDR3 所用的所有 IO。

③配置 MMDC 控制器,初始化 DDR3。

总结:I.MX6ULL 代码编译出来的.bin 文件不能直接烧写到 SD 卡中,需要在.bin 文件前面加上 IVT、 Boot Data 和 DCD 这三个数据块。这三个数据块是有指定格式的,我们必须按照格式填写,然后将其放到.bin 文件前面,最终合成的才是可以直接烧写到 SD 卡中的文件。


此学习笔记来自 "正点原子” 学习资料,如需详细学习请关注 “正点原子”

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

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

相关文章

【ONE·C++ || list (一)】

总言 主要介绍list的基本函数使用及部分函数接口模拟实现(搭框架)。 文章目录总言1、常用接口与举例演示1.1、接口总览1.2、部分例子1.2.1、头删、头插、尾删、尾插、遍历1.2.2、pos插入删除、迭代器失效问题1.2.3、一些相对陌生接口简介(std::sort和list::sort比较…

D. Captain Flint and Treasure(拓扑排序 + 贪心)

Problem - D - Codeforces 芬特队长参与了另一个寻宝活动,但只发现了一个奇怪的问题。这个问题可能与宝藏的位置有关,也可能不是。这就是为什么弗林特船长决定把解决问题的工作交给他的船员,并提供了一个高得离谱的奖励:休息一天。问题本身听…

【日常】我的扬马最后一小时

文章目录1 Approxmation, Regularization and Relaxation赛前风波惨痛的主场之战释然的痛苦之路后记1 Approxmation, Regularization and Relaxation 在算法理论研究中,为了使得降低问题的求解复杂度,常常会选择牺牲算法的选择求解精度,这种…

Redis-----什么是Redis?

什么是Redis? redis是一个基于内存的key-value结构数据库。 基于内存存储,读写性能高适合存储热点数据(热点商品、资讯、新闻)企业应用广泛 Redis入门 redis简介 redis是一个开源的内存中的数据结构存储系统,数据库…

ASP宿舍管理系统设计与实现

学生宿舍的管理工作也将成为一项十分繁重的工作,建立一个学生宿舍管理系统是非常必要的,可行的。计算机能够极大地提高学生宿舍管理的办事效率,学校要想与先进科学技术接轨,就得科学化、正规化的进行管理。随着社会信息化步伐的加…

使用Unity模拟人群疏散的资料整理

本文地址:https://blog.csdn.net/t163361/article/details/130136283 UnityDemo Evacuation Simulator Unity_EvacuationSimulator Crowd-Simulation-and-Visualization-in-Unity Multi-agent-simulation-program-for-evacuation Crowd-Evacuation-Simulatio…

Android SQLite插入float类型浮点数小数位数异常(四舍五入过的两位小数变成13位小数)的原因和解决方法

浮点数异常截图: 说明: 正常保留两位小数并正确插入的记录是通过db.execSQL(sql);方法插入的,而浮点数异常的是通过ContentValues db.insert() 方式插入的,可以发现问题出在db.insert()方法上,我又试过在put的时候直接输入类似16…

zabbix代理服务器部署

分布式监控的作用: ●分担 server 的集中式压力 ●解决多机房之间的网络延时问题 部署zabbix代理服务器 1、关闭防火墙、修改主机名 systemctl disable --now firewalld setenforce 0 hostnamectl set-hostname zbx-proxy su 2、设置zabbix的下载源,按…

7.2 模拟乘法器及其在运算电路中的应用

模拟乘法器是实现两个模拟量相乘的非线性电子器件,利用它可以方便地实现乘、除、乘方和开方运算电路。此外,由于它还能广泛地应用于广播电视、通讯、仪表和自动控制系统,进行模拟信号的处理,所以发展很快,称为模拟集成…

【微信小程序-原生开发】添加自定义图标(以使用阿里图标库为例)

方式一 &#xff1a; 下载svg导入 优点&#xff1a;操作方便&#xff0c;支持多彩图标缺点&#xff1a;会增加源代码大小 下载 svg 格式的图标图片&#xff0c;放入源码中使用 小程序项目中的路径为 assets\icon\美食.svg 使用时-代码范例 <image class"imgIcon"…

【JSP学习笔记】3.JSP 指令及动作元素

前言 本章介绍JSP的指令和动作元素。 JSP 指令 JSP指令用来设置整个JSP页面相关的属性&#xff0c;如网页的编码方式和脚本语言。 语法格式如下&#xff1a; <% directive attribute"value" %>指令可以有很多个属性&#xff0c;它们以键值对的形式存在&am…

属性文法和语法制导翻译

前言 前面通过词法分析&#xff0c;语法分析&#xff0c;DFA最后接受了一个输入实际上是理解了某一句编程语句&#xff0c;编译器的角色是将高级程序语言编译&#xff08;翻译&#xff09;为汇编代码&#xff0c;通过词法、语法分析编译器可以理解高级程序语言了&#xff0c;那…

JavaScript + DOM

JavaScript 官方文档 https://www.w3school.com.cn/js/index.asp 基本说明 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SgjOIfTi-1681034533049)(E:\Kuangshen\学习笔记\韩顺平java\JavaScript_img\image-20230409130530115.png)] <!DOCT…

华为手表开发:WATCH 3 Pro(18)传感器订阅 方向传感器

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;18&#xff09;传感器订阅 方向传感器初环境与设备方向传感器鸿蒙开发文件夹&#xff1a;文件新增展示的文本标记index.hmlindex.cssindex.js初 希望能写一些简单的教程和案例分享给需要的人 鸿蒙可穿戴开发 环境与设备 系…

Java设计模式之状态模式

状态模式 状态模式允许一个对象在其内部状态改变的时候改变其行为 应用场景 1、一个对象的行为取决于它的状态&#xff0c;并且它必须在运行时根据状态改变它的行为 2、操作中含有庞大的多分支的条件语句&#xff0c;且这些分支依赖于该对象的状态。这个状态通常用一个或者…

管廊隧道怎么定位人员?分享管廊隧道人员定位系统解决方案

管廊隧道施工的安全不仅关系着施工项目的质量与施工效率&#xff0c;更是关系着国家财产安全以及施工人员和人民群众的生命和财产安全。如何有效加强管廊隧道施工安全管理水平成为管廊隧道项目施工企业管理者最为关注的问题。 管廊隧道施工安全管理痛点难题 1.风险预警难 现场…

《数据库系统概论》第三章课后习题 (4个表+三建工程项目)

目录 5. 针对习题4中的4个表试用SQL完成以下各项操作&#xff1a; 9. 为三建工程项目建立一个供应情况的视图&#xff0c;包括供应商代码SNO, 零件代码PNO, 供应数量QTY&#xff0c;针对该视图完成下列查询&#xff1a; 5. 针对习题4中的4个表试用SQL完成以下各项操作&#x…

Resnet代码详解

这篇文章是用来讲解Resnet(残差网络)代码的&#xff0c;结合代码理解残差网络结构。 目录 Bottleneck类 Conv33 Conv11 BasicBlock ResNet _make_layer代码解析 完整的ResNet代码&#xff1a; 可以直接调用torch内置的resnet官方代码。 from torchvision.models impo…

华为手表开发:WATCH 3 Pro(19)传感器订阅 光线传感器

华为手表开发&#xff1a;WATCH 3 Pro&#xff08;19&#xff09;传感器订阅 光线传感器初环境与设备光线传感器鸿蒙开发文件夹&#xff1a;文件新增展示的文本标记index.hmlindex.cssindex.js初 希望能写一些简单的教程和案例分享给需要的人 鸿蒙可穿戴开发 环境与设备 系…

IP子网划分例题详解

子网划分概念&#xff1a; 通过改变ip的掩码长度来改变ip的网络地址&#xff0c;把原来的ip地址从网络位主机位&#xff0c;改成网络位子网位主机位。从而达到缩小主机个数或者扩大主机个数。缩小主机位&#xff0c;可以避免ip资源的浪费&#xff0c;减小广播域&#xff0c;提…