基于VxWorks的NAND FLASH驱动程序设计
时间:07-31
来源:现代电子技术
点击:
4 TrueFFS的实现
4.1 TrueFFS的基本结构
TrueFFS由1个核心层和3个功能层组成,它们是翻译层(Translation Layer)、MTD(Memory Tech-nology Drivers Layer)层和Socket层,其结构框图如图2所示。
交互功能。它包含了控制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的帮助文件获得,在此不详述。
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()中完成的。
根据前面的介绍知道,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(),如下所示为程序片段:
完成上述代码后,剩下的工作就是完成在函数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的性能。以此为基础的系统在某机载设备上得到成功运用。
4.1 TrueFFS的基本结构
TrueFFS由1个核心层和3个功能层组成,它们是翻译层(Translation Layer)、MTD(Memory Tech-nology Drivers Layer)层和Socket层,其结构框图如图2所示。
交互功能。它包含了控制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的帮助文件获得,在此不详述。
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()中完成的。
根据前面的介绍知道,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(),如下所示为程序片段:
完成上述代码后,剩下的工作就是完成在函数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的性能。以此为基础的系统在某机载设备上得到成功运用。
- Linux下PCI设备驱动程序开发(07-27)
- PCI设备Windows通用驱动程序设计(04-16)
- USB设备驱动程序的设计(05-20)
- 基于GPRS的远程心电实时监护仪软件系统设计(02-10)
- 如何选用合适的闪存进行设计?(05-24)
- 基于ARM9内核Processor对外部NAND FLASH的控制实现(07-12)