4.1 NAND FLASH控制器
在S3C2410上电后,NAND FLASH控制器会自动的把NAND FLASH上的前4kB数据搬移到4kB内部RAM中,并把0x00000000设置内部RAM的起始地址,CPU从内部RAM的0x00000000位置开始启动,在这个过程不需要程序干涉。而程序员需要完成的工作是把最核心的启动程序放在NAND FLASH的前4kB中。
以往将U-BOOT移植到ARM9平台中的解决方案主要针对的是ARM9中的NOR闪存,因为NOR闪存的结构特点使应用程序可以直接在其内部运行,不用把代码读到RAM中,所以移植过程相对简单。
4.1.1 NOR FLASH和NAND FLASH比较
NOR和NAND是现在市场上两种主要的非易失闪存技术。NOR FLASH指线性存储器,通过线性、连续的地址进行寻址;NAND FLASH指非线性存储器,通过非线性、不连续的地址进行寻址。
(1)应用
大多数情况下用NOR FLASH可以存储少量代码,而NAND FLASH则是高数据存储密度较为理想的解决方案。NOR的特点是芯片内执行,应用程序可以直接在FLASH闪存内运行,不必再把代码读到系统RAM中。
(2)读写速度
NAND的写入和擦除的速度较快,应用NAND的困难在于FLASH的管理和需要特殊的系统接口。NOR的传输效率很高,但是很低的写入和擦除速度大大影响了它的性能。NOR的读速度比NAND稍快一些,但NAND的写入速度比NOR快很多。
(3)接口性质
NOR FLASH带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。NAND FLASH没有采取内存的随机读取技术,它的读取是以一次读取一块的形式来进行的,通常是一次读取512个字节,与硬盘管理有些类似。
(4)容量与成本
NOR FLASH占据了容量为1~16MB闪存市场的大部分,而NAND FLASH只是用在8~128MB的产品当中。NAND FLASH比NOR FLASH廉价。
4.1.2 S3C2410 NAND FLASH控制器
由于NOR FLASH存储器的价格比较昂贵,而SDRAM和NAND FLASH存储器的价格相对比较合适。因而嵌入式开发者希望从NAND FLASH启动和引导系统,并在SDRAM上执行主程序代码。S3C2410实现了从NOR FLASH及NAND FLASH上执行引导程序。为了支持从NAND FLASH的系统引导,S3C2410具有一个内部SDRAM缓冲器。当系统启动时,引导代码需要将NAND FLASH中的程序内容拷贝到SDRAM中,然后系统自动执行这些载入的引导代码。从NAND FLASH启动要通过引脚OM[1:0]进行选择,当选择OM[1:0]=00时,处理器通过NAND FLASH启动;OM[1:0]=01或10时,处理器分别通过16位、32位NOR FLASH启动。图4.1所示是S3C2410 NAND FLASH控制器的方块电路图。
图4.1 S3C2410 NAND FLASH控制器的方块电路图
4.1.3 NAND FLASH启动过程
S3C2410支持从NAND FLASH引导系统,这是通过内置的SRAM(Synchronous Dynamic Random Access Memory:同步动态随机存储器)及自动引导控制逻辑实现的,当系统启动时,NAND FLASH存储器的前4KB将被自动加载到内部缓冲区(又称为Steppingstone)中,然后系统自动执行这些载入的启动代码。使用这4KB代码来把更多的代码从NAND FLASH中读到SDRAM中去,然后执行SDRAM中的指令,实现系统的引导。这4KB的程序一般实现CPU、GPIO、Memory、Clock、Watchdog、Uart等的初始化。
1. NAND FLASH自动引导过程
(1)复位完成;
(2)NAND FLASH的前4KB被拷到内部SDRAM;
(3)SDRAM被映射到GCS0(BANK0);
(4)CPU从内部SDRAM开始执行程序。
2. NAND FLASH操作过程
NAND FLASH的操作通过NFCONF、NFCMD、NFADDR、NFDATA、NFSTAT和NFECC这六个寄存器来完成,具体操作步骤如下:
(1)配制NAND FLASH控制寄存器NFCONF;
(2)写NAND FLASH命令到NFCMD寄存器;
(3)写NAND FLASH地址到NFADDR寄存器;
(4)通过NFSTAT寄存器检查NAND FLASH状态实现读/写操作。
4.1.4 NAND FLASH存储器接口
图4.2是NAND FLASH存储器接口示意图,其引脚分别与S3C2410微处理器引脚相连。
图4.2 是NAND FLASH存储器接口
在图4.2中,NAND FLASH的管脚配置如下:
DATA[7:0] :数据/命令/地址/的输入/输出口(与数据总线共享)
CLE:命令锁存使能(输出)
ALE:地址锁存使能(输出)
nFCE :NAND FLASH片选使能(输出)
nFRE :NAND FLASH读使能(输出)
nFWE :NAND FLASH写使能(输出)
R/nB : NAND FLASH准备好/繁忙(输入)
S3C2410的存储控制器提供访问外部存储器所需要的存储器控制信号,支持数据存储的大、小端模式,将存储空间分成8组。因而S3C2410的内存片选有8个片选(BANK),在U-BOOT中,要配制SDRAM和FLASH的BANK数,如果SDRAM或者FLASH就接了n个片选的时候,就定义为n,如n为8,即BANK8。图4.3是S3C2410的内存映射图,S3C2410和其他的大部分的处理器一样,支持NOR FLASH和NAND FLASH启动,而这两种启动方式内存所映射的地址不相同。
图4.3 启动方式与内存映射的地址关系
在图4.3中BANK6、BANK7对应的地址空间与BANK0—BANK5不同。BANK0—BANK5的地址空间都是固定的128M,地址范围是(x*128M)到(x+1)*128M-1, x表示0到5。但是BANK7的起始地址是可变的,您可以查找S3C2410数据手册第5章,获取BANK6、BANK7的地址范围与地址空间的关系。
4.1.5 NAND FLASH寄存器参数描述
1. NAND FLASH寄存器概述
前面已经谈到,NAND FLASH的操作通过设置NFCONF、NFCMD、NFADDR、NFDATA、NFSTAT和NFECC这六个寄存器来完成。下面首先讨论NAND FLASH这些寄存器的一些性质,这对嵌入式程序设计至关重要,表4.1列出了NAND FLASH相关寄存器的地址、读写情况与功能的描述。其中:
NFCONF是NAND FLASH的配置寄存器;
NFCMD是NAND FLASH命令寄存器,CPU通过此寄存器向NAND FLASH传递控制命令;
NFADDR是NAND FLASH地址寄存器,CPU通过此寄存器向NAND FLASH传递地址;
NFDATA是NAND FLASH数据寄存器,CPU通过此寄存器向NAND FLASH传递数据;
NFSTAT是NAND FLASH状态寄存器,CPU通过读取该寄存器获取NAND FLASH当前状态;
NFECC是NAND FLASH ECC寄存器,实现循环校验功能。
表4.1 NAND FLASH相关寄存器
在NAND FLASH的程序设计中通过下列宏进行地址映射:
#define rNFCONF (*(volatile unsigned *)0x4e000000) //NAND FLASH configuration #define rNFCMD (*(volatile unsigned *)0x4e000004) //NADD FLASH command #define rNFADDR (*(volatile unsigned *)0x4e000008) //NAND FLASH address #define rNFDATA (*(volatile unsigned *)0x4e00000c) //NAND FLASH data #define rNFSTAT (*(volatile unsigned *)0x4e000010) //NAND FLASH operation status #define rNFECC (*(volatile unsigned *)0x4e000014) //NAND FLASH ECC
2. NAND FLASH相关寄存器设置及应用
(1)NFCONF寄存器
NFCONF寄存器的地址是0x4e000000,表4.2所示是NFCONF寄存器属性值设置,相对应位的默认值、功能设置位的表示。
表4.2 NFCONF寄存器属性值设置
注意:需要指出的是TACLS、TWRPH0和TWRPH1,请读者参考S3C2410数据手册,可以看到这三个参数控制的是NAND FLASH信号线命令锁存CLE、地址锁存ALE与写控制信号nWE的时序关系。设上述值为TACLS=0, TWRPH0=3, TWRPH1=0,其含义为:TACLS=1个HCLK时钟,TWRPH0=4个HCLK时钟,TWRPH1=1个HCLK时钟。
NAND FLASH需要初始化,在一般情况下要使NAND FLASH使能,使用ECC校验,[15:12]设置为0b1111;内存片选使能,持续时间=HCLK*(设定值+1)中设定值为0,即CLE和ALE持续时间设置为HCLK,因而[11:8]=0b1000;设TWRPH0设定值为3,即位[7:4]设置为0b0011,如果把TWRPH1值设为0,即把NFCONF初始化为0b1111100000110000,即0xF830。
例如:NAND FLASH在使用时应把第11位设置为0,支持NAND FLASH使能,只需对0x800取反即可,此时有:
NFCONF & = ~0x800;
当禁用NAND FLASH时,应把第11位设置为1,可以用以下语句:
NFCONF | = 0x800;
(2)NFCMD寄存器
NAND FLASH的命令寄存器NFCMD的地址是0x4e000004,表4.3所示是NFCMD寄存器属性值设置,相对应位的默认值、功能设置位的表示。NFCMD寄存器中,对于不同型号的FLASH,操作命令一般不同。
表4.3 NAND FLASH命令寄存器NFCMD
例如:
NFCONF & = ~(1<<11) //第11位为0, nFCF为低电平,发出片选信号 NFCMD = 0xff //在K9F1208U0M存储器中表示reset命令
(3)NFADDR寄存器
NAND FLASH地址寄存器NFADDR的地址是0x4e000008,表4.4所示是NFADDR寄存器属性值设置,相对应位的默认值、功能设置位的表示。
表4.4 NAND FLASH地址寄存器NFADDR
例如: NFADDR = addr & 0xff //获取第1个字节的地址 NFADDR = ( addr >> 9 ) & 0xff //获取第2个字节的地址
(4)NFDATA寄存器
NAND FLASH数据寄存器NFDATA的地址是0x4e00000c,表4.5所示是NFDATA寄存器属性值设置,相对应位的默认值、功能设置位的表示。
表4.5 NAND FLASH数据寄存器NFDATA
[7:0]存储Nand FLASH的读出数据或者编程数据,写操作时存放编程数据,读操作时存放读出数据。
(5)NFSTAT寄存器
NAND FLASH状态寄存器NFSTAT地址是0x4e000010,表4.6所示是状态寄存器NFSTAT属性值设置及相对应位的初始值表示。
表4.6 状态寄存器NFSTAT
(6)ECC寄存器
NAND FLASH ECC寄存器NFECC的地址是0x4e000014,表4.7所示为ECC寄存器位功能与设置描述。
表4.7 ECC寄存器