三星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中。S5PV210的SPEC是《S5PV210_UM_REV1.1.pdf》,在其第29页~30页中描述了IROM和IRAM的内存映射图。IRAM,即内置RAM,在启动引导阶段有两个作用:一是IROM运行时使用的数据变量所在的区域,二是IROM,即BL0会将外存中的BL1引导到该区域中。因为IROM启动运行的时候,外置SDRAM还没有初始化好,而IRAM是可用的,因此必须要把BL1加载到IRAM中运行,由BL1对SDRAM进行初始化。IROM为什么不初始化SDRAM呢?那是因为支持的SDRAM规格是可变的,由固化代码来初始化显得不够灵活,而且固化代码往往代码量比较小,因为越多越容易出BUG,出BUG就会导致SOC芯片重新掩膜tapout,一次可要好几百万人民币呢。由内存映射图可以得到:
IROM是64K,在0x0000-0000开始的区域,而IRAM是96K,在0xD0020000-0xD0037FFF。
S5PV210的IROM的SPEC是《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得到。
2)根据OM的值,IROM中的BL0选择其固话的对应驱动将对应介质的前16K代码数据读到IRAM中。引导代码之后会进行校验,校验和BL1的长度信息放在16K代码数据的最前面16个字节。为什么需要长度?因为校验是对确定长度的内容进行计算得到,而BL1的有效代码数据可能并没有16K。BL1头部信息和校验算法如下图:
加载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)一般的启动流程图如下:
从上图可以得知,当引导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启动过程,欢迎关注。