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
46
47
56
57
63
64
65
66
67
68
69
78
79
84
85
86
87
88
89
90
91
94
95
98
99
102
103
104
105
108
109
110
111
112
113
114
115
120
121
122
123
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
154
155
156
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
217
218
219
220
221
222
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
261
262
263
264
265
266
267
268
269
270
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
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
377
378
379
380
381
382
383
385
386
387
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
/* ... */
#ifndef FF_DEFINED
#define FF_DEFINED 80286
#ifdef __cplusplus
extern "C" {
#endif
#include "ffconf.h"
#if FF_DEFINED != FFCONF_DEF
#error Wrong configuration file (ffconf.h).
#endif
#if defined(_WIN32)
#define FF_INTDEF 2
#include <windows.h>
typedef unsigned __int64 QWORD;
#include <float.h>
#define isnan(v) _isnan(v)
#define isinf(v) (!_finite(v))
/* ... */
#elif (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus)
#define FF_INTDEF 2
#include <stdint.h>
typedef unsigned int UINT;
typedef unsigned char BYTE;
typedef uint16_t WORD;
typedef uint32_t DWORD;
typedef uint64_t QWORD;
typedef WORD WCHAR;
/* ... */
#else
#define FF_INTDEF 1
typedef unsigned int UINT;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef WORD WCHAR; /* ... */
#endif
#if FF_FS_EXFAT
#if FF_INTDEF != 2
#error exFAT feature wants C99 or later
#endif
typedef QWORD FSIZE_t;
#if FF_LBA64
typedef QWORD LBA_t;
#else
typedef DWORD LBA_t;
#endif/* ... */
#else
#if FF_LBA64
#error exFAT needs to be enabled when enable 64-bit LBA
#endif
typedef DWORD FSIZE_t;
typedef DWORD LBA_t;/* ... */
#endif
#if FF_USE_LFN && FF_LFN_UNICODE == 1
typedef WCHAR TCHAR;
#define _T(x) L ## x
#define _TEXT(x) L ## x/* ... */
#elif FF_USE_LFN && FF_LFN_UNICODE == 2
typedef char TCHAR;
#define _T(x) u8 ## x
#define _TEXT(x) u8 ## x/* ... */
#elif FF_USE_LFN && FF_LFN_UNICODE == 3
typedef DWORD TCHAR;
#define _T(x) U ## x
#define _TEXT(x) U ## x/* ... */
#elif FF_USE_LFN && (FF_LFN_UNICODE < 0 || FF_LFN_UNICODE > 3)
#error Wrong FF_LFN_UNICODE setting
#else
typedef char TCHAR;
#define _T(x) x
#define _TEXT(x) x/* ... */
#endif
#if FF_MULTI_PARTITION
typedef struct {
BYTE pd;
BYTE pt;
}{ ... } PARTITION;
extern const PARTITION VolToPart[]; /* ... */
#endif
#if FF_STR_VOLUME_ID
#ifndef FF_VOLUME_STRS
extern const char* VolumeStr[FF_VOLUMES];
#endif/* ... */
#endif
typedef struct {
BYTE fs_type;
BYTE pdrv;
BYTE ldrv;
BYTE n_fats;
BYTE wflag;
BYTE fsi_flag;
WORD id;
WORD n_rootdir;
WORD csize;
#if FF_MAX_SS != FF_MIN_SS
WORD ssize;
#endif
#if FF_USE_LFN
WCHAR* lfnbuf;
#endif
#if FF_FS_EXFAT
BYTE* dirbuf;
#endif
#if !FF_FS_READONLY
DWORD last_clst;
DWORD free_clst; /* ... */
#endif
#if FF_FS_RPATH
DWORD cdir;
#if FF_FS_EXFAT
DWORD cdc_scl;
DWORD cdc_size;
DWORD cdc_ofs; /* ... */
#endif/* ... */
#endif
DWORD n_fatent;
DWORD fsize;
LBA_t volbase;
LBA_t fatbase;
LBA_t dirbase;
LBA_t database;
#if FF_FS_EXFAT
LBA_t bitbase;
#endif
LBA_t winsect;
#if FF_USE_DYN_BUFFER
BYTE* win;
#else
BYTE win[FF_MAX_SS];
#endif
}{ ... } FATFS;
typedef struct {
FATFS* fs;
WORD id;
BYTE attr;
BYTE stat;
DWORD sclust;
FSIZE_t objsize;
#if FF_FS_EXFAT
DWORD n_cont;
DWORD n_frag;
DWORD c_scl;
DWORD c_size;
DWORD c_ofs; /* ... */
#endif
#if FF_FS_LOCK
UINT lockid;
#endif
}{ ... } FFOBJID;
typedef struct {
FFOBJID obj;
BYTE flag;
BYTE err;
FSIZE_t fptr;
DWORD clust;
LBA_t sect;
#if !FF_FS_READONLY
LBA_t dir_sect;
BYTE* dir_ptr; /* ... */
#endif
#if FF_USE_FASTSEEK
DWORD* cltbl;
#endif
#if !FF_FS_TINY
#if FF_USE_DYN_BUFFER
BYTE* buf;
#else
BYTE buf[FF_MAX_SS];
#endif/* ... */
#endif
}{ ... } FIL;
typedef struct {
FFOBJID obj;
DWORD dptr;
DWORD clust;
LBA_t sect;
BYTE* dir;
BYTE fn[12];
#if FF_USE_LFN
DWORD blk_ofs;
#endif
#if FF_USE_FIND
const TCHAR* pat;
#endif
}{ ... } FF_DIR;
typedef struct {
FSIZE_t fsize;
WORD fdate;
WORD ftime;
BYTE fattrib;
#if FF_USE_LFN
TCHAR altname[FF_SFN_BUF + 1];
TCHAR fname[FF_LFN_BUF + 1]; /* ... */
#else
TCHAR fname[12 + 1];
#endif
}{ ... } FILINFO;
typedef struct {
BYTE fmt;
BYTE n_fat;
UINT align;
UINT n_root;
DWORD au_size;
}{ ... } MKFS_PARM;
typedef enum {
FR_OK = 0,
FR_DISK_ERR,
FR_INT_ERR,
FR_NOT_READY,
FR_NO_FILE,
FR_NO_PATH,
FR_INVALID_NAME,
FR_DENIED,
FR_EXIST,
FR_INVALID_OBJECT,
FR_WRITE_PROTECTED,
FR_INVALID_DRIVE,
FR_NOT_ENABLED,
FR_NO_FILESYSTEM,
FR_MKFS_ABORTED,
FR_TIMEOUT,
FR_LOCKED,
FR_NOT_ENOUGH_CORE,
FR_TOO_MANY_OPEN_FILES,
FR_INVALID_PARAMETER
}{ ... } FRESULT;
FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode);
FRESULT f_close (FIL* fp);
FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br);
FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw);
FRESULT f_lseek (FIL* fp, FSIZE_t ofs);
FRESULT f_truncate (FIL* fp);
FRESULT f_sync (FIL* fp);
FRESULT f_opendir (FF_DIR* dp, const TCHAR* path);
FRESULT f_closedir (FF_DIR* dp);
FRESULT f_readdir (FF_DIR* dp, FILINFO* fno);
FRESULT f_findfirst (FF_DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern);
FRESULT f_findnext (FF_DIR* dp, FILINFO* fno);
FRESULT f_mkdir (const TCHAR* path);
FRESULT f_unlink (const TCHAR* path);
FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new);
FRESULT f_stat (const TCHAR* path, FILINFO* fno);
FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask);
FRESULT f_utime (const TCHAR* path, const FILINFO* fno);
FRESULT f_chdir (const TCHAR* path);
FRESULT f_chdrive (const TCHAR* path);
FRESULT f_getcwd (TCHAR* buff, UINT len);
FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs);
FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn);
FRESULT f_setlabel (const TCHAR* label);
FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf);
FRESULT f_expand (FIL* fp, FSIZE_t fsz, BYTE opt);
FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt);
FRESULT f_mkfs (const TCHAR* path, const MKFS_PARM* opt, void* work, UINT len);
FRESULT f_fdisk (BYTE pdrv, const LBA_t ptbl[], void* work);
FRESULT f_setcp (WORD cp);
int f_putc (TCHAR c, FIL* fp);
int f_puts (const TCHAR* str, FIL* cp);
int f_printf (FIL* fp, const TCHAR* str, ...);
TCHAR* f_gets (TCHAR* buff, int len, FIL* fp);
#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize))
#define f_error(fp) ((fp)->err)
#define f_tell(fp) ((fp)->fptr)
#define f_size(fp) ((fp)->obj.objsize)
#define f_rewind(fp) f_lseek((fp), 0)
#define f_rewinddir(dp) f_readdir((dp), 0)
#define f_rmdir(path) f_unlink(path)
#define f_unmount(path) f_mount(0, path, 0)8 defines
#if !FF_FS_READONLY && !FF_FS_NORTC
DWORD get_fattime (void);
#endif
#if FF_USE_LFN >= 1
WCHAR ff_oem2uni (WCHAR oem, WORD cp);
WCHAR ff_uni2oem (DWORD uni, WORD cp);
DWORD ff_wtoupper (DWORD uni); /* ... */
#endif
#if FF_USE_LFN == 3
void* ff_memalloc (UINT msize);
void ff_memfree (void* mblock); /* ... */
#endif
#if FF_FS_REENTRANT
int ff_mutex_create (int vol);
void ff_mutex_delete (int vol);
int ff_mutex_take (int vol);
void ff_mutex_give (int vol); /* ... */
#endif
#define FA_READ 0x01
#define FA_WRITE 0x02
#define FA_OPEN_EXISTING 0x00
#define FA_CREATE_NEW 0x04
#define FA_CREATE_ALWAYS 0x08
#define FA_OPEN_ALWAYS 0x10
#define FA_OPEN_APPEND 0x30
#define CREATE_LINKMAP ((FSIZE_t)0 - 1)
#define FM_FAT 0x01
#define FM_FAT32 0x02
#define FM_EXFAT 0x04
#define FM_ANY 0x07
#define FM_SFD 0x08
#define FS_FAT12 1
#define FS_FAT16 2
#define FS_FAT32 3
#define FS_EXFAT 4
#define AM_RDO 0x01
#define AM_HID 0x02
#define AM_SYS 0x04
#define AM_DIR 0x10
#define AM_ARC 0x20 22 defines
#ifdef __cplusplus
}{...}
#endif
/* ... */
#endif