卢骏 · 6月30日

CORTEX-A8裸机系列:第四章 S5PV210的启动过程

第四章 S5PV210的启动过程

S5PV210,提供了一种IROM的启动方式,这个类似于ARM11的stepping stone的启动方式,也就是在CPU内部的IROM,固化了一段代码,称为BL0,当上电之后,这部分代码首先被执行,然后再去执行指定的代码。

1、使用IROM启动

对于IROM启动,需要以下两个部件。不过这两个部件,都已经是集成在CPU中了。

64KB 的 IROM:  用于保存BL0的代码

96KB 的 SRAM: 充当BL0代码运行时的RAM

BL0代码执行后,需要后续的代码才能够真正的启动CPU,后续的代码,是可以放置在一些外部设备中的,这些设备包括以下:

◾SDRAM
◾ONENANAD启动
◾NAND 启动(8/16-bit ECC校验)
◾MMC 启动(MMC标准4.3)
◾eSSD启动
◾UART/USB 启动
IROM启动的一些特性:
◾onenand 启动
◾nand启动
◾MMC启动
◾eSSD启动
◾UART/USB启动
◾支持安全启动模式

-除了UART/USB启动外,会检查bootloader的完整性。

-为了支持安全启动模式,安全的键值要写入到S5PV210中

如果没有值写入到210中,不是安全启动模式

否则就是安全启动模式。在这种情况下,三星应该写入安全值在制造阶段

◾支持第二级启动

当第一级的启动模式失败后,会进行第二级的启动。如MMC启动时,首先是从MMC通道0启动,如果该启动失败,会从通道2再次启动。

电路设计注意的地方:

1) 通过OM管脚进行IROM启动模式选择,CPU提供了OM0-5管脚来选择后续是使用哪一个设备进行启动。
1.png

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用来启动

2、启动顺序

下图是官方推荐的IROM的启动顺序图:
2.png

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的起始地址执行

以下是启动的流程图:
3.png

启动代码分成两部分,BL1(16KB)和BL2(剩下的80KB)。

BL1负责初始化外部启动设备,然后将BL2从外部启动设备读取到SRAM中,跳到BL2中执行

BL2负责初始化DRAM,然后将OS复制到DRAM中,在跳转到DRAM的OS中执行。

BL0会根据OM pin的值,从而确定从外部的哪个启动设备去读取BL1。
4.png

第二级启动流程图,当第一级启动失败后,会执行以下的流程。
5.png

1) 第一级启动校验失败,启动第二级启动

2) 第二级启动失败,启动UART启动,启动成功,跳转到BL1执行

3) UART启动失败,启动USB启动,启动成功,跳转到BL1执行

4) USB启动失败,就结束启动

当USB启动的时候,要设置启动模式为调试模式,也就是设置外部OM管脚的值。并且设置DNW的地址,下载的地址要设置为0xd020_0000。
6.png
7.png

当UART启动的时候,要设置启动模式为调试模式,也就是设置外部OM管脚的值。UART启动,使用的是UART2。
8.png

在使用USB/UART启动时,不需要头信息去校验。BL1的基地址是0xd002_0000。除了这两个模式外,其他启动方式要使用头信息校验,16字节大小。此时BL1的基地址是0xd002_0010。

3、存储分布
3.1、IROM与IRAM的存储分布

下图是内部IROM和IRAM的存储分布。
9.png

可以看出,IRAM的启动地址是从0xd002_0000开始的,不过前16个字节是头信息,真正BL1的程序是从0xd002_0010开始的。

IRAM中有异常向量表,有堆栈,有函数区等等,这些都是在BL0的阶段,给设置的。因此对于这些,BL1程序是可以直接使用。

3.2、MMC设备信息

使用MMC器件作为启动时,要保存一些MMC卡信息。这些信息,就是保存在global variable区域中的。

例如,如果是SD/MMC启动,在BL1阶段,想知道SD/MMC的设备的容量,就可以读取0xd003_7480地址的值,这个值就是外部SD/MMC的设备的容量。
10.png

3.3、启动设备拷贝函数

s5pv210内部实现了一些启动设备的数据拷贝函数。这些函数可以复制存储器设备的数据到SDRAM中。这些函数,在BL1是可以直接使用的。

包括了有nand,MMC,eMMC, onenand, eSSD这些在IROM支持的启动设备。
11.png
12.png

4、启动设备中保存的启动文件布局

对于外部启动的设备,对存储在该设备中的启动代码,官方是有要求的,必须要按照该启动文件布局放置代码,启动代码才会被正确的执行。

不过这个,我们一般都不关心,因为最终我们写好的程序,是通过工具来进行烧写的,工具就会依据这个文件布局,从而将程序烧写到对应的地方去。
13.png
14.png

对于安全模式的启动模式,在BL1的前16个字节,要加上必要的头信息。因为该头信息会被BL0用到来校验。校验通过,BL1才会得到执行,否则BL1得不到执行。
15.png

当载入BL1,IROM检查头数据的BL1的大小,然后拷贝这么大小的BL1到IRAM中。拷贝完BL1后,IROM会计算BL1的数据,然后和BL1的头信息的checksum data比较,比较一致,BL1启动。否则BL1不运行启动,CPU尝试从后续的启动方式启动。

5、启动配置

以下是OM pin的组合,从而确定后续是从哪个外部设备进行启动。对于OM5,为1的话,BL1优先从UART/USB进行启动。

因此如果要通过UART/USB启动的话,这个管脚在上电之初,是要设置为高电平的。
16.png
17.png

启动失败的时候,XPWMTOUT0管脚会输出一个方波。根据不同启动方式失败,方波的占空比不一样。因此,是可以抓取这个管脚波形,确定失败的启动方式。
18.png
19.png

系列其他篇

原文首发于骏的世界博客
作者:卢骏.
更多Arm技术相关的文章请关注Arm技术博客极术专栏,每日更新。
3 阅读 76
推荐阅读
0 条评论
关注数
6068
内容数
156
Arm相关的技术博客,提供最新Arm技术干货,欢迎关注
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
Arm中国学堂公众号
关注Arm中国学堂
实时获取免费 Arm 教学资源信息
Arm中国招聘公众号
关注Arm中国招聘
实时获取 Arm 中国职位信息