阿尔法(MX6U)启动方式


前言

I.MX6U 支持多种启动方式以及启动设备,可以从 SD/EMMC、 NAND Flash、 QSPI Flash等启动,不同的启动方式其启动方式和启动要求也不一样,从 SD 卡启动就需要在 bin 文件前面添加一个数据头,其它的启动设备也是需要这个数据头


一、启动方式

BOOT 的处理过程是发生在 I.MX6U 芯片上电后,芯片会根据BOOT_MODE[1:0]的设置来选择 BOOT 方式,修改相应的 GPIO 高低电平可以选择不同的启动方式

BOOT_MODE[1:0] BOOT类型
00 从FUSW启动
01 串行下载
10 内部BOOT模式
11 保留

一般,只使用串行下载和内部BOOT模式方式

BOOT_MODE原理图
在这里插入图片描述
BOOT_MODE[1:0]两个引脚在内部都接了100KΩ的下拉电阻,默认是0,也接到开发板的拨码开关上,通过控制拨码开关,可以控制高(NO)/低(OFF)电平

1.串行下载

BOOT_MODE[1:0] = 01(BOOT_MODE1=0,BOOT_MODE0=1)使用该模式,可以通过 USB 或者 UART 将代码下载到板子上的外置存储设备中。

2.内部 BOOT 模式

BOOT_MODE[1:0] = 10(BOOT_MODE1=1,BOOT_MODE0=0)使用该模式,芯片会执行内部的 boot ROM 代码,boot ROM 代码会进行一部分硬件初始化,然后从 boot 设备(存放代码的设备,SD/EMMC、 NAND)中将代码拷贝出来复制到指定的 RAM 中,一般是 DDR中

(1)BOOT ROM 初始化内容

首先初始系统时钟,内部 boot ROM 为了加快执行速度会打开 MMU(存储器管理部件) 和 Cache(存储器)

BOOT ROM 设置系统时钟
下载镜像的时 L1 ICache 会打开,验证镜像的时 L1 DCache、 L2 Cache 和 MMU 都会打开, 当镜像验证完成, boot ROM就会关闭 L1 DCache、 L2 Cache 和 MMU

然后,中断向量偏移会被设置到 boot ROM 的起始位置,当 boot ROM 启动了用户代码后,便可以重新设置中断向量偏移

(2)启动设备选择

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

  1. NOR Flash
  2. OneNAND Flash
    3.NAND Flash
    4.Quad SPI Flash
    5.SPI 接口的 EEPROM

启动设备是通过设置BOOT_CFG1[7:0]、 BOOT_CFG2[7:0]和 BOOT_CFG4[7:0]来选择启动设备

注:这三组IO刚好对应LCD的24根数据线,当启动完成后,就可以当作LCD的数据线使用。

在这里插入图片描述
BOOT_CFG4[7:0]的引脚全部都下拉接地了,可以不用管这一组IO
基本上都是由BOOT_CFG1[7:0]、 BOOT_CFG2[7:0来配置这里的六种选择
在这里插入图片描述

但是,在开发板上设置却是非常简单的阿尔法开发板的选择拨码开关引出了LCD_DATA11,LCD_DATA[3-7]引脚,分别对应BOOT_CFG2[3],BOOT_CFG1[3]~BOOT_CFG1[7]

在这里插入图片描述
IO 的配置含义
在这里插入图片描述
ALPHA 开发板从 SD 卡、 EMMC、 NAND 启动拨码编码:
在这里插入图片描述

二、镜像烧写

使用 imxdownload 将 led.bin 烧写到了 SD 卡中,最终再led.bin前面添加一些头部信息生成一个load.imx文件,那么,imxdownload 对led.bin做了什么呢?

I.MX6U 中的程序其组成为: IVT+Boot data+DCD+.bin

(1)IVT:存放一系列地址信息
(2)Boot data:启动数据,包含了镜像要拷贝到的地址,拷贝的大小是多少
(3)Device configuration data,简称 DCD,设备配置信息,重点是 DDR3 的初始化配置
(4)用户代码可执行文件,*.bin

imxdownload 所生成的 load.imx 就是在 led.bin 前面加上 IVT+Boot data+DCD,内部 Boot ROM 会将 load.imx 拷贝到 DDR 中,用户代码是要一定要从 0X87800000(链接地址)地址开始的,load.imx 在用户代码前面又有 3KByte 的 IVT+Boot Data+DCD 数据,所以,load.imx 在 DDR 中的起始地址就是 0X87800000-3072=0X877FF400

1.Image vector table(IVT)

IVT 存放了一系列的地址信息这些地址信息在ROM 中按照固定的地址存放着,IVT 包含了镜像程序的入口点、指向 DCD 的指针和一些用作其它用途的指针

内部 Boot ROM 要求 IVT 应该放到指定的位置,不同的启动设备位置不同,而 IVT 在整个 load.imx 的最前面,相当于要求 load.imx 在烧写的时候应该烧写到存储设备的指定位置去,整个位置都是相对于存储设备的起始地址的偏移
在这里插入图片描述
以 SD/EMMC 为例, IVT 偏移为 1Kbyte, 总共4K,所以IVT+Boot data+DCD 的总大小为 4KByte-1KByte=3KByte,若SD/EMMC 每个扇区为 512 字节,那么 load.imx 应该从第三个扇区开始烧写,前两个扇区(1k)要留出来, load.imx 从第 3KByte 开始才是真正的.bin 文件

IVT内容
在这里插入图片描述

header格式:
在这里插入图片描述

详细介绍
在这里插入图片描述
在这里插入图片描述

2.DCD 数据

复位后, I.MX6U 片内的所有寄存器都会复位为默认值,这些默认值往往不是我们想要的值,而且有些外设必须在使用之前初始化它

DCD 就是 I.MX6U 寄存器地址和对应的配置信息集合, Boot ROM 会使用这些寄存器地址和配置集合来初始化相应的寄存器,比如开启某些外设的时钟、初始化 DDR 等等,DCD 区域不能超过 1768Byte

DCD区域结构
在这里插入图片描述
DCD 的 header 和 IVT 的 header 类似

CMD 就是要初始化的寄存器地址和相应的寄存器值
CMD格式:
在这里插入图片描述
Address 和 Vlalue/Mask 就是要初始化的寄存器地址和相应的寄存器值
DCD数据
在这里插入图片描述
在这里插入图片描述
DCD 里面的初始化配置主要包括三方面:

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


总结

提示:这里对文章进行总结:

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

Guess you like

Origin blog.csdn.net/qq_53144843/article/details/121432349