Nand Flash驱动, ECC, MTD, FTL, 文件系统
2011-05-23 20:03
特点 Nand flash存储结构为chip->(plane)->block->page>byte。 page分为数据区和oob(out of band),oob用于存放ecc码、标记坏块和文件系统备用等。 Nand flash的物理特性决定了每一个bit只能从1变为0,不能从0变为1。 Nand flash在出厂和使用过程中可能出现某些bit错误,所以采用了ecc的纠错和检错方法。 在读写过程中Nand flash状态寄存器返回错误或者发现多个bit发生不能纠错的错误,则可以标记该block为坏块,将该block的第一第二page的oob的相应byte置为非0xff,文件系统/操作系统需要管理坏块。
Nand flash的命令包括擦除、读、写,擦除针对block进行,将整个block全部置为1;读和写都针对page进行。因为每个bit只能从1到0,所以每次写之前,要进行擦除。基本三个阶段:命令->地址->数据,不同阶段根据引脚(片选、读\写使能、命令\地址锁存引脚等)决定。
对每个block中的page访问必须是顺序的,不能是随机的。 擦除和写次数是有寿命的,通常可达10万次。所以不能频繁对某个block进行擦除和写,所以软件需要将擦除和写平摊到每个block上,这种操作叫做负载均衡wear leveling。
Nand flash的IO是复用的,这样的好处就是pin少,可扩展性好。
ecc ecc有软件和硬件之分。 对于硬件ecc来说,在写page的时候,硬件自动产生ecc,将其存入oob的某些byte。在读page的时候,硬件也自动产生一个ecc,并和oob比较,通过比较可以实现纠错和检错。 详见: http://dev.firnow.com/course/3_program/c/c_js/20100710/397316.html
Nand flash controller Nand flash只是相当于cpu的一个外设,并不位于内存地址区。cpu内部有Nand flash controller与Nand flash打交道。
驱动程序 所谓Nand flash的驱动也就是对Nand flash controller编程(发送命令/写寄存器都是同样的意思)。驱动程序的结构大同小异,区别在于每家芯片的Nand flash controller的设计不同,所以对controller的编程的部分是不同的,还有不同的在于数据传输(比如,数据是拷贝或是DMA等)。
对于硬件ecc来说,基本的驱动包括下述功能:擦除block、读写page、ecc判断、坏块标识、读取Nand状态、等待Nand、复位Nand、初始化等;
初始化中要开辟驱动程序需要的memory,设置工作模式(page大小、block大小、时钟频率、ecc模式等),和对函数指针赋值:
驱动是分层的,以上是最底层的chip的驱动,是为了上层MTD服务的。 以读page为例: chip->cmdfunc(MTD, NAND_CMD_READ0, 0x00, page);//先发读命令,由controller将读命令发给nand flash chip->ecc.read_page(MTD, chip, buf);//然后读取数据(拷贝或者DMA方式),其中还有ecc校验
关于MTD的驱动架构详见: 《如何编写Linux下Nand Flash驱动》
MTD linux下的设备分成block device和character device,flash两者都不是属于MTD(Memory Technology Device)。但这个只是指代的是原始的Nand flash和Nor flash芯片,衍生产品如SSD, MMC, eMMC, RS-MMC, SD, mini-SD, micro-SD, USB flash都属于block device。
block device和mtd device的区别如下:
像传统的文件系统,如FAT、ntfs、ext2、ext3等,都是建立在block device上的。MTD有自己的文件系统。
SSD, MMC, eMMC, RS-MMC, SD, mini-SD, micro-SD, USB flash这些设备里面的储存媒介当然还是flash,但是拆开它们还会发现一块MCU,它的firmware实现了FTL。所谓FTL是Flash Translation Layers,从软件上将flash“模拟”为block device了。
FTL的重要功能包括负载均衡、逻辑地址与物理地址映射、提供与block device相同的访问界面(512 bytes/sector)。FTL建立在MTD之上,传统的文件系统再建立在FTL之上。但每家厂家的FTL是不公开的,所以不知道好坏真的如何。遇到使用不好的FTL的U盘,可能马上出现“IO读写错误”了!
详见: http://www.linux-mtd.infradead.org/index.html
文件系统 常见的有JFFS2、YAFFS、TrueFFS文件系统都提供了坏块管理、负载均衡,ecc纠错检错等功能。 有UBIFS,UBIFS建立在UBI层上,UBI层建立在MTD上,而上述的两个文件系统是直接建立在MTD上的。 UBI要的工作就是实现更好的负载均衡和坏块管理,减轻文件系统的工作。 详见: http://www.linux-mtd.infradead.org/doc/ubifs.html 一般系统启动流程 Nor flash类似ram,地址线和数据线分开,一般位于内存地址区,支持代码片上执行。嵌入式芯片内部一般还有rom,从rom跳转到nor flash中执行代码,该代码称为bootloader,它初始化外设,串口、dram、nand flash等。之后bootloader把Nand flash中的main code拷贝到dram中去,接着跳转到main code入口。 当然启动有多种方式,main code较小的也有直接放在nor flash中,bootloader较大可能还会把自己也拷贝到dram中去。
|
分享到:
相关推荐
### Linux在TQ2440上的NAND Flash驱动及MTD分区移植详解 #### 一、背景介绍 本文将详细介绍如何在Linux环境下为TQ2440开发板移植NAND Flash驱动,并进行MTD分区配置。TQ2440是一款基于S3C2440处理器的嵌入式开发板...
总的来说,这个压缩包文件提供了关于Linux系统中NAND Flash驱动开发和管理的深入知识,包括MTD子系统的功能、NAND Flash的特性和驱动设计的要点。对于想要从事嵌入式系统开发,尤其是涉及NAND Flash存储的工程师来说...
MTD并不直接对应于文件系统,而是作为文件系统的底层支持。在NAND Flash的驱动实现中,MTD框架处理硬件接口、错误管理和数据完整性检查。 在"nandflash驱动源代码"中,我们通常会看到以下关键部分: 1. **初始化**...
在Linux系统中,MTD具有承上启下的关键作用,承上可以很好地支持cramfs、jfS2和yaffs等文件系统,启下也能对FLASH的擦除和写入操作提供支持。 Nand Flash驱动的实现机制可以分为三个部分:设备注册、驱动加载和驱动...
NAND Flash驱动是Linux操作系统中非常重要的一个组件,它负责管理和操作存储在NAND Flash芯片上的数据。由于NAND Flash具有独特的硬件特性,使得它的驱动编写相对复杂。下面,我们将详细介绍NAND Flash和Linux下NAND...
- **mtd-block**: 将NAND Flash设备模拟成块设备,以便使用标准的文件系统工具。 - **mtd-ubi**: 通用闪存设备(Ubi)提供了一个虚拟的分区表,可以将Nand Flash划分为多个逻辑分区。 **2.3 MTD驱动开发** MTD驱动的...
- **MTD驱动框架**:提供了通用的API,驱动开发者可以基于此框架编写针对特定Nand Flash芯片的驱动程序。 编写Linux下的Nand Flash驱动,需要理解硬件特性,如SLC和MLC的区别、坏块管理和负载平衡的实现,以及ECC...
- NAND Flash 中每一页都配有一个额外的区域,用于存放 ECC 数据以及其他元数据,如文件系统信息。这一区域在不同的上下文中可能被称为 Spare Area、Redundant Area 或 OOB。 - Spare Area 主要用于存储错误校验码...
在嵌入式Linux系统中,YAFFS2文件系统的构建需要考虑到Nand FLASH存储器的硬件接口设计和MTD驱动编写方法。MTD驱动是指Memory Technology Device驱动程序,它可以控制Nand FLASH存储器的读写操作。MTD驱动的编写需要...
打完补丁、更新了 MTD 驱动和 JFFS2 文件系统之后,就开始写自己 nand flash 驱动了。 在配置时,需要定义 flash 分区结构、定义 flash 读写地址、写控制 flash 的_hwcontrol()函数。具体的操作要看所用的 nand ...
6. **映射层**:为了简化上层文件系统的操作,驱动通常会提供一个虚拟地址到物理地址的映射层,使得文件系统可以像操作内存一样操作Flash。 在"008_NAND FLASH驱动"这个主题中,我们可以深入学习如何编写和调试NAND...
MTD分区允许系统将NAND Flash划分为不同的区域,每个区域可以有不同的用途,如引导程序、操作系统内核或文件系统。例如,上述启动信息中显示的三个分区:"boot"、"kernel"和"yaffs2"分别用于存储引导加载程序、内核...
在编写NandFlash驱动时,通常需要实现MTD子系统中定义的一系列接口函数,如open、read、write、erase、sync等,以便满足MTD框架的要求。 在驱动编写的具体实现上,需要处理几个关键点: 1. NandFlash行列地址的计算...
Nand Flash更适合于存储大量数据,如操作系统镜像、多媒体文件等;而Nor Flash则更适用于代码执行,因其支持随机访问。 **2.2.2.2 Nand Flash的详细分类** Nand Flash主要分为SLC(单层单元)和MLC(多层单元)两种...
- **NAND 文件系统**: 基于 MTD 层提供的功能,实现文件系统的支持。 ## 4. 获取 NAND Flash 参数的过程 ### 4.1 `nand_get_flash_type()` 函数的作用 `nand_get_flash_type()` 函数是 MTD NAND 驱动架构中的关键...
3. NAND Flash驱动程序的总体架构:NAND Flash驱动程序的总体架构包括设备驱动层、文件系统层和应用层。 4. 嵌入式Linux下的NAND Flash驱动程序设计:在嵌入式Linux系统下,NAND Flash驱动程序的设计需要考虑到...
在IT行业中,NAND Flash是一种常见的非易失性存储技术,广泛应用于移动设备、嵌入式系统和固态硬盘等。烧录文件制作是将操作系统、应用程序和其他必要数据写入NAND Flash的过程,以实现设备的初始化和功能实现。本文...
3. **MTD(Memory Technology Device)层**:Linux系统中,Nand Flash驱动通常基于MTD子系统,需要熟悉MTD的API和模型。 4. **错误处理**:考虑硬件错误和数据完整性,实现有效的错误检测和恢复机制。 5. **性能优化...
构建基于超大容量NAND Flash的YAFFS2文件系统,需要综合考虑硬件特性、MTD驱动的配置与优化,以及文件系统参数的调整。在嵌入式Linux平台上,YAFFS2为大页面和超大容量的NAND Flash提供了高效、稳定的数据管理和存储...
在本主题中,我们聚焦于如何在基于Intel PXA270处理器的系统上实现对K9G8G08U0A NAND Flash的驱动。由于PXA270处理器本身并不直接支持NAND Flash接口,因此需要通过PC Card接口进行模拟以实现数据读写功能。 PXA270...