【驱动】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设备可以分层四层。
——》如图所示,内核 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技术中,比较难理解的是设备层和原始设备层的关系,如下所示
——》一个 MTD原始设备可以通过 mtd_part结构被分成多个 MTD原始设备,然后注册到 mtd_table中。
——》mtd_table列表中,每个 MTD原始设备都可以注册为一个 MTD设备。其中,字符设备的主设备号是 90,次设备号奇数是只读设备,偶数是可读写设备;块设备的主设备号是 31,次设备号为连续的自然数。
Flash设备基础
——》NAND和NOR是两种不同的Flash存储技术,它们各有不同,适合不同的工作范围。编写一个闪存设备的驱动不仅需要了解MTD的结构,还需要知道闪存设备的硬件原理。
存储原理
——》NAND和NOR闪存都使用三端器件作为存储单元,和模拟电子技术里面的一种叫做场效应管的器件原理类似。三端器件分别有源极、漏极和栅极,栅极利用了电场效应控制源极于漏极之间的通断。
——》从上可以看出,三端器件的底部是一个硅基,用来存放材料,浮置栅极是由氮化物夹在两层二氧化硅中间构成的,中间的氮化物可以存储电荷,达到存储数据的目的。
——》程序向数据单元写入数据的过程就是向浮置栅极中间注入电荷的过程。
——》从物理角度看,写入数据有热电子注入(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层的关系
——》典型的 NOR Flash驱动模型
NAND Flash设备驱动框架
——》NAND Flash设备使用nand_chip结构描述。该结构与 MTD层的关系如图所示。
——》在 MTD层的映射下,编写 Linux系统 NAND Flash设备驱动工作量相对较小,主要集中在向内核提供必要的设备硬件信息。
——》注意:内核提供了 ECC校验算法,如果硬件没有提供 ECC,则 nand_chip结构中的 calculate_ecc成员函数不需要设置。
本文出自 “成鹏致远” 博客,请务必保留此出处http://infohacker.blog.51cto.com/6751239/1229779
【驱动】Flash设备驱动基础·NOR·NAND的更多相关文章
- 字符设备驱动、平台设备驱动、设备驱动模型、sysfs的比较和关联
转载自:http://www.kancloud.cn/yueqian_scut/emlinux/106829 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动.设备驱动模型和sy ...
- [kernel]字符设备驱动、平台设备驱动、设备驱动模型、sysfs几者之间的比较和关联
转自:http://www.2cto.com/kf/201510/444943.html Linux驱动开发经验总结,绝对干货! 学习Linux设备驱动开发的过程中自然会遇到字符设备驱动.平台设备驱动 ...
- spi驱动框架全面分析,从master驱动到设备驱动
内核版本:linux2.6.32.2 硬件资源:s3c2440 参考: 韦东山SPI视频教程 内容概括: 1.I2C 驱动框架回顾 2.SPI 框架简单介绍 3.maste ...
- LinuxI2C核心、总线驱动与设备驱动
I2C体系结构分为三个部分:I2C核心.总线驱动.设备驱动 I2C核心: I2C核心提供了一组不依赖硬件的接口函数,I2C总线驱动和设备驱动之间依赖于I2C核心作为纽带 (1)增加/删除i2c_ada ...
- 【驱动】linux设备驱动·字符设备驱动开发
Preface 前面对linux设备驱动的相应知识点进行了总结,现在进入实践阶段! <linux设备驱动入门篇>:http://infohacker.blog.51cto.com/6751 ...
- Linux字符设备驱动--Led设备驱动
①驱动源码 #include <linux/module.h> #include <linux/init.h> #include <linux/cdev.h> #i ...
- 《Linux设备驱动开发具体解释(第3版)》进展同步更新
本博实时更新<Linux设备驱动开发具体解释(第3版)>的最新进展. 2015.2.26 差点儿完毕初稿. 本书已经rebase到开发中的Linux 4.0内核,案例多数基于多核CORTE ...
- linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-112879.html linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxx ...
- 乾坤合一~Linux设备驱动之USB主机和设备驱动
如果不能陪你到最后 是否后悔当初我们牵手 如果当初没能遇见你 现在的我 在哪里逗留 所有的爱都是冒险 那就心甘情愿 等待我们一生中 所有悬念 我一往情深的恋人 她是我的爱人 她给我的爱就像是 带着露水 ...
随机推荐
- Easyui入门视频教程 第07集---Accordion的使用
Accordion 是一个 收缩的组件 类似挂历的 百度了一下 意思是 accordion 英[əˈkɔ:diən] 美[əˈkɔrdiən] n. 手风琴 adj. 可折叠的 他就是 一个折叠的 很 ...
- (原)torch7中指定可见的GPU
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/7418694.html 参考网址: https://gitter.im/torch/torch7/arc ...
- kafka负载均衡相关资料收集(二)
[转]关于kafka producer 分区策略的思考 from:http://blog.csdn.net/ouyang111222/article/details/51086037 今天跑了一个简单 ...
- maven最全教程
Maven 教程 1.Maven概述 Maven 是什么? Maven 是一个项目管理和整合工具.Maven 为开发者提供了一套完整的构建生命周期框架.开发团队几乎不用花多少时间就能够自动完成工程的基 ...
- iOS-获取当前View所在的控制器
用一个分类,具体: .h #import <UIKit/UIKit.h> @interface UIView (CurrentController) /** 获取当前View的控制器对象 ...
- Oracle2MySQL注意事项
在Oracle切换成MySQL时,会碰到如下注意事项: Oracle中的sysdate在MySQL中是不支持的: Oracle中的分布方案在MySQL中的实现: Oracle中的SQL语句是大小写不敏 ...
- 下载远程(第三方服务器)文件、图片,保存到本地(服务器)的方法、保存抓取远程文件、图片 将图片的二进制字节字符串在HTML页面以图片形式输出 asp.net 文件 操作方法
下载远程(第三方服务器)文件.图片,保存到本地(服务器)的方法.保存抓取远程文件.图片 将一台服务器的文件.图片,保存(下载)到另外一台服务器进行保存的方法: 1 #region 图片下载 2 3 ...
- Mac OS下Android Studio的Java not found问题,androidfound
Android Studio正式版已经发布一段时间了,使用Mac版的Android Studio可能与遇到Java not found:Android Studio was unable to fin ...
- sqlserver不太常见的,可能常见但又疑问的tsql语句
2013年10月29日16:01:58 当数据有 time类型列时候,比如 打电话的通话时长,我们查询时候不方便,我们可以添加一个冗余列,直接统计秒 ,但是 后期知道的,现在我把例如 00:12:23 ...
- session的取代者:Json Web Tokens----在客户端存储登陆状态
https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/