FatFs is a generic FAT file system module for small embedded systems.
FatFs的作者写了两个,一个是正宗的FatFs,比较适合大的RAM的设备,另一个是FatFs/Tiny,比较适合小RAM的系统,比如单片机,FatFs/Tiny占用较小的RAM,代价是更慢的读写速度和更少的API函数。不过两个都支持FAT12,FAT16,FAT32文件系统。
我们把源代码下载下来,最新的版本应该是0.09.下载下来的ff9.zip有两个文件夹,一个是 doc ,FatFs的说明,包括特性,系统函数,以及可能的一些问题,另一个就是源代码文件夹src了,diskio.c和diskio.h是硬件层,ff.c和ff.h是FatFs的文件系统层和文件系统的API层,integer.h是文件系统所用到的数据类型的定义,还有一个00readme.txt简要的介绍了FatFSHE FatFs/Tiny,包括他们所支持的API,怎么配置等等。
写底层的驱动函数,包括:
disk_initialize - Initialize disk drive
disk_status - Get disk status
disk_read - Read sector(s)
disk_write - Write sector(s)
disk_ioctl - Control device dependent features
get_fattime - Get current time
所有的函数都牵涉到了选择第几个磁盘的问题,如果仅仅用一个,可以不必理会这个drv 参数。
简单移植的话以下三个函数是必须的
disk_initialize
disk_read - Read sector(s)
disk_write - Write sector(s)
即初始化和读写扇区函数,其它可以简单返回0即可
读写扇区,注意参数哦!
部分说明来自网络,写文苦手啊。
程序说明:
运行会先判断是否存在test.txt文件?
如果存在,读出并显示。
如果不存在,询问是否要格式化?
是,会先格式化flash,再创建文件,写入文字。
读出文件内容并显示
计算空间占用。(没调好,不准确)
视频在这里
[media]http://www.tudou.com/v/Gtx26hc-c20/&rpid=100900070&resourceId=100900070_04_05_99/v.swf[/media]
源代码在这里
[
本帖最后由 shower.xu 于 2012-6-2 10:01 编辑 ]
回复 板凳 shower.xu 的帖子
fatfs能写JPEG或者其他格式的文件吗?
引用: 原帖由 zca123 于 2012-6-1 22:23 发表
fatfs能写JPEG或者其他格式的文件吗?
FatFs is a generic FAT file system module for small embedded systems.
我不知道怎样去描述我的意思,我认为单就Fatfs而言,它只是一个介于 底层硬件驱动和上层操作系统或应用之间的一个封装好的模块,而支持或操作什么格式的文件和程序是它更上一层的事,所以说能不能读写jpeg或其它格式的文件不在于它....
自己的一点看法,不知道对不对,欢迎拍砖
[
本帖最后由 shower.xu 于 2012-6-1 23:14 编辑 ]
搜集的一些函数说明:
#define ENTER_FF(fs) { if (!lock_fs(fs)) return FR_TIMEOUT; } //获取文件系统同步对象,不成功返回超时,成功,继续执行。
#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } //释放文件系统同步对象。
Static FATFS *FatFs[_DRIVES]; //定义一个文件系统对象指针数组,当然一般我们也就用到一个元素。
Static WORD LfnBuf[_MAX_LFN + 1]; //这个是与长文件名支持相关的。
#define NAMEBUF(sp,lp) BYTE sp[12]; WCHAR *lp = LfnBuf
#define INITBUF(dj,sp,lp) dj.fn = sp; dj.lfn = lp
下面都是函数的定义,很多只在内部使用。
Static void mem_cpy (void* dst, const void* src, int cnt) {
char *d = (char*)dst;
const char *s = (const char *)src;
while (cnt--) *d++ = *s++;
} //接下来还定义了几个内存操作的函数,这个函数实现了从一块内存到另一块的复制,下面还有mem_set()对一块内存进行清0或设置操作;mem_cmp()比较内存的多个字节是否相同,相同返回0;chk_chr()检测字符串中是否存在某个字符,存在则返回该字符。
FRESULT move_window (
FATFS *fs,
DWORD sector
)//简单阅读了一下源代码,应该是改变文件系统的当前工作扇区,如果想要操作的扇区就是当前扇区,什么事不做;如果不是,则将原扇区写回;如果是FAT表,还得写入备份区。
这个函数内部使用,外部无法引用。
FRESULT sync (
FATFS *fs
)//这个函数用于更新FAT32文件系统的FSI_Sector。什么含义还不太清楚。
DWORD get_fat (
FATFS *fs,
DWORD clst
)
if (move_window(fs, fsect + (clst / (SS(fs) / 4)))) break; 获取簇号码对应的FAT扇区
return LD_DWORD(&fs->win[((WORD)clst * 4) & (SS(fs) - 1)]) & 0x0FFFFFFF; //这个函数应该是获取簇的下一个连接簇。
综合起来,这个函数应该是获取下一簇,感觉这个函数名起得不太好。get_nextcluster感觉更好一点。
FRESULT put_fat (
FATFS *fs,
DWORD clst,
DWORD val
)//上个函数是获取连接簇,这个是写入新的连接信息。
FRESULT remove_chain (
FATFS *fs,
DWORD clst
)//将下一簇号写为0,也就是该文件的簇到此为止,同时系统的自由簇增加1.
DWORD create_chain (
FATFS *fs,
DWORD clst
)//跟上一个相反,在该簇的位置写入新的下一簇簇号。
DWORD clust2sect (
FATFS *fs,
DWORD clst
) //这个函数是将簇号转变为对应的扇区号。
clst * fs->csize + fs->database; //这个是算法
FRESULT dir_seek (
DIR *dj,
WORD idx
)//这个函数的最终目的是根据索引号找到目录项所在簇、所在扇区、并是目录对象的对象指针指向文件系统对象窗口扇区的对应位置。
FRESULT dir_next (
DIR *dj,
BOOL streach
)//
FRESULT dir_read (
DIR *dj
)
FRESULT dir_register (
DIR *dj
)
FRESULT dir_remove (
DIR *dj
)
//以上这些函数都是对目录项的操作函数。
FRESULT create_name (
DIR *dj,
const XCHAR **path )
//这个函数太长了,具体用到的时候再说吧。
void get_fileinfo (
DIR *dj,
FILINFO *fno )
该函数用于获取文件状态信息。主要是从文件的目录项中获取信息。
FRESULT follow_path (
DIR *dj,
const XCHAR *path
)
该函数给定一个全路径,得到相应的目录对象。
BYTE check_fs (
FATFS *fs,
DWORD sect )
该函数用于读取BOOT扇区,检查是否FAT文件系统。
FRESULT validate (
FATFS *fs,
WORD id
)//检查是否合法的文件系统。
FRESULT f_mount (
BYTE vol,
FATFS *fs )
这是一个很重要的函数,装载文件系统。也是从这个函数开始,对外输出供用户调用。
if (vol >= _DRIVES)现在只支持卷号0.
FatFs[vol] = fs;将参数文件系统对象指针赋给全局文件对象指针。