[转载]嵌入式文件系统uc/fs在Nios II上基于Nor Flash的移植

来源:互联网 发布:碰碰软件怎么玩? 编辑:程序博客网 时间:2024/06/11 14:40
写在前面:经过一个多星期的努力,今天终于把uc/fs在de2板上跑通了,现在能够对flash进行格式化,能够建立,读写,删除文件,能够建立目录,等等文件系统应该具备的基本功能都可以实现了,算是一个不小的进步。在这里先要感谢网友棉花糖糖主提供的uc/fs 1.34在lpc2210上的移植例子,里面的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]);

 
原创粉丝点击