原创 嵌入式文件系统uc/fs在Nios II上基于Nor Flash

2008-9-3 12:56 6283 5 9 分类: MCU/ 嵌入式

写在前面:经过一个多星期的努力,今天终于把uc/fsde2板上跑通了,现在能够对flash进行格式化,能够建立,读写,删除文件,能够建立目录,等等文件系统应该具备的基本功能都可以实现了,算是一个不小的进步。在这里先要感谢网友棉花糖糖主提供的uc/fs 1.34lpc2210上的移植例子,里面的flash驱动给了我很大帮助(实际上,我只是在这个驱动的基础上做了一些修改,使之支持de2板上的flash罢了。呵呵,拿来主义,是我一向的主张!^_^)。下面简要说一下我的移植过程,以备查阅。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


一、uc/fs简单介绍


uc/fs是美国micrium公司研发的一个专门针对嵌入式应用的文件系统,支持FAT12FAT16FAT32,可以用于大部分常见的存储器件,比如RamDiskSMC/NAND DeviceMultiMedia & SD card DeviceCompactFlash card & IDE DeviceNor Flash DeviceSerialFlash Device等等。当然,要使用这些存储器件,就需要相应的驱动程序。我们的工作,实际上就是修改,并完善相应的驱动程序,使之适用于我们自己的系统。


现在网上的可以下载的源码是2.0版本的,不过好像大家用的比较多的是1.34版,而且我得到的例子也是1.34版的,所以就在此基础上进行我的工作。


二、uc/fs设备驱动结构


uc/fs以一种宏定义的形式来管理设备,这些定义在API文件夹下的fs_info.c文件中可以找到,比如flash设备的定义如下:




#ifFS_USE_FLASH_DRIVER


#defineFS_DEVINFO_DEVFLASH  {"flash",   &FS__fat_functable, &FS__flashdevice_driver, FS_CACHEINFO_FLASH_DRIVER 0 },


#else


#defineFS_DEVINFO_DEVFLASH


其中,FS_USE_FLASH_DRIVERConfig文件夹下的fs_conf.h中定义,表示使用flash设备。这里的FS_DEVINFO_DEVFLASH就定义了uc/fs操作一个设备所需要的各种信息。"flash"表示设备名称,这个名称在以后会多次用到,比如你要在flash设备上建立文件,就需要用到这个名称来指示路径;&FS__fat_functable是一个指向一组函数指针的指针,该组函数指针指向fat的一些操作函数,如fopenfclose等,我们无需去改变这个指针;&FS__flashdevice_driver指向flash设备的驱动,其中提供对flash设备的读写,设备状态以及各种IO命令控制函数,这些函数需要我们自己去创建,这也是我们移植工作的核心内容;FS_CACHEINFO_FLASH_DRIVER 0定义flash读数据缓冲区的信息,由于flash读取速度很快,可以像一般内存一样线性读取,所以没有必要加一个读缓冲区,故将其值设为0


为了uc/fs能够使用flash,我们需要提供这样一个结构:




constFS__device_type FS__flashdevice_driver = {


 "Flash device",


 _FS_Flash_DevStatus,


 _FS_Flash_DevRead,


 _FS_Flash_DevWrite,


 _FS_Flash_DevIoCtl


};


其中,"Flash device"设备驱动名称,这个名称是在uc/fs内部使用,而我们上面提到的"flash"这个设备名称可由用户使用;_FS_Flash_DevStatus指向检测设备状态的函数,_FS_Flash_DevRead指向读设备函数,_FS_Flash_DevWrite指向写设备函数,_FS_Flash_DevIoCtl指向对设备进行IO控制的函数――这几个函数都需要我们自己根据特定的设备来编写。


三、flash设备驱动的编写


flash设备驱动的编写实际上就是要编写上面所说的那几个函数,我们采用从上到下的编写模式,即先编写设备驱动所需要的比较高级的函数,然后一步一步细化到对具体地址的操作。为此,我们将设备驱动分为flash_drv.cflash_X_HW.c两个文件,其中,flash_drv.c提供上层的接口,设备驱动结构体FS__flashdevice_driver应该在该文件中定义;而flash_X_HW.c主要完成对flash的具体操作。


1flash_drv.c的编写


在编写具体的函数之前,先要定义几个全局变量:




staticchar    _FS_flash_mbrbuffer[0x200];


staticchar    _FS_flash_diskchange[FS_FLASH_MAXUNIT];


staticchar    _FS_flash_busycnt[FS_FLASH_MAXUNIT];


其中,FS_FLASH_MAXUNIT表示最大的flash设备个数,在fs_conf.h中定义为1_FS_flash_mbrbuffer[0x200]:读取MBR的数据缓冲区,512字节,MBRflash芯片的第一个扇区开始的地方,由uc/fs格式化flash盘的时候写入;


_FS_flash_diskchange[FS_FLASH_MAXUNIT]:一个表示设备改变的flag变量;


_FS_flash_busycnt[FS_FLASH_MAXUNIT]:用于控制表示Busy状态的LEDOn/Off,我们不使用Busy LED,所以这个变量可以不要;


1)_FS_Flash_DevStatus函数:


该函数用来表示设备状态是否改变,由于我们使用的是焊接在电路板上的flash芯片,所以这个函数作用不是很大,因为我们的设备是不会改变的。




staticint_FS_Flash_DevStatus(FS_u32 Unit) {


 staticintinit;


 intx;


 chara;


 if(!init) {


   for(init = 0; init < FS_FLASH_MAXUNIT; init++) {


     _FS_flash_diskchange[init] = 1;


   }


   init = 1;


 }


 if(Unit >= FS_FLASH_MAXUNIT) {


   return-1; /* No valid unit number */


 }


 a = FS_Flash_HW_X_DetectStatus(Unit);/* Check if a card is present */


 if(a) {


   return-1; /* No card in reader */


 }


 /* When you get here, then there is a card in the reader */


 a = _FS_flash_diskchange[Unit]; /* Check if the media has changed */


 if(a) {


   /*


      A diskchange took place. The following code reads the MBR of the


      card to get its partition information.


   */


   _FS_flash_diskchange[Unit] = 0; /* Reset 'diskchange' flag */


   FS__Flash_Init(Unit);


   x = FS__Flash_ReadSector(Unit, 0, (unsignedchar*) &_FS_flash_mbrbuffer[0]);


   if(x != 0) {


文章评论4条评论)

登录后参与讨论

用户316834 2010-11-10 11:37

按照楼主的步骤,编译连接时出现如下结果: Unable to create file flash:\flash.txt Unable to open file flash:\flash.txt. information of flash: Invalid drive specified 同时驱动程序所用底层函数FS_FLASH_HW_X_DetectStatus()(编译时将此段代码注销后才能通过)在文件系统中没有定义,是否需要自己编写。 还请大侠指点一下。能否共享下文件系统flash驱动。我的邮箱qinggv@126.com,不胜感激!

用户1356205 2009-12-10 11:53

问下楼主,移植之后从flash里读写文件的速度能达到多少?

用户1090663 2008-10-20 10:56

博主,你好!我正在做ucfs在flash上的移植,看到了你的帖子,感觉帮助很大,不过没有看到余下的内容,到了if函数就结束了。能否把余下的内容公开一下呢?yueyewutong@163.com,谢谢!

用户1090663 2008-10-20 10:37

不错
相关推荐阅读
用户461316 2009-08-17 17:57
Zigbee星型网络组网程序段
最近一直在做Zigbee的星型网络的组网试验,由于时间的原因,现在只是在最高的应用层上来编写程序。即协议栈的程序是2430的开发商(无限龙)编写的,我只是调用相应的函数来完成组网的,星型网络组网部分的...
用户461316 2009-08-17 17:14
VB6的标题栏使用上真彩色图标
模块 ModIcon.Bas 代码: Option Explicit Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long...
用户461316 2009-08-17 16:58
AppendToLog一个API方式存取日志文件的模块
'**************************************' 模块名称: AppendToLog' 功能描述:一个很不错的日志文件写入模块,不同于'     open/print/...
用户461316 2009-08-17 16:57
(VB自定义函数)去除字符串中的空格
'去除字符串中的空格(方法一)Public Function DelBlank(SearchString As String)   DelBlank = Replace(SearchString, C...
用户461316 2009-08-17 16:56
(VB自定义函数)对任意输入的汉字,可以得到它的拼音的第一个字母
调用方法:Command1.Caption = getHzPy("你")'//函数入口为汉字串,返回值为该汉字的第一个字母Public Function getHzPy(hzStr As String...
用户461316 2009-08-17 16:54
VB_代码执行速度测试
'**************************************'Windows API/Global Declarations for :[ '     A Simple] code ...
我要评论
4
5
关闭 站长推荐上一条 /2 下一条