• tiny210裸机第1课(启动原理)


    软硬件环境

    宿主机系统:ubuntu

    板子芯片:S5PV210(Contex-A8),512M DDR2,512M SLC Nand

    交叉编译器:arm-linux-gcc-4.5.1

    手册:S5PV210S5PV210_UM_REV1.1(老版本居然连内存地址空间都不同)

    1.写在前面的话

           虽然现在主要做应用层软件,还是想学一下底层的东东,弄清楚cpu的启动原理。内容多为摘抄《Linux平台下Mini210S裸机程序开发指南》--友善之臂和他人博客,作为日后翻阅的笔记之用。

    2.S5PV210介绍

    S5PV210datasheet中有对它的基本架构的一些介绍,里面有这么一幅图

            

             从这张图中我们可以看出,对于S5PV210来说,采用ContextA8架构,具有32KB的一级缓存(Cache)和512K的二级缓存。

    S5PV210有一个96KiRam和一个64KiRomiRom是拿来存放ContextA8的启动BL0的,在出厂的时候由生产商固化在里面,iRamContextA8的内部RAM,这个才是真正意义上的内存,BL0会把BL1拷贝到iRam中运行。S5PV210支持存储接口包括SRAM/ROM, OneNAND, SLC/MLC NAND, LPDDR1/LPDDR2/DDR2。

    3.S5PV210内存映射 

           

    3. S5PV210启动流程

    参考S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf(以下简称SIAP)以及S5PV210S5PV210_UM_REV1.1.pdf这个版本的datasheet

    3.1板子是怎么启动起来的?

    首先我们看下面这一表(见SIAP p22页):

    从原文可知道OM[5:0] 引脚决定了SP5V210的启动流程,可直接接VDD或GND来进行模式切换。OM[5]则需要多接一个100k的的下拉电阻。

    从友善之臂的原理图中可查到SD启动时,OM[5:0]=001100b,跟原文相符。

    接着我们来看看SIAN里面的一个图:

               

    下面还有个注:BL1 / BL2 : It can be variable size copied from boot device to internal SRAM area. 
                            BL1 max. size is 16KB. BL2 max. size is 80KB.       

        在这个图中我们看以看出我们的S5PV210支持Nor Flash启动,eSSD启动,MMC启动,OneNand启动和Nand启动。B1最大为16KB,BL2最大为80KB。这里的启动代码分为三个部分,第一个就是BL0,第二个就是BL1,第三个就是BL2,这里的BL就是Bootloader的意思。这些标着①②③的就是三星给我们的一个启动流程建议步骤,为啥说是建议的步骤呢?因为我们的启动有时候不一定按照它的建议来,不过流程是不变的,只是代码存放的地方要做一些调整。下面为参考解释:

    (1)BL0:是指S5PV210的iROM中固化的启动代码
            作用:初始化系统时钟,设置看门狗,初始化堆和栈,加载BL1

    (2)BL1:是在iRAM自动从外扩存储器(nand/sd/usb)中拷贝的uboot.bin二进制文件的头最大16K代码
            作用:初始化RAM,关闭Cache,设置栈,加载BL2

    (3)BL2:是指在代码重定向后在内存中执行的uboot的完整代码
            作用:初始化其它外设,加载OS内核

    (4)三者之间的关系:(Interal ROM固化代码)BL0将BL1(bootloader的前16KB--BL1)加载到iRAM;BL1然后在iRAM中运行将BL2(剩下的bootloader)加载到SDRAM;BL2加载内核,把OS在SDRAM中运行起来,最终OS是运行在SDRAM(内存)中的。

    下图为SRAM的内存地址映射。

                

            因为我使用的是从SDMMC启动,所以我们会使用到CopySDMMCtoMem这个函数,这个函数被定义在0xD0037F98这个位置.

        

    这个函数的原型是:

    SD/MMC Copy Function Address
    External source clock parameter is used to fit EPLL source clock at 20MHz.
    /**
    * This Function copy MMC(MoviNAND/iNand) Card Data to memory.
    * Always use EPLL source clock.
    * This function works at 20Mhz.
    * @param u32 StartBlkAddress : Source card(MoviNAND/iNand MMC)) Address.(It must block address.)
    * @param u16 blockSize : Number of blocks to copy.
    * @param u32* memoryPtr : Buffer to copy from.
    * @param bool with_init : determined card initialization.
    * @return bool(u8) - Success or failure.
    */
    #define CopySDMMCtoMem(z,a,b,c,e)(((bool(*)(int, unsigned int, unsigned short, unsigned int*, bool))(*((unsigned
    int *)0xD0037F98)))(z,a,b,c,e))
     

    转自:http://blog.csdn.net/shexujia/article/details/20962573

  • 相关阅读:
    Ascending Rating(单调队列)
    记忆化搜索(学习笔记)
    meet in the middle双向搜索(学习笔记)
    多人01背包(背包k优解)
    神奇的分块算法(学习笔记)
    搜索---从初始状态到目标状态(学习笔记)
    搜索---数独类问题(学习笔记)
    莫队(学习笔记)
    最大子矩形问题(学习笔记)
    Java IO流-合并流
  • 原文地址:https://www.cnblogs.com/zhangpengshou/p/3617800.html
Copyright © 2020-2023  润新知