logo资料库

Flash闪存设备接口设计和驱动开发.doc

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
Flash 闪存设备接口设计和驱动开发 赵军伟 1,李宏穆 1,庄阿龙 1,何剑锋 2 (1.成都理工大学,四川成都 610059 2. 东华理工大学软件学院 江西南昌 330013) 摘 要: 随着嵌入式系统的迅速发展,其应用环境的广泛性,复杂性对构建于系统上的 Nor 和 Nand 闪存设备提出更高要求, 需要闪存设备传输速度更快,体积更小,容量更大,稳定性更好。该文在基于 SAMSUNG 公司的 S3C2410 处理器平台上, 针对 Flash 闪存设备在嵌入式系统中的应用,详细分析 Flash 闪存设备的接口设计方法,并针对 Flash 接口特点,提出 Linux 环境下 NorFlash 和 NandFlash 的驱动开发流程,给出详细的代码分析。该流程开发的驱动程序,代码所占空间小,执行效 率高,在 ARM 开发板上实验达到较好效果。 关键词: Nor 闪存;Nand 闪存;接口设计;驱动开发 中图分类号: TP311.11;TP333 文献标识码:A The interface design and driver development of nandfalsh and norflash ZHAO Jun-wei1 ,LI Hong-mu1,ZHUANG A-long1,He Jian-feng2 1. Chengdu University of Techology,Chengdu,Sichuan 610059,China 2. College of Software , East China University of Technology , Nanchang ,Jiangxi 330013,China Abstract:With the rapid development of embedded system,the breadth and complexity of its applications have put forward higher requirements about Nor and Nand Flash memory devices whice are built on the system. Flash memory devices have been needed to speed faster ,size smaller,the capacity is bigger and better stability. In this page,based on the platform of SAMSUNG’s S3C2410 processors,a detailed analysis of Flash interface is made.For these interface features,put forward the driver development process of NorFlash and NandFlash,and gives a detailed analysis of the code. The driver of the development process, share small code space, high-performance, the experiments to the development on-board of ARM have achieved better results. Keywords:NorFlash;NandFlash;interface design;driver development 1 引言 随着存储技术的高速发展,闪存设备因其在性能和成本方面的优势,如非易失性,可擦除性以及更低廉 的价格正逐步取代传统记忆体。目前常用闪存是 Nor Flash 和 Nand Flash。它们的技术性能差异显著,表 1 是它们的技术对比。 表 1 NorFlash NandFlash 技术对比 总线配置 读取方式 编程擦除模式 存储可靠性 闪存 Nor Flash 硬件接口 有 SRAM 接 口,有足够的 程序、数据存放 在同一芯片上, 地址引脚进行 有 独 立 的 数 据 寻址,能存取 总线、地址总线 Nand Flash 每一个字节 I/O 接口复杂, 八个引脚传输 控制、地址、 数据信息 以 字 或 字 节 编 芯片存储位 程,以块擦除, 错误率相对低 快速随机读取, 系统从 Flash 读 取 程 序 执 行 不 用 将 代 码 下 载 到 RAM 执行 串行读取,随机 编 程 前 要 先 对 块 或 整 片 进 行 预编程和擦除 以 页 单 位 读 写 数据、地址采用 同一总线 读取速度慢 操作,以块单位 擦除,编程擦除 错 误 率 高 , 需 ECC 校验,含冗 余块,存储块错 速度快 误时替换 NorFlash 使用方便,易于连接,可以在芯片上直接运行代码,稳定性出色,传输速率高,在小容量时 有很高的性价比,这使其很适合应于嵌入式系统中作为 FlashRom。相对于 Nor Flash ,Nand Flash 强调更 高的性能,更低的成本,更小的体积,更长的使用寿命, 这使 Nand Flash 很擅于存储纯资料或数据等,
在嵌入式系统中用来支持文件系统,在本 S3C2410 平台上用以支持 bon 文件系统。 然而 Flash 闪存却是保证数据正确性不太理想的设备,应用中可能出现坏块,这就给其在嵌入式系统 中的应用,如何更好的进行数据存储管理提出了更高要求。恰当的接口设计和驱动开发是解决问题的关键, 本文基于 S3C2410,详细分析 Flash 接口设计和驱动开发流程[1]。 2 Flash 接口设计 2.1 处理器内存分配情况 在分析 Flash 的接口以及工作模式前,先分析处理器的内存分配情况,内核 ARM920T 是 32 位处理器, 寻址空间 4G 字节,3G 被处理器内部的寄存器和一些其他设备占用,只有 1G 用于外部寻址,这 1G 的空 间 S3C2410 分为八个部分以支持不同的设备,每个空间是 128M,这每个空间被命名为 BANK。S3C2410 给每个 BANK 一个片选即 nGCS0~nGCS7 来方便对 BANK 的操作,将 CPU 上相应的 BANK 连线接到外 设芯片的片选引脚上就可以根据相应的地址对存储器进行控制[2]。 2.2 Flash 在系统中的架构 Flash 模块通过系统总线与处理器相连,如图 1 所示。 图 1 Flash 在 S3C2410 中的架构 为了拥有高速的数据交换通道,Flash 经由控制器模块通过 AHB 总线与处理器通信。Nand Flash 控制 器、NorFlash 控制器和 DMA 控制器都是高速总线 AHB 上的 master 模块,都包含符合 AMBA 标准的总线 接口模块与 AHB 交互工作。Flash 工作时,Flash 控制器模块和 DMA 控制器模块相互协作,完成各种操作。 2.3 NorFlash 的接口设计 系统用的 NorFlash 芯片是 ATMEL 公司开发的 AT49BV1614A,存储空间为 16M 字节,在系统中常用 于存放代码,系统上电或复位后获得指令开始执行,因此,应将其配置到 Bank0,将 AT49BV1614A 的片 选端 nCE 接至 S3C2410 的 nGCS0;AT49BV1614A 的输出使能端 nOE 接 S3C2410 的 nOE;写使能端 nWE 接 S3C2410 的 nWBE0;将模式选择 nBYTE 上拉,使 AT49BV1614A 工作在 16 位数据模式。AT49BV1614A 地址总线 A[19~0]和 S3C2410 的地址总线 ADDR[20~1]相连,16 位数据总线 DQ[15~0]和 S3C2410 的低 16 位数据总线 DATA[15~0]相连[3]。 2.4 NorFlash 在系统中的具体操作 以 AT49BV1614A 芯片时序图为例,来具体说明 NorFlash 的写操作,如图 2 所示。
图 2 写操作时序图 HCLK 是时钟。 ADRR 地址总线,输出存储器的地址。DATA 数据总线,总线宽度可编程为 16/32 位。 nGCSx 芯片选择,当存储器地址在相应段的地址区域时被激活。nWE 是写使能控制端,控制 I/O 口的指令 写入。nWait 请求延长当前的总线周期,低电平有效。Tacc 是存取周期,存储周期和段尺寸可编程。 第一个时钟周期开始,系统总线给出要访问的存储空间地址,同时片选为低电平,开始工作,激活当 前地址总线上的地址信息,nWE 为低电平写使能,处理器给出当前操作为写操作,在 Tacc 时间内将 DATA 数据写入到指定地址的区域内,同时检查 nWait 若为低电平则延长本次总线操作。nWE 上升沿锁存数据。 这样一个总线写操作基本完成。 2.5 NandFlash 接口设计 S3C2410 系统上的 NandFalsh 以 SMC 卡形式设计,处理器有专门的 NandFlash 接口,可以很方便地和 NandFlash 设备对接。NandFlash 存储器使用复杂的 I/O 口来串行存取数据,8 个引脚用来实现地址和数据 总线的复用,CLE 信号指定指令周期,ALE 信号指定地址周期,用这两个信号就可以选择指令、数据或地 址周期。把 ALE 引脚连接到处理器第五地址位,把 CLE 引脚连接到处理器第四地址位,就能通过改变处 理器输出地址来选择指令、地址或数据。 2.6 NandFlash 在系统中的具体操作 以 K9F1208U0M 芯片时序图为例,来具体说明 NandFlash 的读操作,如图 3 所示[4]。 图 3 读操作时序图 CLE 信号有效时系统通过 IO 口向命令寄存器发送命令 00H,此时 WE 为低电平,写操作有效,Nand Flash 处 于写状态。发送命令后,接着发送要读的地址,该操作将占用 WE 的 1、2、3、4, 4 个周期,发送地址信息时, CLE 为低电平,ALE 为高电平。地址信息发送完毕后,不能立刻读取数据,因为此时芯片正处于 BUSY(忙)状 态,需要等待 2~20ms,之后,才能开始数据读取。此时 WE 为高电平,处于无效状态,CE 片选信号也始终为低 以表明选中该芯片。
3 Flash 驱动程序开发 3.1 Linux 系统下的驱动程序 Linux 系统将所有的设备都看作具体的文件,通过文件系统对设备进行管理。所以在 Linux 架构中, 和设备相关的处理分成两层:文件系统层和设备驱动层。设备驱动层用来屏蔽具体设备的细节,文件系统 层向用户提供一组统一的接口。这种设备管理方法可以很好的实现设备无关性,使 Linux 系统可以随着外 部设备的发展进行扩展,比如要添加一个设备,只要根据该硬件设备特性向文件系统提供一组接口,应用 程序通过系统调用接口来访问设备[5]。 Linux 系统里将 Flash 设备归属到 MTD 设备下管理,相对于常规块设备驱动程序,MTD 设备驱动程序 能更好的支持和管理闪存[6],具体讲,基于 MTD 的 Flash 驱动程序,对上层可以很好的支持 jffs(针对 NorFlash)和 yaffs(针对 NandFlash)等文件系统,对下层 Flash 的读写,擦除,坏块处理都能进行很好的管 理,它在硬件设备和上层文件系统间提供一个抽象接口。 3.2 Flash 驱动程序开发流程 Flash 驱动程序有两种编程方式。一种是直接编程进内核(kernel),另一种是编程成模块(modules), 如果编程进内核,会增加内核的大小,还要改动内核源文件,不能动态卸载,不利于调试,所以 Flash 驱 动编程采用模块化方式较好[7]。 Flash 驱动开发流程要经过四步:模块化设计,编译,加载,调用验证。如图 4 所示。 3.2.1 驱动程序的模块化设计 图 4 Flash 驱动程序开发流程 构成 Flash 驱动程序的所有子程序,要进行模块化设计,就必须加入两个函数:入口函数 module_init() 和出口函数 module_exit()。在执行程序时 module_init()会调用 int_init cfi_probe_init(void),负责初始化 MTD 芯片,同时这个函数还调用 register_mtd_chip_driver(),将 cfi_chipdrv 加入到 MTD 驱动器列表 chip_drvs_list 中。初始化成功返回 0,否则返回负值。实现代码为: int __init cfi_probe_init(void) { register_mtd_chip_driver(&cfi_chipdrv); return 0; } 另一个函数 module_exit()执行时,会调用 static void __exit cfi_probe_exit(void),负责清除 MTD 芯片驱 动 工 作 。 同 时 这 个 函 数 还 调 用 unregister_mtd_chip_driver() , 将 cfi_chipdrv 从 MTD 芯 片 驱 动 器 列 表 chip_drvs_list 中删除。实现代码为: static void __exit cfi_probe_exit(void) { unregister_mtd_chip_driver(&cfi_chipdrv); } 添 加 了 这 两 个 函 数 , 模 块 化 设 计 还 不 完 善 , 还 要 加 上 MODULE_LICENSE 授 权 声 明 , MODULE_AUTHOR 作者声明等,这些函数和*.C 主体函数共同就构建成了一个 Flash 程序模块。 3.2.2 驱动程序的编译 编译模块要有 Linux 内核的源码目录,也就是 Linux 内核的源码头文件,内核目录结构以及内核的 Makefile。这些文件都放在/lib/modules/2.4.18/build 子目录里。Linux 中,模块可以用 C 语言编写,用 gcc
编译成目标文件。由于在不链接时,gcc 只允许一个输入文件,因此一个模块的所有部分必须在一个文件 里实现。 编译格式: $ gcc –O2 -DMODULE -D__KERNEL__ -l/usr/src/linux/include -c *.c -O 指定代码优化的级别;-D 内核模块必须按照特殊定义的参数进行编译,这些参数跟在选项 –D 后; MODULE 通知头文件要给出适当的内核模块定义;__KERNEL__通知头文件形成的目标代码在内核态运 行。得到的文件*.O 就是一个 Flash 驱动程序的目标文件,这样 Flash 驱动程序就编译好了。编译好的模块 *.O 放在/lib/modules/2.4.18/misc 下,然后用 depmod -a 使此模块成为可加载模块。 3.2.3 驱动程序的加载 加载模块要用到两个命令:insmod(加载),rmmod(卸载)。加载时,module_init() 函数被调用,这个函 数向系统设备表登记 Flash 设备。卸载时,module_exit()函数被调用,它释放 Flash 设备在系统设备表中占 有的表项。注册成功后就可以用 mknod 命令把 Flash 设备映射为一个特别文件,其它程序使用 Flash 设备 时 ,只要对此文件进行操作就行了。 Linux 在/dev 目录中为每个设备建立了一个文件,用 ls –l 命令列出 函数返回值,若小于 0,表示注册失败;否则表示注册成功。注册以后,Linux 将 Flash 设备名与主、次设 备号联系起来。当对 Flash 访问时,Linux 通过请求访问 Flash 设备名得到主、次设备号,然后把此访问发 送到 Flash 设备驱动,Flash 驱动再根据次设备号调用不同的函数。 3.2.4 驱动程序的调用验证 模块加载到内核后,然后就要调用验证。在 Linux 根目录下有 dev 子目录,这里面是节点名,这些结点 是通过 mknod 建立的,里面有 MTD 字符设备节点和 MTD 块设备节点,通过访问这些节点来访问设备驱 动程序。Open 一般是设备节点上的第一个操作,访问设备时其实就是系统调用 open()函数,然后 open() 函数打开设备准备进行 I/O 操作,该函数注册进 mtd_fops 结构中[8]。 上面就是NorFlash和NandFlash驱动程序架构,具体开发驱动程序时,就要填充架构里的程序代码,来 完成驱动程序。这个框架中有一个函数表,具体到Linux系统里,需要提供一个结构来向系统说明Flash驱 动程序所提供的一组入口点,这个结构就是fop函数表。 Flash驱动程序运行时,向内核注册,告诉系统fop函数表是跟Flash驱动程序相关联的。当用户去访问驱 动程序时,系统就告诉文件系统的管理程序,调用fop函数表就可以了,然后调用函数表里的函数,完成用 户要求。当从设备来收发数据时,系统不是调用read(),write()这两个函数,fop结构里没这两个函数,而是 要用到一个函数blk_init_queue(),这个函数向上注册了一个请求处理函数request,对Flash设备的读取和发 送数据,都是从请求队列发出一个请求,请求调用请求处理函数,由请求处理函数执行具体的读写操作。 设计驱动程序90%工作来完成fop函数表及request函数,10%完成驱动程序中的一些函数接口 。 完成了这些函数加上上面的Flash驱动程序架构就构成了完整的Flash驱动程序。 结束语: 本文基于samsung公司的s3c2410处理器平台,分析和设计了NorFlash和NandFlash的接口和驱动,详细 介绍了两种Flash的硬件结构、性能差异、读写时序、以及驱动开发。NorFlash和NandFlash因其在存储数据 和程序以及性价比方面的优势,占据的存储器市场份额越来越多,并在嵌入式系统中得到广泛应用。 [参考文献] [1]冯欣,秦娟英.uClinux平台下的Flash存储技术[J].单片机与嵌入式系统应用,2004,2:36-38. [2]Samsung Corp. S3C2410User’s Manual[EB/OL].2005.http://www.samsungsemi.com. [3] Atmel Corp. AT49BV/LV1604A(T)/1614A(T)[EB/OL].2005.http://www.atmel.com [4] Samsung Corp.K9F1208UOMDatasheet[EB/OL].2005.http://www.samsung.com [5] 毛德操,胡希明.Linux内核源代码情景分析[M].浙江:浙江大学出版社,2001. [6]李胜广,张其善.闪存设备在嵌入式Linux系统中的应用[A].计算机工程,2007,2:191-193. [7] 孙天泽,袁文菊.嵌入式设计及 Linux 开发指南——基于 ARM9 处理器[M].北京:电子工业出版社,2005. [8]李胜朝,黄先祥,周召发.嵌入式 Linux 下块设备驱动程序的开发[A].机电工程技术,2007,6:26-28.
作者简介:赵军伟(1983-),男,河南省获嘉县人,在读硕士研究生,从事嵌入式系统应用开发研究。 E-mail:zjwei83@163.com 通讯作者:李宏穆(1956-),男,教授,硕士生导师,从事智能机器人研究。 文章标题 NandFlash 和 NorFlash 接口设计和驱动开发 作者单位 成都理工大学 作者姓名 赵军伟 研究方向 智能仪器 E-mail zjwei83@163.com 联系电话 邮 编 610059 手 机 15882269723 通信地址 四川省成都市成都理工大学银杏一楼 167 宿舍赵军伟收 投稿栏目
分享到:
收藏