赞
踩
参考:Linux之ARM(IMX6U)裸机之I.MX6ULL启动方式详解
作者:一只青木呀
发布时间: 2020-08-09 16:32:07
网址:https://blog.csdn.net/weixin_45309916/article/details/107891591
I.MX6U 支持多种启动方式以及启动设备,比如可以从SD/EMMC、NAND Flash、QSPI Flash
等启动。用户可以根据实际情况,选择合适的启动设备。不同的启动方式其启动方式和启动要
求也不一样,比如上一章中的从SD 卡启动就需要在bin 文件前面添加一个数据头,其它的启
动设备也是需要这个数据头的。本章我们就来学习一下I.MX6U 的启动方式,以及不同设备启
动的要求。
BOOT 的处理过程是发生在 I.MX6U 芯片上电以后,芯片会根据 BOOT_MODE[1:0]的设置来选择 BOOT 方式。 BOOT_MODE[1:0]的值是可以改变的,有两种方式:
I.MX6U 有一个 BOOT_MODE1 引脚和BOOT_MODE0 引脚,这两个引脚对应这 BOOT_MODE[1:0]。 I.MX6U-ALPHA 开发板的这两个引脚原理图如图:
其中 BOOT_MODE1 和 BOOT_MODE0 在芯片内部是有 100KΩ下拉电阻的,所以默认是0。 BOOT_MODE1 和 BOOT_MODE0 这两个引脚我们接到了底板的拨码开关上,这样我们就可以通过拨码开关来控制 BOOT_MODE1 和 BOOT_MODE0 的高低电平。
以 BOOT_MODE1为例,当我们把 BOOT_CFG 的第一个开关拨到“ON”的时候,就相当于 BOOT_MODE1 引脚通过 R88 这个 10K 电阻接到了 3.3V 电源,芯片内部的 BOOT_MODE1 又是 100K 下拉电阻接地,因此此时 BOOT_MODE1 的电压就是 100/(10+100)*3.3V= 3V,这是个高电平, 因此BOOT_CFG 的中的 8 个开关拨到“ON”就是高电平,拨到“OFF”就是低电平。
而 I.MX6U 有四个 BOOT 模式,这四个 BOOT 模式由 BOOT_MODE[1:0]来控制,也就是BOOT_MODE1 和 BOOT_MODE0 这两 IO, BOOT 模式配置如表所示:
BOOT_MODE[1:0] | BOOT类型 |
---|---|
00 | 从 FUSE 启动 |
01 | 串行下载 |
10 | 内部 BOOT 模式 |
11 | 保留(无效) |
当 BOOT_MODE1 为 0, BOOT_MODE0 为 1 的时候此模式使能。串行下载的意思就是可以通过 USB 或者 UART 将代码下载到板子上的外置存储设备中,我们可以使用 OTG1 这个 USB口向开发板上的 SD/EMMC、 NAND 等存储设备下载代码。我们需要将 BOOT_MODE1 拨到“OFF”,将 BOOT_MODE0 拨到“ON”。这个下载是需要用到 NXP 提供的一个软件,一般用来最终量产的时候将代码烧写到外置存储设备中的。【自己理解:下面的BOOT方式更加智能,只需选择好启动设备后会执行内部的BOOT ROM代码,帮我们初始化硬件等操作。这里的串行方式要我们自己去写初始化时钟、中断向量表等。后面讲主频和中断向量表的时候就是我们手动去一一实现的】
当 BOOT_MODE1 为 1, BOOT_MODE0 为 0 的时候此模式使能。在此模式下,芯片会执行内部的 boot ROM 代码,这段 boot ROM 代码会进行硬件初始化(一部分外设),然后从 boot 设备(就是存放代码的设备、比如 SD/EMMC、 NAND)中将代码拷贝出来复制到指定的 RAM 中,一般是 DDR。
当我们设置BOOT 模式为“内部BOOT 模式”以后,I.MX6U 内部的boot ROM 代码就会
执行,这个boot ROM 代码都会做什么处理呢?首先肯定是初始化时钟,boot ROM 设置的系统
时钟如图9.2.1 所示:
图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,
IPG=66MHz。关于I.MX6U 的系统时钟,我们后面会详细讲解。
内部boot ROM 为了加快执行速度会打开MMU 和Cache,下载镜像的时候L1 ICache 会打
开,验证镜像的时候L1 DCache、L2 Cache 和MMU 都会打开。一旦镜像验证完成,boot ROM
就会关闭L1 DCache、L2 Cache 和MMU。
中断向量偏移会被设置到boot ROM 的起始位置,当boot ROM 启动了用户代码以后就可
以重新设置中断向量偏移了。一般是重新设置到我们用户代码的开始地方,关于中断的内容后
面会详细讲解。
前提是设置MODE1和MODE0是从内部BOOT启动的,也就是MODE1=1,MODE0=0时才要选择启动设备。
当 BOOT_MODE 设置为内部 BOOT 模式以后,可以从以下设备中启动:
正点开发板启动设备的底板原理图(如何对应核心板)
这些启动设备如何选择呢?通过BOOT_CFG选择
I.MX6U 同样提供了 eFUSE 和 GPIO 配置两种, eFUSE 就不讲解了。我们重点看如何通过 GPIO 来选择启动设备,因为所有的 I.MX6U 开发板都是通过 GPIO来配置启动设备的。
正如启动模式由BOOT_MODE[1:0]来选择一样,启动设备是通过 BOOT_CFG1[7:0]、 BOOT_CFG2[7:0]和 BOOT_CFG4[7:0] (每个8位)这 24 个配置 IO,这 24 个配置 IO 刚好对应着 LCD 的 24 根数据线 LCD_DATA0~LCDDATA23,当启动完成以后这 24 个 IO 就可以作为 LCD 的数据线使用。这 24 根线和 BOOT_MODE1、 BOOT_MODE0 共同组成了 I.MX6U的启动选择引脚,如图:
虽然有 24 个 IO,但是实际需要调整的只有那几个 IO,其它的 IO 全部下拉接地即可,也就是设置为 0。打开 I.MX6U-ALPHA 开发板的核心板原理图,这 24 个 IO 的默认设置如图:
大部分的 IO 都接地了,只有几个 IO 接高,尤其是 BOOT_CFG4[7:0]这 8 个 IO 都 10K 电阻下拉接地,所以我们压根就不需要去关注 BOOT_CFG4[7:0]。我们需要重点关注的就只剩下了 BOOT_CFG2[7:0]和 BOOT_CFG1[7:0]这 16 个 IO。这 16 个配置 IO 含义在原理图的左侧已经贴出来了,如图:
BOOT_CFG2全部接地,除了BOOT_CFG[3],此位用来选择SD卡启动接口(6ull不止插一个SD卡)。
打开正点原子 I.MX6U-ALPHA 开发板的底板原理图,底板上启动设备选择拨码开关原理图如图:
除 了 BOOT_MODE1 和 BOOT_MODE0 必 须 引 出 来 ,LCD_DATA3~LCDDATA7、 LCD_DATA11 这 6 个 IO 也被引出来了,可以通过拨码开关来设置其对应的高低电平,拨码开关拨到“ON”就是 1,拨到“OFF”就是 0。其中 LCD_DATA11 就是 BOOT_CFG2[3], LCD_DATA3~LCD_DATA7 就是 BOOT_CFG1[3]~BOOT_CFG1[7],这 6 个IO 的配置含义如表
BOOT_CFG1[0] ~ BOOT_CFG1[2]都是定死的,BOOT_CFG1[3] ~ BOOT_CFG1[7]是可以设置的。
BOOT IO 含义, I.MX6U-ALPHA 开发板从 SD 卡、 EMMC、 NAND 启动的时候拨码开关各个位设置方式如表
表9.3.2 I.MX6U-ALPHA 开发板启动设置
我们在“第八章汇编LED 灯试验”中,最终的可执行文件led.bin 烧写到了SD 卡里面,
然后开发板从SD 卡启动,其拨码开关就是根据表9.3.2 来设置的,通过上面的讲解就知道为什
么拨码开关要这么设置了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。