]> cloudbase.mooo.com Git - z180-stamp.git/blame - fatfs/source/ff.h
Import fatfs R0.15
[z180-stamp.git] / fatfs / source / ff.h
CommitLineData
70702af1 1/*----------------------------------------------------------------------------/\r
5630b930 2/ FatFs - Generic FAT Filesystem module R0.15 /\r
70702af1 3/-----------------------------------------------------------------------------/\r
53668523 4/\r
5630b930 5/ Copyright (C) 2022, ChaN, all right reserved.\r
53668523 6/\r
70702af1
L
7/ FatFs module is an open source software. Redistribution and use of FatFs in\r
8/ source and binary forms, with or without modification, are permitted provided\r
9/ that the following condition is met:\r
10\r
11/ 1. Redistributions of source code must retain the above copyright notice,\r
12/ this condition and the following disclaimer.\r
53668523 13/\r
70702af1
L
14/ This software is provided by the copyright holder and contributors "AS IS"\r
15/ and any warranties related to this software are DISCLAIMED.\r
16/ The copyright owner or contributors be NOT LIABLE for any damages caused\r
17/ by use of this software.\r
289f6a14 18/\r
53668523
L
19/----------------------------------------------------------------------------*/\r
20\r
70702af1 21\r
289f6a14 22#ifndef FF_DEFINED\r
5630b930 23#define FF_DEFINED 80286 /* Revision ID */\r
53668523
L
24\r
25#ifdef __cplusplus\r
26extern "C" {\r
27#endif\r
28\r
53668523 29#include "ffconf.h" /* FatFs configuration options */\r
70702af1 30\r
289f6a14 31#if FF_DEFINED != FFCONF_DEF\r
53668523
L
32#error Wrong configuration file (ffconf.h).\r
33#endif\r
34\r
35\r
5630b930
L
36/* Integer types used for FatFs API */\r
37\r
38#if defined(_WIN32) /* Windows VC++ (for development only) */\r
39#define FF_INTDEF 2\r
40#include <windows.h>\r
41typedef unsigned __int64 QWORD;\r
42#include <float.h>\r
43#define isnan(v) _isnan(v)\r
44#define isinf(v) (!_finite(v))\r
45\r
46#elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus) /* C99 or later */\r
47#define FF_INTDEF 2\r
48#include <stdint.h>\r
49typedef unsigned int UINT; /* int must be 16-bit or 32-bit */\r
50typedef unsigned char BYTE; /* char must be 8-bit */\r
51typedef uint16_t WORD; /* 16-bit unsigned integer */\r
52typedef uint32_t DWORD; /* 32-bit unsigned integer */\r
53typedef uint64_t QWORD; /* 64-bit unsigned integer */\r
54typedef WORD WCHAR; /* UTF-16 character type */\r
55\r
56#else /* Earlier than C99 */\r
57#define FF_INTDEF 1\r
58typedef unsigned int UINT; /* int must be 16-bit or 32-bit */\r
59typedef unsigned char BYTE; /* char must be 8-bit */\r
60typedef unsigned short WORD; /* 16-bit unsigned integer */\r
61typedef unsigned long DWORD; /* 32-bit unsigned integer */\r
62typedef WORD WCHAR; /* UTF-16 character type */\r
63#endif\r
53668523 64\r
53668523 65\r
5630b930 66/* Type of file size and LBA variables */\r
53668523 67\r
5630b930
L
68#if FF_FS_EXFAT\r
69#if FF_INTDEF != 2\r
70#error exFAT feature wants C99 or later\r
289f6a14 71#endif\r
5630b930
L
72typedef QWORD FSIZE_t;\r
73#if FF_LBA64\r
74typedef QWORD LBA_t;\r
75#else\r
76typedef DWORD LBA_t;\r
77#endif\r
78#else\r
79#if FF_LBA64\r
80#error exFAT needs to be enabled when enable 64-bit LBA\r
81#endif\r
82typedef DWORD FSIZE_t;\r
83typedef DWORD LBA_t;\r
53668523
L
84#endif\r
85\r
86\r
87\r
5630b930 88/* Type of path name strings on FatFs API (TCHAR) */\r
289f6a14
L
89\r
90#if FF_USE_LFN && FF_LFN_UNICODE == 1 /* Unicode in UTF-16 encoding */\r
53668523
L
91typedef WCHAR TCHAR;\r
92#define _T(x) L ## x\r
93#define _TEXT(x) L ## x\r
289f6a14
L
94#elif FF_USE_LFN && FF_LFN_UNICODE == 2 /* Unicode in UTF-8 encoding */\r
95typedef char TCHAR;\r
96#define _T(x) u8 ## x\r
97#define _TEXT(x) u8 ## x\r
98#elif FF_USE_LFN && FF_LFN_UNICODE == 3 /* Unicode in UTF-32 encoding */\r
99typedef DWORD TCHAR;\r
100#define _T(x) U ## x\r
101#define _TEXT(x) U ## x\r
102#elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3)\r
103#error Wrong FF_LFN_UNICODE setting\r
104#else /* ANSI/OEM code in SBCS/DBCS */\r
53668523
L
105typedef char TCHAR;\r
106#define _T(x) x\r
107#define _TEXT(x) x\r
108#endif\r
289f6a14 109\r
53668523 110\r
70702af1 111\r
5630b930 112/* Definitions of volume management */\r
70702af1 113\r
5630b930
L
114#if FF_MULTI_PARTITION /* Multiple partition configuration */\r
115typedef struct {\r
116 BYTE pd; /* Physical drive number */\r
117 BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */\r
118} PARTITION;\r
119extern PARTITION VolToPart[]; /* Volume - Partition mapping table */\r
120#endif\r
70702af1 121\r
5630b930
L
122#if FF_STR_VOLUME_ID\r
123#ifndef FF_VOLUME_STRS\r
124extern const char* VolumeStr[FF_VOLUMES]; /* User defied volume ID */\r
125#endif\r
53668523
L
126#endif\r
127\r
128\r
129\r
289f6a14 130/* Filesystem object structure (FATFS) */\r
53668523
L
131\r
132typedef struct {\r
5630b930
L
133 BYTE fs_type; /* Filesystem type (0:not mounted) */\r
134 BYTE pdrv; /* Volume hosting physical drive */\r
135 BYTE ldrv; /* Logical drive number (used only when FF_FS_REENTRANT) */\r
70702af1 136 BYTE n_fats; /* Number of FATs (1 or 2) */\r
5630b930
L
137 BYTE wflag; /* win[] status (b0:dirty) */\r
138 BYTE fsi_flag; /* FSINFO status (b7:disabled, b0:dirty) */\r
289f6a14 139 WORD id; /* Volume mount ID */\r
53668523 140 WORD n_rootdir; /* Number of root directory entries (FAT12/16) */\r
70702af1 141 WORD csize; /* Cluster size [sectors] */\r
289f6a14 142#if FF_MAX_SS != FF_MIN_SS\r
70702af1
L
143 WORD ssize; /* Sector size (512, 1024, 2048 or 4096) */\r
144#endif\r
289f6a14 145#if FF_USE_LFN\r
70702af1
L
146 WCHAR* lfnbuf; /* LFN working buffer */\r
147#endif\r
289f6a14
L
148#if FF_FS_EXFAT\r
149 BYTE* dirbuf; /* Directory entry block scratchpad buffer for exFAT */\r
53668523 150#endif\r
289f6a14 151#if !FF_FS_READONLY\r
70702af1
L
152 DWORD last_clst; /* Last allocated cluster */\r
153 DWORD free_clst; /* Number of free clusters */\r
53668523 154#endif\r
289f6a14 155#if FF_FS_RPATH\r
53668523 156 DWORD cdir; /* Current directory start cluster (0:root) */\r
289f6a14 157#if FF_FS_EXFAT\r
70702af1
L
158 DWORD cdc_scl; /* Containing directory start cluster (invalid when cdir is 0) */\r
159 DWORD cdc_size; /* b31-b8:Size of containing directory, b7-b0: Chain status */\r
160 DWORD cdc_ofs; /* Offset in the containing directory (invalid when cdir is 0) */\r
161#endif\r
53668523 162#endif\r
70702af1 163 DWORD n_fatent; /* Number of FAT entries (number of clusters + 2) */\r
5630b930
L
164 DWORD fsize; /* Number of sectors per FAT */\r
165 LBA_t volbase; /* Volume base sector */\r
166 LBA_t fatbase; /* FAT base sector */\r
167 LBA_t dirbase; /* Root directory base sector (FAT12/16) or cluster (FAT32/exFAT) */\r
168 LBA_t database; /* Data base sector */\r
169#if FF_FS_EXFAT\r
170 LBA_t bitbase; /* Allocation bitmap base sector */\r
171#endif\r
172 LBA_t winsect; /* Current sector appearing in the win[] */\r
289f6a14 173 BYTE win[FF_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */\r
53668523
L
174} FATFS;\r
175\r
176\r
177\r
289f6a14 178/* Object ID and allocation information (FFOBJID) */\r
70702af1
L
179\r
180typedef struct {\r
289f6a14 181 FATFS* fs; /* Pointer to the hosting volume of this object */\r
5630b930 182 WORD id; /* Hosting volume's mount ID */\r
289f6a14 183 BYTE attr; /* Object attribute */\r
5630b930 184 BYTE stat; /* Object chain status (b1-0: =0:not contiguous, =2:contiguous, =3:fragmented in this session, b2:sub-directory stretched) */\r
289f6a14
L
185 DWORD sclust; /* Object data start cluster (0:no cluster or root directory) */\r
186 FSIZE_t objsize; /* Object size (valid when sclust != 0) */\r
187#if FF_FS_EXFAT\r
188 DWORD n_cont; /* Size of first fragment - 1 (valid when stat == 3) */\r
189 DWORD n_frag; /* Size of last fragment needs to be written to FAT (valid when not zero) */\r
190 DWORD c_scl; /* Containing directory start cluster (valid when sclust != 0) */\r
191 DWORD c_size; /* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */\r
192 DWORD c_ofs; /* Offset in the containing directory (valid when file object and sclust != 0) */\r
70702af1 193#endif\r
289f6a14
L
194#if FF_FS_LOCK\r
195 UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */\r
70702af1 196#endif\r
289f6a14 197} FFOBJID;\r
70702af1
L
198\r
199\r
200\r
53668523
L
201/* File object structure (FIL) */\r
202\r
203typedef struct {\r
289f6a14 204 FFOBJID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */\r
70702af1 205 BYTE flag; /* File status flags */\r
53668523 206 BYTE err; /* Abort flag (error code) */\r
70702af1 207 FSIZE_t fptr; /* File read/write pointer (Zeroed on file open) */\r
289f6a14 208 DWORD clust; /* Current cluster of fpter (invalid when fptr is 0) */\r
5630b930 209 LBA_t sect; /* Sector number appearing in buf[] (0:invalid) */\r
289f6a14 210#if !FF_FS_READONLY\r
5630b930 211 LBA_t dir_sect; /* Sector number containing the directory entry (not used at exFAT) */\r
289f6a14 212 BYTE* dir_ptr; /* Pointer to the directory entry in the win[] (not used at exFAT) */\r
53668523 213#endif\r
289f6a14 214#if FF_USE_FASTSEEK\r
70702af1 215 DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */\r
53668523 216#endif\r
289f6a14
L
217#if !FF_FS_TINY\r
218 BYTE buf[FF_MAX_SS]; /* File private data read/write window */\r
53668523
L
219#endif\r
220} FIL;\r
221\r
222\r
223\r
224/* Directory object structure (DIR) */\r
225\r
226typedef struct {\r
289f6a14 227 FFOBJID obj; /* Object identifier */\r
70702af1 228 DWORD dptr; /* Current read/write offset */\r
53668523 229 DWORD clust; /* Current cluster */\r
5630b930 230 LBA_t sect; /* Current sector (0:Read operation has terminated) */\r
70702af1
L
231 BYTE* dir; /* Pointer to the directory item in the win[] */\r
232 BYTE fn[12]; /* SFN (in/out) {body[8],ext[3],status[1]} */\r
289f6a14 233#if FF_USE_LFN\r
70702af1 234 DWORD blk_ofs; /* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */\r
53668523 235#endif\r
289f6a14 236#if FF_USE_FIND\r
70702af1 237 const TCHAR* pat; /* Pointer to the name matching pattern */\r
53668523
L
238#endif\r
239} DIR;\r
240\r
241\r
242\r
70702af1 243/* File information structure (FILINFO) */\r
53668523
L
244\r
245typedef struct {\r
70702af1
L
246 FSIZE_t fsize; /* File size */\r
247 WORD fdate; /* Modified date */\r
248 WORD ftime; /* Modified time */\r
249 BYTE fattrib; /* File attribute */\r
289f6a14 250#if FF_USE_LFN\r
5630b930 251 TCHAR altname[FF_SFN_BUF + 1];/* Alternative file name */\r
289f6a14 252 TCHAR fname[FF_LFN_BUF + 1]; /* Primary file name */\r
70702af1 253#else\r
289f6a14 254 TCHAR fname[12 + 1]; /* File name */\r
53668523
L
255#endif\r
256} FILINFO;\r
257\r
258\r
259\r
5630b930
L
260/* Format parameter structure (MKFS_PARM) */\r
261\r
262typedef struct {\r
263 BYTE fmt; /* Format option (FM_FAT, FM_FAT32, FM_EXFAT and FM_SFD) */\r
264 BYTE n_fat; /* Number of FATs */\r
265 UINT align; /* Data area alignment (sector) */\r
266 UINT n_root; /* Number of root directory entries */\r
267 DWORD au_size; /* Cluster size (byte) */\r
268} MKFS_PARM;\r
269\r
270\r
271\r
53668523
L
272/* File function return code (FRESULT) */\r
273\r
274typedef enum {\r
275 FR_OK = 0, /* (0) Succeeded */\r
276 FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */\r
277 FR_INT_ERR, /* (2) Assertion failed */\r
278 FR_NOT_READY, /* (3) The physical drive cannot work */\r
279 FR_NO_FILE, /* (4) Could not find the file */\r
280 FR_NO_PATH, /* (5) Could not find the path */\r
281 FR_INVALID_NAME, /* (6) The path name format is invalid */\r
282 FR_DENIED, /* (7) Access denied due to prohibited access or directory full */\r
283 FR_EXIST, /* (8) Access denied due to prohibited access */\r
284 FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */\r
285 FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */\r
286 FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */\r
287 FR_NOT_ENABLED, /* (12) The volume has no work area */\r
288 FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */\r
70702af1 289 FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */\r
53668523
L
290 FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */\r
291 FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */\r
292 FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */\r
289f6a14 293 FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > FF_FS_LOCK */\r
53668523
L
294 FR_INVALID_PARAMETER /* (19) Given parameter is invalid */\r
295} FRESULT;\r
296\r
297\r
298\r
5630b930
L
299\r
300/*--------------------------------------------------------------*/\r
301/* FatFs Module Application Interface */\r
53668523 302/*--------------------------------------------------------------*/\r
53668523
L
303\r
304FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */\r
305FRESULT f_close (FIL* fp); /* Close an open file object */\r
70702af1
L
306FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from the file */\r
307FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to the file */\r
308FRESULT f_lseek (FIL* fp, FSIZE_t ofs); /* Move file pointer of the file object */\r
309FRESULT f_truncate (FIL* fp); /* Truncate the file */\r
310FRESULT f_sync (FIL* fp); /* Flush cached data of the writing file */\r
53668523
L
311FRESULT f_opendir (DIR* dp, const TCHAR* path); /* Open a directory */\r
312FRESULT f_closedir (DIR* dp); /* Close an open directory */\r
313FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */\r
70702af1
L
314FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */\r
315FRESULT f_findnext (DIR* dp, FILINFO* fno); /* Find next file */\r
53668523
L
316FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */\r
317FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */\r
318FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */\r
319FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */\r
70702af1
L
320FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of a file/dir */\r
321FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change timestamp of a file/dir */\r
53668523
L
322FRESULT f_chdir (const TCHAR* path); /* Change current directory */\r
323FRESULT f_chdrive (const TCHAR* path); /* Change current drive */\r
324FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */\r
325FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */\r
326FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn); /* Get volume label */\r
327FRESULT f_setlabel (const TCHAR* label); /* Set volume label */\r
70702af1 328FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */\r
5630b930 329FRESULT f_expand (FIL* fp, FSIZE_t fsz, BYTE opt); /* Allocate a contiguous block to the file */\r
53668523 330FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */\r
5630b930
L
331FRESULT f_mkfs (const TCHAR* path, const MKFS_PARM* opt, void* work, UINT len); /* Create a FAT volume */\r
332FRESULT f_fdisk (BYTE pdrv, const LBA_t ptbl[], void* work); /* Divide a physical drive into some partitions */\r
289f6a14 333FRESULT f_setcp (WORD cp); /* Set current code page */\r
53668523
L
334int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */\r
335int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */\r
336int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */\r
337TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */\r
338\r
5630b930
L
339/* Some API fucntions are implemented as macro */\r
340\r
70702af1 341#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize))\r
53668523
L
342#define f_error(fp) ((fp)->err)\r
343#define f_tell(fp) ((fp)->fptr)\r
70702af1
L
344#define f_size(fp) ((fp)->obj.objsize)\r
345#define f_rewind(fp) f_lseek((fp), 0)\r
346#define f_rewinddir(dp) f_readdir((dp), 0)\r
289f6a14
L
347#define f_rmdir(path) f_unlink(path)\r
348#define f_unmount(path) f_mount(0, path, 0)\r
53668523 349\r
53668523
L
350\r
351\r
352\r
353/*--------------------------------------------------------------*/\r
5630b930
L
354/* Additional Functions */\r
355/*--------------------------------------------------------------*/\r
53668523 356\r
5630b930 357/* RTC function (provided by user) */\r
289f6a14 358#if !FF_FS_READONLY && !FF_FS_NORTC\r
5630b930 359DWORD get_fattime (void); /* Get current time */\r
53668523
L
360#endif\r
361\r
5630b930
L
362\r
363/* LFN support functions (defined in ffunicode.c) */\r
364\r
365#if FF_USE_LFN >= 1\r
289f6a14
L
366WCHAR ff_oem2uni (WCHAR oem, WORD cp); /* OEM code to Unicode conversion */\r
367WCHAR ff_uni2oem (DWORD uni, WORD cp); /* Unicode to OEM code conversion */\r
368DWORD ff_wtoupper (DWORD uni); /* Unicode upper-case conversion */\r
369#endif\r
53668523 370\r
5630b930
L
371\r
372/* O/S dependent functions (samples available in ffsystem.c) */\r
373\r
374#if FF_USE_LFN == 3 /* Dynamic memory allocation */\r
375void* ff_memalloc (UINT msize); /* Allocate memory block */\r
376void ff_memfree (void* mblock); /* Free memory block */\r
377#endif\r
378#if FF_FS_REENTRANT /* Sync functions */\r
379int ff_mutex_create (int vol); /* Create a sync object */\r
380void ff_mutex_delete (int vol); /* Delete a sync object */\r
381int ff_mutex_take (int vol); /* Lock sync object */\r
382void ff_mutex_give (int vol); /* Unlock sync object */\r
53668523
L
383#endif\r
384\r
385\r
386\r
387\r
388/*--------------------------------------------------------------*/\r
5630b930
L
389/* Flags and Offset Address */\r
390/*--------------------------------------------------------------*/\r
53668523 391\r
70702af1 392/* File access mode and open method flags (3rd argument of f_open) */\r
53668523 393#define FA_READ 0x01\r
53668523 394#define FA_WRITE 0x02\r
70702af1 395#define FA_OPEN_EXISTING 0x00\r
53668523
L
396#define FA_CREATE_NEW 0x04\r
397#define FA_CREATE_ALWAYS 0x08\r
398#define FA_OPEN_ALWAYS 0x10\r
70702af1 399#define FA_OPEN_APPEND 0x30\r
53668523 400\r
70702af1
L
401/* Fast seek controls (2nd argument of f_lseek) */\r
402#define CREATE_LINKMAP ((FSIZE_t)0 - 1)\r
53668523 403\r
70702af1
L
404/* Format options (2nd argument of f_mkfs) */\r
405#define FM_FAT 0x01\r
406#define FM_FAT32 0x02\r
407#define FM_EXFAT 0x04\r
408#define FM_ANY 0x07\r
409#define FM_SFD 0x08\r
53668523 410\r
70702af1 411/* Filesystem type (FATFS.fs_type) */\r
53668523
L
412#define FS_FAT12 1\r
413#define FS_FAT16 2\r
414#define FS_FAT32 3\r
70702af1 415#define FS_EXFAT 4\r
53668523 416\r
70702af1 417/* File attribute bits for directory entry (FILINFO.fattrib) */\r
53668523
L
418#define AM_RDO 0x01 /* Read only */\r
419#define AM_HID 0x02 /* Hidden */\r
420#define AM_SYS 0x04 /* System */\r
53668523
L
421#define AM_DIR 0x10 /* Directory */\r
422#define AM_ARC 0x20 /* Archive */\r
53668523
L
423\r
424\r
53668523
L
425#ifdef __cplusplus\r
426}\r
427#endif\r
428\r
289f6a14 429#endif /* FF_DEFINED */\r