学习笔记----S3C2440 从NANDFLASH启动的设计原理与过程
来源:互联网 发布:mac自动登录 灰色 编辑:程序博客网 时间:2024/05/07 19:15
S3C2440有两种启动方式:NORFLASH启动与NANDFLASH启动;但一般都只从NANDFLASH启动,既然是从这个地方启动,那必须具备两个条件:
1 这个里面必须得有程序
2 必须得有内存去跑这段程序
第一个条件,我们必须通过JTAG下载程序到NANDFLASH,假设下载了一个LED测试程序在里面了;
第二个条件,要跑这段程序必须有内存,可这个时候SDRAM还没有初始化,不能跑,怎么办?S3C2440里面有一个4k空间的SRAM,当芯片复位的时候会通过外部引脚首先判断使用哪种启动方式,如果是NANDFLASH启动方式,S3C2440的Nand Flash控制器有一个特殊的功能,在S3C2440上电后,Nand Flash控制器会自动的把Nand Flash上的前4K数据搬移到4K内部SRAM中,(此内部RAM被称为Steppingstone)并把0X00000000设置内部RAM的起始地址,CPU从内部RAM的0X00000000位置开始启动。这个过程不需要程序干涉。芯片怎么做到没有NANDFLASH驱动就能够读取前4K代码呢?在最后会讲。
上面的两个条件都满足了,程序可以在4K SRAM里面自动跑起来了。但只能是4K的代码,大于4K怎么办?那就只能在SDRAM去跑了,这就需要满足下面条件:
1 SDRAM必须要初始化
2 有一段代码把NANDFLASH里面的程序搬到SDRAM里面去运行
上面的两个条件都需要运行程序,就只能在SRAM里面运行,所以程序的前面4k的代码必须完成这两项工作,在完成了这两项工作后从SRAM跳转到SDRAM里面执行余下的工作;这样就实现了程序从NANDFLASH启动了。但程序是如何从SRAM跳转到SDRAM接着去执行的呢?
启动代码最开始是这样的:
@*************************************************************************@ File:head.S@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行@*************************************************************************.equ MEM_CTL_BASE, 0x48000000.equ SDRAM_BASE, 0x30000000.text.global _start_start: bl disable_watch_dog @ 关闭WATCHDOG,否则CPU会不断重启 bl memsetup @ 设置存储控制器 bl copy_steppingstone_to_sdram @ 复制代码到SDRAM中 ldr pc, =on_sdram @ 跳到SDRAM中继续执行on_sdram: ldr sp, =0x34000000 @ 设置堆栈 bl mainhalt_loop: b halt_loop
首先其他的都先不管,这里只关注bl指令与ldr指令,这两个指令的区别:
bl :位置无关码 -- 跳转位置与启动代码的链接地址无关
ldr:位置相关码 --跳转位置与链接地址相关
S3C2440 的SDRAM起始地址为0x3000,0000,最开始运行启动代码,所以启动代码的连接地址为0x3000,0000,这个地址是在编译链接操作的时候指定的,在makefile里面;
当执行bl的时候,跳转地址跟SDRAM链接地址无关(当前指令在SRAM内地址),这个地址还是本来的地址范围,SRAM的范围,所以还是在SRAM里面跳转。
当执行ldr的时候,跳转地址跟SDRAM连接地址有关,这里跳转到0x3000,0000+当前指令在SRAM内地址,这个地址已经是SDRAM的地址范围了,所以完成跳转。
就这样理解吧,如果要详细的理解,需要分析启动代码的反汇编文件,理解起来更加清晰。
下面再把整个过程总结一下:
1 上电复位判断从NANDFLASH启动后,芯片自动复制NANFLASH前4K内容到SRAM,(这时候SDRAM还没初始化)。再SRAM里面从0地址开始执行PC=0X00000000
2 此时PC执行到memsetup,初始化SDRAM
3 SDRAM初始化完成后,再执行
bl copy_steppingstone_to_sdram
完成将NANDFLASH里面的代码复制到SDRAM里面(这里是复制的SRAM里面的代码到SDRAM,因为程序小于4K,SRAM里面就是所有的代码了;大于4K必须从NANDFLASH里面复制)
4 复制完成以后执行
ldr pc, =on_sdram
这时候的跳转地址就跟链接地址有关了,本来是0x0000,0010,而SDRAM的连接地址是 0x3000,0000 ,所以跳转到 0x3000,0000+0x0000,0010 =0x3000,0010 。这样就完成了SRAM到SDRAM的跳转。
——————————————————————————————————————————————
前面说到那4K代码在系统复位后芯片自动复制带SRAM,这时候NANDFLASH驱动都没有,怎么实现读操作的呢?S3C2440的芯片手册是这样说的:
在系统复位期间,NANDFLASH控制器会去读取硬件PIN脚的电平来获取NANDFLASH信息从而对其进行对应的控制。
系统复位期间内部完成步骤:
1 读取OM【0:1】脚判断从哪里启动。
2 如果从NAND启动,读取 NCON, GPG[13-15] PIN脚信息
3 NAND控制器自动产生时序读取4K信息到SRAM
NANDFLASH启动的PIN脚设置说明如下:
- 学习笔记----S3C2440 从NANDFLASH启动的设计原理与过程
- s3c2440的nandflash启动
- s3c2440的nandflash启动
- s3c2440 nandflash启动过程分析
- s3c2440 nandflash启动过程分析
- s3c2440 nandflash启动过程分析
- s3c2440 nandflash启动过程分析
- 学习笔记--- S3C2440 对NANDFLASH操作原理与测试代码分析
- nandflash的启动原理
- nandflash 启动,s3c2440
- NandFlash原理与启动详解
- NANDFLASH学习 <s3c2440>
- Linux设计与实现原理笔记《一》从开机加电到main之前的过程
- arm9 norflash与nandflash启动过程分析
- arm9 norflash与nandflash启动过程分析
- arm9 norflash与nandflash启动过程分析
- S3C2440从 NAND FLASH 启动原理
- S3C2440从 NAND FLASH 启动原理
- 什么是野指针?迷途指针!悬空指针!
- 好的用户界面-界面设计的一些技巧
- C/C++中sprintf的用法
- 我们不能计划生活,我们只能为生活做好准备
- 2012蓝桥杯【初赛试题】干支纪年
- 学习笔记----S3C2440 从NANDFLASH启动的设计原理与过程
- [C++_2]结构及函数指针&重载&内联
- 安卓开发拨号器调用
- 我是如何在Tizen app大赛中获奖的
- sql用了leftjoin 没有用where得不到最左表全部数据
- Swing JList组件
- 一路有你
- 新学到的概念
- Skeletal Animation(骨骼动画)