版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第2424章章 FlashFlash设备驱动设备驱动Flash存储器是近几年来发展最快的存储设备,通常也存储器是近几年来发展最快的存储设备,通常也称作闪存。称作闪存。Flash属于属于EEPROM(电可擦除可编程只读存储(电可擦除可编程只读存储器),是一类存取速度很高的存储器。它既有器),是一类存取速度很高的存储器。它既有ROM断电可断电可保存数据的特点,又有易于擦写的特点。保存数据的特点,又有易于擦写的特点。Flash可以在断电可以在断电的情况下长期保存信息,因此被广泛的应用在的情况下长期保存信息,因此被广泛的应用在PC机的机的BIOS和嵌入式系统的存储设备。本章主要内容如下:和嵌入式系统
2、的存储设备。本章主要内容如下:Flash存储器的硬件结构和存储原理存储器的硬件结构和存储原理Linux内核内核MTD设备支持设备支持Flash编程框架编程框架Flash驱动实例驱动实例24.1 Linux Flash24.1 Linux Flash驱动结构驱动结构Linux内核对内核对Flash存储器有很好的支持。内核设计了一存储器有很好的支持。内核设计了一个个MTD结构支持结构支持Flash设备,用户只需要按照设备,用户只需要按照MTD的要求设的要求设置置Flash设备的参数并且提供驱动就可以让设备的参数并且提供驱动就可以让Flash设备很好的设备很好的工作。本节介绍内核工作。本节介绍内核M
3、TD的系统结构。的系统结构。24.1.1 24.1.1 什么是什么是MTDMTDMTD是英文是英文Memory Technology Device的缩写,中文可的缩写,中文可以直接译为内存技术设备。以直接译为内存技术设备。MTD是是Linux内核为支持闪存设内核为支持闪存设备的一个驱动中间层。对内核其他部分来说,备的一个驱动中间层。对内核其他部分来说,MTD屏蔽了闪屏蔽了闪存设备的细节;对于闪存设备驱动来说,只需要向存设备的细节;对于闪存设备驱动来说,只需要向MTD中间中间层提供接口就可以向内核提供闪存设备支持。层提供接口就可以向内核提供闪存设备支持。Linux内核提内核提供了一些与供了一些与
4、MTD相关的术语,解释如下:相关的术语,解释如下:JEDEC:JCFI: OOB: ECC: EraseSize:BusWidth:NAND: NOR: 24.1.2 MTD24.1.2 MTD系统结构系统结构Linux内核内核MTD设备相关代码在设备相关代码在drivers/mtd目录下,设目录下,设计计MTD的目的是让新的闪存设备使用更简单。的目的是让新的闪存设备使用更简单。MTD设备可设备可以分层四层。以分层四层。24.1.2 MTD24.1.2 MTD系统结构系统结构24.2 Flash24.2 Flash设备基础设备基础NAND和和NOR是两种不同的是两种不同的Flash存储技术,它
5、们各有存储技术,它们各有不同,适合不同的工作范围。编写一个闪存设备的驱动不仅不同,适合不同的工作范围。编写一个闪存设备的驱动不仅需要了解需要了解MTD的结构,还需要知道闪存设备的硬件原理。的结构,还需要知道闪存设备的硬件原理。本机介绍两种不同的闪存工作原理,并且比较它们之间的异本机介绍两种不同的闪存工作原理,并且比较它们之间的异同。同。24.2.1 24.2.1 存储原理存储原理NAND和和NOR闪存都使用三端器件作为存储单元,学闪存都使用三端器件作为存储单元,学过模拟电子技术的读者可能了解一种叫做场效应管的器件,过模拟电子技术的读者可能了解一种叫做场效应管的器件,与此原理类似。三端器件分别有
6、源极、漏极和栅极,栅极利与此原理类似。三端器件分别有源极、漏极和栅极,栅极利用了电场效应控制源极于漏极之间的通断。用了电场效应控制源极于漏极之间的通断。24.2.2 24.2.2 性能比较性能比较NOR Flash技术最早是技术最早是Intel公司研发出来的,紧接着东公司研发出来的,紧接着东芝公司研发出了芝公司研发出了NAND Falsh技术。技术。NOR闪存的特点是支持闪存的特点是支持片内执行(片内执行(Execute In Place),应用程序不必加载到),应用程序不必加载到RAM就可以直接运行,简化了软件开发。就可以直接运行,简化了软件开发。NOR闪存的读取速率闪存的读取速率非常高,但
7、是容量通常不大,因为容量大成本会显著增大。非常高,但是容量通常不大,因为容量大成本会显著增大。此外,此外,NOR闪存的写入和擦除速度非常慢,不利于大量数闪存的写入和擦除速度非常慢,不利于大量数据存储。据存储。NAND Flash特点是存储密度高,写入和擦除速度都比特点是存储密度高,写入和擦除速度都比NOR Flash快,适合大数据量存储。但是,快,适合大数据量存储。但是,NAND Flash需需要特殊的存储电路控制,并且空的或者已经擦除的单元才能要特殊的存储电路控制,并且空的或者已经擦除的单元才能写入数据,所以必须在写入数据之前先擦除块。写入数据,所以必须在写入数据之前先擦除块。24.3 24
8、.3 内核内核MTDMTD层层由于由于NOR和和NAND Flash的物理特性差异,的物理特性差异,Linux内核内核设计了设计了MTD层用于管理两种不同类型的层用于管理两种不同类型的Flash设备。设备。MTD层层对内核空间其他部分屏蔽了对内核空间其他部分屏蔽了Flash的差异,有几个比较重要的差异,有几个比较重要的数据结构,在设计闪存驱动的时候需要了解,本节以的数据结构,在设计闪存驱动的时候需要了解,本节以Linux内核内核2.6.18版本为例介绍。版本为例介绍。24.3.1 mtd_info24.3.1 mtd_info结构结构mtd_info结构是结构是MTD原始设备层的一个重要结构,
9、该原始设备层的一个重要结构,该结构定义了大量的关于结构定义了大量的关于MTD的数据和操作,定义在的数据和操作,定义在include/linux/mtd/mtd.h头文件。头文件。mtd_info结构成员主要由结构成员主要由数据成员和操作函数两部分组成。数据成员和操作函数两部分组成。24.3.2 mtd_part24.3.2 mtd_part结构结构mtd_part结构描述分区,该结构中的结构描述分区,该结构中的mtd_info结构成员结构成员用于描述本分区,加入到用于描述本分区,加入到mtd_table全局变量中。结构定义全局变量中。结构定义在在drivers/mtd/mtdpart.c。 2
10、7 /* 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_partition24.3.3 mtd_partition结构结构内核代码内核代码drivers/mtd/mtdpart.c文件内定义了添加和删文件内定义了添加和删除闪存分区的函数如下:除闪存分
11、区的函数如下:int add_mtd_partitions(struct mtd_info *master, const struct mtd_partition *parts, int nbparts);int del_mtd_partitions(struct mtd_info *master);24.3.4 map_info24.3.4 map_info结构结构NOR Flash驱动使用驱动使用map_info结构作为核心数据结构。结构作为核心数据结构。该结构定义了该结构定义了NOR Flash的基址、位宽、大小等信息以及闪的基址、位宽、大小等信息以及闪存的操作函数。存的操作函数。24.
12、3.5 nand_chip24.3.5 nand_chip结构结构NAND闪存使用闪存使用nand_chip结构描述存储设备信息,该结构描述存储设备信息,该结构定义在结构定义在include/linux/mtd/nand.h头文件:头文件: 24.4 Flash24.4 Flash设备框架设备框架由于由于NOR Flash和和NAND Flash设备的差异,内核对这设备的差异,内核对这两种类型的两种类型的Flash设备设计了不同的驱动和管理方式。设备设计了不同的驱动和管理方式。NOR Flash的操作相对要简单一些,的操作相对要简单一些,NAND Flash不仅需要提供读不仅需要提供读写函数,
13、还需要提供写函数,还需要提供ECC校验函数和坏块管理函数。校验函数和坏块管理函数。24.4.1 NOR Flash24.4.1 NOR Flash设备驱动框架设备驱动框架Linux内核提供了内核提供了map_info结构描述结构描述NOR Flash设备,设备,驱动程序围绕该结构操作,通过内核提供的注册函数把芯片驱动程序围绕该结构操作,通过内核提供的注册函数把芯片的信息提交给内核,并且提供必要的操作函数。的信息提交给内核,并且提供必要的操作函数。24.4.2 NAND Flash24.4.2 NAND Flash设备驱动框架设备驱动框架NAND Flash设备使用设备使用nand_chip结构
14、描述。结构描述。24.5 Flash24.5 Flash设备驱动实例设备驱动实例NOR FlashNOR Flash设备设备驱动剖析驱动剖析在介绍了在介绍了Linux内核对内核对MTD的支持以后,本节给出两个的支持以后,本节给出两个Flash设备驱动实例,并且分析驱动的工作原理。由于设备驱动实例,并且分析驱动的工作原理。由于Flash设备具有硬件平台无关的特点,本节介绍的两种设备具有硬件平台无关的特点,本节介绍的两种Flash设备设备驱动适应于不同的硬件平台。驱动适应于不同的硬件平台。NOR Flash设备驱动一般来说比较简单,主要因为设备驱动一般来说比较简单,主要因为NOR Flash硬件的
15、操作比较简单,可以像操作内存一样使用硬件的操作比较简单,可以像操作内存一样使用,因此驱动程序无需提供太多功能。本节以内核,因此驱动程序无需提供太多功能。本节以内核2.6.18版本版本代码代码drivers/mtd/maps/sharpsl-flash.c文件为例分析文件为例分析NOR Flash驱动程序。驱动程序。24.5.1 24.5.1 数据结构数据结构该驱动程序是该驱动程序是SHARP某种设备驱动,程序比较简单。某种设备驱动,程序比较简单。首先在首先在39行定义了一个行定义了一个mtd_info结构用于描述结构用于描述NOR设备:设备: 39 struct map_info sharps
16、l_map = 40 .name = sharpsl-flash, 41 .size = WINDOW_SIZE, 42 .bankwidth = BANK_WIDTH, 43 .phys = WINDOW_ADDR 44 ;24.5.2 24.5.2 驱动初始化驱动初始化通过查找模块初始化和清除宏能得到该驱动的初始化通过查找模块初始化和清除宏能得到该驱动的初始化函数为函数为init_sharpsl()以及清除函数以及清除函数cleanup_sharpsl()。24.5.3 24.5.3 驱动卸载驱动卸载驱动卸载调用了驱动卸载调用了cleanup_sharpsl()函数,主要是释放函数,主要是
17、释放NOR驱动占用的资源,函数定义如下:驱动占用的资源,函数定义如下: 101 static void _exit cleanup_sharpsl(void) 102 103 if (mymtd) 104 del_mtd_partitions(mymtd); 105 map_destroy(mymtd); 106 107 if (sharpsl_map.virt) 108 iounmap(sharpsl_map.virt); 109 sharpsl_map.virt = 0; 110 111 24.6 Flash24.6 Flash设备驱动实例设备驱动实例NAND FlashNAND Flas
18、h设设备驱动分析备驱动分析NAND Flash由于需要控制器才能操作,驱动程序相对由于需要控制器才能操作,驱动程序相对复杂。在复杂。在NAND Flash驱动程序中,主要工作是配置驱动程序中,主要工作是配置NAND控制器。内核控制器。内核2.6.18版本代码版本代码drivers/mtd/nand/s3c2410.c文文件包含了件包含了S3C2410、S3C2412和和S3C2440平台上平台上NAND Flash驱动。本节重点分析驱动。本节重点分析S3C2440平台上平台上NAND Flash驱动程序驱动程序。24.6.1 S3C2440 NAND24.6.1 S3C2440 NAND控制器
19、介绍控制器介绍S3C2440芯片内部集成了芯片内部集成了NAND Flash控制器,在芯片控制器,在芯片手册手册Figure 6-1给出了一个给出了一个NAND Flash控制器的功能框图。控制器的功能框图。24.6.2 24.6.2 数据结构数据结构S3C2410、S3C2412和和S3C2440这三个处理器在这三个处理器在NAND控制器部分存在一些差异。为了在三款处理器上都可以驱动控制器部分存在一些差异。为了在三款处理器上都可以驱动同样的同样的NAND Flash闪存,在闪存,在drivers/mtd/nand/s3c2410.c文文件中定义了件中定义了s3c2410_nand_mtd结构
20、和结构和s3c2410_nand_info结结构存放相关信息。构存放相关信息。s3c2410_nand_mtd结构定义如下:结构定义如下: 92 struct s3c2410_nand_mtd 93 struct mtd_info mtd;/ 内核内核mtd_info结构结构 94 struct nand_chip chip;/ 内核内核nand_chip结构结构 95 struct s3c2410_nand_set *set;/ 封装后的封装后的mtd_partition结构,加入结构,加入了了s3c2440的一些属性的一些属性 96 struct s3c2410_nand_info *in
21、fo; / s3c2440状态信息,私有数据状态信息,私有数据 97 int scan_res; 98 ;24.6.3 24.6.3 驱动初始化驱动初始化驱动初始化调用驱动初始化调用s3c2410_nand_init()函数,定义如下:函数,定义如下: 796 static int _init s3c2410_nand_init(void) 797 798 printk(S3C24XX NAND Driver, (c) 2004 Simtec Electronicsn); 799 800 platform_driver_register(&s3c2412_nand_driver); 8
22、01 platform_driver_register(&s3c2440_nand_driver); / 注册注册S3C2440平台驱动数据结构平台驱动数据结构 802 return platform_driver_register(&s3c2410_nand_driver); 803 24.6.4 24.6.4 驱动卸载驱动卸载驱动卸载时调用驱动卸载时调用s3c2410_nand_remove()函数,主要是函数,主要是释放驱动占用的资源。释放驱动占用的资源。24.6.5 24.6.5 初始化初始化NANDNAND控制器控制器s3c2410_nand_inithw()函数负责初始化函数负责初始化NAND控制器。控制器。24.6.6 24.6.6 设置芯片操作设置芯片操作s3c2410
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年春学期高二物理鲁科版(2019)第11周周末小测卷
- 医院医疗器械验收管理制度
- 园林养护公司绩效管理办法
- 公关服务公司安全检查管理制度
- 2026电信管家面试题及答案
- 工业机器人维护保养合同2026年设备租赁行业
- 排水设计说明书
- 教师招聘(中学)考试真题带答案下载
- 流水线扫码追溯与记录工作手册
- 山地矿山生态修复与复绿管理手册
- 2026年深圳入学租赁合同(1篇)
- 2026年餐饮从业人员食品安全知识培训测试题及答案
- 2026国家国防科技工业局安全工程技术与合作交流中心招聘笔试参考题库及答案详解
- 2026年高考上海卷语文试卷题库及答案(新课标卷)
- GB/T 6544-2026瓦楞纸板
- 2026山东济南市劳服中心劳务派遣人员招聘备考题库及答案详解(全优)
- 2026新疆能源(集团)有限责任公司财务系统人员招聘6人笔试历年参考题库附带答案详解
- 2026年聚氨酯工业行业分析报告及未来发展趋势报告
- 项目管理任务分解WBS工作坊模板
- 血液净化中心质量控制分析报告
- 2025长沙中考历史模拟试卷
评论
0/150
提交评论