前言
本系列基于Smart210开发板,对u-boot相关知识进行总结与分析。
本文是对S5PV210芯片手册中启动部分的翻译,原文位于《S5PV210 RISC Microprocessor User's Manual, Revision 1.10》第二部分“系统”中的第六章“启动顺序”。
1.1 启动顺序综述
S5PV210内部存储器由64KB ROM和96KB SRAM组成。S5PV210从内部ROM启动来确保安全启动,这确保镜像不被未授权用户修改。S5PV210使用电熔丝(e-fuse)来选择安全启动还是正常启动。启动设备可从下述列表中选择:
> 通用NAND Flash存储器
> OneNAND存储器
> SD/MMC存储器(例如:MoviNAND和iNAND)
> eMMC存储器
> eSSD存储器
> 串口和USB设备
译者注:OneNAND存储器,是采用了NOR Flash的接口,NAND Flash的架构,是两者的性能得到了综合,这就有了x-loader的产生。说到底这个x-loader就是起到初始化OneNAND和引导U-BOOT的作用。详细描述见文章《浅谈对OneNAND的认识》。
在系统复位的时候,程序计数器从内部ROM区域的iROM代码开始。然而,系统复位不一定是在启动的时候,也有可能是在低电压模式下。因此,iROM代码必须根据复位状态来执行合适的过程。参见图6-1。
Boot loader很多情况下是由iROM,第一级和第二级boot loader组成。
> iROM代码:包含小而简单的代码,平台独立,存储于内部存储器;
> 第一级boot loader:包含小而简单的代码,平台独立,存储于外部存储器;
> 第二级boot loader:包含复杂的代码,平台相关,存储于外部存储器。
如果选择安全启动,iROM代码和第一级boot loader提供完整性核查功能(使用公钥算法)来验证加载的镜像。安全启动键共有160个电熔丝位,它们用于在iROM的完整性检查之前进行授权加载的公钥。详细情况参见本手册第十一部分安全部分。
> iROM代码位于内部64KB ROM中,它初始化基本的系统功能,例如时钟、堆和栈。
> iROM从一个指定的启动设备加载第一级boot loader镜像到内部的96KB SRAM。这个启动设备由操作模式管脚(OM)选择。根据安全启动钥的值,iROM代码可能会对第一级boot loader镜像做完整性检查。
>第一级boot loader加载第二级boot loader,然后根据安全启动钥的值检查第二级boot loader的完整性。
>第二级boot loader初始化系统时钟,串口和DRAM控制器。初始化DRAM之后,从启动设备加载OS镜像到DRAM。根据安全启动钥的值,第二级boot loader可以对OS镜像做完整性检查。
> 在启动完成之后,第二级boot loader跳转到操作系统。
OM管脚决定了启动设备,例如OneNAND,NAND,MoviNAND,eSSD和iNAND。它同时也决定了启动选项,例如比特位宽度,等待延时,页大小,和ECC模式。
注意:USB启动用于系统调试和flash再烧写,并不用于正常启动。为此,通过切换OM[5:4]管脚到“2‘b10”来选择,并不用考虑其他OM管脚值。
在内部64KB ROM中的iROM代码称为BL0,第一级boot loader称为BL1。
1.2 方案说明
1.2.1 复位状态
系统复位的方案有很多,例如硬件复位,看门狗复位,软件复位,和从掉电模式中唤醒。对于每一个功能,强制性功能概括在表1-1:多种复位状态下的功能需求。
在iROM中的 基本初始化 | 在iROM中的 PLL设置 | 第一/二级boot loader 加载 | 第二级中的 DRAM设置 | 操作系统 加载 | 恢复 先前状态 | |
---|---|---|---|---|---|---|
硬件复位 | O | O | O | O | O | X |
看门狗复位 | O | O | O | O | O | X |
SLEEP中唤醒 | O | O | O | O | X | O |
软件复位 | O | O | O | O | O | X |
DEEP_STOP中唤醒 | O | X | X | X | X | O |
DEEP_IDLE中唤醒 | O | X | X | X | X | O |
在硬件复位和看门狗复位的时候,系统应该按照第一级boot loader和第二级boot loader和OS镜像加载,完全启动。新的复位状态归类为复位组0。
因为在SLEEP模式中,DRAM的内容被保留,不需要加载OS镜像到DRAM。然而,内部电源在SLEEP模式下不会供应给内部逻辑,所有存储在内部SRAM中的内容不会被保留。因此,第一级和第二级boot loader应该再次被加载。这个复位状态归类为复位组1。
在软件复位时,boot loader的加载被执行。在DEEP_STOP和DEEP_IDLE模式下,顶层模块的电源被选通,内部SRAM的内容可以被保存,因此boot loader不需要再被加载。在DEEP_STOP和DEEP_IDLE模式下,非保留SRAM的情况下,第一级boot loader应该被再次加载。这些从DEEP_STOP和DEEP_IDLE状态下的软件复位被归类为复位组2。(这段感觉英文原文就有点逻辑不通,贴出原文:At the time of software reset, The loading of boot loader is executed. Although top block’s power is gated in DEEP_STOP and DEEP_IDLE modes, the internal SRAM can be reserved, so that the re-loading of boot loader is not required. In case of non-retention of SRAM in DEEP_STOP and DEEP_IDLE modes, the first boot loader should be loaded again. These software reset that wake up from DEEP_STOP and DEEP_IDLE statuses are classified as reset group2.)
如果系统进入所有电源关闭的模式,当前系统状态应该被安全的保存在安全存储区域,例如DRAM,从而使系统在电源关闭模式下唤醒时,能够继续无缝处理。
最后,在SLEEP,DEEP_STOP和DEEP_IDLE模式下,需要具有恢复之前状态的功能。
1.2.2 启动序列例子
程序代码从内部ROM(iROM)开始,移到内部SRAM(iRAM)。最后,程序在DRAM中执行。
内部ROM中的启动顺序如下:
a. 禁止看门狗计时器;
b. 初始化指令缓存控制器;
c. 初始化堆和栈区域;
d. 检查安全键值;
e. 设置时钟分频,锁定时间,PLL(MPS值),和源时钟;
f. 检查OM管脚,从指定设备(块号码 0)加载第一级boot loader(boot loader的大小取决于S/W)到iRAM。
g. 如果安全启动成功,执行完整性检查;
h. 如果完整性检查通过,跳转到iRAM(0xD002_0010)中的第一级boot loader;
内部SRAM中的启动顺序如下:
a. 从启动设备加载第二级boot loader到iRAM;
b. 如果安全启动成功,执行完整性检查;
c. 如果完整性检查通过,跳转到iRAM中的第二级boot loader(跳转地址取决于用户软件);
d. 如果完整性检查失败,停止第一级boot loader;
e. 第二级boot loader初始化DRAM控制器;
f. 从指定设备(块号码1)加载OS镜像到DRAM;
g. 跳到DRAM(0x2000_0000或者0x4000_0000)中的OS代码处;
DRAM中的启动顺序如下:
a. 如果S5PV210从SLEEP, DEEP_STOP, 或DEEP_IDLE模式上电启动,恢复先前状态;
b. 跳转到OS代码处。
1.2.3 固定PLL和时钟设置
为加速第一级boot loader的操作,第一级boot loader以固定的值初始化PLL。固定的PLL设置如下:
• APLL: M=200, P=6, S=1 FOUT = (MDIV X FIN )/ (PDIV X 2(SDIV-1))) = 800MHz
• MPLL: M=667, P=12, S=1 FOUT = (MDIV X FIN) / (PDIV X 2SDIV) = 667MHz
• EPLL: M=80, P=3, S=3, K=0 FOUT = ((MDIV+KDIV) X FIN) / (PDIV X 2SDIV) = 80MHz
在由第一级boot loader设置的PLL初始化之后,24MHz外部晶振下的系统时钟频率如下表所示。
ARMCLK | ACLK200 | HCLK200 | PCLK100 | HCLK100 | HCLK166 | PCLK83 | SCLK_FIMC | HCLK133 |
---|---|---|---|---|---|---|---|---|
400 | 133 | 133 | 66 | 66 | 133 | 66 | 133 | 133 |
1.2.4 OM管脚配置
下表显示了能被OM管脚设置的启动选项。
注意:第一级boot loader首先尝试串口。如果失败,尝试驱动USB设备。因此,如果你想要通过USB设备启动,必须断开串口设备。
硬件逻辑决定地址映射,软件函数决定其它启动选项。OM管脚值可以从OM寄存器中读取,这部分在本手册的章节2.1中有讲述。
1.2.5 安全启动
安全系统的基本标准是“ ‘ root of trust ’(信任的root)必须是硬件的。不能请求一个软件系统‘ validate itself ’(自我验证) ”。
在S5PV210中,‘ root of trust ’ 由内部ROM中的iROM代码实现。因此,它不能被未验证的用户修改。硬件设计已经证明了iROM代码的完整性。另一方面,第一级、第二级boot loader和OS镜像存储在外部存储设备中。因此,iROM代码(那已经被证明是安全的)应验证第一级boot loader的完整性。如果完整性检查通过了第一级boot loader,它应该被包含在信任区域。然后,第一级boot loader验证第二级boot loader的完整性,第二级boot loader验证OS镜像的完整性。
下图显示了安全启动的过程。
安全启动顺序如下:
iROM代码
a. 使用E-Fuse RSA键哈希值检查RSA公钥的完整性;
b. 加载第一级boot loader到iRAM;
c. 使用信任的RSA公钥检查第一级boot loader的完整性;
第一级boot loader
a. 加载安全软件到iRAM;
b. 使用信任的RSA公钥检查软件的完整性;
c. 加载第二级boot loader到iRAM;
d. 使用信任的RSA公钥检查第二级boot loader的完整性;
第二级boot loader
a. 加载安全软件到iRAM;
b. 使用信任的RSA公钥检查软件的完整性;
c. 加载OS内核和应用到DRAM;
d. 使用信任的RSA公钥检查OS内核和应用的完整性;