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 - Generic FAT Filesystem module R0.13a / 00003 /-----------------------------------------------------------------------------/ 00004 / 00005 / Copyright (C) 2017, ChaN, all right reserved. 00006 / 00007 / FatFs module is an open source software. Redistribution and use of FatFs in 00008 / source and binary forms, with or without modification, are permitted provided 00009 / that the following condition is met: 00010 00011 / 1. Redistributions of source code must retain the above copyright notice, 00012 / this condition and the following disclaimer. 00013 / 00014 / This software is provided by the copyright holder and contributors "AS IS" 00015 / and any warranties related to this software are DISCLAIMED. 00016 / The copyright owner or contributors be NOT LIABLE for any damages caused 00017 / by use of this software. 00018 / 00019 /----------------------------------------------------------------------------*/ 00020 00021 00022 #ifndef FF_DEFINED 00023 #define FF_DEFINED 89352 /* Revision ID */ 00024 00025 #ifdef __cplusplus 00026 extern "C" { 00027 #endif 00028 00029 #include "integer.h" /* Basic integer types */ 00030 #include "ffconf.h" /* FatFs configuration options */ 00031 00032 #if FF_DEFINED != FFCONF_DEF 00033 #error Wrong configuration file (ffconf.h). 00034 #endif 00035 00036 00037 00038 /* Definitions of volume management */ 00039 00040 #if FF_MULTI_PARTITION /* Multiple partition configuration */ 00041 typedef struct { 00042 BYTE pd; /* Physical drive number */ 00043 BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */ 00044 } PARTITION; 00045 extern PARTITION VolToPart[]; /* Volume - Partition resolution table */ 00046 #endif 00047 00048 00049 00050 /* Type of path name strings on FatFs API */ 00051 00052 #ifndef _INC_TCHAR 00053 #define _INC_TCHAR 00054 00055 #if FF_USE_LFN && FF_LFN_UNICODE == 1 /* Unicode in UTF-16 encoding */ 00056 typedef WCHAR TCHAR; 00057 #define _T(x) L ## x 00058 #define _TEXT(x) L ## x 00059 #elif FF_USE_LFN && FF_LFN_UNICODE == 2 /* Unicode in UTF-8 encoding */ 00060 typedef char TCHAR; 00061 #define _T(x) u8 ## x 00062 #define _TEXT(x) u8 ## x 00063 #elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 2) 00064 #error Wrong FF_LFN_UNICODE setting 00065 #else /* ANSI/OEM code in SBCS/DBCS */ 00066 typedef char TCHAR; 00067 #define _T(x) x 00068 #define _TEXT(x) x 00069 #endif 00070 00071 #endif 00072 00073 00074 00075 /* Type of file size variables */ 00076 00077 #if FF_FS_EXFAT 00078 typedef QWORD FSIZE_t; 00079 #else 00080 typedef DWORD FSIZE_t; 00081 #endif 00082 00083 00084 00085 /* Filesystem object structure (FATFS) */ 00086 00087 typedef struct { 00088 BYTE fs_type; /* Filesystem type (0:N/A) */ 00089 BYTE pdrv; /* Physical drive number */ 00090 BYTE n_fats; /* Number of FATs (1 or 2) */ 00091 BYTE wflag; /* win[] flag (b0:dirty) */ 00092 BYTE fsi_flag; /* FSINFO flags (b7:disabled, b0:dirty) */ 00093 WORD id; /* Volume mount ID */ 00094 WORD n_rootdir; /* Number of root directory entries (FAT12/16) */ 00095 WORD csize; /* Cluster size [sectors] */ 00096 #if FF_MAX_SS != FF_MIN_SS 00097 WORD ssize; /* Sector size (512, 1024, 2048 or 4096) */ 00098 #endif 00099 #if FF_USE_LFN 00100 WCHAR* lfnbuf; /* LFN working buffer */ 00101 #endif 00102 #if FF_FS_EXFAT 00103 BYTE* dirbuf; /* Directory entry block scratchpad buffer for exFAT */ 00104 #endif 00105 #if FF_FS_REENTRANT 00106 FF_SYNC_t sobj; /* Identifier of sync object */ 00107 #endif 00108 #if !FF_FS_READONLY 00109 DWORD last_clst; /* Last allocated cluster */ 00110 DWORD free_clst; /* Number of free clusters */ 00111 #endif 00112 #if FF_FS_RPATH 00113 DWORD cdir; /* Current directory start cluster (0:root) */ 00114 #if FF_FS_EXFAT 00115 DWORD cdc_scl; /* Containing directory start cluster (invalid when cdir is 0) */ 00116 DWORD cdc_size; /* b31-b8:Size of containing directory, b7-b0: Chain status */ 00117 DWORD cdc_ofs; /* Offset in the containing directory (invalid when cdir is 0) */ 00118 #endif 00119 #endif 00120 DWORD n_fatent; /* Number of FAT entries (number of clusters + 2) */ 00121 DWORD fsize; /* Size of an FAT [sectors] */ 00122 DWORD volbase; /* Volume base sector */ 00123 DWORD fatbase; /* FAT base sector */ 00124 DWORD dirbase; /* Root directory base sector/cluster */ 00125 DWORD database; /* Data base sector */ 00126 DWORD winsect; /* Current sector appearing in the win[] */ 00127 #if FF_FS_HEAPBUF 00128 BYTE *win; /* Disk access window for Directory, FAT (and file data at tiny cfg) */ 00129 #else 00130 BYTE win[FF_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */ 00131 #endif 00132 } FATFS; 00133 00134 00135 00136 /* Object ID and allocation information (FFOBJID) */ 00137 00138 typedef struct { 00139 FATFS* fs; /* Pointer to the hosting volume of this object */ 00140 WORD id; /* Hosting volume mount ID */ 00141 BYTE attr; /* Object attribute */ 00142 BYTE stat; /* Object chain status (b1-0: =0:not contiguous, =2:contiguous, =3:flagmented in this session, b2:sub-directory stretched) */ 00143 DWORD sclust; /* Object data start cluster (0:no cluster or root directory) */ 00144 FSIZE_t objsize; /* Object size (valid when sclust != 0) */ 00145 #if FF_FS_EXFAT 00146 DWORD n_cont; /* Size of first fragment - 1 (valid when stat == 3) */ 00147 DWORD n_frag; /* Size of last fragment needs to be written to FAT (valid when not zero) */ 00148 DWORD c_scl; /* Containing directory start cluster (valid when sclust != 0) */ 00149 DWORD c_size; /* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */ 00150 DWORD c_ofs; /* Offset in the containing directory (valid when file object and sclust != 0) */ 00151 #endif 00152 #if FF_FS_LOCK 00153 UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */ 00154 #endif 00155 } FFOBJID; 00156 00157 00158 00159 /* File object structure (FIL) */ 00160 00161 typedef struct { 00162 FFOBJID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */ 00163 BYTE flag; /* File status flags */ 00164 BYTE err; /* Abort flag (error code) */ 00165 FSIZE_t fptr; /* File read/write pointer (Zeroed on file open) */ 00166 DWORD clust; /* Current cluster of fpter (invalid when fptr is 0) */ 00167 DWORD sect; /* Sector number appearing in buf[] (0:invalid) */ 00168 #if !FF_FS_READONLY 00169 DWORD dir_sect; /* Sector number containing the directory entry (not used at exFAT) */ 00170 BYTE* dir_ptr; /* Pointer to the directory entry in the win[] (not used at exFAT) */ 00171 #endif 00172 #if FF_USE_FASTSEEK 00173 DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */ 00174 #endif 00175 #if !FF_FS_TINY 00176 #if FF_FS_HEAPBUF 00177 BYTE *buf; /* File private data read/write window */ 00178 #else 00179 BYTE buf[FF_MAX_SS]; /* File private data read/write window */ 00180 #endif 00181 #endif 00182 } FIL; 00183 00184 00185 00186 /* Directory object structure (FATFS_DIR) */ 00187 00188 typedef struct { 00189 FFOBJID obj; /* Object identifier */ 00190 DWORD dptr; /* Current read/write offset */ 00191 DWORD clust; /* Current cluster */ 00192 DWORD sect; /* Current sector (0:Read operation has terminated) */ 00193 BYTE* dir; /* Pointer to the directory item in the win[] */ 00194 BYTE fn[12]; /* SFN (in/out) {body[8],ext[3],status[1]} */ 00195 #if FF_USE_LFN 00196 DWORD blk_ofs; /* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */ 00197 #endif 00198 #if FF_USE_FIND 00199 const TCHAR* pat; /* Pointer to the name matching pattern */ 00200 #endif 00201 } FATFS_DIR; 00202 00203 00204 00205 /* File information structure (FILINFO) */ 00206 00207 typedef struct { 00208 FSIZE_t fsize; /* File size */ 00209 WORD fdate; /* Modified date */ 00210 WORD ftime; /* Modified time */ 00211 BYTE fattrib; /* File attribute */ 00212 #if FF_USE_LFN 00213 TCHAR altname[FF_SFN_BUF + 1];/* Altenative file name */ 00214 TCHAR fname[FF_LFN_BUF + 1]; /* Primary file name */ 00215 #else 00216 TCHAR fname[12 + 1]; /* File name */ 00217 #endif 00218 } FILINFO; 00219 00220 00221 00222 /* File function return code (FRESULT) */ 00223 00224 typedef enum { 00225 FR_OK = 0, /* (0) Succeeded */ 00226 FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */ 00227 FR_INT_ERR, /* (2) Assertion failed */ 00228 FR_NOT_READY, /* (3) The physical drive cannot work */ 00229 FR_NO_FILE, /* (4) Could not find the file */ 00230 FR_NO_PATH, /* (5) Could not find the path */ 00231 FR_INVALID_NAME, /* (6) The path name format is invalid */ 00232 FR_DENIED, /* (7) Access denied due to prohibited access or directory full */ 00233 FR_EXIST, /* (8) Access denied due to prohibited access */ 00234 FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */ 00235 FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */ 00236 FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */ 00237 FR_NOT_ENABLED, /* (12) The volume has no work area */ 00238 FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */ 00239 FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */ 00240 FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */ 00241 FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */ 00242 FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */ 00243 FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */ 00244 FR_INVALID_PARAMETER /* (19) Given parameter is invalid */ 00245 } FRESULT; 00246 00247 00248 00249 /*--------------------------------------------------------------*/ 00250 /* FatFs module application interface */ 00251 00252 FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */ 00253 FRESULT f_close (FIL* fp); /* Close an open file object */ 00254 FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from the file */ 00255 FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to the file */ 00256 FRESULT f_lseek (FIL* fp, FSIZE_t ofs); /* Move file pointer of the file object */ 00257 FRESULT f_truncate (FIL* fp); /* Truncate the file */ 00258 FRESULT f_sync (FIL* fp); /* Flush cached data of the writing file */ 00259 FRESULT f_opendir (FATFS_DIR* dp, const TCHAR* path); /* Open a directory */ 00260 FRESULT f_closedir (FATFS_DIR* dp); /* Close an open directory */ 00261 FRESULT f_readdir (FATFS_DIR* dp, FILINFO* fno); /* Read a directory item */ 00262 FRESULT f_findfirst (FATFS_DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */ 00263 FRESULT f_findnext (FATFS_DIR* dp, FILINFO* fno); /* Find next file */ 00264 FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */ 00265 FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */ 00266 FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */ 00267 FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */ 00268 FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of a file/dir */ 00269 FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change timestamp of a file/dir */ 00270 FRESULT f_chdir (const TCHAR* path); /* Change current directory */ 00271 FRESULT f_chdrive (const TCHAR* path); /* Change current drive */ 00272 FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */ 00273 FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */ 00274 FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn); /* Get volume label */ 00275 FRESULT f_setlabel (const TCHAR* label); /* Set volume label */ 00276 FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */ 00277 FRESULT f_expand (FIL* fp, FSIZE_t szf, BYTE opt); /* Allocate a contiguous block to the file */ 00278 FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */ 00279 FRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len); /* Create a FAT volume */ 00280 FRESULT f_fdisk (BYTE pdrv, const DWORD* szt, void* work); /* Divide a physical drive into some partitions */ 00281 FRESULT f_setcp (WORD cp); /* Set current code page */ 00282 int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */ 00283 int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */ 00284 int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */ 00285 TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */ 00286 00287 #define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize)) 00288 #define f_error(fp) ((fp)->err) 00289 #define f_tell(fp) ((fp)->fptr) 00290 #define f_size(fp) ((fp)->obj.objsize) 00291 #define f_rewind(fp) f_lseek((fp), 0) 00292 #define f_rewinddir(dp) f_readdir((dp), 0) 00293 #define f_rmdir(path) f_unlink(path) 00294 #define f_unmount(path) f_mount(0, path, 0) 00295 00296 #ifndef EOF 00297 #define EOF (-1) 00298 #endif 00299 00300 00301 00302 00303 /*--------------------------------------------------------------*/ 00304 /* Additional user defined functions */ 00305 00306 /* RTC function */ 00307 #if !FF_FS_READONLY && !FF_FS_NORTC 00308 DWORD get_fattime (void); 00309 #endif 00310 00311 /* LFN support functions */ 00312 #if FF_USE_LFN >= 1 /* Code conversion (defined in unicode.c) */ 00313 WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */ 00314 WCHAR ff_uni2oem (DWORD uni, WORD cp); /* Unicode to OEM code conversion */ 00315 DWORD ff_wtoupper (DWORD uni); /* Unicode upper-case conversion */ 00316 #endif 00317 #if FF_USE_LFN == 3 || FF_FS_HEAPBUF /* Dynamic memory allocation */ 00318 void* ff_memalloc (UINT msize); /* Allocate memory block */ 00319 void ff_memfree (void* mblock); /* Free memory block */ 00320 #endif 00321 00322 /* Sync functions */ 00323 #if FF_FS_REENTRANT 00324 int ff_cre_syncobj (BYTE vol, FF_SYNC_t* sobj); /* Create a sync object */ 00325 int ff_req_grant (FF_SYNC_t sobj); /* Lock sync object */ 00326 void ff_rel_grant (FF_SYNC_t sobj); /* Unlock sync object */ 00327 int ff_del_syncobj (FF_SYNC_t sobj); /* Delete a sync object */ 00328 #endif 00329 00330 00331 00332 00333 /*--------------------------------------------------------------*/ 00334 /* Flags and offset address */ 00335 00336 00337 /* File access mode and open method flags (3rd argument of f_open) */ 00338 #define FA_READ 0x01 00339 #define FA_WRITE 0x02 00340 #define FA_OPEN_EXISTING 0x00 00341 #define FA_CREATE_NEW 0x04 00342 #define FA_CREATE_ALWAYS 0x08 00343 #define FA_OPEN_ALWAYS 0x10 00344 #define FA_OPEN_APPEND 0x30 00345 00346 /* Fast seek controls (2nd argument of f_lseek) */ 00347 #define CREATE_LINKMAP ((FSIZE_t)0 - 1) 00348 00349 /* Format options (2nd argument of f_mkfs) */ 00350 #define FM_FAT 0x01 00351 #define FM_FAT32 0x02 00352 #define FM_EXFAT 0x04 00353 #define FM_ANY 0x07 00354 #define FM_SFD 0x08 00355 00356 /* Filesystem type (FATFS.fs_type) */ 00357 #define FS_FAT12 1 00358 #define FS_FAT16 2 00359 #define FS_FAT32 3 00360 #define FS_EXFAT 4 00361 00362 /* File attribute bits for directory entry (FILINFO.fattrib) */ 00363 #define AM_RDO 0x01 /* Read only */ 00364 #define AM_HID 0x02 /* Hidden */ 00365 #define AM_SYS 0x04 /* System */ 00366 #define AM_DIR 0x10 /* Directory */ 00367 #define AM_ARC 0x20 /* Archive */ 00368 00369 00370 #ifdef __cplusplus 00371 } 00372 #endif 00373 00374 #endif /* FF_DEFINED */
Generated on Tue Jul 12 2022 12:44:04 by
