关于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启动指导的主要内容,如果未能解决你的问题,请参考以下文章

u-boot启动流程详解-基于iTop4412开发板

iTOP-4412开发板网盘资料介绍

linux内核代码框架熟悉 itop4412-linux内核4.14.2总体框架熟悉

iTOP-4412 平台基础软件的安装和学习

iTOP-4412开发板-串口基础知识和测试方法

iTop4412时钟配置