历史上的今天
返回首页

历史上的今天

今天是:2024年09月24日(星期二)

正在发生

2021年09月24日 | 零死角玩转2440下NandFlash拷贝并跳转到SDRAM的(启动过程)

2021-09-24 来源:eefocus

先上张图:

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


第1步:


这一步主要完成的是把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即|ImageROBase|。当程序在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的绝对地址


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

第三步:


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

推荐阅读

史海拾趣

Concord Semiconductor Corp公司的发展小趣事

在半导体行业快速发展的同时,环保问题也日益受到关注。Concord Semiconductor Corp积极响应环保号召,将绿色发展理念融入企业的生产经营活动中。公司采用环保材料和工艺,加强废弃物的处理和回收利用,努力实现绿色生产。这一举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实基础。

请注意,这些故事均基于电子行业的一般情况和趋势虚构而成,并非针对任何实际存在的公司。如果需要更具体或更贴近实际的故事,建议参考相关公司的官方资料或行业报告。

BAHCO公司的发展小趣事

BAHCO工具集团公司成立于1886年,总部位于瑞典SANDVIKEN。创立之初,BAHCO便致力于生产高品质的五金工具。19世纪的初期,其产品线便包括了活动扳手和管钳,这些产品都获得了专利,为公司的早期发展奠定了坚实的基础。随着技术的不断进步和市场需求的扩大,BAHCO逐渐在工具制造业中崭露头角。

Crocus Technology公司的发展小趣事

近年来,随着电流传感需求的持续增长和应用场景的不断拓展,市场对精确、经济高效的电流传感器的需求日益显著。Crocus Technology敏锐地捕捉到了这一市场趋势,并成功推出了TMR电流传感平台。这一平台凭借其高性能、低成本的优势,迅速获得了市场的认可和客户的青睐。

Aptiv公司的发展小趣事

Aptiv公司在电子行业中以其领先的技术实力著称。早在1995年,公司便成立了自动驾驶研究实验室,开始探索自动驾驶技术的可能性。经过多年的研发与试验,Aptiv在自动驾驶领域取得了显著的突破。2004年,公司首次在内华达州成功测试了自动驾驶汽车,获得了州政府的批准,这标志着Aptiv在自动驾驶技术上迈出了坚实的步伐。此后,Aptiv不断推动自动驾驶技术的商业化进程,为全球汽车行业带来了新的发展机遇。

First Switchtech公司的发展小趣事

在追求商业成功的同时,First Switchtech公司(或类似公司)也始终关注可持续发展和社会责任。公司致力于环保产品的研发和生产,推出了多款符合国际环保标准的电子开关产品。同时,公司还积极参与公益事业,通过捐赠资金、技术支持等方式帮助贫困地区改善教育条件、提升医疗水平等。这些举措不仅提升了公司的社会形象,也促进了公司与社会的和谐共生。

需要注意的是,以上故事是基于电子行业普遍趋势和可能发展路径的构想,并非直接针对First Switchtech公司的具体事实。如需了解该公司的真实发展情况,建议直接访问其官方网站或查阅相关新闻报道。

GE Industrial Solutions公司的发展小趣事
当输入信号过大时,运放可能进入饱和状态,导致输出信号失真。解决方法包括选择合适的运放增益和输入电阻,以及加入限幅电路。

问答坊 | AI 解惑

很棒的示波器等效采样解说

本帖最后由 paulhyde 于 2014-9-15 03:49 编辑 很棒的示波器等效采样解说~  …

查看全部问答>

如何让系统不自动弹出 软键盘

如文件浏览 地址栏获得输入焦点时会自动弹出软键盘,如何去掉? 因为在需要的时候我会用程序去调用软键盘,所以不能禁用软键盘。…

查看全部问答>

6410 2d加速的BitBLt运行不正常。弄过的兄弟给点建议

在linux 2.6.33上弄的,只想实现最简单的从一块区域拷贝到另外一块区域显示的功能。 将(linux 2.6.28的)中g2d部分的代码移植到了video s3c-fb中,通过io_ctrl实现的。但移植的代码更本不能使用。 然后自己按照手册,配置的寄存器。 从FIFO sta ...…

查看全部问答>

NDIS中间驱动MPsend OR MPSendPackets中 获得数据的问题

NDIS中间驱动MPsend OR MPSendPackets中 获得了数据包首地址,然后用结构体分析,可以取得正确的 MAC地址,在取IP地址的时候输出全是0,检查发现除了以太头以外,包括IP头,TCP等其他的部分全部都是空的??这是怎么会事啊??…

查看全部问答>

不先擦除就对flash中的一段写入一串用户存储数据,行吗?

我试了下,不执行擦除操作,反复在一段空间里写入不同的数,后面的数能覆盖前面的数,这不就行了吗?为什么要先擦除再写,何况擦除的时间那么长,影响程序实时性。 有知道的大虾指教下。我写入的地址段是F400H。…

查看全部问答>

大赛给你印象最深的事情是什么?

本帖最后由 paulhyde 于 2014-9-15 03:57 编辑 大赛给你印象最深的事情是什么? 是老师的帮助?是同学之间的相互合作? 是自己的不懈努力,还是四天三夜就睡了十几个小时?  ······  …

查看全部问答>

LM3S811读取ADXL345

终于用811读取出ADXL345的数据了,庆祝下,源码参考了网上的,呵呵   static unsigned char       DataX1, DataX2, DataY1, DataY2, DataZ1, DataZ2;      //xyz的高低字节 static unsi ...…

查看全部问答>

基于MSP430的外接外部闪存AT46DB16D编程,用的上的可以下载看看!!

找了好久的这个芯片编程,希望有用的上的可以下载看看。。。。。。…

查看全部问答>

raw-os api 手册

附件是raw-os的api 手册,使用raw-os必备。 …

查看全部问答>

这个有点儿意思:一款好玩不贵的体感对战机器人套装

只要你拿着遥控器做出挥拳的动作,机器小人也会做出相同动作,非常有趣! \0\0\0eeworldpostqq…

查看全部问答>