学习笔记----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脚设置说明如下:





0 0
原创粉丝点击