iTop4412 irom启动和Exynos4212 iROM Booting Guide是一样的。
iROM阶段启动流程
本次介绍如何构建Exynos4412中的BL1和BL2,使irom能成功加载BL1、BL2最后执行OS。
iROM中存储的是用于启动阶段从(NAND、emmc、SDcard等)加载特定二进制到RAM/SRAM中的程序,此程序由三星公司在芯片出厂时就烧录,未给出代码,所以我们不能看到源代码。irom加载启动过程详见下面图:
1.首先irom为执行arm代码提供初始化好的基本环境 2.把BL1从特定的启动设备(SD/MMC, eMMC4.3, eMMC4.4, and NAND)中拷贝到内存SRAM 3.irom检查内存SRAM中的BL1的完整性,如果检查拷贝结果是OK的就跳到BL1中执行
Direct-Go
这个选项目的是为了跳过BL1和BL2的执行,条件是系统是刚从AFTR, DEEPSTOP, and LPA 模式被唤醒。
如果专用的寄存器在进入以上三个模式前已经配置了Direct-Go,那么iROM代码将执行指定地址DDR中的代码,不回去执行BL1和BL2了。
Direct-Go寄存器如下:
如果Direct-Go功能的Flag寄存器(0x0202_0020)的值是 0xFCBA_0D10 并且Direct-Go功能的地址寄存器(0x0202_0024)的值也提供,那么程序流程就跳转到0x02020024寄存器中所给的地址处执行。
关于启动设备,代码中可以通过读取OM pin管脚所对应的寄存器,就可以知道是从哪个设备启动的,OM各个值有对应的设备如下:
下面来介绍下BL1的流程:
BL1读取启动模式寄存器判断是从哪个设备上启动的,然后从这个设备读取BL2到SRAM里面,然后检查SRAM中BL2的完整性。BL1的code应该不依赖于外部平台的配置,此外安全上下文数据应该是在BL1里面的,
BL1内还有BL2的安全校验公钥,BL2的公钥用于校验BL2是否是作者自己的未修改过的程序镜像,如果不是则会启动失败。
关于BL2启动流程:
BL2拷贝OS镜像(BL3)到DDR中然后检查OS镜像的完整性。
在BL2中会初始化系统时钟和配置初始化DDR,如果必要也可以初始化uart、net、emmc、sdcard等。
BL2中的流程代码是不依赖BL1,就是说BL2不会再回去调用BL1的流程。
各个阶段的启动流程基本上就是这样了,下面介绍内部内存映射即SRAM中怎么划分各段的,各段内都放些什么?
BL1的大小就是8KB即8192字节,SRAM的起始地址开始5KB是为iROM预留的,BL1代码安全上下文存储在0x0202_3000的位置,BL2的大小是可以修改BL1来调整的,只要BL1多拷贝点BL2就可以放大了。
在(S.LSI‟s reference code of BL1)三星给的BL1中指定的BL2最大是14KB - 4B,4B是存放BL2的校验码的,如果你制作的BL2不满14KB-4,则不满的那些地方应该填0,BL2的签名位于0x0202_6C00,checksum for BL2 位于 0x0202_6BFC in S.LSI‟s reference code.
iROM要拷贝BL1到SRAM里面,那么它肯定有一些功能接口比如(sdcard拷贝接口、emmc拷贝接口、u***拷贝接口等),那么这些接口在哪里呢?
答案就是在0x0202_0030 到 0x0202_0070 这些地址就是一个个拷贝功能函数的入口,可以通过使用函数指针指向某个地址然后调用相应的拷贝函数。
下面来介绍下这些功能函数:
注意:
1. 在启动时提供给SDMMC和eMMC的时钟是20Mhz,MPLL是这些时钟的源头。 2. 如果SDMMC和eMMC被选中为启动设备,那么iROM中SDMMC或eMMC拷贝函数在BL1和BL2阶段是可以使用的。如果你要使用这两函数,那么在使用前请不要修改SDMMC或eMMC的时钟。
另外不要修改SDMMC或eMMC相关的PLL时钟配置。如果你修改了SDMMC或eMMC相关的时钟配置,那么正确的拷贝我们无法保证。
如下给出了参考SD启动关于sdcard的示例分区:
|