【驱动】Flash设备驱动基础·NOR·NAND-阿里云开发者社区

开发者社区> 科技小能手> 正文

【驱动】Flash设备驱动基础·NOR·NAND

简介:
+关注继续查看

Flash存储器


——》Flash存储器是近几年来发展最快的存储设备,通常也称作闪存。Flash属于EEPROM(电可擦除可编程只读存储器),是一类存取速度很高的存储器。


——》它既有ROM断电可保存数据的特点,又有易于擦写的特点。Flash可以在断电的情况下长期保存信息,因此被广泛的应用在PC机的BIOS和嵌入式系统的存储设备。



Linux Flash驱动结构


——》Linux内核对Flash存储器有很好的支持。内核设计了一个MTD结构支持Flash设备,用户只需要按照MTD的要求设置Flash设备的参数并且提供驱动就可以让Flash设备很好的工作。



MTD概述


——》MTD是英文Memory Technology Device的缩写,中文可以直接译为内存技术设备。


——》MTD是Linux内核为支持闪存设备的一个驱动中间层。


——》对内核其他部分来说,MTD屏蔽了闪存设备的细节;对于闪存设备驱动来说,只需要向MTD中间层提供接口就可以向内核提供闪存设备支持。



MTD系统结构


——》Linux内核MTD设备相关代码在drivers/mtd目录下,设计MTD的目的是让新的闪存设备使用更简单。MTD设备可以分层四层。

104724422.jpg


——》如图所示,内核 MTD从上到下可以分成设备节点、MTD设备层、MTD原始设备层和硬件驱动层在内核中,文件系统和根文件系统都可以建立在 MTD基础上。



设备节点层


——》通过 mknod命令可以在 /dev目录下建立 MTD字符设备节点(主设备号 90)和 MTD块节点(主设备号 31),通过设备节点可以访问 MTD字符设备和块设备。



MTD设备层


——》MTD设备层基于 MTD原始设备,向上一层提供文件操作函数,如 lseek()、open()、close()、read()、write()等。


——》MTD块设备定义了一个描述 MTD块设备的结构 mtdblk_dev,并且申明了一个 mtdblks数据用于存放系统所有注册的 MTD块设备。



MTD原始设备层


——》MTD原始设备层由两部分组成,一部分包括 MTD原始设备的通用代码,另一部分包括特定的 Flash数据,如闪存分区等。MTD原始设备的 mtd_info结构描述定义了有关 MTD的大量数据的操作函数。


——》drivers/mtd/mtd_core.c文件定义了 mtd_table全局变量作为 MTD原始设备列表,drivers/mtd/mtd_part.c定义了 mtd_part全局变量作为 MTD原始设备分区结构,其中包含 mtd_info结构。


——》在内核中每个 MTD分区都被当作一个 MTD原始设备加入到 mtd_table中进行处理。


——》drivers/mtd/maps目录存放的是特定的闪存数据,该目录下每个文件都对应一种类型开发板上的闪存。通过调用内核提供的 add_mtd_device()函数可以建立一个 mtd_info结构并加入到 mtd_table中,通过 del_mtd_device()函数可以从 mtd_table中删除一个闪存设备。



硬件驱动层


——》硬件驱动层负责在系统初始化的时候驱动闪存硬件。


——》Linux内核 MTD技术中,比较难理解的是设备层和原始设备层的关系,如下所示


110001995.jpg


——》一个 MTD原始设备可以通过 mtd_part结构被分成多个 MTD原始设备,然后注册到 mtd_table中。


——》mtd_table列表中,每个 MTD原始设备都可以注册为一个 MTD设备。其中,字符设备的主设备号是 90,次设备号奇数是只读设备,偶数是可读写设备;块设备的主设备号是 31,次设备号为连续的自然数。



Flash设备基础


——》NAND和NOR是两种不同的Flash存储技术,它们各有不同,适合不同的工作范围。编写一个闪存设备的驱动不仅需要了解MTD的结构,还需要知道闪存设备的硬件原理。



存储原理


——》NAND和NOR闪存都使用三端器件作为存储单元,和模拟电子技术里面的一种叫做场效应管的器件原理类似。三端器件分别有源极、漏极和栅极,栅极利用了电场效应控制源极于漏极之间的通断。

112021839.jpg


——》从上可以看出,三端器件的底部是一个硅基,用来存放材料,浮置栅极是由氮化物夹在两层二氧化硅中间构成的,中间的氮化物可以存储电荷,达到存储数据的目的。


——》程序向数据单元写入数据的过程就是向浮置栅极中间注入电荷的过程。


——》从物理角度看,写入数据有热电子注入(Hot Election Injection)和 F-N隧道效应(Fowler Nordheim Tunneling)。这两种技术的区别是,一种通过源极给浮置栅极充电,另一种通过硅基给浮置栅极充电。通常 NOR Flash使用热电子注入方式,而 NAND Flash使用 F-N隧道效应充电。


——》Flash存储器在写入数据前必须把数据擦除,从物理角度看就是把浮置栅极的电荷释放掉。两种Flash都是通过 F-N隧道效应放电。


——》对程序来说,向浮置栅极注入电荷表示写入了二进制数据 0,没有注入电荷表示二进制 1.因此,擦除 Flash数据是写 1,而不是写 0,这点与传统的存储设备不同。


——》NOR和 NAND Flash具有相同的存储单元,工作原理也相同,每次按照一定大小的块读取数据会降低存取时间,NAND Flash只能按照串行读取数据,而 NOR Flash可以按照块读取数据。为了读取数据,必须对存储单元进行编址。NAND Flash把存储单元分成若干块,每个块又可以分成页,每个页是 512字节大小。NOR Flash的地址线是并联方式的,因此 NOR可以使用直接寻址方式存取数据。



性能比较


——》NOR闪存的特点是支持片内执行(Execute In Place),应用程序不必加载到RAM就可以直接运行,简化了软件开发。NOR闪存的读取速率非常高,但是容量通常不大,因为容量大成本会显著增大。此外,NOR闪存的写入和擦除速度非常慢,不利于大量数据存储。


——》NAND Flash特点是存储密度高,写入和擦除速度都比NOR Flash快,适合大数据量存储。但是,NAND Flash需要特殊的存储电路控制,并且空的或者已经擦除的单元才能写入数据,所以必须在写入数据之前先擦除块。



NOR Flash设备驱动框架


——》Linux内核提供了map_info结构描述NOR Flash设备,驱动程序围绕该结构操作,通过内核提供的注册函数把芯片的信息提交给内核,并且提供必要的操作函数。


——》在一个 NOR Flash设备驱动程序中,主要需要考虑到初始化和清除两个部分。


——》Linux内核 NOR Flash驱动程序与 MTD层的关系


113509381.jpg


——》典型的 NOR Flash驱动模型


113647949.jpg



NAND Flash设备驱动框架


——》NAND Flash设备使用nand_chip结构描述。该结构与 MTD层的关系如图所示。


113857518.jpg


——》在 MTD层的映射下,编写 Linux系统 NAND Flash设备驱动工作量相对较小,主要集中在向内核提供必要的设备硬件信息。


——》注意:内核提供了 ECC校验算法,如果硬件没有提供 ECC,则 nand_chip结构中的 calculate_ecc成员函数不需要设置。


本文转自infohacker 51CTO博客,原文链接:http://blog.51cto.com/liucw/1229779



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Linux字符设备驱动
<h1>1、预备知识:</h1> <p><strong>应用程序、库、内核、驱动程序的关系</strong></p> <p><span style="white-space:pre"></span>应用程序调用应用程序函数库完成功能<br><span style="white-space:pre"></span>应用程序以文件形式访问各种资源<br><span style="white
1404 0
VxWorks6.6 pcPentium BSP 使用说明(三):设备驱动
<div style=""><span id="goog" class="goog-gtc-unit" style="padding-bottom:0px; margin:0px; padding-left:0px; padding-right:0px; padding-top:0px"><span dir="ltr" class="goog-gtc-translatable goog-g
2847 0
用拖拉实现设备驱动配置(EsayHMI最新驱动配置方式)
以前的IOServer 是用VB6开发,驱动的配置方式和一般的组态软件没有什么很大的区别,配置起来比较麻烦,对一般的生手来说,要费一番功夫才能配置完毕。
563 0
Flask基础知识点1
一、.基于装饰器的session访问控制,endpoint路由参数可以解决视图函数重名的情况。 下面我有一个简单的需求,就是一个网站有三个页面,分别是home、index和login界面,用户只有当登陆后才可以正常访问home和index页面,通过装饰器的方法来实现。
1025 0
JDBC驱动下载汇总
在使用JDBC连接数据库的时候,一般都要求有相应数据库的JDBC驱动程序,这些数据库的JDBC驱动程序一般都是数据库厂商开发的,但是有些,例如MS之类的很久都,没有为它的SQL Server开发相应的JDBC驱程,所以要使用第三方公司开发的驱动程序(不过现在微软已经为SQL Server开发了JDBC驱动程序),为了使得大家方便学习,这里给出一些主要的数据库相应的JDBC驱动下载地址和相应的操作方法,希望能够对大家有所帮助。
1442 0
LDD3学习笔记(1):设备驱动简介
 1、几乎每个系统操作都被映射到具体的物理设备上,而任何设备的控制操作都由特定于要寻址的相关代码来进行,这些代码成为设备驱动。 2、linux可以在运行时扩展由内核提供的特性,既可以在系统运行时增加内核的功能(也可以删除)。
805 0
23706
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载