I.MX6ULL 支持多种启动方式以及启动设备,比如可以从 SD/EMMC、 NAND Flash、 QSPI Flash等启动。用户可以根据实际情况,选择合适的启动设备。不同的启动方式其启动方式和启动要求也不一样,比如上一章中的从 SD 卡启动就需要在 bin 文件前面添加一个数据头,其它的启动设备也是需要这个数据头的。本章我们就来学习一下 I.MX6ULL 的启动方式,以及不同设备启动的要求。
9.1 启动方式选择
BOOT 的处理过程是发生在 I.MX6ULL 芯片上电以后,芯片会根据 BOOT_MODE[1:0]的设置来选择 BOOT 方式。 BOOT_MODE[1:0]的值是可以改变的,有两种方式:
第一种方式:改写 eFUSE(熔丝),修改 eFUSE 的方式只能修改一次,后面就不能再修改了;
第二种方式:一种是修改相应的 GPIO 高低电平,修改 BOOT_MODE[1:0]对应的 GPIO 高低电平来选择启动方式,所有的开发板都使用的这种方式。
I.MX6ULL 有一个 BOOT_MODE1 引脚和BOOT_MODE0 引脚,这两个引脚对应这 BOOT_MODE[1:0]。 I.MX6ULL-ALPHA 开发板的这两个引脚原理图如图 9.1.1 所示:
![](https://img-blog.csdnimg.cn/img_convert/d47e38a8bfd9bc1f2622bb4586c82eb9.png)
图 9.1.1 BOOT_MODE 原理图
其中 BOOT_MODE1 和 BOOT_MODE0 在芯片内部是有 100KΩ下拉电阻的,所以默认是0。 BOOT_MODE1 和 BOOT_MODE0 这两个引脚我们也接到了底板的拨码开关上,这样我们就可以通过拨码开关来控制 BOOT_MODE1 和 BOOT_MODE0 的高低电平。
以 BOOT_MODE1为例,当我们把 BOOT_CFG 的第一个开关拨到“ON”的时候,就是高电平,拨到“OFF”就是低电平。
I.MX6ULL 有四个 BOOT 模式,这四个 BOOT 模式由 BOOT_MODE[1:0]来控制,也就是BOOT_MODE1 和 BOOT_MODE0 这两 IO, BOOT 模式配置如表 9.1.1 所示:
![](https://img-blog.csdnimg.cn/img_convert/dd7c552bb2177edc3daa23f15444fa06.png)
表 9.1.1 BOOT 类型
本开发板用到的只有第二和第三种 BOOT 方式。
9.1.1 串行下载
当 BOOT_MODE1 为 0, BOOT_MODE0 为 1 的时候此模式使能,串行下载就是可以通过 USB 或者 UART 将代码下载到板子上的外置存储设备中,我们可以使用 OTG1 这个 USB口向开发板上的 SD/EMMC、 NAND 等存储设备下载代码。这个下载是需要用到 NXP 提供的一个软件,一般用来最终量产的时候将代码烧写到外置存储设备中的,后面讲解如何使用。
9.1.2 内部 BOOT 模式
当 BOOT_MODE1 为 1, BOOT_MODE0 为 0 的时候此模式使能,在此模式下,芯片会执行内部的 boot ROM 代码,这段 boot ROM 代码会进行硬件初始化(一部分外设),然后从 boot 设备(就是存放代码的设备、比如 SD/EMMC、 NAND)中将代码拷贝出来复制到指定的 RAM 中,一般是 DDR。
9.2 BOOT ROM 初始化内容
当设置 BOOT 模式为“内部 BOOT 模式”以后, I.MX6ULL 内部的 boot ROM 代码就会执行,首先肯定是初始化时钟, boot ROM 设置的系统时钟如图 9.2.1 所示
![](https://img-blog.csdnimg.cn/img_convert/ec9ee1430aad503aebad1f42ff592f00.png)
图 9.2.1 boot ROM 系统时钟设置
在图 9.2.1 中 BT_FREQ 模式为 0,可以看到, boot ROM 会将 I.MX6U 的内核时钟设置为396MHz, 也就是主频为 396Mhz。 System PLL=528Mhz, USB PLL=480MHz, AHB=132MHzÿ