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融合成最终结果:
I.MX6U 的最终可烧写文件组成如下:
①、Image vector table,简称 IVT,IVT 里面包含了一系列的地址信息,这些地址信息在
ROM 中按照固定的地址存放着。
②、Boot data,启动数据,包含了镜像要拷贝到哪个地址(里面我们会设为0X87800000,得和我们程序编译时候的链接地址手动保持一致),拷贝的大小是多少等等。
③、Device configuration data,简称 DCD,设备配置信息,重点是 DDR3 的初始化配置。
④、用户代码可执行文件,比如 led.bin。
当我们设置 BOOT 模式为“内部 BOOT 模式”以后,打开电源(或者按复位键,如果stm32(cortex-m),按复位键会直接从复位中断开始跑,而cortex-a会从内部bootrom程序开始跑),I.MX6U 内部的 boot ROM 代码就会执行,初始化如下内容:
- boot ROM 会将 I.MX6U 的内核时钟设置为396MHz,也就是主频为 396Mhz。System PLL=528Mhz,USB PLL=480MHz,AHB=132MHz,IPG=66MHz
- 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。 - 进入复位中断,然后跳入main函数。(这些函数里照样可以进行外设初始化)
我们需要使用外设内存,因此DDR3得初始化,不使用虚拟内存,因此MMU不用打开,但是I,D cache能打开最好,加快速度嘛,FPU能打开也最好,加快速度嘛。