嵌入式学习笔记(一)——初识NAND FLASH
初识NAND FLASH
今天买了本二手书(《嵌入式系统原理及接口技术》)刚从目录扫到“NAND FLASH”这个概念,晚上就得到了老师的任务,要我做NAND FLASH FTL,神马香港博士做好了接口,让改程序神码的,虽然不明白什么意思,但感觉像驱动开发,觉得很厉害!!!
差点起名字叫NAND FLASH学习笔记,一想也不对,我目前的目标是NAND FLASH,但是相关的整个体系都得学才明白,而我也是这样做的,那应该叫嵌入式学习。
说是让我先去搜索中文资料,随后发给我英文版的资料。好了,开始搜索吧,先百科“NAND FLASH”,再百度“NAND FLASH FTL” “NAND FLASH 驱动”等字眼,然后把我那二手书也扫两眼,就这么定了
百科篇:
打开百科,映入眼帘的是NOR FLASH与NAND FLASH对比。NOR的特点是XIP,eXecute In Place——芯片内执行,技术角度就是,它可以在FLASH内运行程序,不用转到RAM,这就是所谓插入U盘可以扩充电脑内存的说法的来源吧,那这句话的错误之处肯定在于他没提出NAND不可以这样做。
NOR的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除 速度大大影响了它的性能。NAND结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于flash的管理需要特殊的系统接口。以前知道磁盘都是扇区的,FLASH的擦写单元是块。NOR的块大64KB~128KB,擦写一次慢,NAND块小8KB~32KB,擦写一次快。而且NOR擦前要写1,更繁琐更慢了。
ref:
性能比较
目前我的大脑获得的有用信息就是NAND期间使用复杂的I/O口来串行地存取数据,8个引脚用来传送控制/地址和数据信息。总之,它需要驱动。
ref:
构成
NAND Flash 的数据是以bit的方式保存在memory cell,一般来说,一个cell 中只能存储一个bit。这些cell 以8个或者16个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device的位宽。这些Line会再组成Page,(NAND Flash 有多种结构,我使用的NAND Flash 是K9F1208,下面内容针对三星的K9F1208U0M),每页528Bytes(512byte(Main Area)+16byte(Spare Area)),每32个page形成一个Block(32*528B)。具体一片flash上有多少个Block视需要所定。我所使用的三星k9f1208U0M具有4096个block,故总容量为4096*(32*528B)=66MB,但是其中的2MB是用来保存ECC校验码等额外数据的,故实际中可使用的为64MB。
NAND flash以页为单位读写数据,而以块为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址:Column Address:Starting Address of the Register. 翻成中文为列地址,地址的低8位Page Address :页地址Block Address :块地址对于NAND Flash来讲,地址和命令只能在I/O[7:0]上传递,数据宽度是8位。在NOR器件上运行代码不需要任何的软件支持,在NAND器件上进行同样操作时,通常 需要驱动程序,也就是内存技术驱动程序(MTD ),NAND和NOR器件在进行写入和擦除操作时都需要MTD。
坏块:NAND的坏块是分布的,也不好有效处理,因此存储一直需要虚拟映射。
ref:
NOR FLASH的主要供应商是INTEL ,MICRO等厂商,曾经是FLASH的主流产品,但现在被 NAND FLASH挤的比较难受。它的优点是可以直接从FLASH中运行程序,但是工艺复杂,价格比 较贵。
NAND FLASH的主要供应商是SAMSUNG和东芝,在U盘、各种存储卡、MP3播放器里面的都是这种 FLASH,由于工艺上的不同,它比NOR FLASH拥有更大存储容量,而且便宜。但也有缺点,就是无法寻址直接运行程序,只能存储数据。另外NAND FLASH 非常容易出现坏区,所以需要有校验的算法。在掌上电脑里要使用NAND FLASH 存储数据和程序,但是必须有NOR FLASH来启动。除了SAMSUNG处理器,其他用在掌上电脑的主流处理器还不支持直接由NAND FLASH 启动程序。因此,必须先用一片小的NOR FLASH 启动机器,在把OS等软件从NAND FLASH 载入SDRAM中运行才行,挺麻烦的。(引导相关 bootloader还没学)另外还有数码产品中,有SLC和MLC两种NAND,品牌,制作工艺等,封装技术BGA、COB、TSOP。等等。。。我的重点是linux和驱动,掠过
课本篇(Day 2):
把我的二手书《嵌入式系统原理及接口技术》看了下,和NAND FLASH有关的标题有两个,一个是寻址(Addressing),一个是接口(interface)
NAND FLASH接口引脚有三类:数据、控制、状态。
数据引脚高度复用:地址总线、数据总线、命令输入信号线。
此外还有命令锁存使能CLE、地址锁存使能ALE、读写使能nRE、nWE、片选nCE等,还有R/nB(高电平表示芯片忙),I/O 0~7。
有个问题,NAND FLASH(eg.K9F6408) 8MB可用空间,除以块数1024,除以页数16,一页可用512B,可是实际确实528B,还有16B的辅助数据存储器,存放ECC代码,坏块信息和文件系统代码等。而且:芯片内部还有一个528B的静态寄存器,名为页寄存器,听起来像一个索引,但是却是用来做数据存取的缓冲区。
那这里就有个悖论了,怎么设计要制作的存储芯片大小,按8MB生产的话,不够,还要给出一堆零头,专门计算此特例。难道按528那个算,这样生产太不统一标准了吧,又或者都是大概多大一块,然后用了多少,所以都不整齐,只是大概容量差不多,从里边格式化来这么多就行了。实际生产到底怎样呢(至少知道组成原理课中一般都简化了,一个芯片就是个很规整的数字比如8MB).
NAND FLASH的特点使它可以当bootloader,貌似是这个意思。
(前文提过NAND FLASH需要接口设计,而且没有统一标准,只是说各家可能大概套路会些共同点,这本N年前的书说ONFI(Open NAND Flash Interface),说Intel发起的要统一标准,既然现在老师还让我做,估计是没统一,查一下吧,貌似2011年就ONFI3.0了。。。。那统一不统一,估计也有工作要做,因为是嵌入式嘛。。。)
====================================================================================================================================
其他嵌入式基础知识:
NAND FLASH到此告一小段,先继续看两页《Understanding the Linux Kernel(3rd Edition)》(《深入理解Linux内核》,我看是渗入)
上次上课老师说的“两种模式”原来是对的,我们说用户态和核心态,其实原文就是是模式(mode)
非特权用户模式unprivileged User Mode和特权内核模式privileged Kernel Mode
前者进入后者的唯一两种途径就是中断(Interrupts)和异常(Exceptions)_看来计算机组成原理要被复习一遍。
然后,一些小常识和细节——各种专业名词,各种英语,此书主要用80*86芯片,linux2.6.11,“因为代码太多,我们不可能都列出来,我们只选择有代表性的”。
各种ARM系列,还有THUMB指令集与ARM指令集,在这空中楼阁太枯燥了,等需要接触的时候查询吧。
初期只能零散学了,先积累点基础知识,对什么都有点印象,后边免得硬啃太慢太枯燥。
接下来的计划是找一找linux内核和驱动的相关文章,快速入门一下。