440 likes | 1.04k Views
Nand flash 驱动. Bash Shell programme. 课程目标. Flash 两大类别 Nand flash 工作原理 Nand Flash 控制器 Linux 对 Nand Flash 的支持 MTD 源码分析. Nor 和 Nand Flash 区别 (1).
E N D
Nand flash驱动 Bash Shell programme
课程目标 • Flash 两大类别 • Nand flash 工作原理 • Nand Flash 控制器 • Linux 对Nand Flash 的支持 • MTD源码分析
Nor和Nand Flash 区别(1) • NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM一统天下的局面。紧接着,1989年,东芝公司发表了NAND flash结构,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级 • NOR的特点是芯片内执行(XIP, eXecute In Place),这样应用程序可以直接在flash闪存内运行,不必再把代码读到系统RAM中。NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响了它的性能。 • NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于flash的管理和需要特殊的系统接口。并且不统一.
Nor和Nand Flash 区别(2) • 性能比较 • flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。 • 由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,而擦 除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。 • NOR的读速度比NAND稍快一些。 • NAND的写入速度比NOR快很多。 • NAND的4ms擦除速度远比NOR的5s快。 • 大多数写入操作需要先进行擦除操作。 • NAND的擦除单元更小,相应的擦除电路更少 • 接口差别 • NOR flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。 • NAND器件使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同。8个引脚用来传送控制、地址和数据信息。 • NAND读和写操作采用512字节的块,这一点有点像硬盘管理此类操作,很自然地,基于NAND的存储器就可以取代硬盘或其他块设备。 • 容量和成本 • NAND flash的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格。 • NOR flash占据了容量为1~16MB闪存市场的大部分,而NAND flash只是用在8~128MB的产品当中,这也说明NOR主要应用在代码存储介质中,NAND适合于数据存储,NAND在CompactFlash、Secure Digital、PC Cards和MMC存储卡市场上所占份额最大。
Nor和Nand Flash 区别(3) • 易用性 • 可以非常直接地使用基于NOR的闪存,可以像其他存储器那样连接,并可以在上面直接运行代码。 • 由于需要I/O接口,NAND要复杂得多。各种NAND器件的存取方法因厂家而异。 • 在使用NAND器件时,必须先写入驱动程序,才能继续执行其他操作。向NAND器件写入信息需要相当的技巧,因为设计师绝不能向坏块写入,这就意味着在NAND器件上自始至终都必须进行虚拟映射。 • 软件支持 • 在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是内存技术驱动程序(MTD),NAND和NOR器件在进行写入和擦除操作时都需要MTD。 • 使用NOR器件时所需要的MTD要相对少一些,许多厂商都提供用于NOR器件的更高级软件,这其中包括M-System的TrueFFS驱动,该驱动被Wind River System、Microsoft、QNX Software System、Symbian和Intel等厂商所采用。Nor 驱动经常采用CFI命令接口 • 而Nand Flash 驱动
Nand flash 工作原理 • S3C2410板的Nand Flash支持由两部分组成:Nand Flash控制器(集成在S3C2410 CPU)和Nand Flash存储芯片(K9F1208U0B)两大部分组成。当要访问Nand Flash中的数据时,必须通过Nand Flash控制器发送命令才能完成。所以, Nand Flash相当于S3C2410的一个外设,而不位于它的内存地址区. • Nand flash芯片型号为Samsung K9F1208U0B,数据存储容量为64MB,采用块页式存储管理。8个I/O引脚充当数据、地址、命令的复用端口。 • 一片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内置的指针指向各自的首地址。
Nand flash 工作原理(2) • 重要芯片引脚功能 • I/O0 -I/O7:复用引脚。可以通过它向nand flash芯片输入数据、地址、nand flash命令以及输出数据和操作状态信息。 • CLE(Command Latch Enable): 命令锁存允许 • ALE(Address Lactch Enable): 地址锁存允许 • CE:芯片选择 • RE:读允许 • WE:写允许 • WP:在写或擦除期间,提供写保护 • R/B:读/忙输出 • 寻址方式 • 一个页(Page)通常是528Byte/page,每32个Page 组成一个BLOCK,K9F1208有4096个块,Block是Nand Flash中最大的操作单元,擦除就是按照block为单位完成的,而编程/读取是按照page 为单位完成的.所以有三类的地址就是 Block Address,Page Address,Column Address • Samsung K9F1208U0B Nand Flash 片内寻址采用26位地址形式。从第0位开始分四次通过I/O0-I/O7进行传送,并进行片内寻址。具体含义如 • 0-7位:字节在上半部、下半部及OOB内的偏移地址 • 8位:值为0代表对一页内前256个字节进行寻址,值为1代表对一页内后256个字节进行寻址 • 9-13位:对页进行寻址 • 14-25位:对块进行寻址 • 当传送地址时,从位0开始
Nand flash 主要硬件命令 • Nand flash 主要内设命令详细介绍 • Nand Flash命令执行是通过将命令字送到Nand Flash控制器的命令寄存器来执行。这里的命令是指硬件命令 • Nand Flash的命令是分周期执行的,每条命令都有一个或多个执行周期,每个执行周期都有相映代码表示该周期将要执行的动作。 • 1. Read 1 (命令代码:00h) • 功能:表示将要读取Nand flash存储空间中一个页的前半部分,并且将内置指针定位到前半部分的第一个字节。 • 2.Read 2:(命令代码:01h) • 功能:表示将要读取Nand flash存储空间中一个页的后半部分,并且将内置指针定位到后半部分的第一个字节。 • 3. Read ID: (命令代码:90h) • 功能:读取Nand flash芯片的ID号 • 4. Reset:(命令代码:FFh) • 功能:重启芯片。 • 5. Page Program: • 功能:对页进行编程命令, 用于写操作。 • 命令代码:首先写入00h(A区)/01h(B区)/05h(C区), 表示写入那个区; 再写入80h开始编程模式(写入模式),接下来写入地址和数据; 最后写入10h表示编程结束. • 6. Block Erase • 功能:块擦除命令。 • 命令代码:首先写入60h进入擦写模式,然后输入块地址; 接下来写入D0h, 表示擦写结束. • 7. Read Status(命令代码:70h) • 功能:读取内部状态寄存器值命
Nand Flash 控制器工作原理 • S3C2410 集成一个Nand Flash控制器,S3C2410的启动代码可以外部Nand Flash上,当启动时,Nand Flash 存储器最先4K Bytes 将在被装载到Steppingstone(一个内部SRAM缓冲区的模块名称), 接着启动代码将在Steppingstone中执行,从一过程可以看,S32410为了让Nand Flash 能启动Bootloader ,做一个非常规的动作. • 对Nand Flash存储芯片进行操作, 必须通过Nand Flash控制器的专用寄存器才能完成。所以,不能对Nand Flash进行总线操作。而Nand Flash的写操作也必须块方式进行。对Nand Flash的读操作可以按字节读取。 • 1. 支持对Nand Flash芯片的读、检验、编程控制 • 2. 如果支持从Nand Flash启动, 在每次重启后自动将前Nand Flash的前4KB数据搬运到ARM的内部RAM中 • 3. 支持ECC校验 • 4.启动后,4K缓存可做其它用途.
工作模式 • 1)自动启动模式流程 • 1)复位完成 • 2)NAND FLASH存储器的最先4 KB代码被拷贝到Steppingstone 4KB内部缓冲区 • 3)CPU在Steppingstone 4KB 开始执行启动代码,将NAND Flash的内容拷贝到SDRAM • 4)主程序在SDRAM中被执行 • 注意 在自动模式下,ECC不检测,在NAND FLASH存储器中的最先4 Kbytes不能有失效位。 • (2)NAND FLASH模式流程 • NAND FLASH存储器当作普通的存储器使用 • 1)通过NFCONF寄存器设置NAND flash配置 • 2)向NFCMD寄存器写NAND flash的命令 • 3)向NFADDR寄存器写NAND flash的地址 • 4)通过NFSTAT寄存器检查NAND flash状态来读/写数据,在读操作前或编程操作后 R/n信号应该被检测
引脚配置 • D[7..0] 数据/命令/地址 输入/输出端口(共享) • CLE 命令锁存使能(Output) • ALE 地址锁存使能(Output) • nFCE NAND FLASH芯片使能(Output) • nFRE NAND FLASH 读使能(Output) • nFWE NAND FLASH 写使能(Output) • nWAIT NAND FLASH 读/忙 (Input) • OM[1:0] = 00b使能NAND Flash控制器自动启动模式 • OM1是S3C2410上一个管脚,在SBC2410被导到BOOT SEL上 • OM[1:0]=00时处理器从NANDFlash启动; • OM[1:0]=01时处理器从16位宽的ROM启动; • OM[1:0]=10时处理器从32位宽的ROM启动。 • OM[1:0]=11 测试模式
NAND Flash 相关寄存器 • #define rNFCONF (*(volatile unsigned *)0x4e000000) • #define rNFCMD (*(volatile U8 *)0x4e000004) • #define rNFADDR (*(volatile U8 *)0x4e000008) • #define rNFDATA (*(volatile U8 *)0x4e00000c) • #define rNFSTAT (*(volatile unsigned *)0x4e000010) • #define rNFECC (*(volatile unsigned *)0x4e000014) • #define rNFECC0 (*(volatile U8 *)0x4e000014) • #define rNFECC1 (*(volatile U8 *)0x4e000015) • #define rNFECC2 (*(volatile U8 *)0x4e000016)
NAND Flash 相关寄存器 • NAND Flash 配置寄存器(NFCONF)
/*************************************************** Function name: MemCfgInit Description : 设置NAND FLASH的配置寄存器 Return : void Argument : enable nand flash control, initilize ecc, chip disable ***************************************************/ void MemCfgInit(void) { //rCLKCON |= 0xffff0; //enable nand flash control, initilize ecc, chip disable, rNFCONF = (1<<15)|(1<<12)|(1<<11)|(7<<8)|(7<<4)|(7); // rNFCONF = Bin(10011011101110111) }
/*************************************************** Function name : NFChipSel(U32 sel) Parameter : U32 sel : 用来使能NAND FLASH 0:禁止 1:使能 Return : void Argument : 用来使能或禁止NAND FLASH芯片***************************************************/ void NFChipSel(U32 sel) { if(sel) rNFCONF &= ~0x800; else rNFCONF |= 0x800; }
NAND Flash 相关寄存器 • NAND Flash 命令设置寄存器(NFCMD)
写入一个命令 /*************************************************** Function name: NFWrCmd(int cmd) Parameter : int cmd : 命令参数 Description : 向NAND FLASH 输入一个命令 Return : void ***************************************************/ void NFWrCmd(int cmd) { rNFCMD = cmd; }
NAND Flash 相关寄存器 • NAND Flash 地址设置寄存器(NFADDR)
/*************************************************** Function name: NFWrAddr(int addr) Parameter : int addr : 地址 Description : 向NAND FLASH 输入一个地址 Return : void ***************************************************/ void NFWrAddr(int addr) { rNFADDR = addr & 0xFFFF; }
NAND Flash 相关寄存器 • NAND Flash 数据寄存器(NFDATA)
/*************************************************** Function name: NFWrDat(int dat) Parameter : int dat : 数据 Description : 向NAND FLASH 输入一个数据 Return : void ***************************************************/ void NFWrDat(int dat) { rNFDATA = dat; }
/*************************************************** • Function name: NFRdDat(int dat) • Parameter : int dat : 数据 • Description : 向NAND FLASH读一个数据 • Return : void • ***************************************************/ • U8 NFRdDat(void) • { • return rNFDATA; • }
NAND Flash 相关寄存器 • NAND Flash 工作状态寄存器(NFSTAT)
/*************************************************** Function name : NFIsReady(void) Parameter : void Return : 返回R/B脚的状态 Argument : R/B输出低时,表示读/写/擦除操作正在进行 ***************************************************/ int NFIsReady(void) { return rNFSTAT&1; }
NAND Flash 相关寄存器 • NAND Flash ECC寄存器(NFECC)
Linux 对Nand Flash的支持 • Linux对Nand Flash主要通过MTD来支持 • MTD(memory technology device内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。MTD的所有源代码在/drivers/mtd子目录下 • MTD支持两大类Flash 操作接口,一类是CFI接口,针对是Nor Flash,另一类就是Nand Flash接口 • 公共闪存接口(Common Flash Interface),简称CFI , CFI是一个从Flash Memory器件中读取数据的公共的标准的接口。它可以使系统软件查询已安装的Flash Memory器件的各种参数,包括器件阵列结构参数、电气和时间参数以及器件支持的功能等。利用CFI可以不用修改系统软件就可以用新型的和改进的产品代替旧版本的产品 • 利用CFI就可编写出大致统一的Nor Flash 驱动了.
MTD分层 • MTD设备分为四层(从设备节点直到底层硬件驱动),这四层从上到下依次是:设备节点、MTD设备层、MTD原始设备层和硬件驱动层。 • Nor 驱动和Nand 驱动只在硬件驱动不一样,在MTD其它部分采用相同处理
MTD分区 • 象IDE硬盘一样,一个MTD物理设备可以逻辑划分为多个逻辑分区,以方便用户使用. • 一个MTD原始设备可以通过mtd_part分割成数个MTD原始设备注册进mtd_table,mtd_table中的每个MTD原始设备都可以被注册成一个MTD设备,其中字符设备的主设备号为90,次设备号为0、2、4、6…(奇数次设备号为只读设备),块设备的主设备号为31,次设备号为0、1、2、3…
nand_chip 表示某一类Nand设备,它要负责最基本的读写Data寄存器之,基本操作 • struct mtd_info 代表一个逻辑的MTD设备 • 当对nand flash的设备文件(nand flash在/dev下对应的文件)执行系统调用read(),或在某个文件系统中对该设备进行读操作时. 会调用struct mtd_info中的read方法,他们缺省调用函数为nand_read(), • nand_select 选择芯片
Linux下Nand Flash驱动说明 • Linux 2.4 是在mtd/nand/smc_s32410.c 驱动 • 注册driver_register • 通过module_init(smc_s3c2410_init);注册Nand Flash驱动. 在 smc_s3c2410_init()中通过driver_register()注册 • 初始化Nand Flash 控制器 • smc_s3c2410_init函数会初始化Nand Flash控制器, 通过设置Nand Flash控制寄存器(S3C2410_NFCONF • 移除设备 • smc_s3c2410_cleanup()当设备被移除时,被device核心驱动调用. • Nand Flash 芯片初始化 • smc_s3c2410_init()初始化struct nand_chip中的一些主要字段以及方法 • 读Nand Flash • 当对nand flash的设备文件(nand flash在/dev下对应的文件)执行系统调用read(),或在某个文件系统中对该设备进行读操作时. 会调用struct mtd_info中的read方法,他们缺省调用函数为nand_read () • 写Nand Flash • 当对nand flash的设备文件(nand flash在/dev下对应的文件)执行系统调用write(),或在某个文件系统中对该设备进行读操作时, 会调用struct mtd_info中write方法,他们缺省调用函数为nand_write
谢谢,请提问 在疯狂的时代把握未来