经过UBOOT初步的移植,Linux内核初步的移植,Linux内核总线设备模型的分析,等一系列
痛苦的折腾,目的就是想更好的来分析下NANDFLASH的驱动。。大概一共历经了半个月
的时间,慢慢的对NANDFLASH驱动程序有感觉了。。。
一、MTD体系结构:Linux内核提供MTD子系统来建立FLASH针对Linux的统一、抽象接口。MTD将文件系统与底层的FLASH存储器进行隔离。
引入MTD后Linux系统中对FLASH的设备驱动分为4层
设备节点:用户在/dev目录下使用mknod命令建立MTD字符设备节点(主设备号为90),或者MTD块设备节点(主设备号为31),使用该设备节点即可访问MTD设备。
MTD设备层:基于MTD原始设备层,系统将MTD设备可以定义为MTD字符(在/mtd/mtdchar.c中实现,设备号90)和MTD块设备(在/mtd/mtdblock.c中实现,设备号31)。
MTD原始设备层:MTD原始设备层由两部分构成,一部分是MTD原始设备的通用代码,另一部分是各个特定Flash的数据,如分区。
主要构成的文件有:
drivers/mtd/mtdcore.c支持mtd字符设备
driver/mtd/mtdpart.c支持mtd块设备
Flash硬件驱动层: Flash硬件驱动层负责对Flash硬件的读、写和擦除操作。MTD设备的Nor Flash芯片驱动位于drivers/mtd/chips/子目录下,Nand Flash芯片的驱动则位于drivers/mtd/nand/子目录下。
二、Linux内核中基于MTD的NANDFLASH驱动代码布局:
三、NANDFLASH的硬件特性
要想读懂后面Linux系统中对NANDFLASH硬件驱动代码,了解NANDFLASH的硬件特性这是再好不过的。
1、NANDFLASH的内部布局
2、Nand Flash的物理存储单元的阵列组织结构(以开发板上的K9F2G08为例)
K9F2G08的大小是256M
a)block:"Block是Nand Flash的擦除操作的基本/最小单位",一片NANDFLASH(chip)由很多块
(block)组成,块的大小一般是 128KB, 256KB,512KB,此处是 128KB。。其他的小于 128KB 的,
比如 64KB称之为small block的Nand Flash。
b)page:"page是读写操作的最小单位",每一个block里面包又含了许多page(页),每个页的大小,
对于现在常见的Nand Flash多数是2KB,最新的Nand Flash的是4KB、8KB等,这类的页大小大于
2KB的NandFlash,被称作 big block的 Nand Flash,对应的发读写命令地址,一共 5个周期(cycle),
而老的 Nand Flash,页大小是 256B,512B,,这类的 Nand Flash被称作 small block的nandflash
地址周期只有4个。
c)oob:每一个页,对应还有一块区域,叫做空闲区域(spare area)/冗余区域(redundant area)而
Linux 系统中,一般叫做 OOB(Out Of Band),这个区域,是最初基于Nand Flash的硬件特
性:数据在读写时候相对容易错误,所以为了保证数据的正确性,必须要有对应的检测和纠
错机制,此机制被叫做 EDC(Error Detection Code)/ECC(Error Code Correction, 或者 Error
Checking and Correcting),所以设计了多余的区域,用于放置数据的校验值。
Oob 的读写操作,一般是随着页的操作一起完成的,即读写页的时候,对应地就读写了 oob。
关于 oob具体用途,总结起来有:
1、 标记是否是坏快
2、存储ECC数据
3、存储一些和文件系统相关的数据。如 jffs2 就会用到这些空间存储一些特定信息,
4、而yaffs2 文件系统,会在 oob中,存放很多和自己文件系统相关的信息。
3、K9F2G08的引脚定义
IO7~IO0:用于输入地址/数据/命令,输出数据。
CLE:命令锁存使能位,在发送命令之前要先将模式寄存器中设置CLE使能(高电平有效)。
ALE:地址锁存使能位,在发送地址之前,要先将模式寄存器中设置ALE使能(高电平有效)。
CE:(nFCE)芯片的片选信号,操作nandflash前应该拉低该位使之选中该芯片。
RE:(nFRE)读使能,低电平有效,读之前使CE有效。
WE:(nFWE)写使能,低电平有效,写之前必须使WE有效。
WP:写保护低电平有效
R/B:(R/nB)Ready/Busy Output,就绪/忙,主要用于在发送完编程/擦除命令后,检测这些操作是
否完成,忙,表示编程/擦除操作仍在进行中,就绪表示操作完成。(其中就绪:高电平,忙:低电平)。