I.MX6开发板 启动流程分享 -迅为嵌入式

2019-07-13 09:25发布

本篇文章是Nxp官方参考手册IMX6DQRM中Chapter 8System Boot的翻译,翻译中如有理解偏差和用词不当之处,请网友多多指教。 8.1 总揽 
boot处理过程开始于处理器的上电复位,这时,硬件复位逻辑强制ARM内核执行芯片内置的ROM Boot程序。Boot ROM 代码使用内置的寄存器BOOT_MODE[1:0]状态–后者取决于eFuses和(或)GPIO设定状态,来确定启动流(boot flow)设备行为。 
Boot的主要特性包含: 
•支持从各种启动设备上启动 
•串行下载支持 
• 设备配置数据(DCD)和插件 
• 数字签名和基于HAB的加密术 
• 从低功耗模式唤醒 
• 唤醒第二个内核(core)
boot ROM支持下面的启动设备: 
• NOR Flash 
• NAND Flash 
• OneNAND Flash 
• SD/MMC 
• Serial ATA (SATA) HDD (only i.MX 6Dual/6Quad) 
• Serial (I2C/SPI) NOR Flash and EEPROM
正常操作模式下,Boot ROM 使用BOOT_MODE的状态和eFUSEs来确定启动设备。当为了开发目的时,决定启动设备的eFUSEs常常被GPIO 引脚输入所重载。 
含有新Image的启动设备,如SD/MMC Flash。典型的,这个配给程序(前者)被下载到内部RAM中,来允许对启动设备的编程。这个ROM串行下载器使用non-stream模式串行高速USB 。 
Boot ROM 允许从低功耗和第二个Cortex-A9内核中唤醒。在启动时,ROM检查ARM内核 ID和电源Gating状态寄存器,在低功耗模式唤起时,主内核(ID=0)会跳过从启动设备加载Image,跳到保存到PERSISTENT_ENTRY0寄存器中的地址。在所有的电源模式下唤起时 ,次内核(ID!=0)跳到PERSISTENT_ENTRY中的地址(这里0 设备配置数据(DCD)特性,允许Boot ROM代码从驻留在启动设备上的外部编程内核镜像(Image)中获取SOC配置数据,例如,DCD可以用来对DDR控制器编程,来优化启动执行的设定。DCD只能限定为内存区域和外围地址空间,且这些地址区域是为了启动(boot)所必须考虑的顾及 。
8.2 启动模式 
在复位时,芯片会检查ARM核ID和电源门控制状态寄存器。正常操作模式下,Boot ROM 使用BOOT_MODE的状态和eFUSEs来确定启动设备。当为了开发目的时,eFUSEs用作确定启动设备,或许使用GPIO输入重载值。 
当被从低功耗启动模式唤醒时,内核会跳过时钟设置,Boot ROM 会检查PERSISTENT_ENTRY0所指向的地址空间的有效性。如果该地址空间有效,就会开始执行PERSISTENT_ENTRY0寄存器中的进入点(Entry Pointer),如果无效,则内核执行系统复位。第二个内核(ID!=0)会重复上面同样的动作,即检查PERSISTENT_ENTRY 的指向地址空间的有效性,所不同的是,当该地址空间无效时,会发出唤醒错误中断,并执行等待中断指令。其他内核的中断服务程序必须重新配置系统,且复位第二个启动失败的内核。 
注意 
使能第二个内核的代码不是ROM的一部分,他必须是低级软件的一部分。
8.2.1 启动模式引脚配置 
设备有四种启动模式(其中一种为FSL的保留模式)。启动模式的选择基于保存在寄存器BOOT_MODE中的二进制值。BOOT_MODE是在POR_B的上升沿对BOOT_MODE0和BOOT_MODE1输入 引脚的采样值,一旦此输入被采样,它们其后的状态就不再影响BOOT_MODE内部寄存器的内容。内部BOOT_MODE寄存器的状态或许读自SOC的启动模式寄存器(SRC_SBMR2)的BMOD[1:0] 域。可用的启动模式有:从Fuses启动,通过USB的串行启动,内部启动。 
见下面的配置表:
BOOT_MODE[1:0] Boot Type
00 Boot From Fuses
01 Serial Downloader
10 Internal Boot
11 Reserved
8.2.3 Fuses启动模式 (BOOT_MODE[1:0] = 00b) 
当BOOT_MODE[1:0]寄存器为00b是,选择为从Fuses模式下启动。该模式和内部启动模式很相似,只是有一点不同:在此模式下,GPIO启动重载引脚会被忽略。启动ROM代码只使用启动eFuse配置,此模式也支持使用HAB的安全启动。如果配置为从Fuses启动,启动流(boot flow)会受BT_FUSE_SEL eFUSE的值控制。如果BT_FUSE_SEL = 0,表明这个启动设备(如Flash,SD/MMC)还没有被编程,启动流(boot flow)会直接跳到串行下载器。如果BT_FUSE_SEL = 1,就允许正常的启动流(boot flow),ROM会尝试从选择的启动设备来启动。当板子第一次被使用,默认的eFuses或许在硬件平台中没有被正确的配置,在此情况下,Boot ROM代码会尝试从不存在的设备上启动,这或许会在一些Pads上产生电器/逻辑损坏。使用从Fuses模式启动能解决这个问题。 
(这里强调第一次使用我们的新板子时,最好将跳线跳到Fuses模式,因为之前该CPU的BT_FUSE_SEL没有被烧录,所以这时BT_FUSE_SEL = 0,强制从串行下载器执行)
设置BT_FUSE_SEL=0将强制ROM 代码直接跳到串行下载器(serial downloader)。这允许一个加载器(bootloader)被下载,然后配给启动设备编程的Image,烧写BT_FUSE_SEL,以及配置其他启动eFUSEs。当复位后,Boot ROM代码判断BT_FUSE_SEL已被烧写(BT_FUSE_SEL=1),ROM代码就会依据新的eFuses配置执行内部启动(即以下过程和内部启动模式BT_FUSE_SEL=1 时相同)。这允许用户配置可生产设备的OOT_MODE[1:0]=00b,然后通过同样的设备烧写fuses(通过强制进入串行下载器),无须改变BOOT_MODE[1:0]的值和BOOT_MODE 引脚的上下拉。 
(这段原英文描述也比较模糊,翻译的比较生硬,理解的应该不是很到位,应该有些偏差。) 
注:我们设想这样一种情况,CPU模块和含有BOOT_MODE[1:0]跳线的模块相分离。
8.2.4 串行下载器 
此串行下载器提供了一个通过USB串行连接进行编程Image的方法。在此模式下,如果在eFues中的WDOG_ENABLE位为1,ROM编程WDOG1为90秒溢出,且不停地轮询(poll)USB连接。如果找不到活动的USB OTG1且看门狗到期(溢出),ARM核会复位。 
注: 
被下载的image(如uboot)必须继续服务看门狗始终,以避免复位的发生。
8.2.5 内部启动模式 (BOOT_MODE[1:0] = 0b10) 
BOOT_MODE[1:0]寄存器的值为0b10时,选择为内部启动模式。在此模式下,处理器继续执行内部的启动代码。启动代码执行硬件初始化,从选择的启动设备中加载程序镜像,使用HAB执行镜像有效性检查,然后跳到程序镜像地址处。如果在内部启动中出项任何错误,启动代码就会跳到串行下载器。在三种模式下,安全启动都可使用HAB。当使用内部启动模式时,启动流(boot flow)被eFuse配置和GPIO重载fuse的两者结合所控制。启动选择FUSE(BT_FUSE_SEL)决定ROM使用GPIO或eFuses来获取各种配置参数(见下面的注)。 
如果BT_FUSE_SEL = 1,所有的启动选项被eFuses配置所控制 
如果BT_FUSE_SEL = 0,特定的启动配置参数或许使用GPIO Pins,而不是eFuses。fuses会被表 8-2的GPIO所列值来覆盖。表8-3提供了GPIO 引脚的细节。
注: 
注意不是所有的fuses配置都可被GPIO所能重载。比如BT_FUSE_SEL只是eFuses的值,另外重要的值还包括WDOG_ENABLE、DIR_BT_DIS 、SEC_CONFIG[1](见表等5-4),均不能被GPIO重载。GPIO重载的只是BOOT_CFG1-4相关的启动配置。使用GPIO重载的模式被用于开发,因为这些GPIO pads在部署产品 时会被留作他用。fsl建议在部署产品时启动配置由是eFuses的配置来确定,开发产品时,保留此GPIO重载模式,仅仅用于测试。
8.2.6 启动安全设置 
内部启动使用三种安全配置的其中之一: 
1.封闭模式:此等级用于交付产品。所有的HAB功能都会被执行,安全硬件会被初始化(安全控制,SNVS,进入安全状态),DCD如果存在会被处理,程序镜像执行时会被HAB优先验证,所有检测到的错误会被计入日志,启动流会被中断,进入串行下载器。 
在此等级下,除非目标执行镜像已被认证,程序的执行是不能离开内部ROM。 
2.开放模式:此等级用于非安全产品,或安全产品的开发阶段。所有的HAB功能都会像封闭模式一样被执行,安全硬件会被初始化(除非SNVS不在非安全状态),DCD如果存在会被处理,程序镜像执行时会被HAB优先验证,所有检测到的错误会被计入日志,但启动流会不受影响,即使有错误发生它也会继续执行(which continues as if the errors did not occur 继续执行就像没有错误发生一样),这种配置对安全产品的开发是有用的,因为程序镜像会一直运行即使认证数据错误或不正确,错误日志会被检查以便检查认证失败原因。 
注意:如果DIR_BT_DIS eFuse没有被烧写,认证就会被旁路,这时系统是不安全的。


shipping secure products. 这里shipping的含义是“交付的,离岸的”,译为“交付的安全产品“。
总结: 
内部启动模式一般只用于产品的开发阶段,因为此模式要占用大量的GPIO资源,而这些GPIO是EIM中关键的数据和地址控制线。在Fuses启动模式下,一旦这些eFuses被烧录,均不能被重擦修改,显而易见的是后者不利于开发中的摸索尝试(一旦出现错误,我们甚至要考虑更换CPU)。在开发阶段,我们使用跳线来配置efuses,然后我们调试测试,直至其稳定后,在最终的产品中,使用和跳线配置相对的eFuses值来烧录fuse,最终可将这些GPIO上的跳线去除,而用于一般用途。 
如果BT_FUSE_SEL = 0: 
当启动模式配置为内部启动时,fuses的启动配置会被GPIO的重载所决定;当为Fuses模式时,强制进入串行下载器。 
如果BT_FUSE_SEL = 1: 
启动模式无论为内部启动和Fuses模式,fuses的启动配置均会由eFuses配置来决定,只是ROM code继续执行,如果eFuses决定的启动设备(或出现其他错误,如安全认证错误)不存在或出现错误时,也会进入串行下载模式。 
efuses是内部OTP Flash的Fuses配置值。注意efuses和fuses的含义区别。 
I.MX6启动总流程图: