基于VXWORKS的NAND FLASH驱动程序设计_千山鸟飞绝万径人踪灭的博客-程序员ITS301

技术标签: nand flash  vxworks  TFFS  K9F2G08QOM  文件系统  开发最前沿  

基于VXWORKS的NAND FLASH驱动程序设计

[email protected]

技术交流QQ群: 691976956


目前,随着电子技术的不断发展,计算机技术也得到飞速的发展,产生了很多新技术。但就计算机 的基本结构来说,还是基本采用了冯·诺依曼结构。然而冯·诺依曼结构的一个中心点就是存储一控制,所以存储器在计算机系统中的作用是非常重要的。嵌入式计 算机作为计算机中的一个类别,对执行速度和系统可靠性都有较强的要求,这也决定了嵌入式系统不仅要有实时性很强的操作系统,同时也需要一种安全、快速的存 储设备。同时,嵌入式系统经常会涉及到海量数据的存储,这就要求存储设备必须具有可靠性高,功耗低,容量大,掉电数据不丢失等特点,而NAND FLASH芯片正好具有这些优点。

VxWorks是嵌入式领域内公认的最有特色的高性能实时操作系统之一。它以其良好的可靠性和卓越的实时性,被广泛地应用在通信、军事、航空、 航天等高精尖技术及实时性要求极高的领域中,如卫星通信、军事演习、弹道制导、飞机导航等。

目前,在VxWorks实现上,涉及文件系统的文章不少,但一般都是针对容量较小,操作相对 简单的NORFLASH实现的。本文讨论了如何在以AMCC公司的Power PC芯片PPC440epx为核心的嵌入式平台上,利用三星公司的大容量NAND FLASH实现文件系统的具体办法。

  1 三星NAND FLASH芯片K9F2G08QOM

K9F2G08QOM芯片的容量为256 M×8 b="2" Gb的数据区,再加上64 Mb的备用区。一块这种芯片被分为2 048个块,每个块又分为64页,每页由2 KB的数据区加上64 B的备用区组成。如图1所示,列地址为12 b(A11~A0)。当A12为0时,A10~A0确定对每页中2 KP;数据的访问;当A12为1时,访问的是64 B的备用区。由于NANDFLASH芯片在出厂时就可能出现坏块(块中的某个或多个bit不能有效的进行读写),为了将其标注出来,三星公司保证每个坏块 的第一页和第二页备用区第一个byte的数据没有被初始化为0xFF。设计人员要确保在对该芯片进行擦除之前,先将这个信息保留起来(建一个坏块表)。行 地址为17 b(A28~A12)。它确定了对2 048块×64页=128 K个页中的某一页进行访问。为了简化NAND FLASH芯片的管脚,其地址和数据信息共享8个I/O管脚,因此,其29 B的地址信息被设计为5个周期进行传输。具体操作如表1所示。

Nand Flash K9F2G08

Nand Flash K9F2G08

注:起始地址是列地址;L表示必须置为低电平

对NAND FLASH的操作流程比较简单,即在第一个周期里送操作相关的命令字,然后送地址,以及相应的数据,最后送确认字。需要说明的是,由于地址、命令和数据都 共用8个I/O管脚来进行传输,因此在硬件上必须要有专用的管脚来区分传输类型(在传输命令的时候,命令锁存使能信号CLE有效;在传输地址的时候,地址 锁存使能信号ALE有效)。具体的命令字、时序和操作流程在K9F2G08Q0M的数据手册上有较详细的描述,在此不一一详述。

  2 PPC440epx的NAND FLASH接口

AMCC公司的PPC440epx芯片是一款性能指标较高的嵌入式CPU芯片,其主频可以达到667 MHz,拥有DDR2接口,可支持千兆以太网,USB 2.0接口,支持浮点运算,同时还支持NAND FLASH芯片。

PPC440epx使用一个NAND FLASH Controller作为外部NAND FLASH与其外部总线通信的接口电路,该控制器最多可以支持4个NAND FLASH芯片,每个芯片的容量可以为4~256 MB,每页的大小可以为512 B+16 B或者2 KB+64 B。NDFC(NANDFLASH Controller)的存在使得对NAND FLASH的操作变的非常简单。根据前面对K9F2G08Q0M的介绍可知,对NAND FLASH的操作需要在硬件上产生ALE,CLE信号来区分传输类型。NDFC给程序设计人员提供两种实现时序的方法:硬件实现,软件实现。如果是前者, NDFC提供了几个寄存器:命令寄存器、地址寄存器、数据寄存器、配置寄存器和状态寄存器。通过对这几个寄存器执行相应的读/写操作就可以产生相应的时 序。例如,如果需要对NAND FLASH写命令字80H,则只需将80H写人命令寄存器即可。NDFC自动将80H送到I/O7~I/O0上,同时置CLE为有效状态。而软件实现方法 是根据K9F2G08Q0M的时序要求,通过对硬件控制寄存器中相应的bit写1或者0,使得对应的控制信号为高电平或者低电平。设计人员可以根据自己的 情况,选择实现方法。这里推荐采用硬件实现的方法。不过,在有问题时,可采用软件实现的方法来进行调试。

  3 TrueFFS简介

TureFFS(Ture Flash File System)是M-Systems公司为VxWorks操作系统定制的实现FLASH块设备的接口。通过使用TFFS,应用程序对FLASH的读写就像 对拥有MS-DOS文件系统的磁盘设备操作一样。对于上层设计人员,TFFS屏蔽了底层多种多样FLASH设备的具体细节。同时,由于FLASH存储芯片 自身的一些特性(如擦除、编程次数有限并且操作时间较长;容易进入过度编程状态等),TFFS采用虚拟块、损耗均衡、碎片回收、错误恢复等机制来提高 FLASH的使用寿命,确保数据完整,优化性能。

  4 TrueFFS的实现

  4.1 TrueFFS的基本结构

TrueFFS由1个核心层和3个功能层组成,它们是翻译层(Translation Layer)、MTD(Memory Tech-nology Drivers Layer)层和Socket层,其结构框图如图2所示。

Nand Flash Tffs Layer

  1. 交互功能。它包含了控制FLASH映射到块、wear-lev-eling、碎片回收和数据完整性所需的智能化处理功能。目前,有三种不 同的翻译层模块可供选择。选择哪一种层需要看所用的FLASH介质是采用NOR-based,还是NAND-based,或者SSFDC-based技术 而定。
  2. MTD(Memory Technology Driver)层实现具体的FLASH芯片底层程序设计,包括读、写、擦、ID识别、映射等功能,以及一些与FLASH芯片相关的参数设置。
  3. Socket层提供了TrueFFS和硬件之间的接口服务,负责电源管理、检测设备插 拔、硬件写保护、 窗口管理和向系统注册Socket等;
  4. 核心层将其他3层有机结合起来,另外还处理全局问题,如信号量、碎片回收、计时器和其他系统资源等。

在VxWorks中,由于翻译层和核心层以二进制形式提供给设计人员的,因此实现TFFS的主要工作集中在对MTD层和Socket层的设计 上。

  4.2 Socket层的实现

如果VxWorks中包含TFFS,在系统启动后,先完成内核的初始化,之后开始进行I/O的初始化操作。系统调用UsrRoot()函数,该 函数再调用 tffsDrv()函数,这样就产生如图3所示的调用流程。调用这些函数的目的之一就是注册socket驱动函数。最后的注册操作都是由 xxxRegister()函数完成(这个函数和sysTff-sInit()函数的定义都在sysTffs.c中)的。该函数是通过更新 FLSocket结构体来完成注册操作的。该结构体的定义以及相关细节可以通过阅读VxWorks的帮助文件获得,在此不详述。

Nand Flash Tffs Register

sysTffs.C文件的编写,可以参考其他的BSP来完成。config目录下的任何一个BSP都有该文件,设计人员可以复制其中一个到自己 的BSP目录下。例如:复制wrPpmc440gp目录下的sysTffs.c文件,再根据自己的硬件电路修改FLASH BASE ADRS以及FLASHSIZE的宏定义,同时添加宏定义:#define INCLUDE_MTD_NAND。其他地方一般不需要改动。

  4.3 MTD层驱动程序的实现

要创建一个TFFS块设备,首先应该调用函数tffsDevCreate(),这样就产生了如图4所示的一系列的调用函数。系统通过这一系列的 调用函数来确认具体的MTD层程序。确认过程在flIdentifyFlash()函数中完成。flIdentifyFlash()通过逐个执行 xxxIdentify()表中的程序来确定合适的MTD。如果系统只有一种FLASH,则只需写一个Identify()函数可。与Socket层类 似,MTD层的核心工作也是针对一个数据结构(FLFLASH)而进行的初始化操作。通过初始化操作来注册FLASH芯片的处理函数,具体的实现是在函数 xxxldentify()中完成的。

Nand Flash Tffs Identify

根据前面的介绍知道,MTD层的主要功能是实现对FLASH芯片的读、写、擦、ID识别、映射等操作。而对不同FLASH芯片的相应操作是有一 定差别的,所以使用不同的FLASH芯片时,MTD层的程序设计也是不一样的。开发人员的工作是根据系统使用的具体FLASH芯片来完成相应的程序设计。

Tornado提供了几种FLASH的TrueFFS MTD层驱动的参考设计。在installDir\target\src\drv\tffs中,主要包括Intel,AMD等公司的几种FLASH的 TrueFFS MTD层驱动。虽然没有需要的K9F2G08驱动程序,但可以根据其结构来设计自己的MTD程序。具体做法是在BSP目录下建立一个MTD层驱动文件,将 其取名为K9F2G08Mtd.C。在该文件中首先编写函数nandMTDIdentify(),如下所示为程序片段:

Nand Flash Tffs nandMtdIdentify

完成上述代码后,剩下的工作就是完成在函数nandMTDIdentify()中引用的readFlashID(),nand- MTDRead()。 nandMTDWrite(),nandMTDErase(),nandMTDMap()这几个函数的代码编写。由于不同的FLASH芯片,时序不同,因 此这几个函数的实现也不同。必须根据芯片K9F2G08的数据手册上时序的要求,对PPC440epx的相应寄存器进行读/写操作,以完成这些功能。由于 篇幅原因,这几个函数的具体代码就不再赘述。建议在Boot Loader工作正常后,先在应用程序中对这些函数进行调试。这样就可以利用单步和断点等工具进行调试,并且在修改后可立即通过网络下载程序。

  4.4 TrueFFS的配置

在完成上述代码的编写后,还要做如下工作:在配置文件config.h中增加定义INCLUDE_TFFS和IN-CLUDE_DOSFS,使 得 TrueFFS组件和DOS文件系统被包含进来。并且要在MakeFile文件MACH_EXTRA一项中添加K9F2G08Mtd.o,这样可将 TureFFS文件驱动程序加入系统。另外,还要在tffsConfig.c文件中的mtdTable[]表中添加上述的函数nandMTDI- dentify。

  5 结 语

在此介绍如何在由AMCC公司的CPU芯片PPC440epx、三星公司的NAND FLASH构成的硬件平台上和VxWorks软件平台上,实现TrueFFS。按照上述设计流程,实现了NAND FLASH的驱动程序设计。能够对K9F2G08进行正常的读、写、擦、ID识别、映射等操作。同时,在VxWorks操作系统上,实现了 TrueFFS。这样就提高FLASH使用寿命,确保数据完整,优化了FLAsH的性能。以此为基础的系统在某机载设备上得到成功运用。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cph77777/article/details/79552955

智能推荐

TensorFlow2.0中的tf.keras和Keras的区别?为什么要用tf.keras?_Yuetianw的博客-程序员ITS301_tensorflow2.0和keras

随着 TensorFlow 2.0 的发布,不少开发者产生了一些疑惑:作为 Keras 用户,TensorFlow 2.0 的发布跟我有关系吗?TensorFlow 中的 tf.keras 和 Keras 有什么区别?我该用哪一个训练神经网络?在本文中,作者给出的答案是:你应该在以后所有的深度学习项目和实验中都使用 tf.keras。通过本教程,你可以了解 Keras 和 tf.keras 之间的区别,以及 TensorFlow 2.0 的新特性。本教程的灵感来自于上周二我在 PyImageSearch

VS2010下实现一个简单的Windows程序_suseyaoyao的博客-程序员ITS301

从今天开始真正学习MFC了,一个真正的高手都是从基本功开始的。下面我将详细解剖我的第一个MFC程序。注意哦,我可是新建的Win32 Application具体实现功能:当用鼠标左键单击程序窗口的用户区时,计算机的扬声器会发出“叮”的声音。当我们新建一个工程时,选择win32,会有如下两个选项:(1)Win32 Project就是普通的常见的窗口应用程序(VC是Win

加推时序系统RTS实现原理及应用简介_加推的博客-程序员ITS301

一、背景知识1、什么是时序数据及分析目的?时序数据是指时间序列数据。时间序列数据是同一指标按时间顺序记录的数据列。在同一数据列中的各个数据必须是同口径的,要求具有可比性。时序数据可以是【时期数】,也可以【时点数】。时间序列分析的目的是通过找出样本内时间序列的【统计特性】和【发展规律性】,构建时间序列模型,进行样本外【预测】。——【定义来自百度】Sky认为,更广义来说时序分析是一种数据挖掘:通过“趋势、相关性、特征”,进行“整合、归纳、评估”。提升用户感知,优化用户体验,支持产品改进,加强

linux查看mongo表大小,MongoDB_mongodb 查看数据库和表大小,1,查看数据库 > db.stats() - phpStudy..._测试狗科研服务的博客-程序员ITS301

mongodb 查看数据库和表大小1,查看数据库> db.stats();{"db" : "test", //当前数据库"collections" : 3, //当前数据库多少表"objects" : 4, //当前数据库所有表多少条数据"avgObjSize" : 51, //每条数据的平均大小"dataSize" : 204, /...

代码导出Reporting Services报表文件_weixin_30647065的博客-程序员ITS301

背景部分 使用Reporting Services很容易制作和发布我们需要的报表,报表效果也还不错不过如果报表数据过大或报表数量过多,打开及查看报表感觉可能就是另外一回事了好在Reporting Services提供了离线下载功能;同时,也提供了Web Services供开发人员调用作为一个软件工程师,完全可以建一个控制台程序,代码写好,使用配置文件获取报表参数运行,喝杯...

大规模linux集群架构实,大规模Linux集群架构最佳实践:如何管理上千台服务器..._Shi Max的博客-程序员ITS301

前言第1章 Linux系统管理入门1.1 系统安装1.1.1 安装CentOS1.1.2 首次启动CentOS1.1.3 更多设置1.2 系统登录1.2.1 本地登录1.2.2 远程登录1.3 用户管理1.3.1 用户和用户组的概念1.3.2 新增和删除用户1.3.3 新增和删除用户组1.3.4 用户切换1.4 文件系统1.4.1 什么是文件系统1.4.2 常见的文件系统1.4.3 磁盘分区和创建...

随便推点

Python新手教程-变量和简单的数据类型_Pymili的博客-程序员ITS301

醒一醒!该敲代码了!别躺着在床上打王者了!????在本篇论文中,你将学习到Python的变量名,即基本的数据类型。和一个好玩的小程序!期不期待,开不开心!(废话x1)????Hello大家好,我是PYmili !今天给大家带来一期Python新手教程博客!同时以后每过一段时间就会依次更新教程。把我的看法,分享给大家共同学习。共同学习进步(废话x2)????好的,不讲废话了!正式开始!你准备好了吗?期不期待,开不开心?(废话x3)????正式开始首先我们按照流程啊!老套路!做出自己的第

vsftpd启动报错:vsftpd:500 OOPS: bad bool value in config file for: anonymous_enable_weixin_30677617的博客-程序员ITS301

vsftpd启动报错:vsftpd:500 OOPS: bad bool value in config file for: anonymous_enable今天在调试centos vsftp的时候,配置好了vsftpd准备重新启动时,出现了一个奇怪的现象,[[email protected] ~]# service vsftpd restartShutting down v...

CH340电路设计_SoldierJazz2021的博客-程序员ITS301

最近选用USB转串口芯片进行开发调试,在调研了各主流芯片的之后,觉得 CH340 系列的性价比很高,而且技术支持在国内,如果遇到问题解决起来也会方便很多。但是 CH340 / CH341 型号很多,具体选型就就该结合需求和芯片手册了,关于选型也可以参考我的其他博文,在这里我选择的型号是 CH340g。去官网地址:江苏沁恒股份有限公司 http://www.wch.cn/ 然后选择“在线下载”,

wifipineapple插件:codeInject的使用_dianyan5615的博客-程序员ITS301

  如果在中间人攻击的时候, 能在用户的网页中插入任意代码, 可以说已经完成一半了  wifipineapple有个codeInject插件, 可以让连上这个网络所有设备浏览网页的时候, 在网页中插入任意html代码  但是目前我用的wifipineapple版本是MK4, 官方很久不维护这个版本的wifipineapple  使用scp把本地的codeinject传到wif...

十大企业级Linux服务器安全防护要点_click_idc的博客-程序员ITS301

随着开源系统Linux的盛行,其在大中型企业的应用也在逐渐普及,很多企业的应用服务都是构筑在其之上,例如Web服务、数据库服务、集群服务等等。因此,Linux的安全性就成为了企业构筑安全应用的一个基础,是重中之重,如何对其进行安全防护是企业需要解决的一个基础性问题,基于此,本文将给出十大企业级Linux服务器安全防护的要点。1、强化:密码管理设定登录密码是一项非常重要的安全措施,如果用户的密码设定...

推荐文章

热门文章

相关标签