嵌入式系统设计与实践:Linux篇
上QQ阅读APP看书,第一时间看更新

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寄存器