EDN首页   博客首页

日志档案

发表于 2008-9-3 12:56:54

14

标签: 无标签

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

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

一、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) {

系统分类: 嵌入式   |   用户分类: ARM杂记   |   来源: 整理   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(328)    回复(3)  

投一票您将和博主都有获奖机会!

  • lunarkylin

    2008-10-20 10:37:55

    不错

  • lunarkylin

    2008-10-20 10:56:28

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

  • lunarkylin

    2008-10-20 10:56:41

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