移植u-boot到FriendlyARM Tiny4412开发板上,首先我们需要对Samsung Exyson4412芯片的启动方式系统时钟初始化串口初始化内存初始化以及开发板的内存地址空间分配有一个清楚的认识。

下面是一些参考资料:

1>技术部落 (这个网站对Exyson4412芯片的启动、时钟系统、串口以及内存初始化进行了详细的讲解)

2>、嵌入式Linux系统开发完全手册_基于4412_上册.pdf (这个文档是韦东山写的,讲的也非常好)

3>、Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf (这篇文档是Samsung的官方文档,详细介绍了这款Exyson4412的启动)

4>、SEC_Exynos4412_Users Manual_Ver.1.00.00.pdf (这篇文档也是Samsung官方文档,是exynos4412的用户手册,有两千八百多页,包含了exynos4412的详细信息)

1、Exyson4412芯片的启动方式

参考Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf的第五章Booting Sequence。

Ÿ   iROM是存储在内部的64KROM中的,主要进行CPU的时钟,堆栈等基本初始化工作。

Ÿ   iROM从启动外设加载BL1到内部256KB的SRAM中,启动外设是由OM来决定的,根据安全启动设置值,iROM可能会较验BL1镜像文件。

Ÿ   BL1初始化内部系统时钟和DRAM控制器,在初始化完成DRAM控制器,开始加载OS镜像文件,根据安全启动设置值,BL1可能会较验OS镜像文件。

Ÿ   等启动完成后,BL1就跳转到操作系统进行执行。

<1> iROM :iROM把启动设备上特定位置处的程序读入片内存 (iRAM) ,并执行它。iROM的启动过程如下图所示(摘自Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf):

由上图可以看出,iROM首先关闭看门狗,关闭中断及MMU,关闭数据缓存,打开指令缓存,清除TLB,然后将其他核进入IDLE模式,只留CPU0,这里有了第一个跳转分支,IROM判断当前启动模式,是冷启动还是唤醒,如果是唤醒模式,那么就是直接跳转到BL1,在BL1里面我们会再次判断是否是唤醒模式,如果是就直接跳转到唤醒函数。

接着设置IRQ及SVC模式的栈空间,栈地址是其内部的一片IRAM,这小段RAM是IROM运行的外部随机存储器,没有这片小内存,IROM是无法运行的。接下了就是初始化IROM里面所使用的各种变量,初始化只读数据段,未初始化数据段清零,导出部分核心函数,这个函数可以在BL1中使用,获取当前复位的状态,设置系统时钟分频,获取OM管脚配置模式,从指定的启动设备上拷贝BL1的代码到iRAM中。如果拷贝成功,就验证校验和,BL1的前16个字节就是提供给IROM用来标识BL1相关信息的。

简单地说,iROM就是先设置程序运行环境 (比如关看门狗、关中断、关MMU 、设置栈 、设置栈 、启动 PLL 等 );然后根据OM引脚确定启动设备 (NAND Flash/SD 卡/eMMC卡/其他 ),把 BL1 从指定的启动设备里面读出存入iRAM,接着在iRAM里面执行 BL1的代码。

<2> BL1、BL2 :摘自Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf的P10

2、Exyson4412芯片启动模式选择

OMpin OM[5:1]设置Exyson4412从不同的外设加载程序,如SD卡,NANDFlash等。

Tiny4412的电路图(Tiny4412-1412-Schematic.pdf)如下图所示:

由Table 5-3 OM Pin Setting和Tiny4412的电路图的BootingMode Option可知,XOM0,XOM1,XOM4,XOM5都设置成0,那么主要看XOM2和XOM3了,这两个脚分别接在74LVC1G04反向器的输入和输出上。XOM2接1时,XOM3为0,OM[5:1]为5b'00010,此时选择的是从SD卡(SDMMC_CH2)启动;XOM2接0时,XOM3为1,OM[5:1]为5b'00100,此时选择的是从eMMC卡(eMMC44_CH4)启动;这个启动方式主要由电路板上开关决定。

3、BL1、BL2在启动设备上的存放位置、大小、读到 iRAM哪个位置?

3.1启动设备是SD卡,BL1、BL2在SD卡上存放位置为:

摘自:Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf P24

BL1 位于SD卡偏移地址 512字节处(即从第一个扇区开始,前面有一个扇区保留,每个扇区512字节,第一个扇区是分区表的配置区),iROM从这个位置读入8K 字节的数据,存在iRAM地址 0x02021400位置处。 所以 BL1不能大于8K 。

iROM计算校验和且验证通过后并解密BL1成功后就可以跳转到BL1了,至此iROM已执行完备,权限已交由BL1了,补充说明一下,解密BL1是加密模式启动时才需要的,非加密模式启动是无需解密BL1的。

BL2 位于 SD 卡偏移地址 (512 +8K)字节处,BL1从这个位置读入14K 字节的数据,存在iRAM 地址 0x02023400 处。 BL2 不能大于(14K – 4) 字节,最后 4字节用于存放较验码。

如果我们的程序大于 (14K – 4) 字节,那么需要截取前面 (14K – 4) 字节用来制作BL2并烧入SD卡偏移地址 (512 +8K) 字节处。当BL2启动后,由它来将存放在SD卡另外位置的、完整程序读入内存。

3.2启动设备是eMMC卡,BL1、BL2在SD卡上存放位置为:

摘自:Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf P24

参考文档

1、http://www.cnblogs.com/pengdonglin137/p/5080309.html

2、http://www.techbulo.com/1335.html

X-002 Exyson4412芯片启动过程分析的更多相关文章

  1. 【Bootloader】bootloader启动过程分析

    Boot Loader启动过程分析 一.    Boot Loader的概念和功能 1.嵌入式Linux软件结构与分布在一般情况下嵌入式Linux系统中的软件主要分为以下及部分: (1)引导加载程序: ...

  2. Linux内核分析(三)内核启动过程分析——构造一个简单的Linux系统

    一.系统的启动(各历史节点) 在最开始的时候,计算机的启动实际上依靠一段二进制码,可以这么理解,他并不是一个真正的计算机启动一道程序.计算机在开始加电的时候几乎是没有任何用处的,因为RAM芯片中包括的 ...

  3. ASP.Net Core MVC6 RC2 启动过程分析[偏源码分析]

    入口程序 如果做过Web之外开发的人,应该记得这个是标准的Console或者Winform的入口.为什么会这样呢? .NET Web Development and Tools Blog ASP.NE ...

  4. 开机SystemServer到ActivityManagerService启动过程分析

    开机SystemServer到ActivityManagerService启动过程 一 从Systemserver到AMS zygote-> systemserver:java入层口: /** ...

  5. Neutron分析(2)——neutron-server启动过程分析

    neutron-server启动过程分析 1. /etc/init.d/neutron-server DAEMON=/usr/bin/neutron-server DAEMON_ARGS=" ...

  6. linux视频学习7(ssh, linux启动过程分析,加解压缩,java网络编程)

    回顾数据库mysql的备份和恢复: show databases; user spdb1; show tables; 在mysql/bin目录下 执行备份: ./mysqldump -u root - ...

  7. Activity启动过程分析

    Android的四大组件中除了BroadCastReceiver以外,其他三种组件都必须在AndroidManifest中注册,对于BroadCastReceiver来说,它既可以在AndroidMa ...

  8. Spark Streaming应用启动过程分析

    本文为SparkStreaming源码剖析的第三篇,主要分析SparkStreaming启动过程. 在调用StreamingContext.start方法后,进入JobScheduler.start方 ...

  9. ActivityManagerService启动过程分析

    之前讲Android的View的绘制原理和流程的时候,讲到过在Android调用setContentView之后,Android调用了一个prepreTravle的方法,这里面就提到了Activity ...

随机推荐

  1. linker command failed with exit code 1 (use -v to see invocation)修改方法

    它的意思是指文件丢失或者文件重复,你就要仔细查看项目中有没有重复的文件,如有重复修改即可,如果是文件丢失,那就麻烦啦!你需要根据报错的地方进行修补文件,最为直接的方法是重新创建项目.还有另外一种情况是 ...

  2. java 线程的同步

    Example12_7.java public class Example12_7 { public static void main(String args[]) { Bank bank = new ...

  3. TweenMax说明

    TweenMax 采用了与它的兄弟相似的易于学习的语法结构.实事上,因为它扩展自它们,TweenMax 可以做任何 TweenLite 和/或者 TweenFilterLite 能做的事,还加上了更多 ...

  4. Git学习 -- 标签管理

    新建标签 git tag <tagname>   默认为HEAD,也可以指定一个commit id eg.   git tag v0.9  git tag v1.0 31aa59c git ...

  5. 转:LR的响应时间与使用IE所感受时间不一致的讨论

    在做性能测试时,有时碰到这样一种情况,使用性能工具LR测试出来的响应时间比实际使用IE感受到的时间要长,例如,实际使用IE打开一个系统时只需要1~2秒,而使用LR跑一个用户所得出的结果可能是8秒.10 ...

  6. 使用ADO对象添加、修改、删除数据

    使用ADO对象对数据库中的数据进行添加.修改和删除等操作.首先创建一个ADO类,通过ADO类连接数据库,并打开记录集.例如,使用ADO对象添加.修改.删除数据,程序设计步骤如下:(1)创建一个基于对话 ...

  7. Linux中防火墙centos

    一般的防火墙用下面这些简单的配置都能达到目的 1) 重启后生效 开启: chkconfig iptables on 关闭: chkconfig iptables off 2) 即时生效,重启后失效 开 ...

  8. PAT1002

    This time, you are supposed to find A+B where A and B are two polynomials. 这一次,你被要求计算A+B当A和B是两个多项式的时 ...

  9. Struts2, jquery, select二级联动

    1. 下载jquery.js文件放在webroot下js文件夹里 2. 配置struts.xml: <package name="default" namespace=&qu ...

  10. Entity Framework 学习初级篇4--Entity SQL

    Entity SQL 是 ADO.NET 实体框架 提供的 SQL 类语言,用于支持 实体数据模型 (EDM).Entity SQL 可用于对象查询和使用 EntityClient 提供程序执行的查询 ...