ARM(IMX6U)裸机之I.MX6ULL启动头文件详解(内部BOOT ROM、IVT + Boot data + DCD + led.bin)

参考:Linux之ARM(IMX6U)裸机之I.MX6ULL镜像烧写以及启动头文件的详解
作者:一只青木呀
发布时间: 2020-08-09 17:10:00
网址:https://blog.csdn.net/weixin_45309916/article/details/107895975

目录

  • BOOT ROM做的事情
  • 烧写工具imxdownload在led.bin前面添加的头部信息
    • IVT 和 Boot Data 数据(地址信息和启动数据)
      • IVT(8个地址信息)
      • Boot Data(3个启动数据信息)
    • DCD数据(配置内部寄存器初始化外设,成对出现——地址+数据)
  • 头部信息结构总结

BOOT ROM做的事情

在这里插入图片描述

上一节讲到,当 BOOT_MODE1 为 1, BOOT_MODE0 为 0 的时候此模式使能,在此模式下,芯片会执行内部的 boot ROM 代码,这段 boot ROM 代码会进行硬件初始化(一部分外设),然后从 boot 设备(就是存放代码的设备、比如 SD/EMMC、 NAND)中将代码拷贝出来复制到指定的 RAM 中(这个代码也就是前面点灯讲的leds.bin 文件前面添加了一些数据头后生成的 load.imx 文件),一般是 DDR。

简单看下内存映射:
在这里插入图片描述

这个 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 启动了用户代码以后就可以重新设置中断向量偏移了。一般是重新设置到我们用户代码的开始地方。

BOOT ROM和后面讲的头部信息进行配合,完成初始化的。

详见参考手册第八章,如下。
在这里插入图片描述

对BOOTROM的理解,可以参照阅读。还对比了Bootloader,写的不错。

烧写工具imxdownload在led.bin前面添加的头部信息

IVT 和 Boot Data 数据(地址信息和启动数据)

在这里插入图片描述

前面我们设置好 BOOT 以后就能从指定的设备启动了,但是你的设备里面得有代码啊,在LED灯实验中我们使用 imxdownload这个软件将 led.bin 烧写到了 SD 卡中。imxdownload 会在 led.bin前面添加一些头信息,重新生成一个叫做 load.imx 的文件,最终实际烧写的是 laod.imx。那么imxdownload 究竟做了什么? load.imx 和 led.bin 究竟是什么关系?

①、 Image vector table,简称 IVT, IVT 里面包含了一系列的地址信息,这些地址信息在ROM中按照固定的地址存放着。
②、 Boot data启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等。
③、 Device configuration data,简称 DCD,设备配置信息,重点是 DDR3 的初始化配置。
④、用户代码可执行文件,比如 led.bin。 可以看出最终烧写到 I.MX6U 中的程序其组成为: IVT+Boot data+DCD+.bin。所以LED灯实验中的 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

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

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

以 SD/EMMC 为例(上表第四行所示), IVT 偏移为 1Kbyte, IVT+Boot data+DCD 的总大小为 3KByte,load.imx 从第 3KByte 开始才是真正的.bin 文件。

假如 SD/EMMC 每个扇区为 512 字节,那么 load.imx 应该从第三个扇区开始烧写,前两个扇区要留出来。

SD卡为什么偏移1Kbyte(1K字节)?
SD卡前512字节保存了分区表分区信息,如果把SD卡前512字节写入数据的话,那么这个SD卡就废了。这里偏移了1K。

IVT(8个地址信息)

那么 IVT 里面究竟存放着什么东西呢? IVT 里面存放的内容如图(一共八个,每个占4字节):

在这里插入图片描述
第一个存放的就是 header(头), header 格式如图
在这里插入图片描述

  • Tag为一个字节长度,固定为 0XD1
  • Length 是两个字节,保存着 IVT 长度,为大端格式,也就是高字节保存在低内存中
  • Version 是一个字节,为 0X40 或者0X41

实际情况是不是这样的呢? 我们用winhex 软件打开load.imx (前面点亮LED灯生成的)一看便知,winhex 可以直接查看一个文件的二进制格式数据。用winhex 打开以后的load.imxd 如图所示:
在这里插入图片描述
图是我们截取的load.imx 的一部分内容,从地址0X00000000~0X000025F,共608个字节的数据。我们将前44 个字节的数据按照4 个字节一组组合在一起就是:
8个IVT:0X402000D1(左上角第一个,winhex软件低字节在前显示)、0X87800000、0X00000000、0X877FF42C、0X877FF420、0X877FF400、0X00000000、0X00000000
3个Boot Data:0X877FF000、0X00200000、0X00000000

IVT 和Boot Data 所示的格式对应起来如表所示:

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

Boot Data(3个启动数据信息)

Boot Data 的数据格式如图,一个三个,每个占4字节
在这里插入图片描述

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

我们详细的列出了 load.imx 的 IVT+Boot Data 每 32 位数据所代表的意义。这些数据都是由 imxdownload 这个软件添加进去的(由正点原子的左中凯老师在NXP官方u-boot.imx文件里面提取出来的,反推出的,上面的解释是一种猜测,详见视频讲解:https://www.bilibili.com/video/BV1yE411h7uQ?p=13&spm_id_from=pageDriver)。

DCD数据(配置内部寄存器初始化外设,成对出现——地址+数据)

配置内部寄存器,这个寄存器是非内核寄存器

这里是引用

复位以后, I.MX6U 片内的所有寄存器都会复位为默认值,但是这些默认值往往不是我们想要的值,而且有些外设我们必须在使用之前初始化它。为此 I.MX6U 提出了一个 DCD(DeviceConfig 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 是单字节,固定为 0XD2
  • Length 为两个字节,表示 DCD 区域的大小,包含 header,同样是大端模式
  • Version 是单字节,固定为 0X40 或者 0X41

DCD区域结构图中的 CMD 就是要初始化的寄存器地址和相应的寄存器值, 结构如图
在这里插入图片描述

  • Tag 为一个字节,固定为 0XCC
  • Length 是两个字节,包含写入的命令数据长度,包含 header,同样是大端模式
  • Parameter 为一个字节,这个字节的每个位含义如图
    在这里插入图片描述

bytes 表示是目标位置宽度,单位为 byte,可以选择 1、 2、和 4 字节。 flags是命令控制标志位。

Address 和 Vlalue/Mask 就是要初始化的寄存器地址和相应的寄存器值,注意采用的是大端模式(高字节的数据在低位)! 在分析 IVT 的时候我们就已经说过了, DCD数据是从 0X2C 地址开始的。根据我们分析的 DCD 结构可以得到 load.imx 的 DCD数据如表

DCD结构数据描述
header0X40E801D2根据的 header 格式,第一个字节 Tag 为 0XD2,第二和三这两个字节为 DCD 大小,为大端模式,所以 DCD 大小为 0X01E8=488 字节。第四个字节为 0X40
Write Data Command0X04E401CC第一个为 Tag,固定为 0XCC,第二和三这两个字节是大端模式的命令总长度,为 0X01E4=484 个字节。第四个字节是 Parameter,为 0X04,表示目标位置宽度为 4 个字节。
Address0X020C4068寄存器 CCGR0 地址
Value(成对)0XFFFFFFFF要写入寄存器 CCGR0 的值,表示打开 CCGR0 控制的所有外设时钟(前面寄存器点灯讲过)
…………CCGR1~CCGR5 这些寄存器的地址和值。
Address0X020C4080寄存器 CCGR6 地址
Value(成对)0XFFFFFFFF要写入寄存器 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

头部信息结构总结

在这里插入图片描述

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

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

相关文章

(转)git遇到的问题之“Please make sure you have the correct access rights and the repository exists.”...

对于git的提交一直很小心翼翼,感觉一不小心就会踩到莫名的坑。 这不, 某天commit 就遇到了On branch master nothing to commit (working directory clean) 一查意思。你的分支很干净? 干净?excuse me? 然后git push …

ARM(IMX6U)裸机C语言版本LED驱动实验(汇编进入处理器SVC模式、SP堆内存、跳转main函数、链接起始地址)

参考:Linux之ARM(IMX6U)裸机C语言LED驱动实验–驱动编写,编译 作者:一只青木呀 发布时间: 2020-08-11 11:20:17 网址:https://blog.csdn.net/weixin_45309916/article/details/107930284 目录0.简介①、汇编…

IBM TS3200 Drive故障处理方案

一、故障定位1.1.故障信息截图摘要1.2.故障定位通过网线连接带库,进入Web管理模式从右边告警得到信息:Drive Broken Code :F3 02 SCD:5 ; Exception F3 52 –Error 经第二张图片定位,确认Drive 2故障需要更换一块Drive 模块此部件支持热插拔&…

链接脚本的编写( 起始地址、text、data、__bss_start、__bss_end、dis反汇编验证)

目录链接脚本的简介以及简单编写编写本试验的链接脚本链接脚本的简介以及简单编写 链接脚本描述了要链接的文件,以及链接顺序、链接首地址。 在博文ARM(IMX6U)裸机C语言版本LED驱动实验中,我们在编译过程中使用Makefile 来链接代…

java 无法加载资源,JavaScript:无法加载资源:服务器响应状态为404(未找到)

我处理 JavaScript 应用程序,该应用程序在 https://localhost:63342/WalletClient/index.html_ijtk4ock08pqsve8hb7b2b34ou3h5 的localhost地址中打开 . 看起来像这样,单击余额按钮时,它应执行以下 Ajax GET 请求并尝试打开新页面 balance.ht…

ARM(IMX6U)裸机模仿STM32驱动开发实验(定义外设结构体)

参考:Linux之ARM(IMX6U)裸机模仿STM32驱动开发格式 作者:一只青木呀 发布时间: 2020-08-15 12:11:56 网址:https://blog.csdn.net/weixin_45309916/article/details/108019447 目录0.外设结构体抽象思路1.模…

ARM(IMX6U)裸机官方SDK包使用

参考:Linux之ARM(IMX6U)裸机C语言LED驱动实验–驱动编写,编译 作者:一只青木呀 发布时间: 2020-08-11 11:20:17 网址:https://blog.csdn.net/weixin_45309916/article/details/107930284 目录1、I.MX6ULL 官…

Leaflet中添加的不同图层样式图标

如上图,具体问题请查看对应html页引用的basemaps的css样式。 如下图是本项目引用的css样式: .basemap img { width: 48px; border: 2px solid #FFF; margin: 0 2px; /*border-radius: 40px;*/ box-shadow: 0 1px 5px rgba(0,0,0,0.65)} 当css样式中的bor…

ARM(IMX6U)BSP工程文件管理(分文件编程)

参考:Linux之ARM(IMX6U)BSP工程管理实验 作者:一只青木呀 发布时间: 2020-08-15 23:41:37 网址:https://blog.csdn.net/weixin_45309916/article/details/108028093 目录1、工程管理简介1.1、创建bsp、imx6…

php图片视频,PHP中使用php5-ffmpeg撷取视频图片实例

前几天在玩 FFmpeg 的时后,突然发现 Ubuntu 上多了 php5-ffmpeg 这个扩充套件,就想来玩玩看,看好不好用,有两个结论:读取影片取决于 FFmpeg 的支援性,如果想要什么格式都支援的话,建议自己重新编…

ARM(IMX6U)裸机C语言蜂鸣器驱动实验(BSP+SDK)

参考:Linux之ARM(IMX6U)裸机C语言蜂鸣器驱动实验–驱动编写,编译 作者:一只青木呀 发布时间: 2020-08-16 14:47:23 网址:https://blog.csdn.net/weixin_45309916/article/details/108032168 目录1、有源蜂鸣…

java金字塔的流程图,R中的金字塔图

Plotrix可能更容易,但可以反汇编ggplot图表,并将它们排列为金字塔图 . 使用 eipi10的数据(谢谢),并调整drawing-pyramid-plot-using-r-and-ggplot2中的代码,我为"males","females"和"country…

ARM(IMX6U)裸机按键输入实验(BSP+SDK、GPIO输入与输出、按键消抖)

参考:Linux之ARM(IMX6U)裸机按键输入实验(GPIO的输出与输入) 作者:一只青木呀 发布时间: 2020-08-17 21:43:37 网址:https://blog.csdn.net/weixin_45309916/article/details/108057…

php 提取正文算法,PHP生成文章摘要算法_栈

之前网上复制了一个摘要算法,一直使用正常。最近写的一篇前500字里含有超链接,就导致摘要生成有误,从而影响了前端样式。所以后面打算自己写,想起大学编译原理匹配表达式的大致思想,就决定采用栈的思想试试。实现目标&…

设计模式 之 《组合模式》

GOOD&#xff1a;整体和部分可以被一致对待&#xff08;如WORD中复制一个文字、一段文字、一篇文章都是一样的操作&#xff09; #ifndef __COMPOSITE_MODEL__ #define __COMPOSITE_MODEL__ #include <iostream> #include <string> #include <vector> using n…

ARM(IMX6U)裸机主频和时钟

参考&#xff1a;Linux之ARM&#xff08;IMX6U&#xff09;裸机主频和时钟配置 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-08-28 10:39:17 网址&#xff1a;https://blog.csdn.net/weixin_45309916/article/details/108237599 目录1、I.MX6U 时钟系统详解系统时钟…

关联矩阵古林法的matlab代码,[转载][原创]灰色关联分析及Matlab程序实现

灰色系统理论由我国著名学者邓聚龙教授于1982提出。灰色关联分析是灰色系统理论的一个分支&#xff0c;应用灰色关联分析方法对受多种因素影响的事物和现象从整体观念出发进行综合评价是一个被广为接受的方法。一、灰色关联分析法的建模过程灰色关联分析法的基本思想是根据各比…

C语言排序(桶排序,冒泡排序,选择排序,插入排序,快速排序)

参考&#xff1a;C语言五大排序&#xff08;桶排序&#xff0c;冒泡排序&#xff0c;选择排序&#xff0c;插入排序&#xff0c;快速排序&#xff09;动态演示 作者&#xff1a;一只青木呀 发布时间&#xff1a; 2020-09-09 20:18:43 网址&#xff1a;https://blog.csdn.net/we…

FIFO分枝_限界算法

问题&#xff1a; 检索4-皇后问题的状态空间树如下图的基本过程。&#xff08;4-皇后问题解空间的树结构&#xff0c;结点按深度优先检索编号&#xff09; 如果按序扩展这些结点&#xff0c;则下一个E-结点就是结点2。扩展结点2后生成结点3&#xff0c;8和13。利用限界函数(同行…

智能家居APP使用指南

参考&#xff1a;智能家居APP使用指南 作者&#xff1a;图触靓 发布时间&#xff1a; 2021-04-14 14:11:40 网址&#xff1a;https://blog.csdn.net/bhbhhyg/article/details/115694774 目录一、如何修改IP&#xff0c;端口号&#xff0c;以及发送的指令二、如何增加或者删除一…