zoukankan      html  css  js  c++  java
  • 原来程序是这样从NandFlash拷贝并跳转到SDRAM的

    重新看了一下FL2440的BootLoader,终于把程序是怎样从Nandflash拷贝并跳转到SDRAM的过程弄清楚了,在这边做一下笔记。先上张图:

    1.

    当S3C2440被配置成从Nand Flash启动时, S3C2440的Nand Flash控制器会在 S3C2440上电时自动把NandFlash上的前4K代码搬移到Boot Internal SRAM,然后系统从起始地址是0x0000_0000的Boot Internal SRAM启动,在这4K代码中我们必须完成CPU的核心配置,把NandFlash上的代码全部拷贝到SDRAM中去,然后跳转到SDRAM中去执行剩余的代码(进入操作系统等等);

     

    2.

    这一步完成的是把NandFlash上的代码拷贝到SDRAM的过程:

    (1)先判断是从nor启动还是从nand启动      

         ldr        r0,=BWSCON

                 ldr        r0,[r0]

                 ands     r0,r0, #6                  ;OM[1:0] != 0, NOR FLash boot

                 bne      NORRoCopy           ;don't read nand flash

                 adr       r0,ResetEntry          ;OM[1:0] == 0, NAND FLash boot // ADR 装载参照的地址=subr0,pc,#off_set;

                 cmp      r0,#0                      ;if use Multi-ice,//JTAG调试时是直接下载到SDRAM中运行,不需要再从nand拷贝

                 bne      InitRamZero            ;don't read nand flash for boot

     

    注意哦,执行adr r0,ResetEntry 后,r0 = PC - off_set,adr得到是相对地址而不是绝对地址。ResetEntry是整个程序的入口处,由链接器指定入口地址,如下图,ResetEntry=RO Base=0x3001_0000即|Image

    RO
    Base|。当程序在SDRAM中运行时,当前PC=0x3001_0000+off_set,r0=0x3001_0000,当程序在Boot Internal SRAM运行时,由于程序是从0x0000_0000开始运行的,所以当前PC=0x0000_0000+off_set,即r0=0x0000_0000。所以可以通过 cmp r0,#0来判断程序是否运行在Boot Internal SRAM,如果是,则把NandFlash中的程序拷贝到SDRAM。

    (2)从NandFlash拷贝程序到SDRAM

    在这步中最让我困惑的是在SDRAM中从哪个地址开始存放从NandFlash拷过来的程序。

    ;===========================================================
    ;//将程序从nandflash拷贝到sdram
    ;===========================================================
    nand_boot_beg
                bl         ClearSdram
                mov      r5,#NFCONF
                ;set timing value
                ldr        r0,        =(7<<12)|(7<<8)|(7<<4)
                str        r0,        [r5]
                ;enable control
                ldr        r0,=(0<<13)|(0<<12)|(0<<10)|(0<<9)|(0<<8)|(1<<6)|(1<<5)|(1<<4)|(1<<1)|(1<<0)
                str        r0,[r5, #4]
               
                bl         ReadNandID
                mov      r6,#0
                ldr        r0,=0xecF1
                cmp      r5,        r0
                beq      %F1
    ;           ldr        r0,=0xecda
    ;           cmp      r5,r0
                mov      r6,#1                            ;Nandaddr(寻址周期 0:4 1:5)
    1         
                bl         ReadNandStatus
               
                mov      r8,#0
                ldr        r9,=ResetEntry
                mov r10,#32                              ;+081010 feiling

     

    上面代码中最关键的是这句:

     ldr        r9,=ResetEntry

    其它都是一些NandFlash的相关设置与操作细节,先不管了。这据代码中用ldr来获得在SDRAM存放代码的起始地址,ldr将ResetEntry的绝对地址|Image

    RO
    Base|赋给了r9。也就是说,从NandFlash拷过来的代码放在了SDRAM中从|Image
    RO
    Base|开始的地址空间里。

     

    3.

    CPU配置完了,程序和数据也都拷到SDRAM里了,该跳转到SDRAM里去做其他事情了,怎么知道是否跳转到SDRAM呢?这还是地址啊。我之前一直搞不清楚为什么一句ldr pc,=CEntry和bl Main 就能从Boot Internal SRAM直接跳到SDRAM,原来在编译的时候,像ResetEntry和CEntry这些表示地址的标号都被赋于从|Image

    RO
    Base|开始之后的地址,只要|Image
    RO
    Base|大等于0x3000_0000,利用ldr取得绝对地址后赋给PC就能直接跳转到SDRAM里去了。我之前一直以为ResetEntry=0x0000_0000,而且分不清ldr和adr之间的差别,因此纠结了好久。  

    ldr        pc,=CEntry                   ;goto compiler address
     
    CEntry
                bl         Main                  ;Don t use main()because ......
                b          .

    洗洗睡了,明天再看一下中断向量表。

    以上内容转载自:http://blog.csdn.net/canjiangsu/article/details/6584791
  • 相关阅读:
    MindSpore 建立神经网络
    MindSpore 数据加载及处理
    MindSpore 初探, 使用LeNet训练minist数据集
    Ubuntu 20.04 Xrdp Black Screen Ubuntu 20.04 Xrdp 远程桌面黑屏
    基于Transformer的ViT、DETR、Deformable DETR原理详解
    Ubuntu 18.04 / 20.04 自定义锁屏时间
    Transformer中K 、Q、V的设置以及为什么不能使用同一个值
    Auto-Encoding Scene Graphs for Image Captioning
    Eureka中读写锁的奇思妙想,学废了吗?
    PostgreSQL-查询所有索引
  • 原文地址:https://www.cnblogs.com/shuaishuaidefeizhu/p/6497374.html
Copyright © 2011-2022 走看看