关于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的示例分区:

时间: 2024-07-31 14:25:04

关于iTop4412启动指导的相关文章

IBM小型机远程管理,HMC连接到P5

首先将HMC的键盘.鼠标和显示器连接好.然后将与 HMC 包装在一起的以太网电缆(或交叉电缆)从 HMC 上的以太网端口连接到在受管服务器上标记为 HMC1 的以太网端口.对于独立 HMC 型号,将电缆连接到位于后面板上的集成以太网端口(此端口在后面的配置步骤中标记为 eth0):不要使用位于 PCI 卡(如果已安装)上的以太网端口.对于机架安装式 HMC 型号,将电缆连接到两个纵向排列的以太网端口中位置靠下的那个端口(标为端口 1). 注意:此时不要将受管服务器连接到电源. 设置HMC以识别受

ubuntu 14.04安装quickbuild server

官网: http://www.pmease.com/ 指导网站: http://wiki.pmease.com/display/QB60/ 1.  安装quickbuild server ----------------------------------------------------------- 1.  安装quickbuild server 1.1 下载,解压 1.2 配置,启动 指导网站: http://wiki.pmease.com/display/QB60/Server+Ins

itop4412开发板添加开机启动程序

1. 先编写代码,以helloworld.c为例子 1 #include<stdio.h> 2 #include<unistd.h> //这个文件是什么 3 main() 4 { 5 int i = 0; 6 while(1) 7 { 8 sleep(2); 9 printf("hell0 world!\n"); 10 } 11 } 2. 在ubuntu14环境下,用交叉编译器编译一下,生成.o文件,下一个问题,怎么通过串口把.o文件传给开发板? 3. 在串口l

【Windows10&nbsp;IoT开发系列】“Hello,World!”指导

原文:[Windows10 IoT开发系列]"Hello,World!"指导 本文主要是介绍使用C#来开发一个可以运行在Raspberry Pi2上的一个基本项目. ​1.在启动Visual Studio 2015后,选择"文件"→"新建项目". ​在打开的"新建项目"对话框中,选择"通用". ​选择第一个项目"空白应用(通用Windows)" 新建项目 ​注:如果这是你创建的第一个项

【转】UIAutomator源码分析之启动和运行

我们可以看到UiAutomator其实就是使用了UiAutomation这个新框架,通过调用AccessibilitService APIs来获取窗口界面控件信息已经注入用户行为事件,那么今天开始我们就一起去看下UiAutomator是怎么运作的. 我们在编写了测试用例之后,我们需要通过以下几个步骤把测试脚本build起来并放到测试机器上面: android create uitest-project -n AutoRunner.jar -t 5 -p D:\\Projects\UiAutoma

谋哥:微信启动界面的小人是什么意思?

[谋哥每天一原创,第一百六十三篇] 微信启动首页的这个小人是谁呢?他在干嘛?这张图到底什么意思呢? 谋哥今天就扯淡扯淡这个界面,权当作无聊,但是往往无聊的话最是真实了,这个你懂的. OK,你可能最近看过一些段子,说这个小人是张小龙自己,他孤独地站在那里,表明曾经的他在思考做微信这个产品的时候是孤独的.这个是网上最近的说辞,暂且不说它对和错.首先我们要搞清楚的是,这个小人确实是一个人,不是两个人.一个人很容易被理解代表孤独,但是我觉得未必是如此,后面再细说.说第二点,这个人站在什么位置?很明显,这

使用NFS启动Tiny4412开发板根文件系统

  1.Ubuntu14.04上搭建NFS服务 1.1.安装NFS服务 $ sudo apt-get install nfs-kernel-server    //安装NFS服务 1.2 创建Tiny4412开发板根文件系统 这部分内容参考<Busybox构建根文件系统和制作Ramdisk>部分. 假设Tiny4412开发板根文件系统路径为/home/felix/nfs 1.3. 配置NFS服务器 配置NFS主要涉及配置文件/etc/exports,它用于NFS服务器端,其中列出了NFS服务器

跟踪分析Linux内核的启动过程

李亚健    <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验过程: 实验内容为使用gdb跟踪调试内核从start_kernel到init进程启动 1.根据实验指导按照过程,在实验楼环境下打开shell: cd LinuxKernel/ qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img 输入help指令: 2.使用gdb

第5章2节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 启动流程概览(原创)

天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文"寻求合作伙伴编写<深入理解 MonkeyRunner>书籍".但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在所难免.有需要的就参考下吧,转发的话还请保留每篇文章结尾的出处等信息. 每个应用都会有一个入口方法来供操作系统调用执行,Monkey这个应用的入口方法就是在Monkey.java这个类里面的,也就是说Monkey.java就是整个Monkey应用的入口类. Monkey作为一个命令行应用,