一、S5PV210的启动流程详解(一)

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

猜你喜欢

转载自blog.csdn.net/weixin_42462202/article/details/84787658