重新看了一下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. 【ABAP系列】SAP ABAP 控制ALV单元格编辑后获取新的数值

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 控制ALV单元 ...

  2. 【bzoj4710】[Jsoi2011]分特产

    JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同学,一共有多少种不同的分法?当然,JYY 不希望任何一个同学因为没有拿到 ...

  3. tensorflow学习之tf.truncated_normal和tf.random_noraml的区别

    tf版本1.13.1,CPU 最近在tf里新学了一个函数,一查发现和tf.random_normal差不多,于是记录一下.. 1.首先是tf.truncated_normal函数 tf.truncat ...

  4. spark 2.3.3 的MLlib 使用API

    1.api官网 http://spark.apache.org/docs/2.3.3/ml-guide.html

  5. 深入理解java:2.3. 并发编程 java.util.concurrent包

    JUC java.util.concurrent包, 这个包是从JDK1.5开始引入的,在此之前,这个包独立存在着,它是由Doug Lea开发的,名字叫backport-util-concurrent ...

  6. python+selenium操作cookie

    WebDriver提供了操作Cookie的相关方法,可以读取.添加和删除cookie信息. WebDriver操作cookie的方法: get_cookies(): 获得所有cookie信息. get ...

  7. UrlConnection发送http请求 中文乱码解决

    中文乱码 DataOutputStream dos = new DataOutputStream(httpConn.getOutputStream()); //dos.writeBytes(jsonD ...

  8. Spring MVC-学习笔记(4)数据绑定流程

    1.请求数据在到达处理方法前这段时间. spring MVC还会做请求信息转换.数据转换.数据格式化.数据校验. 2.数据转换 1>ConversionService: Spring类型转换体系 ...

  9. HashMap中确定数组位置为什么要用hash进行扰动

    HashMap数据存储的过程先根据key获得hash值,通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存 ...

  10. Codeforces 1255F Point Ordering(凸包+叉积)

    我们随机选取点1,2作为凸包的一个分割线,那么我们可以直接枚举剩下n-2个点找到他们和向量1-2的叉积大小与正负,然后我们可以根据叉积的正负,先将他们分割出两个区域,在向量1-2的下方还是上方,接下来 ...