Exynos4412启动

来源:互联网 发布:winzip 软件下载 编辑:程序博客网 时间:2024/06/10 09:09

    开始使用iTop-4412开发板学习Exynos4412,启动文档参考网上其他人博客进行总结

    Exynos4412启动

    内存映射

        

    我们需要关注的主要是上面三个。

        iROM:这段地址空间对应exynos4412内部固化的一段程序,exynos4412启动的第一条指令就存放在这里。

        iRAM:这段地址空间对应的是exynos4412内部的一个存储器,这段存储器的特点是上电就可以用,不用初始化。

        DMC0:这段地址空间就是核心板上的DDR3对应的存储空间(有些开发板上有1GB的DDR3,所以地址空间是0x40000000-0x80000000),上电后需要初始化DRAM控制器才能使用。

          

    上图中,iROM首先运行,然后根据OM的值判断从 哪个存储设备加载BL1到iRAM,然后BL1再根据OM的值判断从哪个存储设备加载OS到DRAM中。注意:以tiny4412从sdcard启动为例,iROM固化在SOC内部,BL1是Samsung提供的镜像文件E4412_N.bl1.bin,OS在这里可以认为是BL2,这部分是u-boot代码中编译生成的SPL,BL2是由BL1加载到iRAM中运行的。最后,BL2再根据OM值,从sdcard中将u-boot代码拷贝到DRAM中

    做实验时我们是把bin文件烧入TF卡,如何把这些指令从TF卡读出来执行?

        1.固化在芯片内部ROM上的代码---它被称为iROM ,iROM是厂家事先烧写在芯片上的,无源码。

        2.iROM把启动设备上特定位置处的程序读入片内存(iRAM) ,并执行它。这个程序被称为 BL1(Bootloader 1) ,BL1 是三星公司提供的,无源码。

        3.BL1又把启动设备上另一个特定位置处的程序读入片内内存,并执行它。这个被称为 BL2(Bootloader 2) ,是我们编写的源码。

 

    iROM、BL1更细致的启动过程如下图所示(摘自Android_Exynos4412_iROM_Secure_Booting_Guide_Ver.1.00.00.pdf):

        

    由上图可以看出,首先关闭看门狗,关闭中断及MMU,关闭数据缓存,打开指令缓存,清除TLB,然后将其他核进入IDLE模式,只留CPU0,这里有了第一个跳转分支,IROM判断当前启动模式,是冷启动还是唤醒,如果是唤醒模式,那么就是直接跳转到BL1,在BL1里面我们会再次判断是否是唤醒模式,如果是就直接跳转到唤醒函数,一般都是linux内核的唤醒句柄。当然在裸机里都是冷启动的,休眠唤醒一般是不需要关注的,当然如果你的裸机程序需要支持休眠唤醒,就需要增加相应的代码了。

    继续分析,设置IRQ及SVC模式的栈空间,这个时间,栈地址是其内部的一片IRAM,这小片RAM是IROM运行的外部随机存储器,没有这片小内存,IROM是无法运行的。接下了就是初始化IROM里面所使用的各种变量,初始化只读数据段,未初始化数据段清零,导出部分核心函数,这个函数可以在 BL1中使用,获取当前复位的状态,设置系统时钟分频,获取OM管脚配置模式,这里可以从多种外设启动,具体启动模式如下表:

        

    我们整个裸机教程都是从外部TF卡启动,根据OM启动模式,从TF卡拷贝前8K代码,如果拷贝成功,就验证校验和,BL1的前16个字节就是提供给IROM用来标识BL1相关信息的,具体信息如下:

        /*        * bl1 header infomation for irom        *        * 0x0 - bl1 size        * 0x4 - reserved (should be 0)        * 0x8 - check sum        * 0xc - reserved (should be 0)        */        .word 0x2000        .word 0x0        .word 0x0        .word 0x0


    首先是描述BL1的大小,然后还有一个BL1的校验和,那我们怎么知道BL1的校验和呢,这个是在编译生成最终的二进制文件后,通过mk4412程序制作的

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

    下图是 BL1 的启动过程

        

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

    有几个问题需要解决

        ①在启动设备上哪个位置存放 BL1、BL2?

        ②把BL1 BL2 读到 iRAM哪个位置?

        ③BL1 、BL2 大小是多少?

        ④ 怎么保证 BL1 、BL2 程序的完整性(即读出程序时没有错误 )?

    假设启动备为  卡, 如下图所示(这里只分析SD卡启动):

        

        

    BL1 位于TF卡偏移地址 512字节处(即从第一个扇区开始,前面有一个扇区保留,每个扇区512字节,为什么保留第一个扇区,如果有同学对DOS分区表有过研究,就能明白其中的道理了,第一个扇区是分区表的配置区),iROM从这个位置读入8K 字节的数据,存在iRAM地址 0x02021400位置处。所以 BL1不能大于8K 。

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

    BL2 位于 TF 卡偏移地址 (512+8K)字节处,BL1从这个位置读入14K 字节的数据,存在iRAM 地址 0x02023400 处。 BL2 不能大于(14K – 4) 字节,最后 4字节用于存放较验码(在汇编流水灯试验中我们用mkbl2工具制作的BL2,其中mkbl2工具最主要的作用就是计算出校验码)。

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

 

原创粉丝点击