写在前面:经过一个多星期的努力,今天终于把uc/fs在de2板上跑通了,现在能够对flash进行格式化,能够建立,读写,删除文件,能够建立目录,等等文件系统应该具备的基本功能都可以实现了,算是一个不小的进步。在这里先要感谢网友棉花糖糖主提供的uc/fs 1.34在lpc2210上的移植例子,里面的flash驱动给了我很大帮助(实际上,我只是在这个驱动的基础上做了一些修改,使之支持de2板上的flash罢了。呵呵,拿来主义,是我一向的主张!^_^)。下面简要说一下我的移植过程,以备查阅。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
一、uc/fs简单介绍
uc/fs是美国micrium公司研发的一个专门针对嵌入式应用的文件系统,支持FAT12,FAT16和FAT32,可以用于大部分常见的存储器件,比如RamDisk,SMC/NAND Device,MultiMedia & SD card Device,CompactFlash card & IDE Device,Nor Flash Device,SerialFlash 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_DRIVER在Config文件夹下的fs_conf.h中定义,表示使用flash设备。这里的FS_DEVINFO_DEVFLASH就定义了uc/fs操作一个设备所需要的各种信息。"flash"表示设备名称,这个名称在以后会多次用到,比如你要在flash设备上建立文件,就需要用到这个名称来指示路径;&FS__fat_functable是一个指向一组函数指针的指针,该组函数指针指向fat的一些操作函数,如fopen,fclose等,我们无需去改变这个指针;&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.c和flash_X_HW.c两个文件,其中,flash_drv.c提供上层的接口,设备驱动结构体FS__flashdevice_driver应该在该文件中定义;而flash_X_HW.c主要完成对flash的具体操作。
1、flash_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字节,MBR在flash芯片的第一个扇区开始的地方,由uc/fs格式化flash盘的时候写入;
_FS_flash_diskchange[FS_FLASH_MAXUNIT]:一个表示设备改变的flag变量;
_FS_flash_busycnt[FS_FLASH_MAXUNIT]:用于控制表示Busy状态的LED的On/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) { |
用户316834 2010-11-10 11:37
用户1356205 2009-12-10 11:53
用户1090663 2008-10-20 10:56
用户1090663 2008-10-20 10:37