原来程序是这样从NandFlash拷贝并跳转到SDRAM的

最新更新时间:2021-10-14来源: eefocus关键字:FL2440  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

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

RO

Base|赋给了r9。也就是说,从NandFlash拷过来的代码放在了SDRAM中从|Image

RO

RO

Base|开始的地址空间里。


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

RO

RO

Base|开始之后的地址,只要|Image

RO

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          .


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

关键字:FL2440  SDRAM 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic548257.html

上一篇:Freestanding C与交叉编译器的生成原理分析
下一篇:s3c2440的2440init.s详解_补充

推荐阅读

S3C2440 NANDFLASH启动的设计原理与过程
S3C2440有两种启动方式:NORFLASH启动与NANDFLASH启动;但一般都只从NANDFLASH启动,既然是从这个地方启动,那必须具备两个条件:1 这个里面必须得有程序2 必须得有内存去跑这段程序第一个条件,我们必须通过JTAG下载程序到NANDFLASH,假设下载了一个LED测试程序在里面了;第二个条件,要跑这段程序必须有内存,可这个时候SDRAM还没有初始化,不能跑,怎么办?S3C2440里面有一个4k空间的SRAM,当芯片复位的时候会通过外部引脚首先判断使用哪种启动方式,如果是NANDFLASH启动方式,S3C2440的Nand Flash控制器有一个特殊的功能,在S3C2440上电后,Nand Flash控制器会自
发表于 2022-04-02
S3C2440 <font color='red'>从</font><font color='red'>NANDFLASH</font>启动的设计原理与过程
2440NANDFlash启动之bootloader运行以前
一直对2440上电以后怎么从nandflash中启动不是很清楚,闲来无事看了下s3c2440的用户手册,看到下面这样一段话: S3C2440A boot code can be executed on an external NAND flash memory. In order to support NAND flash bootloader, the S3C2440A is equipped with an internal SRAM buffer called "Steppingstone". When booting, the first 4KBytes of the NAND flash memory
发表于 2016-11-27
ARM开发板启动流程(NandFlash启动)
S3C2440从nandflash启动依赖片内部件SDRAM(Stepping Stone)大小4KB位于ARM空间的0地处。Nandflash不能参与统一编址,在地址空间以外。处理器上电时会自动从Nandflash最前端拷贝出4KB的内容复制到SteppingStone中,接着PC指针指向0地址即StepingStone中所保存的第一条指令。除去4KB剩下的代码从Nandflash拷贝到内存当中。 S3C6410上电后首先运行SROM里的bootloder0,bootloder0将会从Nandflash最前端拷贝出8KB的内容到SRAM当中。剩余的拷贝到内存里。
发表于 2016-05-09
opencv在fl2440上的移植
linux2.6.28arm-linux4.3.21.安装opencv2.0下载地址http://sourceforge.net/projects/opencvlibrary/解压OpenCV-2.0.0.tar.bz2tar xvf OpenCV-2.0.0.tar.bz2配置./configure --host=arm-linux --without-carbon --without-quicktime--without-1394libs --without-ffmpeg --without-python --without-swig--without-gtk --enable-static --enable-shared --
发表于 2022-05-31
Linux下基于fl2440开发板platform按键驱动详解(一)
===============================================操作系统:center os 64位平台:fl2440内核版本:Linux 3.0.54交叉编译器版本:2012.08===============================================#include "s3c_driver.h"#define DRV_AUTHOR "497049229@qq.com"#define DRV_DESC "S3C24XX button driver"/* Driver version*/#de
发表于 2020-05-16
用看门狗定时器做计时器,计算程序耗时,超声波测距,FL244
开发板:FL2440核心芯片:S3C2440(ARM9)超声波模块:HC-SR04超声波模块工作原理:共四个脚,VCC接5V,GND接地,Trig脚接芯片通过IO传出的高电平(持续时间不低于10微秒),之后Echo脚输出一段时间高电平,高电平持续时间即为超声波发出到接收到回波的间隔时间。主要是为了使用看门狗定时器来作计时器,来计算Echo脚返回的高电平持续时间,要将复位使能与中断使能关闭,然后给“狗”最大数值,持续一段时间后,用最大数值减去当前数值,就可得到消耗的数值,再乘以“狗”每次减数的时间间隔(通过设定预分频与分频因子来确定),就是消耗的时间。试验期间出现的重要错误:程序自动run后,消耗时间总是0,而采用AXD单步执行则可以
发表于 2019-11-27

推荐帖子

先楫官方资料包:测评先楫HPM6750看过来
@full_stack@arilink@太阳上的骑士@xusiwei1236@RCSN@littleshrimp 先楫HPM6750开发板完整资料包下载: 百度网盘链接:https://pan.baidu.com/s/1vJDZWEBqnsosFNeedX6Nww 提取码:cmd5 包含资料预览: 先楫官方资料包:测评先楫HPM6750看过来
nmg 国产芯片交流
分享一个十字点阵的c程序 (旋转的摇摇棒)
原文地址 http://user.qzone.qq.com/516903259/blog/1267969405 //bydoublez #include<reg51_stc.h> #defineFENBIANLV150 #defineCYCLEMUN10 bitover=1; unsignedcharpianyi=0; unsignedcharcntcyclenum=0; unsignedcharcodetab[]={ 0xff,
zszhere DIY/开源硬件专区
arm-poky混编Makefile写法
交叉编译工具用ARM-poky-linux-gnueabi-g++和arm-poky-linux-gnueabi-gcc混编 1.新建main.cMakefilemyinclude.htest.cpp vimmain.c //filenamemain.c #include<stdlib.h> #include<stdio.h> #include"myinclude.h" intmain() { test_fun();
明远智睿Lan Linux与安卓
有人知道怎么实现 图像颜色渐变
求大神解答一下就是视频图像可以从蓝色变为红色再变为绿色这个在DM642上怎么实现啊 有人知道怎么实现图像颜色渐变
一生有你123 DSP 与 ARM 处理器
AD转换结果控制PWM波的占空比,为什么PWM波始终是vcc
随着AD转换结果,寄存器CCR1的值有在变AD转换结果控制PWM波的占空比,为什么PWM波始终是vcc
闪闪___ 单片机
基于51单片机的简易“视频播放器”
本帖最后由hjl240于2022-5-320:21编辑 前言 大概10年前,我在咱们EEWORLD论坛看到有人分享了用单片机在液晶屏上播放badapple视频,当时觉得很有趣,但是奈何当时刚入门单片机,很多都不太懂,自己想做却不会做,只能作罢。如今,工作也好几年了,也不做嵌入式这一行。前段时间,趁着周末,工作也不太忙,突然想起这个事情了,于是从网上买了元器件,自己动手再实现这个功能,以弥补自己当年的遗憾,哈哈。 介绍 本文介绍在51单片机上,使用OLE
hjl240 51单片机
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved