linux nand flash?nand flash nor flash

大家好,今天小编来为大家解答以下的问题,关于linux nand flash,nand flash nor flash这个很多人还不知道,现在让我们一起来看看吧!

嵌入式Linux 中,nand flash 和 nor flash ,那个用的多

Nand flash

NAND flash和NOR flash原理

一、存储数据的原理

两种闪存都是用三端器件作为存储单元,分别为源极、漏极和栅极,与场效应管的工作原理相同,主要是利用电场的效应来控制源极与漏极之间的通断,栅极的电流消耗极小,不同的是场效应管为单栅极结构,而 FLASH为双栅极结构,在栅极与硅衬底之间增加了一个浮置栅极。[attach]158 [/attach]

浮置栅极是由氮化物夹在两层二氧化硅材料之间构成的,中间的氮化物就是可以存储电荷的电荷势阱。上下两层氧化物的厚度大于 50埃,以避免发生击穿。

二、浮栅的重放电

向数据单元内写入数据的过程就是向电荷势阱注入电荷的过程,写入数据有两种技术,热电子注入(hot electron injection)和 F-N隧道效应(Fowler Nordheim tunneling),前一种是通过源极给浮栅充电,后一种是通过硅基层给浮栅充电。NOR型 FLASH通过热电子注入方式给浮栅充电,而 NAND则通过 F-N隧道效应给浮栅充电。

在写入新数据之前,必须先将原来的数据擦除,这点跟硬盘不同,也就是将浮栅的电荷放掉,两种 FLASH都是通过 F-N隧道效应放电。

三、0和 1

这方面两种 FLASH一样,向浮栅中注入电荷表示写入了'0',没有注入电荷表示'1',所以对 FLASH清除数据是写 1的,这与硬盘正好相反;

对于浮栅中有电荷的单元来说,由于浮栅的感应作用,在源极和漏极之间将形成带正电的空间电荷区,这时无论控制极上有没有施加偏置电压,晶体管都将处于导通状态。而对于浮栅中没有电荷的晶体管来说只有当控制极上施加有适当的偏置电压,在硅基层上感应出电荷,源极和漏极才能导通,也就是说在没有给控制极施加偏置电压时,晶体管是截止的。如果晶体管的源极接地而漏极接位线,在无偏置电压的情况下,检测晶体管的导通状态就可以获得存储单元中的数据,如果位线上的电平为低,说明晶体管处于导通状态,读取的数据为 0,如果位线上为高电平,则说明晶体管处于截止状态,读取的数据为 1。由于控制栅极在读取数据的过程中施加的电压较小或根本不施加电压,不足以改变浮置栅极中原有的电荷量,所以读取操作不会改变 FLASH中原有的数据。

四、连接和编址方式

两种 FLASH具有相同的存储单元,工作原理也一样,为了缩短存取时间并不是对每个单元进行单独的存取操作,而是对一定数量的存取单元进行集体操作, NAND型 FLASH各存储单元之间是串联的,而 NOR型 FLASH各单元之间是并联的;为了对全部的存储单元有效管理,必须对存储单元进行统一编址。

NAND的全部存储单元分为若干个块,每个块又分为若干个页,每个页是 512byte,就是 512个 8位数,就是说每个页有 512条位线,每条位线下有 8个存储单元;那么每页存储的数据正好跟硬盘的一个扇区存储的数据相同,这是设计时为了方便与磁盘进行数据交换而特意安排的,那么块就类似硬盘的簇;容量不同,块的数量不同,组成块的页的数量也不同。在读取数据时,当字线和位线锁定某个晶体管时,该晶体管的控制极不加偏置电压,其它的 7个都加上偏置电压而导通,如果这个晶体管的浮栅中有电荷就会导通使位线为低电平,读出的数就是 0,反之就是 1。

NOR的每个存储单元以并联的方式连接到位线,方便对每一位进行随机存取;具有专用的地址线,可以实现一次性的直接寻址;缩短了 FLASH对处理器指令的执行时间。五、性能

NAND flash和NOR flash的区别

一、NAND flash和NOR flash的性能比较

flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。执行擦除时块尺寸的不同进一步拉大了NOR和NADN之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。这样,当选择存储解决方案时,设计师必须权衡以下的各项因素。

1、NOR的读速度比NAND稍快一些。

2、NAND的写入速度比NOR快很多。

3、NAND的4ms擦除速度远比NOR的5s快。

4、大多数写入操作需要先进行擦除操作。

5、NAND的擦除单元更小,相应的擦除电路更少。

二、NAND flash和NOR flash的接口差别

NOR flash带有SRAM接口,有足够的地址引脚来寻址,可以很容易地存取其内部的每一个字节。

NAND器件使用复杂的I/O口来串行地存取数据,各个产品或厂商的方法可能各不相同。8个引脚用来传送控制、地址和数据信息。NAND读和写操作采用512字节的块,这一点有点像硬盘管理此类操作,很自然地,基于NAND的存储器就可以取代硬盘或其他块设备。

三、NAND flash和NOR flash的容量和成本

NAND flash的单元尺寸几乎是NOR器件的一半,由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格。

NOR flash占据了容量为1~16MB闪存市场的大部分,而NAND flash只是用在8~128MB的产品当中,这也说明NOR主要应用在代码存储介质中,NAND适合于数据存储,NAND在CompactFlash、Secure Digital、PC Cards和MMC存储卡市场上所占份额最大。

四、NAND flash和NOR flash的可靠性和耐用性

采用flahs介质时一个需要重点考虑的问题是可靠性。对于需要扩展MTBF的系统来说,Flash是非常合适的存储方案。可以从寿命(耐用性)、位交换和坏块处理三个方面来比较NOR和NAND的可靠性。

五、NAND flash和NOR flash的寿命(耐用性)

在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次。NAND存储器除了具有10比1的块擦除周期优势,典型的NAND块尺寸要比NOR器件小8倍,每个NAND存储器块在给定的时间内的删除次数要少一些。

六、位交换

所有flash器件都受位交换现象的困扰。在某些情况下(很少见,NAND发生的次数要比NOR多),一个比特位会发生反转或被报告反转了。一位的变化可能不很明显,但是如果发生在一个关键文件上,这个小小的故障可能导致系统停机。如果只是报告有问题,多读几次就可能解决了。当然,如果这个位真的改变了,就必须采用错误探测/错误更正(EDC/ECC)算法。位反转的问题更多见于NAND闪存,NAND的供应商建议使用NAND闪存的时候,同时使用

七、EDC/ECC算法

这个问题对于用NAND存储多媒体信息时倒不是致命的。当然,如果用本地存储设备来存储操作系统、配置文件或其他敏感信息时,必须使用EDC/ECC系统以确保可靠性。

八、坏块处理

NAND器件中的坏块是随机分布的。以前也曾有过消除坏块的努力,但发现成品率太低,代价太高,根本不划算。

NAND器件需要对介质进行初始化扫描以发现坏块,并将坏块标记为不可用。在已制成的器件中,如果通过可靠的方法不能进行这项处理,将导致高故障率。

九、易于使用

可以非常直接地使用基于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等厂商所采用。

驱动还用于对DiskOnChip产品进行仿真和NAND闪存的管理,包括纠错、坏块处理和损耗平衡。

如何编写Linux下Nand Flash驱动

【Linux下nand flash驱动编写步骤简介】

1.了解硬件的nand

flash的各个参数和工作原理

具体参考nand flash的datasheet,主要包括,自己nand

flash的厂商,型号等。

Nand flash的页大小,oob大小,块大小,位宽8bit还是16bit。

工作原理,上面已经做了一定描述,不清楚的,可以参考datasheet,多看看,就会明白很多。

2.按照linux下驱动编写规范编写nand

flash驱动,

可以参考其他已经有的驱动,比如内核源码中已经有的

drivers/mtd/nand/s3c2410.c

就是个很好的例子。

自己以其为模板,实现自己板子的nand flash驱动。

其实主要工作就是,实现

static struct platform_driver s3c2410_nand_driver=

{

.probe=

s3c2410_nand_probe,

.remove=

s3c2410_nand_remove,

.suspend=

s3c24xx_nand_suspend,

.resume=

s3c24xx_nand_resume,

.driver={

.name=

"s3c2410-nand",

.owner=

THIS_MODULE,

},

};

中的

XXX_nand_probe函数

XXX_nand_remove函数

XXX_nand_enable_hwecc,如果支持硬件ecc的话。

对nand flash的读写,这两个函数,实现了对nand的具体操作。

【Linux下Nand Flash驱动编写简单步骤】

软件和硬件知识,都已经了解的话,由于上层的linux的 mtd框架中,已经完全封装好了,对nand

flash的write page,write oob等相关函数的实现,那么剩下的只是相对来说已经是很少量的,关于nand

驱动具体内部操作方面的工作:

1.初始化

先是在nand芯片初始化的时候,对其

XXX_nand_init_chip()

给对应的芯片chip赋给对应的

XXX_nand_read_buf和XXX_nand_write_buf等函数:

chip->cmd_ctrl=

XXX_nand_hwcontrol;

chip->dev_ready=

XXX_nand_devready;

chip->read_buf=

XXX_nand_read_buf;

chip->write_buf=

XXX_nand_write_buf;

以实现后续的对nand芯片的操作。

然后根据ecc类型,赋给对应的ecc的校验与纠错函数:

chip->ecc.hwctl=

XXX_nand_enable_hwecc;

chip->ecc.calculate= XXX

_nand_calculate_ecc;

3.

实现上面提到的对应的各个函数,关于如何实现,参考一下其他nand驱动,就会理解很多了。

4.驱动测试,参考具体的 ldd3(Linux

Device Driver version 3)的测试相关部分内容。

说得很乱,希望对大家有些帮助。

嵌入式系统必须有nand Flash和nor Flash吗

这个问题你要抓住本质来看。

Nand Flash和Nor Flash是做什么用的,为什么嵌入式系统里要用到他们?

其实,上述两个Flash只是存储芯片,相当于电脑的内存,另外还有一个DRAM或者SDRAM。

嵌入式系统里为什么要用到Flash或者DRAM呢,很显然,是用来存储东西的,Flash特点是掉电能保存,所以,一般用来存储程序代码或者常数数据,或者是掉电必须保存的数据。DRAM掉电不保存,但是几乎可以无限修改,所以一般用来做变量的存储和跑程序。

那么是不是嵌入式系统里必须有Flash和DRAM呢?答案是必须的,不然你的程序和变量怎么保存和运行呢?

那么嵌入式系统里必须要有Nand Flash和NorFlash吗?答案是不是必须的。

如果你用的主MCU,芯片内部集成了大容量的Flash和DRAM,就不必要扩展外部的Flash,比如说MTK62系列的芯片,就是我们常说的山寨手机,就没有外扩的DRAM和Flash.

如果你用的主MCU,芯片内部没有集成,或者集成的很小容量的Flash,你就要自己扩展Flash,可能是单独的Nand Flash,也可以能是单独的NorFlash,也可能是两者都有。如果你的程序很大,需要保存的数据也很大,比如说,你用三星的S3C24XX做主MCU,而跑Linux系统,那么,就两者都需要。如果你用三星的S3C44B0,跑uCOS-II,那么,只要其中一个就行了,一般只要NorFlash就行了,当然,上述的两个还要DRAM。

而现在的高端手机,通常用的高端的MCU,比如Cortex-A9系列的MCU,这些MCU通常集成的Flash和DRAM容量比较小,而跑的程序量比较大,所以,都要外扩上述两种Flash.

简而言之,就是,一个嵌入式操作系统,到底是否需要用到NandFlash和NorFlash,是由系统的大小和你所采用的MCU来决定的,这是一个系统规划问题,早在进行系统开发之前,就应该规划好的。

阅读剩余
THE END