I.MX6U-镜像烧写

1020 字
5 分钟
I.MX6U-镜像烧写

一、镜像的组成#

在编写裸机代码时,最终下载的代码并不是编译生成的 .bin 文件,而且也不是将最终代码直接放在SD卡中就可以了的。这是因为 NXP 有规定其启动应该从哪里开始。

裸机代码中,将 .bin转换为了 load.imx,它是由以下几部分构成的:

  • IVT(Image vector table):

    里面包含了一系列的地址信息,这些地址信息在ROM 中按照固定的地址存放着

  • Boot Data

    启动数据,包含了镜像要拷贝到哪个地址,拷贝的大小是多少等等

  • DCD(Device configuration data):

    设备配置信息,重点是 DDR3 的初始化配置

  • user code

    用户代码,即编译后生成的 .bin文件

因此,最终烧写到 I.MX6U 中的程序其组成为: IVT + Boot Data + DCD + .bin

二、存放位置#

生成的 .imx文件对在存储介质中的存放位置NXP也有所要求:

这里写的是ITV的存放位置要求,因为后面的部分是紧挨这个,也就是整个文件的存放偏移要求。

可以看到,从SD卡启动时,要求从存储介质起始地址偏移 1Kbyte 开始,如果一个扇区是512字节,就是偏移2个扇区。大小就是 4 Kbyte - 1 Kbye = 3Kbye

三、镜像格式#

镜像的构成格式和映射关系如下:

3.1、IVT格式#

IVT成员每个都是32位数据,一共8个,32字节。

  • header

    • Tag (1 Byte):固定为0xD1,一个字节
    • Length (2 Byte):保存着IVT的长度,两个字节,大端端序
    • Version (1 Byte):为0x40或者0x41,一个字节
  • entry

    由镜像映射图可以知道,保存的是App的起始地址。就是裸机编成中设置的 0x87800000

  • resetved1

    保留,未使用

  • dcd

    DCD 地址,其偏移为 IVT + Boot Data,一共44个字节,如果中间不留空的话,从 entry 反推,那么就是:

    文件起始地址:0x87800000 - 0xC00 = 0x877FF400

    DCD地址:0x877FF400 + 44 = 0x877FF42C

  • boot_data

    Boot Data 地址,如果中间不留空的话,从 entry 反推,那么就是:

    文件起始地址:0x87800000 - 0xC00 = 0x877FF400

    Boot Data地址:0x877FF400 + 32 = 0x877FF420

  • self

    IVT 自身复制到 DDR 中以后的地址,从 entry 反推,那么就是:

    文件起始地址:0x87800000 - 0xC00 = 0x877FF400

  • csf

    CSF 地址,使用上面的方法进行推算即可,和 app 大小有关。

  • reserved2

    保留,未使用

3.2、Boot Data#

Boot Data成员每个同样都是32位数据,一共3个,12字节。

  • start

    整个 .imx 的起始地址,包括前面 1KByte 的地址偏移,即:

    0x877FF400 - 0x400 = 0x877FF000

  • length

    镜像大小,这里设置 2MByte。镜像大小不能超过 2MByte。

  • plugin

    插件,设置为0x00000000即可,可以前往参考手册的Pilgin image 查看详细信息。

3.3、DCD#

即设备配置数据,BOOT ROM代码将根据此数据段,对设备的驱动进行配置,比如开启某些外设的时钟、初始化 DDR 等等,便于加载镜像。

DCD字段最大不能超过 1768 字节。结构如下:

首先就是DCD header,4字节,其结构如下:

  • Tag (1 Byte):

    固定为0xD2

  • Length (2 Byte):

    DCD区域的大小,包含Header,同样是大端结构。

  • Version (1 Byte):

    固定为0x41或0x42。

然后就是 CMD 部分了,其结构如下:

  • Tag (1 Byte):

    固定为0xCC。

  • Length (2 Byte):

    包含写入的命令数据长度,包含 header,同样是大端模式。

  • Parameter (1 Byte):

    这个参数含义如 Table 8-29

    • bytes:表示是目标位置宽度,单位为 byte,可以选择 1、 2、和 4 字节,一般设置为0x04个字节。
    • flags:命令控制标志位,一般设置为0即可。
  • [Address] (字节由Parameter.bytes设置):

    寄存器地址。

  • [Value/Mask] (字节由Parameter.bytes设置):

    写入的数值或掩码。

正点原子提供的结构如下:

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

  1. 设置 CCGR0~CCGR6 这 7 个外设时钟使能寄存器,默认打开所有的外设时钟。
  2. 配置 DDR3 所用的所有 IO。
  3. 配置 MMDC 控制器,初始化 DDR3

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

评论区

Profile Image of the Author
lim
Hello, I'm lim.
公告
欢迎来到我的博客!这是一则示例公告。
分类
标签
站点统计
文章
11
分类
4
标签
5
总字数
14,426
运行时长
0
最后活动
0 天前