//本译文只供学习使用,未经作者许可,不得用于其它任何用途
//译者:xiaofeng
//修改日期:2013/03/19
//版本:V1.0
//版权所有,盗版必究。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 | /*---------------------------------------------------------------------------/ /FatFs-FATfilesystemmoduleincludefileR0.09a(C)ChaN,2012 /----------------------------------------------------------------------------/ /FatFsmoduleisagenericFATfilesystemmoduleforsmallembeddedsystems. /Thisisafreesoftwarethatopenedforeducation,researchandcommercial /developmentsunderlicensepolicyoffollowingterms. / /Copyright(C)2012,ChaN,allrightreserved. / /*TheFatFsmoduleisafreesoftwareandthereisNOWARRANTY. /*Norestrictiononuse.Youcanuse,modifyandredistributeitfor /personal,non-profitorcommercialproductUNDERYOURRESPONSIBILITY. /*Redistributionsofsourcecodemustretaintheabovecopyrightnotice. / /----------------------------------------------------------------------------*/
#ifndef_FATFS #define_FATFS4004/*版本IDRevisionID*/
#ifdef__cplusplus extern "C" { #endif
#include"integer.h"/*基本整数类型Basicintegertypes*/ #include"ffconf.h"/*FatFs配置选项FatFsconfigurationoptions*/
#if_FATFS!=_FFCONF #errorWrongconfigurationfile(ffconf.h). #endif
/*容量管理的定义Definitionsofvolumemanagement*/
#if_MULTI_PARTITION/*多分区配置Multiplepartitionconfiguration*/ typedef struct {
BYTE pd; /*物理驱动号Physicaldrivenumber*/
BYTE pt; /*分区:0:自动检测,1-4:强制分区Partition:0:Autodetect,1-4:Forcedpartition)*/ }PARTITION; extern PARTITIONVolToPart[]; /*卷分区解析表Volume-Partitionresolutiontable*/ #defineLD2PD(vol)(VolToPart[vol].pd)/*获取物理驱动号Getphysicaldrivenumber*/ #defineLD2PT(vol)(VolToPart[vol].pt)/*获取分区索引Getpartitionindex*/
#else/*单分区配置Singlepartitionconfiguration*/ #defineLD2PD(vol)(BYTE)(vol)/*每个逻辑驱动器都和一个物理驱动号对应Eachlogicaldriveisboundtothesamephysicaldrivenumber*/ #defineLD2PT(vol)0/*始终安装在第一分区或者SFDAlwaysmountsthe1stpartitionorinSFD*/
#endif
/*FatFsAPI路径名称字符串类型TypeofpathnamestringsonFatFsAPI*/
#if_LFN_UNICODE/*Unicodestring*/ #if!_USE_LFN #error_LFN_UNICODEmustbe0innon-LFNcfg. #endif #ifndef_INC_TCHAR typedef WCHAR TCHAR ; #define_T(x)L##x #define_TEXT(x)L##x #endif
#else/*ANSI/OEM字符串ANSI/OEMstring*/ #ifndef_INC_TCHAR typedef char TCHAR ; #define_T(x)x #define_TEXT(x)x #endif
#endif
/*文件系统对象结构Filesystemobjectstructure(FATFS)*/
typedef struct {
BYTE fs_type; /*FAT子类型(0:没安装)FATsub-type(0:Notmounted)*/
BYTE drv; /*物理驱动器号Physicaldrivenumber*/
BYTE csize; /*每簇的扇区数Sectorspercluster(1,2,4...128)*/
BYTE n_fats; /*文件配置表(FAT)的副本数NumberofFATcopies(1,2)*/
BYTE wflag; /*??win[]dirtyflag(1:mustbewrittenback)*/
BYTE fsi_flag; /*??fsinfodirtyflag(1:mustbewrittenback)*/
WORD id; /*文件系统安装IDFilesystemmountID*/
WORD n_rootdir; /*根目录的数量Numberofrootdirectoryentries(FAT12/16)*/ #if_MAX_SS!=512
WORD ssize; /*每扇区字节Bytespersector(512,1024,2048or4096)*/ #endif #if_FS_REENTRANT
_SYNC_tsobj; /*同步对象标识符Identifierofsyncobject*/ #endif #if!_FS_READONLY
DWORD last_clust; /*最后分配的簇Lastallocatedcluster*/
DWORD free_clust; /*多余的簇数Numberoffreeclusters*/
DWORD fsi_sector; /*fsinfosector(FAT32)*/ #endif #if_FS_RPATH
DWORD cdir; /*当前目录的起始簇(0根)Currentdirectorystartcluster(0:root)*/ #endif
DWORD n_fatent; /*文件配置表的数NumberofFATentries(=numberofclusters+2)*/
DWORD fsize; /*扇区的文档配置表SectorsperFAT*/
DWORD fatbase; /*文档配置表开始的扇区FATstartsector*/
DWORD dirbase; /*根目录开始的扇区Rootdirectorystartsector(FAT32:Cluster#)*/
DWORD database; /*数据开始的扇区Datastartsector*/
DWORD winsect; /*当前扇区出现在win[]Currentsectorappearinginthewin[]*/
BYTE win[_MAX_SS]; /*目录的磁盘访问窗口,文件配置表(和小的CFG数据)DiskaccesswindowforDirectory,FAT(andDataontinycfg)*/ }FATFS;
/*文件对象的结构Fileobjectstructure(FIL)*/
typedef struct {
FATFS*fs; /*对相关文件系统对象的指针Pointertotherelatedfilesystemobject*/
WORD id; /*相关的文件系统的文件系统挂载对象IDFilesystemmountIDoftherelatedfilesystemobject*/
BYTE flag; /*文件状态标志Filestatusflags*/
BYTE pad1;
DWORD fptr; /*文件的读/写指针Fileread/writepointer(0edonfileopen)*/
DWORD fsize; /*文件大小Filesize*/
DWORD sclust; /*文件数据的起始簇Filedatastartcluster(0:nodatacluster,always0whenfsizeis0)*/
DWORD clust; /*文件读写指针的当前簇Currentclusteroffpter*/
DWORD dsect; /*文件读写的当前数据扇区Currentdatasectoroffpter*/ #if!_FS_READONLY
DWORD dir_sect; /*扇区包含的目录条目Sectorcontainingthedirectoryentry*/
BYTE *dir_ptr; /*在窗口中的目录项的指针Pointertothedirectoryentryinthewindow*/ #endif #if_USE_FASTSEEK
DWORD *cltbl; /*链簇映射表指针Pointertotheclusterlinkmaptable(nullonfileopen)*/ #endif #if_FS_LOCK
UINT lockid; /*文件锁定IDFilelockID(indexoffilesemaphoretableFiles[])*/ #endif #if!_FS_TINY
BYTE buf[_MAX_SS]; /*文件数据读/写缓冲Filedataread/writebuffer*/ #endif }FIL;
/*目录结构对象Directoryobjectstructure(DIR)*/
typedef struct {
FATFS*fs; /*主文件系统对象的指针Pointertotheownerfilesystemobject*/
WORD id; /*主文件系统安装IDOwnerfilesystemmountID*/
WORD index; /*当前读写索引数Currentread/writeindexnumber*/
DWORD sclust; /*表的起始簇Tablestartcluster(0:Rootdir)*/
DWORD clust; /*当前簇Currentcluster*/
DWORD sect; /*当前扇区Currentsector*/
BYTE *dir; /*当前SFN指针在win[]PointertothecurrentSFNentryinthewin[]*/
BYTE *fn; /*SFN的指针PointertotheSFN(in/out){file[8],ext[3],status[1]}*/ #if_USE_LFN
WCHAR *lfn; /*LFN工作缓冲区指针PointertotheLFNworkingbuffer*/
WORD lfn_idx; /*最后匹配的LFN索引数LastmatchedLFNindexnumber(0xFFFF:NoLFN)*/ #endif }DIR;
/*文件状态结构Filestatusstructure(FILINFO)*/
typedef struct {
DWORD fsize; /*Filesize*/
WORD fdate; /*Lastmodifieddate*/
WORD ftime; /*Lastmodifiedtime*/
BYTE fattrib; /*Attribute*/
TCHAR fname[13]; /*Shortfilename(8.3format)*/ #if_USE_LFN
TCHAR *lfname; /*PointertotheLFNbuffer*/
UINT lfsize; /*SizeofLFNbufferinTCHAR*/ #endif }FILINFO;
/*文件函数的返回代码Filefunctionreturncode(FRESULT)*/
typedef enum {
FR_OK=0, /*(0)成功Succeeded*/
FR_DISK_ERR, /*(1)在低电平的磁盘I/O层发生硬件错误AharderroroccurredinthelowleveldiskI/Olayer*/
FR_INT_ERR, /*(2)使用错误Assertionfailed*/
FR_NOT_READY, /*(3)物理驱动器不工作Thephysicaldrivecannotwork*/
FR_NO_FILE, /*(4)找不到文件Couldnotfindthefile*/
FR_NO_PATH, /*(5)找不到路径Couldnotfindthepath*/
FR_INVALID_NAME, /*(6)路径名格式无效Thepathnameformatisinvalid*/
FR_DENIED, /*(7)访问拒绝由于禁止访问或者目录满Accessdeniedduetoprohibitedaccessordirectoryfull*/
FR_EXIST, /*(8)拒绝访问由于禁止访问Accessdeniedduetoprohibitedaccess*/
FR_INVALID_OBJECT, /*(9)文件/目录对象是无效的Thefile/directoryobjectisinvalid*/
FR_WRITE_PROTECTED, /*(10)物理驱动器写保护Thephysicaldriveiswriteprotected*/
FR_INVALID_DRIVE, /*(11)逻辑驱动器号无效Thelogicaldrivenumberisinvalid*/
FR_NOT_ENABLED, /*(12)卷没有工作空间Thevolumehasnoworkarea*/
FR_NO_FILESYSTEM, /*(13)没有可用的卷ThereisnovalidFATvolume*/
FR_MKFS_ABORTED, /*(14)f_mkfs()由于任何参数误差中止Thef_mkfs()abortedduetoanyparametererror*/
FR_TIMEOUT, /*(15)不能获得授权在规定的时间内访问卷Couldnotgetagranttoaccessthevolumewithindefinedperiod*/
FR_LOCKED, /*(16)操作被拒绝根据文件共享政策Theoperationisrejectedaccordingtothefilesharingpolicy*/
FR_NOT_ENOUGH_CORE, /*(17)LFN无法分配工作缓冲区LFNworkingbuffercouldnotbeallocated*/
FR_TOO_MANY_OPEN_FILES, /*(18)打开文件数大于FS_SHARENumberofopenfiles>_FS_SHARE*/
FR_INVALID_PARAMETER /*(19)给定的参数无效Givenparameterisinvalid*/ }FRESULT;
/*--------------------------------------------------------------*/ /*FatFs模块应用程序接口FatFsmoduleapplicationinterface*/
FRESULTf_mount( BYTE ,FATFS*); /*安装/卸载一个逻辑驱动器Mount/Unmountalogicaldrive*/ FRESULTf_open(FIL*, const TCHAR *, BYTE ); /*打开或创建一个文件Openorcreateafile*/ FRESULTf_read(FIL*, void *, UINT , UINT *); /*从文件中读取数据Readdatafromafile*/ FRESULTf_lseek(FIL*, DWORD ); /*改变一个文件对象文件指针Movefilepointerofafileobject*/ FRESULTf_close(FIL*); /*关闭打开的文件对象Closeanopenfileobject*/ FRESULTf_opendir(DIR*, const TCHAR *); /*打开一个已经存在的目录Openanexistingdirectory*/ FRESULTf_readdir(DIR*,FILINFO*); /*读一个目录项Readadirectoryitem*/ FRESULTf_stat( const TCHAR *,FILINFO*); /*获取文件状态Getfilestatus*/ FRESULTf_write(FIL*, const void *, UINT , UINT *); /*写数据到一个文件Writedatatoafile*/ FRESULTf_getfree( const TCHAR *, DWORD *,FATFS**); /*获取驱动器上的空闲簇数Getnumberoffreeclustersonthedrive*/ FRESULTf_truncate(FIL*); /*截断文件Truncatefile*/ FRESULTf_sync(FIL*); /*刷新正写入文件的缓存数据Flushcacheddataofawritingfile*/ FRESULTf_unlink( const TCHAR *); /*删除现有文件或目录Deleteanexistingfileordirectory*/ FRESULTf_mkdir( const TCHAR *); /*创建新目录Createanewdirectory*/ FRESULTf_chmod( const TCHAR *, BYTE , BYTE ); /*改变文件/目录属性Changeattributeofthefile/dir*/ FRESULTf_utime( const TCHAR *, const FILINFO*); /*改变文件/目录的时间戳Changetimes-tampofthefile/dir*/ FRESULTf_rename( const TCHAR *, const TCHAR *); /*重命名/移动文件或目录Rename/Moveafileordirectory*/ FRESULTf_chdrive( BYTE ); /*改变当前的驱动器Changecurrentdrive*/ FRESULTf_chdir( const TCHAR *); /*改变当前目录Changecurrentdirectory*/ FRESULTf_getcwd( TCHAR *, UINT ); /*获取当前目录Getcurrentdirectory*/ FRESULTf_forward(FIL*, UINT (*)( const BYTE *, UINT ), UINT , UINT *); /*向流发送数据Forwarddatatothestream*/ FRESULTf_mkfs( BYTE , BYTE , UINT ); /*创建一个驱动器上的文件系统Createafilesystemonthedrive*/ FRESULTf_fdisk( BYTE , const DWORD [], void *); /*将一个物理驱动器为若干分区Divideaphysicaldriveintosomepartitions*/ int f_putc( TCHAR ,FIL*); /*放一个字符在文件中Putacharactertothefile*/ int f_puts( const TCHAR *,FIL*); /*放一组字符串在文件中Putastringtothefile*/ int f_printf(FIL*, const TCHAR *,...); /*将格式化后的字符串的文件Putaformattedstringtothefile*/ TCHAR *f_gets( TCHAR *, int ,FIL*); /*从文件中获得字符串Getastringfromthefile*/
#definef_eof(fp)(((fp)->fptr==(fp)->fsize)?1:0) #definef_error(fp)(((fp)->flag&FA__ERROR)?1:0) #definef_tell(fp)((fp)->fptr) #definef_size(fp)((fp)->fsize)
#ifndefEOF #defineEOF(-1) #endif
/*--------------------------------------------------------------*/ /*额外的用户定义函数Additionaluserdefinedfunctions*/
/*RTC函数RTCfunction*/ #if!_FS_READONLY DWORD get_fattime( void ); #endif
/*Union支持函数Unicodesupportfunctions*/ #if_USE_LFN/*Unicode-OEM码转换Unicode-OEMcodeconversion*/ WCHAR ff_convert( WCHAR , UINT ); /*OEM-Unicode双向转换OEM-Unicodebidirectionalconversion*/ WCHAR ff_wtoupper( WCHAR ); /*Unicode大写转换Unicodeupper-caseconversion*/ #if_USE_LFN==3/*内存函数Memoryfunctions*/ void *ff_memalloc( UINT ); /*分配内存块Allocatememoryblock*/ void ff_memfree( void *); /*空闲内存块Freememoryblock*/ #endif #endif
/*同步函数Syncfunctions*/ #if_FS_REENTRANT int ff_cre_syncobj( BYTE ,_SYNC_t*); /*创建一个同步对象Createasyncobject*/ int ff_req_grant(_SYNC_t); /*锁同步对象Locksyncobject*/ void ff_rel_grant(_SYNC_t); /*解锁同步对象Unlocksyncobject*/ int ff_del_syncobj(_SYNC_t); /*D删除同步对象eleteasyncobject*/ #endif
/*--------------------------------------------------------------*/ /*标志和偏移地址Flagsandoffsetaddress*/
/*文件访问控制和文件状态标志Fileaccesscontrolandfilestatusflags(FIL.flag)*/
#defineFA_READ0x01 #defineFA_OPEN_EXISTING0x00 #defineFA__ERROR0x80
#if!_FS_READONLY #defineFA_WRITE0x02 #defineFA_CREATE_NEW0x04 #defineFA_CREATE_ALWAYS0x08 #defineFA_OPEN_ALWAYS0x10 #defineFA__WRITTEN0x20 #defineFA__DIRTY0x40 #endif
/*FAT副类型FATsubtype(FATFS.fs_type)*/
#defineFS_FAT121 #defineFS_FAT162 #defineFS_FAT323
/*目录项的文件属性字节Fileattributebitsfordirectoryentry*/
#defineAM_RDO0x01/*只读Readonly*/ #defineAM_HID0x02/*隐藏Hidden*/ #defineAM_SYS0x04/*系统System*/ #defineAM_VOL0x08/*卷标Volumelabel*/ #defineAM_LFN0x0F/*LFN项LFNentry*/ #defineAM_DIR0x10/*目录Directory*/ #defineAM_ARC0x20/*存档Archive*/ #defineAM_MASK0x3F/*掩码位Maskofdefinedbits*/
/*快速查找功能Fastseekfeature*/ #defineCREATE_LINKMAP0xFFFFFFFF
/*--------------------------------*/ /*多字节字访问宏Multi-bytewordaccessmacros*/
#if_WORD_ACCESS==1/*FAT结构使字访问EnablewordaccesstotheFATstructure*/ #defineLD_WORD(ptr)(WORD)(*(WORD*)(BYTE*)(ptr)) #defineLD_DWORD(ptr)(DWORD)(*(DWORD*)(BYTE*)(ptr)) #defineST_WORD(ptr,val)*(WORD*)(BYTE*)(ptr)=(WORD)(val) #defineST_DWORD(ptr,val)*(DWORD*)(BYTE*)(ptr)=(DWORD)(val) #else/*FAT结构用位访问Usebyte-by-byteaccesstotheFATstructure*/ #defineLD_WORD(ptr)(WORD)(((WORD)*((BYTE*)(ptr)+1)<<8)|(WORD)*(BYTE*)(ptr)) #defineLD_DWORD(ptr)(DWORD)(((DWORD)*((BYTE*)(ptr)+3)<<24)|((DWORD)*((BYTE*)(ptr)+2)<<16)|((WORD)*((BYTE*)(ptr)+1)<<8)|*(BYTE*)(ptr)) #defineST_WORD(ptr,val)*(BYTE*)(ptr)=(BYTE)(val);*((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8) #defineST_DWORD(ptr,val)*(BYTE*)(ptr)=(BYTE)(val);*((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8);*((BYTE*)(ptr)+2)=(BYTE)((DWORD)(val)>>16);*((BYTE*)(ptr)+3)=(BYTE)((DWORD)(val)>>24) #endif
#ifdef__cplusplus } #endif
#endif/*_FATFS*/ |