cortex-a8裸机系列:第四章 S5PV210的启动过程
0赞S5PV210,提供了一种IROM的启动方式,这个类似于ARM11的stepping stone的启动方式,也就是在CPU内部IROM,固化了一段代码,称为BL0,当上电之后,这部分代码首先被执行,然后再去执行指定的代码。
一、 使用IROM启动
对于IROM启动,需要以下两个部件。不过这两个部件,都已经是集成在CPU中了。
64KB 的 IROM: 用于保存BL0的代码
96KB 的 SRAM: 充当BL0代码运行时的RAM
BL0代码执行后,需要后续的代码才能够真正的启动代码,后续的代码,是可以放置在一些外部设备中的,这些设备包括以下:
l SDRAM
l ONENANAD启动
l NAND 启动(8/16-bit ECC校验)
l MMC 启动(MMC标准4.3)
l eSSD启动
l UART/USB 启动
IROM启动的一些特性:
l onenand 启动
l nand启动
l MMC启动
l eSSD启动
l UART/USB启动
l 支持安全启动模式
-除了UART/USB启动外,会检查bootloader的完整性。
-为了支持安全启动模式,安全的键值要写入到S5PV210中
如果没有值写入到210中,不是安全启动模式
否则就是安全启动模式。在这种情况下,三星应该写入安全值在制造阶段
l 支持第二级启动
当第一级的启动模式失败后,会进行第二级的启动。如MMC启动时,首先是从MMC通道0启动,如果该启动失败,会从通道2再次启动。
电路设计注意的地方:
1) 通过OM管脚进行IROM启动模式选择,CPU提供了OM0-5管脚来选择后续是选择哪一个设备进行启动。
2) x210的SM/MMC的第二阶段的启动存储器件,使用的是MMC通道2
3) Onenand启动-通过Xm0CSn4/NFCSn2/ONANDXL_CSn0信号来启动
(BL1代码应该包括校验数据在BL1二进制代码的前面)
4) NAND启动-通过Xm0CSn2/NFCSn0来启动
(BL1代码应该包括校验数据在BL1二进制代码的前面)
5) SD/MMC/eMMC启动-MMC通道0用来第一级启动。通过通道2用来第二级启动。
(BL1代码应该包括校验数据在BL1二进制代码的前面)
6) UART启动方式使用UART通道2用来启动
二、 启动顺序
下图是官方推荐的IROM的启动顺序图:
1) 上电,判断OM管脚,确定IROM启动,执行内部iROM的程序,也就是BL0。
2) IROM进行启动的一些初始化:初始化系统时钟,初始化一些外设,确定第二阶段启动设备。
3) IROM从外部启动设备载入bootloader(前16K)到SRAM中,此时bootloader成为BL1。如果是在安全启动模式下,IROM会验证BL1的完整性,从而确定BL1是否可以执行。
4) BL1得到执行,BL1会载入bootloader的剩下的部分,称为BL2到SRAM中。
5) BL2得到执行,BL2初始化DRAM控制器,载入OS到SDRAM中
6) 最后,跳到OS的起始地址,开始执行。成功启动。
IROM启动的执行过程
1) 禁止看门狗
2) 初始化指令cache
3) 初始化栈
4) 初始化堆
5) 初始化块设备拷贝函数
6) 初始化PLL和设置系统时钟
7) 复制BL1到内部的SRAM中
8) 校验BL1,如果校验失败的话,IROM会尝试第二级启动
9) 检查是否是安全启动模式,如果安全键值写入到s5pv210,是安全模式,是安全模式的话,检查BL1的完整性
10) 跳转到BL1的起始地址执行
以下是启动的流程图:
启动代码分成两部分,BL1(16KB)和BL2(剩下的80KB)。
BL1负责初始化外部启动设备,然后将BL2从外部启动设备读取到SRAM中,跳到BL2中执行
BL2负责初始化DRAM,然后将OS复制到DRAM中,在跳转到DRAM的OS中执行。
BL0会根据OM pin的值,从而确定从外部的哪个启动设备去读取BL1。
第二级启动流程图,当第一级启动失败后,会执行以下的流程。
1) 第一级启动校验失败,启动第二级启动
2) 第二级启动失败,启动UART启动,启动成功,跳转到BL1执行
3) UART启动失败,启动USB启动,启动成功,跳转到BL1执行
4) USB启动失败,就结束启动
当USB启动的时候,要设置启动模式为调试模式,并且设置DNW的地址。也就是设置外部OM管脚的值。下载的地址要设置为0xd020_0000。
当UART启动的时候,要设置启动模式为调试模式,。也就是设置外部OM管脚的值。UART启动,使用的是UART2
在使用USB/UART启动时,不需要头信息去校验。BL1的基地址是0xd002_0000。除了这两个模式外,其他启动方式要使用头信息校验,16字节大小。此时BL1的基地址是0xd002_0010。
三、 存储分布
下图是内部IROM和IRAM的存储分布。
可以看出,IRAM的启动地址是从0xd002_0000开始的,不过前16个字节是头信息,真正BL1的程序是从0xd002_0010开始的。
IRAM中有异常向量表,有堆栈,有函数区等等,这些都是在BL0的阶段,给设置的。因此对于这些,BL1程序是可以直接使用。
使用MMC器件作为启动时,要保存一些MMC卡信息。这些信息,就是保存在global variable区域中的。
例如,如果是SD/MMC启动,在BL1阶段,想知道SD/MMC的设备的容量,就可以读取0xd003_7480地址的值,这个值就是外部SD/MMC的设备的容量。
启动设备拷贝函数
s5pv210内部实现了一些启动设备的数据拷贝函数。这些函数可以复制存储器设备的数据到SDRAM中。这些函数,在BL1是可以直接使用的。
包括了有nand,MMC,eMMC, onenand, eSSD这些在IROM支持的启动设备。
四、 启动设备中保存的启动文件布局
对于外部启动的设备,对存储在该设备中的启动代码,官方是有要求的,必须要按照该启动文件布局放置代码,启动代码才会被正确的执行。
不过这个,我们一般都不关心,因为最终我们写好的程序,是通过工具来进行烧写的,工具就会依据这个文件布局,从而将程序烧到对应的地方去。
对于安全模式的启动模式,在BL1的前16个字节,要加上必要的头信息。因为该头信息会被BL0用到来校验。校验通过,BL1才会得到执行,否则BL1得不到执行。
当载入BL1,IROM检查头数据的BL1的大小,然后拷贝这么大小的BL1到IRAM中。拷贝完BL1后,IROM会计算BL1的数据,然后和BL1的头信息的checksum data比较,比较一致,BL1启动。否则BL1不运行启动,CPU尝试从后续的启动方式启动。
五、 启动配置
以下是OM pin的组合,从而确定后续是从哪个外部设备进行启动。对于OM5,为1的话,BL1优先从UART/USB进行启动。
因此如果要通过UART/USB启动的话,这个管脚在上电之初,是要设置为高电平的。
启动失败的时候,XPWMTOUT0管脚会输出一个方波。根据不同启动方式失败,方波的占空比不一样。因此,是可以抓取这个芯片,确定失败的启动方式。