目前NAND Flash已经很普及了。我们平时所用的SD、TF、CF、U盘,其实都是一个NAND Flash芯片颗粒加上一个控制器而成。控制器的不同就形成了丰富的接口。
而目前世面上的MP3、MP4、包括速度最快、也是价格最贵的SSD,其实也是一个控制器加上N个NAND Flash颗粒构成。
我们公司在CPU的换代中也渐渐使用了NAND Flash。
下面就介绍了目前的NAND Flash的技术、工艺以及CPU对NAND的控制器。方便以后研发。
背景介绍
NAND Flash相对于NOR Flash来说,容量大,价格低,速度快。但是优点的引入必然会带了缺陷。由于制造工艺的问题,NAND Flash在生产和使用过程中会出现坏块。
坏块指的是擦除后无法变成1的扇区,通常有2钟:
- 出厂时有厂家标记的坏块
- 在使用过程中生成的坏块
由于NAND Flash坏块的存在,所以在使用时就需要对读写的数据做校验。通常使用CPU内部的ECC或者Linux MTD的软ECC对Flash做校验。
Linux MTD采用BBT记录坏区,并将这个BBT保存在芯片的最后一个好的扇区中,并且做冗余。并且使用NAND Flash每个Page的apare array,用来存储ECC和其他数据,Linux MTD下称之为OOB。
NAND Flash分类
制造工艺
从制造工艺来说,NAND Flash分为3钟:SLC/MLC/TCL。
SLC
传统上,每个存储单元内存储1个信息比特,称为单阶存储单元(Single-Level Cell,SLC),使用这种存储单元的闪存也称为单阶存储单元闪存(SLC flash memory),或简称SLC闪存。SLC闪存的优点是传输速度更快,功率消耗更低和存储单元的寿命更长。然而,由于每个存储单元包含的信息较少,其每百万字节需花费较高的成本来生产。由于快速的传输速度,SLC闪存技术会用在高性能的储存卡。
MLC
多阶存储单元(Multi-Level Cell,MLC)可以在每个存储单元内存储2个以上的信息比特,其“多阶”指的是电荷充电 有多个能阶(即多个电压值),如此便能存储多个比特的值于每个存储单元中。借由每个存储单元可存储更多的比特,MLC闪存可降低生产成本,但比起SLC闪 存,其传输速度较慢,功率消耗较高和存储单元的寿命较低,因此MLC闪存技术会用在标准型的储存卡。另外,如飞索半导体的MirrorBit®技术,也是属于这一类技术。
TLC
三阶储存单元(Triple-Level Cell,TLC),这种架构的原理与MLC类似,但可以在每个储存单元内储存3个信息比特。TLC的写入速度比SLC和MLC慢,寿命也比SLC和MLC短,大约500~1000次。
我所使用的SamSung SSD 840固态硬盘就属于TLC。
页面大小
从页面大小来说,我目前所用到的2钟,SP和LP。这2钟主要是以1Gb容量的NAND Flash区分,1Gb以下的是SP,以上的是LP。1Gb的需要看文档决定。
SP
Small Page,指一个Page为512B+16B,前者用来存放数据,后者用来做oob。一个block为16KB+512B。
LP
Large Page,指一个Page为2KB+64B,前者用来存放数据,后者用来做oob。一个block为128KB+4KB。
CPU NAND Flash控制器
ATMEL
硬件
ATMEL ARM CPU中的NAND Flash控制器的数据线与SDRAM/DDR的数据线复用,通过不同的片选来选择访问的芯片。由于DDR是1.8V,NAND Flash可以为1.8V和3.3V,所以ATMEL设计如果使用不同电压的NAND和DDR,则NAND放置在数据线的高16位,DDR在低16位,对不同的功能单独供电。
软件
ATMEL ARM CPU的NAND Flash启动相对来说比较简单,ATMEL提供了一个很小的Bootstrap,CPU首先自动探测所连接NAND Flash型号、8bit/16bit、SP/LP,然后将Bootstrap读进CPU内部的SRAM,然后Bootstrap初始化DDR 2,读进u-boot,启动之。
同时ATMEL提供了SAM-BA软件,可以在线编程NAND Flash。
Freescale
硬件
Freescale的QUICC系列PowerPC CPU具有单独的DDR 2总线和本地总线。本地总线挂载NAND Flash,接线简单。然后通过配置CFG_RESET_SOURCE选择LP或者SP的NAND Flash启动。
软件
Freescale通常使用FCM/UPM控制NAND Flash。U-boot启动分别2步。
STAGE 0
CPU首先读取4KB的代码到FCM的RAM中,并根据设置对没512字节做ECC检查。检查无错后从偏移0x100执行读入的代码。这一部分的代码会做以下步骤:
- 复位并初始化CPU的寄存器、cache和memory access windows;
- 保存复位状态寄存器上下文;
- 设置数据cache作为数据存储区以存储将要运行C代码的堆栈;
- 配置CS0的BR/OR,以设置时序和ECC模式;
- 配置DDR和DDR访问窗口;
- 将FCM buffer中的STAGE 0 bootloader拷贝到DDR,这样就可以读取剩下的u-boot;
- 清除FMC[BOOT]位从FCM buffer模式回到正常模式;
- 从NAND Flash读u-boot image到DDR内存;
- 跳到u-boot image的启动地址;
参考
- Using U-boot to Boot From a NAND Flash Memory Device for MPC8313E (nand_spl.pdf)
- MPC8309 PowerQUICC II Pro Integrated Communications Processor Reference Manual (MPC8309RM.pdf)
- ATMEL SAM9G25 DATASHEET (doc11032.pdf)
- http://zh.wikipedia.org/wiki/%E9%97%AA%E5%AD%98
- linux-2.6/drivers/mtd/nand/nand_bbt.c