关于iTop4412启动指导
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于iTop4412启动指导相关的知识,希望对你有一定的参考价值。
iTop4412 irom启动和Exynos4212 iROM Booting Guide是一样的。
制作itop4412 BL1的工具下载地址:http://download.csdn.net/detail/cj675816156/9101607
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寄存器如下:
Register Name | Address |
SFR for Direct-Go flag | 0x0202_0020 |
SFR for Direct-Go address | 0x0202_0024 |
如果Direct-Go功能的Flag寄存器(0x0202_0020)的值是 0xFCBA_0D10
并且Direct-Go功能的地址寄存器(0x0202_0024)的值也提供,那么程序流程就跳转到0x02020024寄存器中所给的地址处执行。
关于启动设备,代码中可以通过读取OM pin管脚所对应的寄存器,就可以知道是从哪个设备启动的,OM各个值有对应的设备如下:
OM[5:1] | 1st Device | 2nd Device |
2 (b‘00010) | SDMMC_CH2 | USB |
3 (b‘00011) | eMMC43_CH0 | USB |
4 (b‘00100) | eMMC44_CH4 | USB |
8 (b‘01000) | NAND_512_8ECC | USB |
9 (b‘01001) | NAND_2KB_OVER | USB |
19 (b‘10011) | eMMC43_CH0 | SDMMC_CH2 |
20 (b‘10100) | eMMC44_CH4 | SDMMC_CH2 |
24 (b‘11000) | NAND_512_8ECC | SDMMC_CH2 |
25 (b‘11001) | NAND_2KB_OVER | SDMMC_CH2 |
下面来介绍下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拷贝接口、usb拷贝接口等),那么这些接口在哪里呢?
答案就是在0x0202_0030 到 0x0202_0070 这些地址就是一个个拷贝功能函数的入口,可以通过使用函数指针指向某个地址然后调用相应的拷贝函数。
下面来介绍下这些功能函数:
Address | Name | Descripyion |
0x02020030 | SDMMC_ReadBlocks |
这个接口功能是从SD或MMC类型设备拷贝数据到目的地址中; 返回1=True,0=False;参数(u32 SrcBlock,u32 NumofSrcBlock,void * DstByte) SrcBlock:start block number.(0 ~ n)拷贝起始块的编号从0开始 NumofSrcBlock:拷贝块的数目 DstByte:目的地址(System Memory) |
0x0202003C | LoadBL2FromEmmc43Ch0 |
这个接口从emmc 4.3拷贝BL2启动区数据到内部RAM; 返回1=True,0=False;参数(u32 SrcBlock,u32 * DstByte) |
0x02020040 | Emmc43_EndBootOp_eMMC |
这个接口结束emmc 4.3启动模式; 返回和参数都是void |
0x02020044 | MSH_ReadFromFIFO_eMMC |
这个接口从emmc 4.4拷贝启动区数据到目的地址; 返回1=True,0=False;参数(u32 uNumofBlocks,void * uDstAddr) uNumofBlocks:传输的总块数,1块=512B uDstAddr:目的地址(System Memory) |
0x02020048 | MSH_EndBootOp_eMMC |
这个接口结束emmc 4.4启动模式; 返回和参数都是void,这个函数会等待上面读函数的结束。 |
0x02020070 | LoadImageFromUsb |
这个接口从USB拷贝数据,如果在iROM中枚举成功,这个功能就能用; 返回1=True,0=False;参数void |
注意:
1. 在启动时提供给SDMMC和eMMC的时钟是20Mhz,MPLL是这些时钟的源头。
2. 如果SDMMC和eMMC被选中为启动设备,那么iROM中SDMMC或eMMC拷贝函数在BL1和BL2阶段是可以使用的。如果你要使用这两函数,那么在使用前请不要修改SDMMC或eMMC的时钟。
另外不要修改SDMMC或eMMC相关的PLL时钟配置。如果你修改了SDMMC或eMMC相关的时钟配置,那么正确的拷贝我们无法保证。
如下给出了参考SD启动关于sdcard的示例分区:
以上是关于关于iTop4412启动指导的主要内容,如果未能解决你的问题,请参考以下文章