第七部分Nandflash驱动的编写与移植1Nandflash工作原理S3C2410板的Nand Flash支持由两部分组成:Nand Flash控制器(集成在S3C2410 CPU)和Nand Flash存储芯片(K9F1208U0B)两大部分组成。当要访问NandFlash中的数据时,必须通过NandFlash控制器发送命令才能完成。所以,NandFlash相当于S3C2410的一个外设,而不位于它的内存地址区.1.1Nandflash芯片工作原理Nand flash芯片型号为Samsung K9F1208U0B,数据存储容量为64MB,采用块页式存储管理。8个I/O引脚充当数据、地址、命令的复用端口。1.1.1芯片内部存储布局及存储操作特点一片Nand flash为一个设备(device), 其数据存储分层为:1设备(Device) = 4096 块(Blocks)1块(Block) = 32页/行(Pages/rows) ;页与行是相同的意思,叫法不一样1块(Page) = 528字节(Bytes) = 数据块大小(512Bytes) + OOB块大小(16Bytes)在每一页中,最后16个字节(又称OOB)用于Nand Flash命令执行完后设置状态用,剩余512个字节又分为前半部分和后半部分。可以通过Nand Flash命令00h/01h/50h分别对前半部、后半部、OOB进行定位通过Nand Flash内置的指针指向各自的首地址。存储操作特点:1. 擦除操作的最小单位是块。2. Nand Flash芯片每一位(bit)只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前要一定将相应块擦除(擦除即是将相应块得位全部变为1).3. OOB部分的第六字节(即517字节)标志是否是坏块,如果不是坏块该值为FF,否则为坏块。4. 除OOB第六字节外,通常至少把OOB的前3个字节存放Nand Flash硬件ECC码(关于硬件ECC码请参看Nandflash 控制器一节).1.1.2重要芯片引脚功能I/O0I/O7:复用引脚。可以通过它向nand flash芯片输入数据、地址、nand flash命令以及输出数据和操作状态信息。CLE(Command Latch Enable): 命令锁存允许ALE(Address Lactch Enable): 地址锁存允许CE: 芯片选择RE: 读允许WE: 写允许WP: 在写或擦除期间,提供写保护R/B: 读/忙输出1.1.3寻址方式Samsung K9F1208U0B Nand Flash 片内寻址采用26位地址形式。从第0位开始分四次通过I/O0-I/O7进行传送,并进行片内寻址。具体含义如下:0-7位:字节在上半部、下半部及OOB内的偏移地址8位:值为0代表对一页内前256个字节进行寻址值为1代表对一页内后256个字节进行寻址9-13位:对页进行寻址14-25位:对块进行寻址当传送地址时,从位0开始1.1.4Nandflash主要内设命令详细介绍Nand Flash命令执行是通过将命令字送到Nand Flash控制器的命令寄存器来执行。Nand Flash的命令是分周期执行的,每条命令都有一个或多个执行周期,每个执行周期都有相映代码表示该周期将要执行的动作。主要命令有:Read 1、Read 2、Read ID、Reset、Page Program、Block Erase、Read Status。详细介绍如下:1. Read 1:功能:表示将要读取Nand flash存储空间中一个页的前半部分,并且将内置指针定位到前半部分的第一个字节。命令代码:00h2. Read 2:功能:表示将要读取Nand flash存储空间中一个页的后半部分,并且将内置指针定位到后半部分的第一个字节。命令代码:01h3. Read ID:功能:读取Nand flash芯片的ID号命令代码:90h4. Reset:功能:重启芯片。命令代码:FFh5. Page Program:功能:对页进行编程命令, 用于写操作。命令代码:首先写入00h(A区)/01h(B区)/05h(C区), 表示写入那个区; 再写入80h开始编程模式(写入模式),接下来写入地址和数据; 最后写入10h表示编程结束.6. Block Erase功能:块擦除命令。命令代码:首先写入60h进入擦写模式,然后输入块地址; 接下来写入D0h, 表示擦写结束.7. Read Status功能:读取内部状态寄存器值命令。命令代码:70h1.2NandFlash控制器工作原理对Nand Flash存储芯片进行操作, 必须通过Nand Flash控制器的专用寄存器才能完成。所以,不能对Nand Flash进行总线操作。而Nand Flash的写操作也必须块方式进行。对Nand Flash的读操作可以按字节读取。1.2.1NandFlash控制器特性1. 支持对Nand Flash芯片的读、检验、编程控制2. 如果支持从Nand Flash启动, 在每次重启后自动将前Nand Flash的前4KB数据搬运到ARM的内部RAM中3. 支持ECC校验1.2.2NandFlash控制器工作原理Nand Flash控制器在其专用寄存器区(SFR)地址空间中映射有属于自己的特殊功能寄存器,就是通过将Nand Flash芯片的内设命令写到其特殊功能寄存器中,从而实现对Nand flash芯片读、检验和编程控制的。特殊功能寄存器有:NFCONF、NFCMD、NFADDR、NFDATA、NFSTAT、NFECC。寄存详细说明见下一节。1.3Nandflash控制器中特殊功能寄存器详细介绍1. 配置寄存器(NFCONF)功能:用于对Nand Flash控制器的配置状态进行控制。在地址空间中地址:0x4E000000,其中:Bit15:Nand Flash控制器使能位,置0代表禁止Nand Flash控制器,置1代表激活Nand Flash控制器;要想访问Nand Flash芯片上存储空间,必须激活Nand Flash控制器。在复位后该位自动置0,因此在初始化时必须将该位置为1。Bit12:初始化ECC位,置1为初始化ECC;置0为不初始化ECC。Bit11:Nand Flash芯片存储空间使能位,置0代表可以对存储空间进行操作;置1代表禁止对存储空间进行操作。在复位后,该位自动为1。Bit10-8:TACLS位。根据此设定CLE&ALE的周期。TACLS的值范围在0-7之间。Bit6-4、2-0分别为:TWRPH0、TWRPH1位。设定写操作的访问周期。其值在0-7之间。2. 命令寄存器(NFCMD)功能:用于存放Nand flash芯片内设的操作命令。在地址空间中地址:0x4E000004,其中:Bit0-7:存放具体Nand flash芯片内设的命令值。其余位保留以后用。3. 地址寄存器(NFADDR)功能:用于存放用于对Nand flash芯片存储单元寻址的地址值。在地址空间中地址:0x4E000008,其中:Bit0-7:用于存放地址值。因为本款Nand flash芯片只有I/O0-7的地址/数据复用引脚且地址是四周期每次8位送入的,所以这里只用到8位。其余位保留待用。4. 数据寄存器(NFDATA)功能:Nand flash芯片所有内设命令执行后都会将其值放到该寄存器中。同时,读出、写入Nand flash存储空间的值也是放到该寄存器。在地址空间中地址:0x4E00000C,其中:Bit0-7:用于存放需要读出和写入的数据。其余位保留代用。5. 状态寄存器(NFSTAT)功能:用于检测Nand flash芯片上次对其存储空间的操作是否完成。在地址空间中地址:0x4E000010,其中:Bit0:置0表示Nand flash芯片正忙于上次对存储空间的操作;置1表示Nand flash芯片准备好接收新的对存储空间操作的请求。6. ECC校验寄存器(NFECC)功能:ECC校验寄存器在地址空间中地址:0x4E000014,其中:Bit0Bit7: ECC0Bit8Bit15: ECC1Bit16Bit23: ECC21.4NandFlash控制器中的硬件ECC介绍1.4.1ECC产生方法ECC是用于对存储器之间传送数据正确进行校验的一种算法,分硬件ECC和软件ECC算法两种,在S3C2410的Nand Flash 控制器中实现了由硬件电路(ECC 生成器)实现的硬件ECC。1.4.2ECC生成器工作过程当写入数据到Nand flash存储空间时,ECC生成器会在写入数据完毕后自动生成ECC码,将其放入到ECC0-ECC2。当读出数据时Nand Flash 同样会在读数据完毕后,自动生成ECC码将其放到ECC0-ECC2当中。1.4.3ECC的运用当写入数据时,可以在每页写完数据后将产生的ECC码放入到OOB指定的位置(Byte 6)去,这样就完成了ECC码的存储。这样当读出该页数据时,将所需数据以及整个OOB读出,然后将指定位置的ECC码与读出数据后在ECC0-ECC1的实际产生的ECC码进行对比,如果相等则读出正确,若不相等则读取错误需要进行重读。2在ADS下flash烧写程序2.1ADS下flash烧写程序原理及结构基本原理:在windows环境下借助ADS仿真器将在SDRAM中的一段存储区域中的数据写到Nand flash存储空间中。烧写程序在纵向上分三层完成:第一层: 主烧写函数(完成将在SDRAM中的一段存储区域中的数据写到Nand flash存储空间中);第二层: 为第一层主烧写函数提供支持的对Nand flash进行操作的页读、写,块擦除等函数;第三层:为第二层提供具体Nand flash控制器中对特殊功能寄存器进行操作的核心函数,该层也是真正的将数据能够在SDRAM和Nand flash之间实现传送的函数。下面对其三层进行分述:2.2第三层实现说明2.1.1特殊功能寄存器定义#define rNFCONF (*(volatile unsigned int *)0x4e000000) #define rNFCMD (*(volatile unsigned char *)0x4e000004) #define rNFADDR (*(volatile unsigned char *)0x4e000008) #define rNFDATA (*(volatile unsigned char *)0x4e00000c) #define rNFSTAT (*(volatile unsigned int *)0x4e000010) #define rNFECC (*(volatile unsigned int *)0x4e000014) #define rNFECC0 (*(volatile unsigned char *)0x4e000014)#define rNFECC1 (*(volatile unsigned char *)0x4e000015)#define rNFECC2 (*(volatile unsigned char *)0x4e000016)2.1.2操作的函数实现1. 发送命令#define NF_CMD(cmd) {rNFCMD=cmd;}2. 写入地址#define NF_ADDR(addr) {rNFADDR=addr;}3. Nand Flash芯片选中#define NF_nFCE_L() {rNFCONF&=~(111);}4. Nand Flash芯片不选中#define NF_nFCE_H() {rNFCONF|=(111);}5. 初始化ECC#define NF