210整个启动流程可以大致分为三个阶段,分别为:
1.运行IROM中的代码
2.运行UBOOT的BL1
3.运行UBOOT的BL2,最后启动内核
IROM是210里的一块存储介质,里面固化了一段三星原厂的代码
uboot被分为BL1和BL2,存放在外部存储介质中(如SD卡,NANDFLASH等等)
210启动流程图(图1):
图1是210数据手册的启动流程图
①运行IROM中的代码
②读取BL1到SOC内部SRAM运行
③读取BL2并运行
④启动内核
接下来我们来详细地讲解一下这个启动流程
一,IROM阶段
210内部有一段64KB的IROM和96KB的SRAM,IROM中固化了一段三星原厂烧写的代码,SRAM内存,给程序运行时使用
0.210内部这段IROM是和内存一样,总线式访问的,里面集成了一段三星原厂提供的代码,CPU一上电就会运行这段代码
1,该段代码做了什么事情?
从数据手册我们可以得知IROM做了什么事
/* (1)关看门狗 */
(1) Disable the Watch-Dog Timer
/* (2)初始化cache */
(2) Initialize the instruction cache
/* (3)初始化栈,给C语言运行提供环境 */
(3) Initialize the stack region (see “memory map” on chap 2.5)
/* (4)初始化堆,给C语言运行提供环境 */
(4) Initialize the heap region. (see “memory map” on chap 2.5)
/* (5)初始化块设备,如nandflash,SD卡等,并给我们提供了读写函数,之后会根据启动方式从这些存储介质中,拷贝代码到内存中运行 */
(5) Initialize the Block Device Copy Function. (see “Device Copy Function” on chap 2.7)
/* (6)初始化时钟 */
(6) Initialize the PLL and Set system clock. (see “clock configuration” on chap 2.11)
/* (7)从第5步已经初始好的块设备中拷贝一段一定长度的代码,到内部SRAM运行(这段代码被称作BL1) */
(7) Copy the BL1 to the internal SRAM region (see “Device Copy Function” on chap 2.7)
/* (8)校验BL1,BL1的开头有一段校验码,只有正确了才会运行BL1,如果校验失败,iROM将会重启 */
(8) Verify the checksum of BL1.
If checksum fails, iROM will try the second boot up. (SD/MMC channel 2)
/* (9)检查是否启动安全模式 */
(9) Check if it is secure-boot mode or not.
If the security key value is written in S5PV210, It’s secure-boot mode.
If it is secure-boot mode, verify the integrity of BL1.
/* (10)开始运行BL1 */
(10) Jump to the start address of BL1
总结一下:210一上电会去执行iROM里面的代码,里面的代码主要的工作是:
(1)关看门狗,防止复位重启
(2)初始化堆栈,给C语言提供运行环境
(3)初始化时钟
(4)初始化块设备,从块设备中读取一段代码(BL1)到内部SRAM
(5)检验BL1的头部,然后就运行BL1(BL1是我们自己写的代码)
其实主要的工作就是硬件的初始化,然后去运行我们自己写的代码(BL1
2,从上面我们知道了CPU一上电就会去运行IROM中固化的代码,然后从块设备中拷贝BL1再去运行BL1
那么下面有两个问题
(1)IROM在哪里,SRAM又在哪,还有我们的BL1将会被CPU拷贝到哪里运行呢?
(2)BL1是我们自己写的代码,那么CPU是怎么知道我们的BL1放在哪里?
(1)首先解决第一个问题:
IROM在哪里,SRAM又在哪,还有我们的BL1将会被CPU拷贝到哪里运行呢?
从图中我们可以得知,IROM被安排在0x0000_0000 - 0x0000_FFFF这个地址,CPU一上电会运行0x0000_0000地址处的代码
其实我们更加关系的是SRAM的地址,从图中得知BL1将会被拷贝到0xD002_0010这个地址运行
(2)第二个问题
BL1是我们自己写的代码,那么CPU是怎么知道我们的BL1放在哪里?
①我们可以通过设备210的某些引脚的高低电平来选择启动方式,iROM中的代码会读取这些引脚的高低电平来选择启动方式,
启动模式有以下几种
A,ONENAND启动器(Mux / DEMUX)
B,的的Nand启动(支持8/16位ECC)
C,MMC启动(MMC4.3标准,兼容的的eMMC的)
d,ESSD启动
E,UART / USB启动
下面是OM引脚对应的启动方式的表格
从这张表可以得知
OM [4]:210上电后是从IROM运行还是从UART-> USB运行
OM [3] OM [2] OM [1]:iROM会去哪里找到BL1
OM [0] :如果前面选择的方式启动失败,则从这中方式启动
②。来下面分析各种启动方式
从数据手册中得知
1.OneNAND启动
Xm0CSn4 / NFCSn2 / ONANDXL_CSn0信号应该用于启动
iROM中的代码将会去SROM的块4,块2中读取BL1
2. NAND启动
Xm0CSn2 / NFCSn0信号应该用于启动
iROM中的代码将会去SROM的块2,块0中读取BL1
3. SD / MMC和eMMC引导
首次引导使用SDMMC CH0作为4bit
第二次引导使用SDMMC CH2作为4bit
首先回去SDMMC CH0读取BL1,如果读取失败,则回去SDMMC CH2读取
其他的方式这里就不介绍了
③现在我们已经知道IROM会哪里找到BL1运行,那么举个例子,虽然IROM中的代码已经知道BL1存在SD卡中,但是它怎么知道存放在SD卡的哪一个扇区呢?
其实BL1存放应该存放在哪个地方已经被IROM的代码写死了,我们应该做的是知道IROM中的代码会去哪里读取,我们将BL1放到那个位置
从图中BL1应该存放在SD卡的第二个分区
从图中可知应该存放在NAND的第一个分区
暂时讲到这里,下一篇文章再来讨论BL1和BL2