《Flash设备驱动》PPT课件.ppt

上传人:za****8 文档编号:2965126 上传时间:2019-12-05 格式:PPT 页数:30 大小:339.01KB
返回 下载 相关 举报
《Flash设备驱动》PPT课件.ppt_第1页
第1页 / 共30页
《Flash设备驱动》PPT课件.ppt_第2页
第2页 / 共30页
《Flash设备驱动》PPT课件.ppt_第3页
第3页 / 共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 *master, const struct mtd_partition *parts, int nbparts); int del_mtd_partitions(struct mtd_info *master);,24.3.4 map_info结构,NOR Flash驱动使用map_info结构作为核心数据结构。该结构定义了NOR Flash的基址、位宽、大小等信息以及闪存的操作函数。,24.3.5 nand_chip结构,NAND闪存使用nand_chip结构描述存储设备信息,该结构定义在include/linux/mtd/nand.h头文件:,24.4 Flash设备框架,由于NOR Flash和NAND Flash设备的差异,内核对这两种类型的Flash设备设计了不同的驱动和管理方式。NOR Flash的操作相对要简单一些,NAND Flash不仅需要提供读写函数,还需要提供ECC校验函数和坏块管理函数。,24.4.1 NOR Flash设备驱动框架,Linux内核提供了map_info结构描述NOR Flash设备,驱动程序围绕该结构操作,通过内核提供的注册函数把芯片的信息提交给内核,并且提供必要的操作函数。,24.4.2 NAND Flash设备驱动框架,NAND Flash设备使用nand_chip结构描述。,24.5 Flash设备驱动实例NOR Flash设备驱动剖析,在介绍了Linux内核对MTD的支持以后,本节给出两个Flash设备驱动实例,并且分析驱动的工作原理。由于Flash设备具有硬件平台无关的特点,本节介绍的两种Flash设备驱动适应于不同的硬件平台。 NOR Flash设备驱动一般来说比较简单,主要因为NOR Flash硬件的操作比较简单,可以像操作内存一样使用,因此驱动程序无需提供太多功能。本节以内核2.6.18版本代码drivers/mtd/maps/sharpsl-flash.c文件为例分析NOR Flash驱动程序。,24.5.1 数据结构,该驱动程序是SHARP某种设备驱动,程序比较简单。首先在39行定义了一个mtd_info结构用于描述NOR设备: 39 struct map_info sharpsl_map = 40 .name = “sharpsl-flash“, 41 .size = WINDOW_SIZE, 42 .bankwidth = BANK_WIDTH, 43 .phys = WINDOW_ADDR 44 ;,24.5.2 驱动初始化,通过查找模块初始化和清除宏能得到该驱动的初始化函数为init_sharpsl()以及清除函数cleanup_sharpsl()。,24.5.3 驱动卸载,驱动卸载调用了cleanup_sharpsl()函数,主要是释放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 Flash设备驱动实例NAND Flash设备驱动分析,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 NAND控制器介绍,S3C2440芯片内部集成了NAND Flash控制器,在芯片手册Figure 6-1给出了一个NAND Flash控制器的功能框图。,24.6.2 数据结构,S3C2410、S3C2412和S3C2440这三个处理器在NAND控制器部分存在一些差异。为了在三款处理器上都可以驱动同样的NAND Flash闪存,在drivers/mtd/nand/s3c2410.c文件中定义了s3c2410_nand_mtd结构和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 *info; / s3c2440状态信息,私有数据 97 int scan_res; 98 ;,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( 803 ,24.6.4 驱动卸载,驱动卸载时调用s3c2410_nand_remove()函数,主要是释放驱动占用的资源。,24.6.5 初始化NAND控制器,s3c2410_nand_inithw()函数负责初始化NAND控制器。,24.6.6 设置芯片操作,s3c2410_nand_init_chip()函数初始化nand_chip结构,并且设置相关的操作,函数操作流程如下: (1)程序508514行设置通用的读写缓冲函数、查找芯片函数等。 (2)然后在函数516行使用switch语句根据不同平台设置NAND控制器的配置。 (3)设置完毕后,在548551行设置mtd_info结构和nand_chip结构之间的相互指向关系。 (4)最后,程序553576行设置ECC相关操作。,24.6.7 电源管理,S3C2440平台上NAND闪存的电源管理包括s3c24xx_nand_suspend()函数和s3c24xx_nand_resume()函数。,24.7 小结,本章讲解了Flash存储器相关的硬件知识和Linux对Flash设备的支持,包括Flash的硬件结构、工作原理以及MTD的系统结构。本章给出了两种类型Flash设备的驱动程序框架,并且给出实际驱动实例。理解硬件驱动开发的关键是了解硬件工作原理,读者在理解Flash硬件工作原理后理解Flash设备驱动会更容易。第25章讲解USB设备驱动。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!