1. 通过两个GPIO可以决定启动方式:

BOOT_MODE[1:0] BOOT 类型
00 从 FUSE 启动
01 串行下载
10 内部 BOOT 模式(CPU固有化的内部不可变的一段程序)
11 保留

2. 一般选择10,即内部boot启动(这段 boot ROM 代码会进行硬件初始化(一部分外设),然后从 boot 设备(就是存放代码的设备、比如 SD/EMMC、NAND)中将代码拷贝出来复制到指定的 RAM 中,一般是 DDR。),这个boot程序就会选择从哪儿拷贝代码呢?那就是:

①、接到 EIM 接口的 CS0 上的 16 位 NOR Flash。
②、接到 EIM 接口的 CS0 上的 OneNAND Flash。
③、接到 GPMI 接口上的 MLC/SLC NAND Flash,NAND Flash 页大小支持 2KByte、4KByte
和 8KByte,8 位宽。
④、Quad SPI Flash。
⑤、接到 USDHC 接口上的 SD/MMC/eSD/SDXC/eMMC 等设备。
⑥、SPI 接口的 EEPROM。

这个是通过GPIO上下拉电平来决定的。

因此在开发板设计时候,通过拨码开关,可以把这几个GPIO融合成最终结果:

arm cortex-A启动过程_桌面操作系统

I.MX6U 的最终可烧写文件组成如下:

①、Image vector table,简称 IVT,IVT 里面包含了一系列的地址信息,这些地址信息在
ROM 中按照固定的地址存放着。

②、Boot data,启动数据,包含了镜像要拷贝到哪个地址(里面我们会设为0X87800000,得和我们程序编译时候的链接地址手动保持一致),拷贝的大小是多少等等。

③、Device configuration data,简称 DCD,设备配置信息,重点是 DDR3 的初始化配置。

④、用户代码可执行文件,比如 led.bin。

当我们设置 BOOT 模式为“内部 BOOT 模式”以后,打开电源(或者按复位键,如果stm32,按复位键会直接从复位中断开始跑),I.MX6U 内部的 boot ROM 代码就会
执行,初始化如下内容:

  1. boot ROM 会将 I.MX6U 的内核时钟设置为396MHz,也就是主频为 396Mhz。System PLL=528Mhz,USB PLL=480MHz,AHB=132MHz,IPG=66MHz
  2. 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 里面的初始化配置主要包括三方面:
    ①、设置 CCGR0~CCGR6 这 7 个外设时钟使能寄存器,默认打开所有的外设时钟。
    ②、配置 DDR3 所用的所有 IO。
    ③、配置 MMDC 控制器,初始化 DDR3。
  3. 进入复位中断,然后跳入main函数。(这些函数里照样可以进行外设初始化)

我们需要使用外设内存,因此DDR3得初始化,不使用虚拟内存,因此MMU不用打开,但是I,D cache能打开最好,加快速度嘛,FPU能打开也最好,加快速度嘛。