zoukankan      html  css  js  c++  java
  • FS4412的启动流程分析

    先了解一下FS4412开发板的硬件环境,

     可以看到:

      4412有8G内存,即 DDRⅢ 双速率SDRAM,可片上执行,一般为机器运行软件提供内存,掉电后数据丢失。

      还有4G的eMMC,也就是Nand Flash,但是同时集成了主控芯片与接口,不可以片上执行,但掉电后数据不会丢失。

      同时4412支持SD卡启动,SD也是Nand Flash的集成,一般我们会把uboot或裸机程序烧写到eMMC或SD卡上。

    以下内容转自:

    Exynos4412启动过程分析

    再看一下芯片启动框图(芯片手册里的)

      

    从图中可以看到4412内部有64K的ROM和256K SRAM,在ROM中已经固化好了一段代码——iROM BOOT代码,上电后先运行 iROM BOOT (BL0),用于初始化SRAM,并将eMMC中256k代码(BL1)拷贝到SRAM中,进而BL1进行初始化DRAM。(在这儿,我们知道ROM掉电不会丢失数据,且CPU可以直接访问,进行取指令,但是不能直接写数据,由此应该为片内Nor Flash)

    启动运行过程大概如下:

    1:、硬件上电后,实现运行iROM中固化的代码,读取OM电平从而确定硬件启动模式(拨码开关:0110--eMMC启动, 1000--SD卡启动);

    2、把已经设置启动存储单元代码复制到内部RAM中并跳转到RAM运行;

    3、运行系统

    一、iROM

      iROM里面的代码具体干了什么呢?先通过ROM运行流程图来分析一下:

       

      由流程图可以看出,首先关闭看门狗,关闭中断及MMU,关闭数据缓存,打开指令缓存,清除TLB,然后将其他核进入IDLE模式(待机模式),只留CPU0,这里有了第一个跳转分支,IROM判断当前启动模式,是冷启动还是唤醒,如果是唤醒模式,那么就是直接跳转到BL1,在BL1里面我们会再次判断是否是唤醒模式,如果是就直接跳转到唤醒函数,一般都是linux内核的唤醒句柄。当然在裸机里都是冷启动的哈,休眠唤醒一般是不需要关注的,当然如果你的裸机程序需要支持休眠唤醒,就需要增加相应的代码了。
      继续看,冷启动模式后,设置IRQ及SVC模式的栈空间,这个时间,栈地址是其内部的一片IRAM,这小片RAM是IROM运行的外部随机存储器,没有这片小内存,IROM是无法运行的。接下了就是初始化IROM里面所使用的各种变量,初始化只读数据段,未初始化数据段清零,导出部分核心函数,这个函数可以在BL1中使用,获取当前复位的状态,设置系统时钟分频,获取OM管脚配置模式,这里可以从多种外设启动。

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

     二、BL1的启动过程

     单地说,也是设置程序运行环境(初始化中断、设置栈等 );然后从启动设备上把 BL2读入iRAM;最后启动BL2

    三、SD卡作为启动方式

      

     

    BL1 位于SD卡偏移地址 512字节处(即从第一个扇区开始,前面有一个扇区保留,每个扇区512字节,为什么保留第一个扇区,如果有同学对DOS分区表有过研究,就能明白其中的道理了,第一个扇区是分区表的配置区),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字节用于存放较验码(在汇编流水灯试验中我们用mkbl2工具制作的BL2,其中mkbl2工具最主要的作用就是计算出校验码)。

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

    更精彩的解析详见:

    Exynos4412裸机开发系列教程--启动

  • 相关阅读:
    jQuery链式编程时修复断开的链
    只是一个用EF写的一个简单的分页方法而已
    asp.net Core 获取应用程序所在目录的2种方式
    FineUI使用记录
    C#判断一个string是否为数字
    MVC中利用ViewBag传递Json数据时的前端处理方法
    基于Ajax的文件上传使用FileInput插件(使用谷歌翻译作者的原文,大致意思是对的,自己把握)
    ansible中tag的用法
    rabbitMQ中vhost虚拟主机的理解
    一些比较好的链接
  • 原文地址:https://www.cnblogs.com/y4247464/p/12355409.html
Copyright © 2011-2022 走看看