Uboot5之S5PV210的启动顺序

时间:2022-01-23 17:01:01

时间:2018.3.18  作者:Tom   工作:HWE 说明:如需转载,请注明出处。

1.启动所涉及的内存和外存

(1)内存:SRAM即静态内存,缺点是容量小、价格高,一般是几十K或几百K;优点是不需要软件初始化直接上电就能使用DRAM即动态内存,优点是容量大、价格低;缺点是上电后不能直接使用,需要软件初始化后才可以使用。 
(2)
单片机:内存需求量小,而且希望开发尽量简单,适合全部使用SRAM;嵌入式系统:内存需求量大,而且没有NorFlash等可启动介质;PC机:内存需求量大,而且软件复杂,不在乎DRAM的初始化开销,适合全部用DRAM 
(3)
外存:NorFlash的缺点是容量小、价格高;优点是可以和CPU直接总线式相连,CPU上电后可以直接读取,所以一般做启动介质NandFlash的优点是容量大、价格低;缺点是不能总线式访问,即不能一上电CPU直接读取,需要CPU先运行一些初始化软件,然后通过时序接口读写。 
(4)PC
机:很小容量的BIOSNorFlash+很大容量的硬盘(类似于NandFlash+大容量的DRAM单片机:很小容量的NorFlash+很小容量的SRAM嵌入式系统:因为NorFlash很贵,现在的嵌入式系统倾向于不用NorFlash而是使用:外接大容量的Nand+外接大容量的DRAM+SoC内置SRAM

2.S5PV210的启动方式

Uboot5之S5PV210的启动顺序

在这张图中可以看出S5PV210的启动可大致分为五个步骤 
1、iROM阶段(BL0) 
2、BL1阶段 
3、BL2阶段 
4、拷贝OS到SDRAM 
5、启动OS

samsung在S5PV210内部的IROM中固化了一段代码,用于初始化时钟,识别用户选择的启动模式,并从相应的地方拷贝boot-loader第一阶段代码到SRAM中运行。此外samsung在S5PV210内部也集成了96KB的内部SRAM,由于SRAM不需要初始化,上电就能使用,因此可当作DRAM初始化之前的代码运行空间。

(1)210内置了96KB大小的SRAM(叫iRAM)和64KB大小的NorFlash(叫iROM)。 
(2)
1步(BL0):CPU上电后先从内部IROM中读取预先设置的代码(BL0)到IRAM中执行。该段IROM代码首先执行基本的初始化(CPU时钟、关看门狗、初始化块设备拷贝函数)(该段IROM代码是三星出厂前设置的,三星也不知道我们板子上将来接的是什么样的DRAMNanFlash,因此该段IROM代码不能负责初始化外接的DRAMNandFlash的,则该段IROM代码只能初始化SoC内部的东西);然后该段代码会判断我们选择的启动模式(我们通过硬件跳线可更改板子的启动模式),然后从相应的外部存储器去读取第1部分启动代码(BL1,大小为16KB)到IRAM注意此时外部的flash还没有初始化,怎么去读的?!)。 
(3)
2步(BL1):IRAM中去运行读取来的BL116KB),BL1负责初始化NandFlash(此时外部flash已经初始化了,可以读了),然后将BL2(剩余的80KB)读取到IRAM,然后运行。 
(4)
3步(BL2):IRAM中运行BL2,然后BL2负责初始化DRAM,然后将OS读取到DRAM中,然后启动OS,启动过程结束。

3.BL0阶段iROM到底干了什么?

1、关闭看门狗; 
2
、初始化icache 
3
、初始化SRAM栈; 
4
、初始化SRAM堆; 
5
、初始化块设备拷贝函数à这个地方就是来初始化外部启动介质,然后才能拷贝BL1??
6
、初始化PLL,设置系统时钟; 
7
、拷贝BL1到内部的SRAM区域; 
8
、检查BL1的校验和; 
9
、检查是否是安全启动模式; 
10
、跳转到BL1的起始代码处。

刚开始看S5PV210的启动过程时有一个地方一直想不明白:Boot-loader代码都在Flash中存储着,iROM是怎么不初始化Flash并将BL1拷贝到SRAM中运行的(Nand Flash 的初始化代码在BL1阶段才执行),后来通读了《S5PV210_iROM_Application Note》后才明白。iROM中固化了一系列的块设备拷贝函数这个块设备拷贝函数,就是用来初始化不同种Nand并拷贝代码的(它只是说拷贝并没有说初始化!!要疯!),关于这些函数手册2.7节有介绍 
Uboot5之S5PV210的启动顺序

Uboot5之S5PV210的启动顺序

Uboot5之S5PV210的启动顺序

从图可以看出210在启动的时候首先会判断,系统是从休眠中唤醒还是刚上电,从而决定是重新引导系统还是直接跳转到OS继续执行休眠前的代码。然后还有一个"Checksum OK?"的判断,如果BL1的代码检验出错会自动跳转尝试用"2nd"方式启动S5PV210还提供了一个"Secure Boot" 安全启动的模式。S5PV210提供多种启动方式,其中"1st启动"可以通过引脚选择,当"1st启动"失败后会尝试从"2nd启动",也就是从SD卡通道2,通过SD卡启动方式启动。如果"2nd启动"仍然失败,会尝试从"Uart boot"启动,如果仍然失败将会尝试从 "USB boot"启动。

这里以sd卡启动为例来讲,系统一上电检测OM引脚的电平情况,所以上电前你得将开关打到需要的启动模式。手册上有说明,自己去看看就清楚了。注意上图的标号,一上电首先从iROM(这段代码通常称为BL0)开始运行代码,然后根据OM引脚电平情况去初始化启动介质控制器(确定??)sd启动为HS-MMC Controller),从sd卡的第一个扇区开始复制16k代码(这16k代码通常称为BL1)到SRAM(通常称为Stepping Stonesd卡启动的话,图上的Booting Device就是sd卡) 
为什么是从第一个扇区开始复制呢?看手册: 
Uboot5之S5PV210的启动顺序
还是有问题,复制到SRAM哪里呢?SRAM本身又在哪个地址呢?SRAM能直接用吗,要不要初始化?SRAM是不需要初始化的,不信可以百度。SRAM的地址看手册,0xD0020000一方面是内存统一编址,把IROMIRAM一起编址,同时为了隔离,中间有一段0x0001000~0xd001ffff没有用或者有其他用我们不知道三星没给出,或者说中间这一块根本就没有)。 我们只知道我们程序的运行地址是0xD0020000就可以。

Uboot5之S5PV210的启动顺序

看到BL1起始地址为0xD0020010,下面多了一节东西,BL Header Info 4 WORD。按理说不应该啊,BL1应该复制到SRAM起始地址才对呀。接着看手册,发现手册上说 
The BL1 must have header data. The header data is used for being copied to internal SRAM by iROM code.The header data has two information. One is size of BL1 and Another is checksum data of BL1.When loading BL1, iROM check size of BL1 in header data and copy BL1 to internal SRAM. After coping BL1, iROM sum data of copied BL1 and compare it to checksum data in header data of BL1. If it is success, BL1 start. otherwise iROM will try second boot(4-bit SD/MMC) from SDMMC channel 2 port. 
大概意思是说,这个BL Header包含两个信息,第一:BL1的大小。第二:checksum data。为了安全考虑,这里设置了checksum data去控制是充SDMMC的哪个通道启动。BL1的大小好理解,只需搞清楚单位就行了,一般是字节为单位。那么checksum data具体是指什么呢?接往下看 
Uboot5之S5PV210的启动顺序 
其实就是统计BL1的二进制文件包含多少个1的个数。

4.BL1阶段干了什么?

1)外部flash硬件设备初始化

2)加载BL2阶段代码到iRAM空间

3)设置好栈

4)跳转到第二阶段代码入口

5.BL2阶段干了什么?

1)初始化本阶段使用的硬件设备如:DDR

2)检测系统内存映射

3)将内核从Flash读取到DRAM

4)为内核设置启动参数

5调用内核

6使用哪个版本的uboot?

Uboot5之S5PV210的启动顺序

我们后面分析使用三星官方的uboot,因为我们实际工作过程中拿到的就是这种类型的文件。