zoukankan      html  css  js  c++  java
  • X-002 Exyson4412芯片启动过程分析

     

    移植u-bootFriendlyARM 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的详细信息)

    1Exyson4412芯片的启动方式

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

    clip_image001

    clip_image003

    clip_image005

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

    Ÿ   iROM从启动外设加载BL1到内部256KBSRAM中,启动外设是由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):

    clip_image007

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

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

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

        <2> BL1BL2 :摘自Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdfP10

    clip_image009

    clip_image010

    clip_image012

    clip_image013

    2Exyson4412芯片启动模式选择

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

    clip_image015

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

    clip_image017

    clip_image019

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

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

        3.1启动设备是SD卡,BL1BL2SD卡上存放位置为:

    摘自:Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf P24

    clip_image021

    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卡,BL1BL2SD卡上存放位置为:

    摘自:Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf P24

    clip_image022

     

    参考文档

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

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

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    通过CMMI5的国内企业有几个?这个认证是不是很牛啊?
    CNUTCon 全球运维技术大会2017
    新浪微博基于Docker的混合云架构与应用实践-DockerInfo
    k8s~为服务添加ingress的实现
    springboot~HttpPut开启application/x-www-form-urlencoded
    K8s~为pod添加sidecar进行日志收集
    k8s~部署EFK框架
    springboot~Transactional注解的注意事项
    CentOS 6.4 快速安装Nginx笔记
    去掉NSString中的HTML标签
  • 原文地址:https://www.cnblogs.com/LoTGu/p/6076042.html
Copyright © 2011-2022 走看看