Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ff.h
00001 /*---------------------------------------------------------------------------/ 00002 / FatFs - FAT file system module include file R0.09 (C)ChaN, 2011 00003 /----------------------------------------------------------------------------/ 00004 / FatFs module is a generic FAT file system module for small embedded systems. 00005 / This is a free software that opened for education, research and commercial 00006 / developments under license policy of following trems. 00007 / 00008 / Copyright (C) 2011, ChaN, all right reserved. 00009 / 00010 / * The FatFs module is a free software and there is NO WARRANTY. 00011 / * No restriction on use. You can use, modify and redistribute it for 00012 / personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. 00013 / * Redistributions of source code must retain the above copyright notice. 00014 / 00015 /----------------------------------------------------------------------------*/ 00016 00017 #ifndef _FATFS 00018 #define _FATFS 6502 /* Revision ID */ 00019 00020 #ifdef __cplusplus 00021 extern "C" { 00022 #endif 00023 00024 #include "integer.h" /* Basic integer types */ 00025 #include "ffconf.h" /* FatFs configuration options */ 00026 00027 00028 #if _FATFS != _FFCONF 00029 #error Wrong configuration file (ffconf.h). 00030 #endif 00031 00032 00033 00034 /* Definitions of volume management */ 00035 00036 #if _MULTI_PARTITION /* Multiple partition configuration */ 00037 typedef struct { 00038 BYTE pd; /* Physical drive number */ 00039 BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */ 00040 } PARTITION; 00041 extern PARTITION VolToPart[]; /* Volume - Partition resolution table */ 00042 #define LD2PD(vol) (VolToPart[vol].pd) /* Get physical drive number */ 00043 #define LD2PT(vol) (VolToPart[vol].pt) /* Get partition index */ 00044 00045 #else /* Single partition configuration */ 00046 #define LD2PD(vol) (vol) /* Each logical drive is bound to the same physical drive number */ 00047 #define LD2PT(vol) 0 /* Always mounts the 1st partition or in SFD */ 00048 00049 #endif 00050 00051 00052 00053 /* Type of path name strings on FatFs API */ 00054 00055 #if _LFN_UNICODE /* Unicode string */ 00056 #if !_USE_LFN 00057 #error _LFN_UNICODE must be 0 in non-LFN cfg. 00058 #endif 00059 #ifndef _INC_TCHAR 00060 typedef WCHAR TCHAR; 00061 #define _T(x) L ## x 00062 #define _TEXT(x) L ## x 00063 #endif 00064 00065 #else /* ANSI/OEM string */ 00066 #ifndef _INC_TCHAR 00067 typedef char TCHAR; 00068 #define _T(x) x 00069 #define _TEXT(x) x 00070 #endif 00071 00072 #endif 00073 00074 00075 00076 /* File system object structure (FATFS) */ 00077 00078 typedef struct { 00079 BYTE fs_type; /* FAT sub-type (0:Not mounted) */ 00080 BYTE drv; /* Physical drive number */ 00081 BYTE csize; /* Sectors per cluster (1,2,4...128) */ 00082 BYTE n_fats; /* Number of FAT copies (1,2) */ 00083 BYTE wflag; /* win[] dirty flag (1:must be written back) */ 00084 BYTE fsi_flag; /* fsinfo dirty flag (1:must be written back) */ 00085 WORD id; /* File system mount ID */ 00086 WORD n_rootdir; /* Number of root directory entries (FAT12/16) */ 00087 #if _MAX_SS != 512 00088 WORD ssize; /* Bytes per sector (512, 1024, 2048 or 4096) */ 00089 #endif 00090 #if _FS_REENTRANT 00091 _SYNC_t sobj; /* Identifier of sync object */ 00092 #endif 00093 #if !_FS_READONLY 00094 DWORD last_clust; /* Last allocated cluster */ 00095 DWORD free_clust; /* Number of free clusters */ 00096 DWORD fsi_sector; /* fsinfo sector (FAT32) */ 00097 #endif 00098 #if _FS_RPATH 00099 DWORD cdir; /* Current directory start cluster (0:root) */ 00100 #endif 00101 DWORD n_fatent; /* Number of FAT entries (= number of clusters + 2) */ 00102 DWORD fsize; /* Sectors per FAT */ 00103 DWORD fatbase; /* FAT start sector */ 00104 DWORD dirbase; /* Root directory start sector (FAT32:Cluster#) */ 00105 DWORD database; /* Data start sector */ 00106 DWORD winsect; /* Current sector appearing in the win[] */ 00107 BYTE win[_MAX_SS]; /* Disk access window for Directory, FAT (and Data on tiny cfg) */ 00108 } FATFS; 00109 00110 00111 00112 /* File object structure (FIL) */ 00113 00114 typedef struct { 00115 FATFS* fs; /* Pointer to the owner file system object */ 00116 WORD id; /* Owner file system mount ID */ 00117 BYTE flag; /* File status flags */ 00118 BYTE pad1; 00119 DWORD fptr; /* File read/write pointer (0 on file open) */ 00120 DWORD fsize; /* File size */ 00121 DWORD sclust; /* File start cluster (0 when fsize==0) */ 00122 DWORD clust; /* Current cluster */ 00123 DWORD dsect; /* Current data sector */ 00124 #if !_FS_READONLY 00125 DWORD dir_sect; /* Sector containing the directory entry */ 00126 BYTE* dir_ptr; /* Ponter to the directory entry in the window */ 00127 #endif 00128 #if _USE_FASTSEEK 00129 DWORD* cltbl; /* Pointer to the cluster link map table (null on file open) */ 00130 #endif 00131 #if _FS_SHARE 00132 UINT lockid; /* File lock ID (index of file semaphore table) */ 00133 #endif 00134 #if !_FS_TINY 00135 BYTE buf[_MAX_SS]; /* File data read/write buffer */ 00136 #endif 00137 } FIL; 00138 00139 00140 00141 /* Directory object structure (DIR) */ 00142 00143 typedef struct { 00144 FATFS* fs; /* Pointer to the owner file system object */ 00145 WORD id; /* Owner file system mount ID */ 00146 WORD index; /* Current read/write index number */ 00147 DWORD sclust; /* Table start cluster (0:Root dir) */ 00148 DWORD clust; /* Current cluster */ 00149 DWORD sect; /* Current sector */ 00150 BYTE* dir; /* Pointer to the current SFN entry in the win[] */ 00151 BYTE* fn; /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */ 00152 #if _USE_LFN 00153 WCHAR* lfn; /* Pointer to the LFN working buffer */ 00154 WORD lfn_idx; /* Last matched LFN index number (0xFFFF:No LFN) */ 00155 #endif 00156 } eDIR; 00157 00158 00159 00160 /* File status structure (FILINFO) */ 00161 00162 typedef struct { 00163 DWORD fsize; /* File size */ 00164 WORD fdate; /* Last modified date */ 00165 WORD ftime; /* Last modified time */ 00166 BYTE fattrib; /* Attribute */ 00167 TCHAR fname[13]; /* Short file name (8.3 format) */ 00168 #if _USE_LFN 00169 TCHAR* lfname; /* Pointer to the LFN buffer */ 00170 UINT lfsize; /* Size of LFN buffer in TCHAR */ 00171 #endif 00172 } FILINFO; 00173 00174 00175 00176 /* File function return code (FRESULT) */ 00177 00178 typedef enum { 00179 FR_OK = 0, /* (0) Succeeded */ 00180 FR_DISK_ERR, /* (1) A hard error occured in the low level disk I/O layer */ 00181 FR_INT_ERR, /* (2) Assertion failed */ 00182 FR_NOT_READY, /* (3) The physical drive cannot work */ 00183 FR_NO_FILE, /* (4) Could not find the file */ 00184 FR_NO_PATH, /* (5) Could not find the path */ 00185 FR_INVALID_NAME, /* (6) The path name format is invalid */ 00186 FR_DENIED, /* (7) Acces denied due to prohibited access or directory full */ 00187 FR_EXIST, /* (8) Acces denied due to prohibited access */ 00188 FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ 00189 FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ 00190 FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ 00191 FR_NOT_ENABLED, /* (12) The volume has no work area */ 00192 FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ 00193 FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any parameter error */ 00194 FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ 00195 FR_LOCKED, /* (16) The operation is rejected according to the file shareing policy */ 00196 FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ 00197 FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_SHARE */ 00198 FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ 00199 } FRESULT; 00200 00201 00202 00203 /*--------------------------------------------------------------*/ 00204 /* FatFs module application interface */ 00205 00206 FRESULT f_mount (BYTE, FATFS*); /* Mount/Unmount a logical drive */ 00207 FRESULT f_open (FIL*, const TCHAR*, BYTE); /* Open or create a file */ 00208 FRESULT f_read (FIL*, void*, UINT, UINT*); /* Read data from a file */ 00209 FRESULT f_lseek (FIL*, DWORD); /* Move file pointer of a file object */ 00210 FRESULT f_close (FIL*); /* Close an open file object */ 00211 FRESULT f_opendir (eDIR*, const TCHAR*); /* Open an existing directory */ 00212 FRESULT f_readdir (eDIR*, FILINFO*); /* Read a directory item */ 00213 FRESULT f_stat (const TCHAR*, FILINFO*); /* Get file status */ 00214 FRESULT f_write (FIL*, const void*, UINT, UINT*); /* Write data to a file */ 00215 FRESULT f_getfree (const TCHAR*, DWORD*, FATFS**); /* Get number of free clusters on the drive */ 00216 FRESULT f_truncate (FIL*); /* Truncate file */ 00217 FRESULT f_sync (FIL*); /* Flush cached data of a writing file */ 00218 FRESULT f_unlink (const TCHAR*); /* Delete an existing file or directory */ 00219 FRESULT f_mkdir (const TCHAR*); /* Create a new directory */ 00220 FRESULT f_chmod (const TCHAR*, BYTE, BYTE); /* Change attriburte of the file/dir */ 00221 FRESULT f_utime (const TCHAR*, const FILINFO*); /* Change timestamp of the file/dir */ 00222 FRESULT f_rename (const TCHAR*, const TCHAR*); /* Rename/Move a file or directory */ 00223 FRESULT f_chdrive (BYTE); /* Change current drive */ 00224 FRESULT f_chdir (const TCHAR*); /* Change current directory */ 00225 FRESULT f_getcwd (TCHAR*, UINT); /* Get current directory */ 00226 FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream */ 00227 FRESULT f_mkfs (BYTE, BYTE, UINT); /* Create a file system on the drive */ 00228 FRESULT f_fdisk (BYTE, const DWORD[], void*); /* Divide a physical drive into some partitions */ 00229 int f_putc (TCHAR, FIL*); /* Put a character to the file */ 00230 int f_puts (const TCHAR*, FIL*); /* Put a string to the file */ 00231 int f_printf (FIL*, const TCHAR*, ...); /* Put a formatted string to the file */ 00232 TCHAR* f_gets (TCHAR*, int, FIL*); /* Get a string from the file */ 00233 00234 #define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0) 00235 #define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0) 00236 #define f_tell(fp) ((fp)->fptr) 00237 #define f_size(fp) ((fp)->fsize) 00238 00239 #ifndef EOF 00240 #define EOF (-1) 00241 #endif 00242 00243 00244 00245 00246 /*--------------------------------------------------------------*/ 00247 /* Additional user defined functions */ 00248 00249 /* RTC function */ 00250 #if !_FS_READONLY 00251 //DWORD get_fattime (void); 00252 #endif 00253 00254 /* Unicode support functions */ 00255 #if _USE_LFN /* Unicode - OEM code conversion */ 00256 WCHAR ff_convert (WCHAR, UINT); /* OEM-Unicode bidirectional conversion */ 00257 WCHAR ff_wtoupper (WCHAR); /* Unicode upper-case conversion */ 00258 #if _USE_LFN == 3 /* Memory functions */ 00259 void* ff_memalloc (UINT); /* Allocate memory block */ 00260 void ff_memfree (void*); /* Free memory block */ 00261 #endif 00262 #endif 00263 00264 /* Sync functions */ 00265 #if _FS_REENTRANT 00266 int ff_cre_syncobj (BYTE, _SYNC_t*);/* Create a sync object */ 00267 int ff_req_grant (_SYNC_t); /* Lock sync object */ 00268 void ff_rel_grant (_SYNC_t); /* Unlock sync object */ 00269 int ff_del_syncobj (_SYNC_t); /* Delete a sync object */ 00270 #endif 00271 00272 00273 00274 00275 /*--------------------------------------------------------------*/ 00276 /* Flags and offset address */ 00277 00278 00279 /* File access control and file status flags (FIL.flag) */ 00280 00281 #define FA_READ 0x01 00282 #define FA_OPEN_EXISTING 0x00 00283 #define FA__ERROR 0x80 00284 00285 #if !_FS_READONLY 00286 #define FA_WRITE 0x02 00287 #define FA_CREATE_NEW 0x04 00288 #define FA_CREATE_ALWAYS 0x08 00289 #define FA_OPEN_ALWAYS 0x10 00290 #define FA__WRITTEN 0x20 00291 #define FA__DIRTY 0x40 00292 #endif 00293 00294 00295 /* FAT sub type (FATFS.fs_type) */ 00296 00297 #define FS_FAT12 1 00298 #define FS_FAT16 2 00299 #define FS_FAT32 3 00300 00301 00302 /* File attribute bits for directory entry */ 00303 00304 #define AM_RDO 0x01 /* Read only */ 00305 #define AM_HID 0x02 /* Hidden */ 00306 #define AM_SYS 0x04 /* System */ 00307 #define AM_VOL 0x08 /* Volume label */ 00308 #define AM_LFN 0x0F /* LFN entry */ 00309 #define AM_DIR 0x10 /* Directory */ 00310 #define AM_ARC 0x20 /* Archive */ 00311 #define AM_MASK 0x3F /* Mask of defined bits */ 00312 00313 00314 /* Fast seek feature */ 00315 #define CREATE_LINKMAP 0xFFFFFFFF 00316 00317 00318 00319 /*--------------------------------*/ 00320 /* Multi-byte word access macros */ 00321 00322 #if _WORD_ACCESS == 1 /* Enable word access to the FAT structure */ 00323 #define LD_WORD(ptr) (WORD)(*(WORD*)(BYTE*)(ptr)) 00324 #define LD_DWORD(ptr) (DWORD)(*(DWORD*)(BYTE*)(ptr)) 00325 #define ST_WORD(ptr,val) *(WORD*)(BYTE*)(ptr)=(WORD)(val) 00326 #define ST_DWORD(ptr,val) *(DWORD*)(BYTE*)(ptr)=(DWORD)(val) 00327 #else /* Use byte-by-byte access to the FAT structure */ 00328 #define LD_WORD(ptr) (WORD)(((WORD)*((BYTE*)(ptr)+1)<<8)|(WORD)*(BYTE*)(ptr)) 00329 #define LD_DWORD(ptr) (DWORD)(((DWORD)*((BYTE*)(ptr)+3)<<24)|((DWORD)*((BYTE*)(ptr)+2)<<16)|((WORD)*((BYTE*)(ptr)+1)<<8)|*(BYTE*)(ptr)) 00330 #define ST_WORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8) 00331 #define ST_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) 00332 #endif 00333 00334 #ifdef __cplusplus 00335 } 00336 #endif 00337 00338 #endif /* _FATFS */
Generated on Sat Jul 16 2022 22:22:09 by
1.7.2