文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>如何编写linux下nand flash驱动(1)

如何编写linux下nand flash驱动(1)

时间:2009-03-08  来源:soararing

【简介】如何编写linux下nand flash驱动

Version: V0.1

Time:10/06/2008

Author:[email protected]

【编写驱动之前要了解的知识】

1.硬件方面:

【Flash的种类】

Flash主要分nand flash和nor flash

除了网上最流行的这个解释之外:

NAND和NOR的比较

我再多说几句,nor的成本相对高,比较适合应用于存储少量的代码。

Nand flash相对成本低,因此可以用来存储大量的数据,其在嵌入式系统中的作用,相当于PC上的硬盘,用于存储大量数据。

Nor flash,有类似于dram之类的地址总线,因此可以直接和CPU相连,CPU可以直接通过地址总线对nor flash进行访问,而nand flash没有这类的总线,只有IO接口,只能通过IO接口发送命令和地址,对nand flash内部数据进行访问。相比之下,nor flash就像是并行访问,nand flash就是串行访问,所以相对来说,前者的速度更快些。

但是由于物理制程/制造方面的原因,导致nor 和nand在一些具体操作方面的特性不同:


 

Nand 和 Nor Flash 的区别

 

NOR

NAND

(备注)

接口

总线

I/O接口

这个两者最大的区别

单个cell大小

 

单个Cell成本

 

读耗时

 

单字节的编程时间

 

多字节的编程时间

 

擦除时间

 

功耗

低,但是需要额外的RAM

 

是否可以执行代码

不行, 但是一些新的芯片,可以在第一页之外执行一些小的loader

即是否允许,芯片内执行(XIP, eXecute In Place)

位反转Bit twiddling

几乎无限制

1-3次,也称作 “部分页编程限制”

也就是数据错误了?

在芯片出厂时候是否允许坏块

不允许

允许

 

 

【Nand Flash的种类】

具体再分,又可以分为

1)Bare NAND chips:裸片,单独的nand 芯片

2)SmartMediaCards: =裸片+一层薄塑料,常用于数码相机和MP3播放器中。之所以称smart,是由于其软件smart,而不是硬件本身有啥smart之处。^_^

3)DiskOnChip:裸片+glue logic,glue logic=硬件ECC产生器+用于静态的nand 芯片控制的寄存器+直接访问一小片地址窗口,那块地址中包含了引导代码的stub桩,其可以从nand flash中拷贝真正的引导代码。

 

【Nand flash的特点】

Nand flash的操作,和其他一些常见的设备,如硬盘等,不同,其有自己特殊的方式。

其特殊就在于:

1.Nand flash的最小单位是页page,而不是其他很多设备所说的位bit。

2.写入数据之前必须先进行擦除erase操作

3.写的时候,最小单位是页page,对也进行写操作,也称作“页编程”,page programming

4.擦除的最小单位是块block

5.由于物理特性,容易出错,所以无论是读还是写,都要采取检测和校验,即EDC。

6.nand flash出厂时候,就有一定坏的块block,成为换块,并且做了一定标记。

7.nand flash中有个额外的空间,叫做spare area/oob

 

【spare area/oob】

Nand由于最初硬件设计时候考虑到,额外的错误校验等需要空间,专门对应每个页,额外设计了叫做spare area空区域,在其他地方,比如jffs2文件系统中,也叫做oob(out of band)数据。

其具体用途,总结起来有:

1.       标记是否是坏快

2.       存储ECC数据

3.       存储一些和文件系统相关的数据,如jffs2就会用到这些空间存储一些特定信息

 

 

【常见Nand Flash的大小及参数】

常见的nand flash 的大小,由最开始的小于256M,到现在的常见的1G,2G,甚至更大。

以前的nand flash的

Pagesize页大小,多为512B+16B的oob,block大小为64*(512B+16B)=32KB+1KB

现在目前市场上见到的,绝大多数,都是新的nand falsh,其Pagesize页大小多为2KB+64B的oob,block大小多为64pages页=64*(2K+64B)=128KB+4KB,一个nand flash中的芯片,一般含有4096个块,比如samsung的K9F4G08U0M,所以这个nand flash大小就是

4096 Blocks = 4096 * 64 *(2K+64B)=512MB

即:

1 Page = (2K + 64)Bytes

1 Block = (2K + 64)B x 64 Pages

= (128K + 4K) Bytes

1 Device = (2K+64)B x 64Pages x 4,096 Blocks

= 4,224 Mbits =512MB

 

【Nand flash工作原理】

所谓工作原理,其实也就是对应对其如何操作的。

还是以上面提到的samsung的K9F4G08U0M的nand flash为例,简单描述如下:

1.nand flash定义了一些引脚,使得你可以发送命令过去,实现对nand flash的操控:

上面这些引脚,需要解释的主要是

CLE,使能,只有使能有效,你才能进行后续的操作。只能选中了这个nand芯片,才能进行后续的读写。

ALE,在发送地址时,要锁住地址总线,才可以操作。

RE,WE,在读写之前,要对应的引脚有效,才可以进行读写的。

其他见解释皆可。

 

所有如上的引脚,都是驱动中,通过发送命令,具体内部控制逻辑去实现的。

而驱动开发者要关心的,是何时去发送对应的命令。具体想要实现一操作,要何时发送什么命令才能实现,要继续看下面的datasheet中的解释:

 

如果想要对nand flash操作,就要根据datasheet中的规范进行,比如对页的写操作/写编程要根据这个顺序去操作:

其具体的细节,包含了哪些操作,可以看这个时序图:

从上图可以看出来,要先发80h的命令,再继续后面的操作。

这里的80h命令的含义,参考这个图表:

从这个图表,可以看到,80h就是page program的第一个命令。

而时序图中的先两个col列地址,后三个row行地址,是根据下面这个图得来的:

此时才能定位到你所要操作的页,才能进行写操作。

再多说几句,上图表示了,如果想要对这个nand flash操作,读或写,需要进行3次列地址和三次的行地址,才能定位到你所要操作的地方,才能读写。同时显示了,每次每个位,对应代表的地址位。

此处的2个列地址和3个行地址,是由硬件设计决定的。

老的nand flash由于每个页只有512B,所以,最后的操作,只需要1个列地址和3个行地址就可以定位了。感兴趣的可以去网上下载samsung一些老的nand flash,可以对比着看,更明白些。

 

而每个操作,比如上面的写操作,都是需要一定时间的,其具体硬件操作所需的时间,见这个图:

此处可以看到,写一个页,即页编程,一般需要200us,最大需要700us,所以驱动开发者在开发的时候,要知道这个细节,要等待对应的时间,再去判断,是否写操作顺利完成了,才能接下来继续后面其他的操作的。

 

相关阅读 更多 +
排行榜 更多 +
爱是小事最新版

爱是小事最新版

休闲益智 下载
悬案2刹那惊颤游戏

悬案2刹那惊颤游戏

冒险解谜 下载
几何飞行内购修改版

几何飞行内购修改版

飞行射击 下载