- 1、本文档共30页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第24章 Flash设备驱动 Flash存储器是近几年来发展最快的存储设备,通常也称作闪存。Flash属于EEPROM(电可擦除可编程只读存储器),是一类存取速度很高的存储器。它既有ROM断电可保存数据的特点,又有易于擦写的特点。Flash可以在断电的情况下长期保存信息,因此被广泛的应用在PC机的BIOS和嵌入式系统的存储设备。本章主要内容如下: Flash存储器的硬件结构和存储原理 Linux内核MTD设备支持 Flash编程框架 Flash驱动实例 24.1 Linux Flash驱动结构 Linux内核对Flash存储器有很好的支持。内核设计了一个MTD结构支持Flash设备,用户只需要按照MTD的要求设置Flash设备的参数并且提供驱动就可以让Flash设备很好的工作。本节介绍内核MTD的系统结构。 24.1.1 什么是MTD MTD是英文Memory Technology Device的缩写,中文可以直接译为内存技术设备。MTD是Linux内核为支持闪存设备的一个驱动中间层。对内核其他部分来说,MTD屏蔽了闪存设备的细节;对于闪存设备驱动来说,只需要向MTD中间层提供接口就可以向内核提供闪存设备支持。Linux内核提供了一些与MTD相关的术语,解释如下: JEDEC:J CFI: OOB: ECC: EraseSize: BusWidth: NAND: NOR: 24.1.2 MTD系统结构 Linux内核MTD设备相关代码在drivers/mtd目录下,设计MTD的目的是让新的闪存设备使用更简单。MTD设备可以分层四层。 24.1.2 MTD系统结构 24.2 Flash设备基础 NAND和NOR是两种不同的Flash存储技术,它们各有不同,适合不同的工作范围。编写一个闪存设备的驱动不仅需要了解MTD的结构,还需要知道闪存设备的硬件原理。本机介绍两种不同的闪存工作原理,并且比较它们之间的异同。 24.2.1 存储原理 NAND和NOR闪存都使用三端器件作为存储单元,学过模拟电子技术的读者可能了解一种叫做场效应管的器件,与此原理类似。三端器件分别有源极、漏极和栅极,栅极利用了电场效应控制源极于漏极之间的通断。 24.2.2 性能比较 NOR Flash技术最早是Intel公司研发出来的,紧接着东芝公司研发出了NAND Falsh技术。NOR闪存的特点是支持片内执行(Execute In Place),应用程序不必加载到RAM就可以直接运行,简化了软件开发。NOR闪存的读取速率非常高,但是容量通常不大,因为容量大成本会显著增大。此外,NOR闪存的写入和擦除速度非常慢,不利于大量数据存储。 NAND Flash特点是存储密度高,写入和擦除速度都比NOR Flash快,适合大数据量存储。但是,NAND Flash需要特殊的存储电路控制,并且空的或者已经擦除的单元才能写入数据,所以必须在写入数据之前先擦除块。 24.3 内核MTD层 由于NOR和NAND Flash的物理特性差异,Linux内核设计了MTD层用于管理两种不同类型的Flash设备。MTD层对内核空间其他部分屏蔽了Flash的差异,有几个比较重要的数据结构,在设计闪存驱动的时候需要了解,本节以Linux内核2.6.18版本为例介绍。 24.3.1 mtd_info结构 mtd_info结构是MTD原始设备层的一个重要结构,该结构定义了大量的关于MTD的数据和操作,定义在include/linux/mtd/mtd.h头文件。mtd_info结构成员主要由数据成员和操作函数两部分组成。 24.3.2 mtd_part结构 mtd_part结构描述分区,该结构中的mtd_info结构成员用于描述本分区,加入到mtd_table全局变量中。结构定义在drivers/mtd/mtdpart.c。 27 /* Our partition node structure */ 28 struct mtd_part { 29 struct mtd_info mtd; 30 struct mtd_info *master; 31 u_int32_t offset; 32 int index; 33 struct list_head list; 34 int registered; 35 }; 24.3.3 mtd_partition结构 内核代码drivers/mtd/mtdpart.c文件内定义了添加和删除闪存分区的函数如下: int add_mtd_partitions(struct mtd_info *maste
文档评论(0)