嵌入式启动之四:S5PV210 IROM BL0启动

    三星S5PV210基于A8内核,是arm v7体系,广泛应用于手机和平板解决方案中。市场上也有很多基于S5PV210芯片的开发板(如smart210, gec210等),用于学习高级ARM体系编程。S5PV210跟S5PC11X基本一致,很多人认为两者是同样的SOC,只不过是封装不同,事实上,两者确实略有不同。跟S5PC11X相比,S5PV210没有内置16MSRAM和电源管理模块,解码能力也有些许不同。但从软件使用的角度,两者在内核体系、集成模块、管脚封装上确实有很大的相似性,以致UBOOT在命名上看来,其只支持S5PC11X,但事实上,将支持S5PC11X的UBOOT移植支持S5PV210的工作量相当小。主要的工作就是将16M的SRAM和PMIC初始化支持注释掉。从本篇博文开始,详细讲解S5PV210的启动过程,下面阐述启动的第一个阶段--IROM的BL0启动。

       嵌入式启动之二:资源宽裕型嵌入式系统已经说明内存资源宽裕型系统的一般启动过程。S5PV210属于这一类系统,外挂SDRAM内存和NAND、SD卡等外存设备,系统和应用代码等作为固件存放在外存设备中,并通过S5PV210内置的IROM启动并逐步引导到SDRAM中。S5PV210SPEC是《S5PV210_UM_REV1.1.pdf》,在其第29~30页中描述了IROMIRAM的内存映射图。IRAM,即内置RAM,在启动引导阶段有两个作用:一是IROM运行时使用的数据变量所在的区域,二是IROM,即BL0会将外存中的BL1引导到该区域中。因为IROM启动运行的时候,外置SDRAM还没有初始化好,而IRAM是可用的,因此必须要把BL1加载到IRAM中运行,由BL1SDRAM进行初始化。IROM为什么不初始化SDRAM呢?那是因为支持的SDRAM规格是可变的,由固化代码来初始化显得不够灵活,而且固化代码往往代码量比较小,因为越多越容易出BUG,出BUG就会导致SOC芯片重新掩膜tapout,一次可要好几百万人民币呢。由内存映射图可以得到:

IROM64K,在0x0000-0000开始的区域,而IRAM96K,在0xD0020000-0xD0037FFF

       S5PV210IROMSPEC是《S5PV210_iROM_ApplicationNote_Preliminary.pdf》,其主要描述以下内容:

       1. 启动过程,如下图:

                                                                  

       这个图的信息量比较大,描述了启动引导过程大部分的知识点。

      1)BL0位于IROM中,其选择引导的介质受外围引脚OM电平所决定。其能引导的介质包括:nor,nand,onenand,SD/MMC等等。如下图,0x2表示nand(page为2k byte,5个command周期,8bit ECC)启动,0xc表示SD/MMC。OM的值可以通过读寄存器0xE000-0004得到。

                嵌入式启动之四:S5PV210 IROM BL0启动_第1张图片

                                        

         2)根据OM的值,IROM中的BL0选择其固话的对应驱动将对应介质的前16K代码数据读到IRAM中。引导代码之后会进行校验,校验和BL1的长度信息放在16K代码数据的最前面16个字节。为什么需要长度?因为校验是对确定长度的内容进行计算得到,而BL1的有效代码数据可能并没有16K。BL1头部信息和校验算法如下图:

         嵌入式启动之四:S5PV210 IROM BL0启动_第2张图片        

            加载BL1之后,BL0会将给PC赋值为0xd0020010,即BL1代码真正的入口应该设置链接到0xd0020010。在编译链接生存BL1之后需要用专门的工具计算出BL1的长度和校验码,并填充到BL1的头部,在uboot中称为NAND_SPL.BIN。

          3)启动过程中的示意图的第三步只是一种方案的建议,在实际的启动模块中,BL2一般比较大,因为其包括引导操作系统,还包括在启动阶段支持下载等交互功能,所以BL2会大于IRAM中剩下的80K,因此,BL1执行时会先初始化好SDRAM,然后将BL2引导到SDRAM。因此图中的第三步示意图并不准确。BL1执行时MMU是关闭的,其在建立好临时页表后,会开启MMU,并跳转到BL2开始执行。

          4)BL2会提供与用户交互的模式命令,一般用于研发人员调试,如果是真正的产品则没有这种模式,直接开始引导OS到SDRAM。并跳转到OS开始执行。

          5)一般的启动流程图如下:

          嵌入式启动之四:S5PV210 IROM BL0启动_第3张图片                           

               从上图可以得知,当引导OM所对应的介质的BL1失败(如介质接口有问题、校验失败等)时,还有另外的备选引导方案,即2nd boot,那就是USB引导和串口引导,这里不再展开。

        2. IROM除了引导之后,还做了一些硬件和软件环境初始化工作。主要流程包括:

            1)关闭看门狗

            2)初始化指令cache,开启指令cache

            3)初始化 IRAM中的栈(中断栈、SVC栈)和堆,异常向量注册表等。具体如下图:

                                         

           IROM运行是处于SVC模式。这里的exception vector table并不是异常向量表,而应该称为异常向量注册表。因为异常向量表是在IROM的起始位置上,即0x00000000开始的地方,如下所示,IROM建立起的环境只能支持中断(异常的一种)注册,即注册到0xd0037418,对于其他异常的支持需要在启动或者OS阶段进行重建,并将其定位到SDRAM区域,并设置异常向量的基地址(通过改变协处理器P15的C12-Vector Base Address Register)指向该区域。

           _start: b reset
                      .word 0x0
                      .word 0x0

                      .word 0x0

                      .word 0x0

                      .word 0x0

                      ldr pc, _irq
                      .word 0x0

            4)填充好IRAM的块设备读接口区域。如上图,0xd0037f80开始的128个字节存放的是块设备的拷贝函数地址,如nand,sd/mmc等的读接口地址。其用于后续BL1和BL2使用。即BL1和BL2代码不需要实现外存设备的读驱动函数,只需要调用IROM的接口就可以了。SPEC的p14-p18具体描述了各种不同的介质设备的操作接口地址以及相关的信息。

           5)开启PLL,初始化系统时钟。

           6)copy 16k字节的BL1到SRAM。

           7)对BL1进行校验,即计算BL1的校验值,并与BL1的头部的校验值进行比较,失败即会跳到2nd boot中去引导,成功即跳到BL1的0xd0020010执行。

           后续将详细描述基于S5PV210的uboot启动过程,欢迎关注。

 

你可能感兴趣的:(uboot,bootloader,Cortex,A8,s5pv210,嵌入式启动)