weiqi7777

cortex-a8裸机系列:第四章 S5PV210的启动过程

0
阅读(2278)

S5PV210,提供了一种IROM的启动方式,这个类似于ARM11stepping 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管脚来选择后续是选择哪一个设备进行启动。

clip_image002

2)         x210SM/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的启动顺序图:

clip_image004

1)         上电,判断OM管脚,确定IROM启动,执行内部iROM的程序,也就是BL0

2)         IROM进行启动的一些初始化:初始化系统时钟,初始化一些外设,确定第二阶段启动设备。

3)         IROM从外部启动设备载入bootloader(前16K)到SRAM中,此时bootloader成为BL1。如果是在安全启动模式下,IROM会验证BL1的完整性,从而确定BL1是否可以执行。

4)         BL1得到执行,BL1会载入bootloader的剩下的部分,称为BL2SRAM中。

5)         BL2得到执行,BL2初始化DRAM控制器,载入OSSDRAM

6)         最后,跳到OS的起始地址,开始执行。成功启动。

 

IROM启动的执行过程

1)         禁止看门狗

2)         初始化指令cache

3)         初始化栈

4)         初始化堆

5)         初始化块设备拷贝函数

6)         初始化PLL和设置系统时钟

7)         复制BL1到内部的SRAM

8)         校验BL1,如果校验失败的话,IROM会尝试第二级启动

9)         检查是否是安全启动模式,如果安全键值写入到s5pv210,是安全模式,是安全模式的话,检查BL1的完整性

10)     跳转到BL1的起始地址执行

 

以下是启动的流程图:

clip_image006

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

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

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

 

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

clip_image008

 

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

clip_image010

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

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

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

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

 

 

 

 

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

clip_image012

clip_image014

 

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

clip_image015

 

 

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

 

 

 

三、            存储分布

下图是内部IROMIRAM的存储分布。

clip_image017

 

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

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

 

 

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

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

clip_image019

 

启动设备拷贝函数

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

     包括了有nandMMCeMMC, onenand, eSSD这些在IROM支持的启动设备。

clip_image021

clip_image023

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

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

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

clip_image025

clip_image027

 

 

 

 

 

 

 

 

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

clip_image029

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

五、            启动配置

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

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

clip_image031

clip_image033

 

 

 

 

 

 

 

 

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

clip_image035

clip_image037