重新看了一下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

原来程序是这样从NandFlash拷贝并跳转到SDRAM的的更多相关文章

  1. 在应用程序中实现对NandFlash的操作

    以TC58NVG2S3ETA00 为例: 下面是它的一些物理参数: 图一 图二 图三 图四 图五 图6-0 图6-1 说明一下,在图6-1中中间的那个布局表可以看做是实际的NandFlash一页数据的 ...

  2. NandFlash、NorFlash、DataFlash、SDRAM释义

    1. NandFlash和NorFlash       Flash存储芯片,俗称闪存,因其具有非易失性.可擦除性.可重复编程及高密度.低功耗等特点,广泛地应用于手机.数码相机.笔记本电脑等产品.    ...

  3. 微信小程序:wx.navigateTo中url无法跳转问题(app.json中配置的tabBar与wx.navigateTo中url引用相同页面导致)

    今天在做微信小程序时,设置wx.navigateTo页面跳转并传参数,点击始终没有效果,代码如下: //事件处理函数 newsDetail: function (event) { console.lo ...

  4. 微信小程序开发:学习笔记[8]——页面跳转及传参

    微信小程序开发:学习笔记[8]——页面跳转及传参 页面跳转 一个小程序拥有多个页面,我们可以通过wx.navigateTo推入一个新的页面.在首页使用2次wx.navigateTo后,页面层级会有三层 ...

  5. 微信小程序中,如何点击链接跳转到外部网页

    跳转到内部链接 这个我们应该都知道,通过wx.navigateTo,wx.redirectTo,wx.swtichTab等小程序内部的方法,可以直接跳转到小程序内部已经注册的(就是在app.json中 ...

  6. 微信小程序实现淡入淡出效果(页面跳转)

    //目前小程序没有fadeIn(),fadeOut()方法所以还是本方法手写  <!--wxml--><!--蒙版(渐出淡去效果)--><view class=" ...

  7. 【小程序】当遇到bindTap绑定无法跳转到tabbar页面时

    如下图: 更换成navigator包裹跳转也不起作用. cart目录在app.json中定义在底部tabBar中 在小程序 导航 文档 最下方表示 所以,以上应改为

  8. 微信小程序开发——超链接或按钮点击跳转到其他页面失效

    1. 超链接导航失效: 小程序规则——wx.navigateTo 和 wx.redirectTo 不允许跳转到 tabbar 页面,只能用 wx.switchTab 跳转到 tabbar 页面

  9. IOS:程序的退出、App间的跳转

    今天在做一个音乐播放器的项目,发现这个点击退出程序的功能不能实现终于找到了一些有用的资料,就去网上看了半天资料,下面是退出程序的代码: 在动画里面可以自己添加一些,动画,达到相应的效果. AppDel ...

随机推荐

  1. 社工 - By源码托管平台|云盘 - GitHub - 汇总

    搜索规则 ()默认搜索是从master分支搜索代码 ()只有小于384k的代码才是可以搜索到的 ()搜索语句不能有特殊字符如. , : ; / \ ` ' " = * ! ? # $ &am ...

  2. 【Windows Server存储】windows文件系统

    windows文件系统 弹性文件系统(ReFS) 无检查磁盘,Windows 8或Windows Server 2012以上运行. 参考资料表明,这是一个失败的文件系统,以后将不会商用. 参考资料:h ...

  3. Canvas入门03-绘制弧线和圆

    绘制弧线的API: context.arc(centerx:number, centery: number, radius: number, startAngle: number, endAngle: ...

  4. r子集代码实现(递归)

    #!/usr/bin/env python #coding:utf-8 SET_START = 1 SET_END = 9 SUB_LEN = 10 def r_subset(i, r, pre, a ...

  5. [集合]HashMap和Hashtable区别

    底层 哈希算法,双列集合 HashMap 线程不安全,效率高,JDK1.2版本    Hashtable 线程安全,效率低,JDK1.0版本 HashMap 可以存储 null 键和 null 值   ...

  6. c++ Oracle OCCI 编程

    转载备忘:http://blog.sina.com.cn/s/blog_53a72add01015zj4.html 关于occi编程可以参考的链接: http://blog.itpub.net/162 ...

  7. Let's encrypt 通配域名DNS验证方式的证书自动更新

    通配符域名不同于一般的单域名证书. 为了解决之前一篇短文中通配域名通过DNS方式验证的证书自动更新问题. 需要使用到第三方域名提供商的API, 用于自动添加域名的TXT记录, 实现自动验证并完成证书更 ...

  8. 动态规划(股票交易)---只能进行 k 次的股票交易

    只能进行 k 次的股票交易 188. Best Time to Buy and Sell Stock IV (Hard) 题目描述:   只能进行K次股票交易,求能获得的最大利润 思路分析:   和只 ...

  9. IDEA 增加对JPA的支持 执行JPQL语句

    IDEA 可以在控制台console中执行JPQL语句: 1. 在已存在的项目中选择项目结构: 2. 选择模块-指定实体所在的模块-选择上面的号 2. 选择要添加的模块:我们使用的是JPA,也可能有的 ...

  10. DataTable中如何去除重复的项 (获得某个字段中的不重复项)

    就是获取DataTable中某一列的值,因为从数据库中检索数据时,按照2个字段进行分组,而要获得的那一列刚好在分组这两列中,所以该列的值必然有重复,于是就想到了去除重复,有了思路以后在网上看了一些方法 ...