]> cloudbase.mooo.com Git - z180-stamp.git/blame - fatfs/src/ff.h
Merge branch 'chan-fatfs' into fatfs-integration
[z180-stamp.git] / fatfs / src / ff.h
CommitLineData
70702af1
L
1/*----------------------------------------------------------------------------/\r
2/ FatFs - Generic FAT file system module R0.12b /\r
3/-----------------------------------------------------------------------------/\r
53668523 4/\r
70702af1 5/ Copyright (C) 2016, 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
53668523
L
18/----------------------------------------------------------------------------*/\r
19\r
70702af1 20\r
53668523 21#ifndef _FATFS\r
70702af1 22#define _FATFS 68020 /* Revision ID */\r
53668523
L
23\r
24#ifdef __cplusplus\r
25extern "C" {\r
26#endif\r
27\r
28#include "integer.h" /* Basic integer types */\r
29#include "ffconf.h" /* FatFs configuration options */\r
70702af1 30\r
53668523
L
31#if _FATFS != _FFCONF\r
32#error Wrong configuration file (ffconf.h).\r
33#endif\r
34\r
35\r
36\r
37/* Definitions of volume management */\r
38\r
39#if _MULTI_PARTITION /* Multiple partition configuration */\r
40typedef struct {\r
41 BYTE pd; /* Physical drive number */\r
42 BYTE pt; /* Partition: 0:Auto detect, 1-4:Forced partition) */\r
43} PARTITION;\r
44extern PARTITION VolToPart[]; /* Volume - Partition resolution table */\r
45#define LD2PD(vol) (VolToPart[vol].pd) /* Get physical drive number */\r
46#define LD2PT(vol) (VolToPart[vol].pt) /* Get partition index */\r
47\r
48#else /* Single partition configuration */\r
49#define LD2PD(vol) (BYTE)(vol) /* Each logical drive is bound to the same physical drive number */\r
50#define LD2PT(vol) 0 /* Find first valid partition or in SFD */\r
51\r
52#endif\r
53\r
54\r
55\r
56/* Type of path name strings on FatFs API */\r
57\r
70702af1
L
58#if _LFN_UNICODE /* Unicode (UTF-16) string */\r
59#if _USE_LFN == 0\r
53668523
L
60#error _LFN_UNICODE must be 0 at non-LFN cfg.\r
61#endif\r
62#ifndef _INC_TCHAR\r
63typedef WCHAR TCHAR;\r
64#define _T(x) L ## x\r
65#define _TEXT(x) L ## x\r
66#endif\r
53668523
L
67#else /* ANSI/OEM string */\r
68#ifndef _INC_TCHAR\r
69typedef char TCHAR;\r
70#define _T(x) x\r
71#define _TEXT(x) x\r
72#endif\r
70702af1 73#endif\r
53668523 74\r
70702af1
L
75\r
76\r
77/* Type of file size variables */\r
78\r
79#if _FS_EXFAT\r
80#if _USE_LFN == 0\r
81#error LFN must be enabled when enable exFAT\r
82#endif\r
83typedef QWORD FSIZE_t;\r
84#else\r
85typedef DWORD FSIZE_t;\r
53668523
L
86#endif\r
87\r
88\r
89\r
90/* File system object structure (FATFS) */\r
91\r
92typedef struct {\r
70702af1 93 BYTE fs_type; /* File system type (0:N/A) */\r
53668523 94 BYTE drv; /* Physical drive number */\r
70702af1 95 BYTE n_fats; /* Number of FATs (1 or 2) */\r
53668523
L
96 BYTE wflag; /* win[] flag (b0:dirty) */\r
97 BYTE fsi_flag; /* FSINFO flags (b7:disabled, b0:dirty) */\r
98 WORD id; /* File system mount ID */\r
99 WORD n_rootdir; /* Number of root directory entries (FAT12/16) */\r
70702af1 100 WORD csize; /* Cluster size [sectors] */\r
53668523 101#if _MAX_SS != _MIN_SS\r
70702af1
L
102 WORD ssize; /* Sector size (512, 1024, 2048 or 4096) */\r
103#endif\r
104#if _USE_LFN != 0\r
105 WCHAR* lfnbuf; /* LFN working buffer */\r
106#endif\r
107#if _FS_EXFAT\r
108 BYTE* dirbuf; /* Directory entry block scratchpad buffer */\r
53668523
L
109#endif\r
110#if _FS_REENTRANT\r
111 _SYNC_t sobj; /* Identifier of sync object */\r
112#endif\r
113#if !_FS_READONLY\r
70702af1
L
114 DWORD last_clst; /* Last allocated cluster */\r
115 DWORD free_clst; /* Number of free clusters */\r
53668523 116#endif\r
70702af1 117#if _FS_RPATH != 0\r
53668523 118 DWORD cdir; /* Current directory start cluster (0:root) */\r
70702af1
L
119#if _FS_EXFAT\r
120 DWORD cdc_scl; /* Containing directory start cluster (invalid when cdir is 0) */\r
121 DWORD cdc_size; /* b31-b8:Size of containing directory, b7-b0: Chain status */\r
122 DWORD cdc_ofs; /* Offset in the containing directory (invalid when cdir is 0) */\r
123#endif\r
53668523 124#endif\r
70702af1
L
125 DWORD n_fatent; /* Number of FAT entries (number of clusters + 2) */\r
126 DWORD fsize; /* Size of an FAT [sectors] */\r
127 DWORD volbase; /* Volume base sector */\r
128 DWORD fatbase; /* FAT base sector */\r
129 DWORD dirbase; /* Root directory base sector/cluster */\r
130 DWORD database; /* Data base sector */\r
53668523
L
131 DWORD winsect; /* Current sector appearing in the win[] */\r
132 BYTE win[_MAX_SS]; /* Disk access window for Directory, FAT (and file data at tiny cfg) */\r
133} FATFS;\r
134\r
135\r
136\r
70702af1
L
137/* Object ID and allocation information (_FDID) */\r
138\r
139typedef struct {\r
140 FATFS* fs; /* Pointer to the owner file system object */\r
141 WORD id; /* Owner file system mount ID */\r
142 BYTE attr; /* Object attribute */\r
143 BYTE stat; /* Object chain status (b1-0: =0:not contiguous, =2:contiguous (no data on FAT), =3:got flagmented, b2:sub-directory stretched) */\r
144 DWORD sclust; /* Object start cluster (0:no cluster or root directory) */\r
145 FSIZE_t objsize; /* Object size (valid when sclust != 0) */\r
146#if _FS_EXFAT\r
147 DWORD n_cont; /* Size of coutiguous part, clusters - 1 (valid when stat == 3) */\r
148 DWORD c_scl; /* Containing directory start cluster (valid when sclust != 0) */\r
149 DWORD c_size; /* b31-b8:Size of containing directory, b7-b0: Chain status (valid when c_scl != 0) */\r
150 DWORD c_ofs; /* Offset in the containing directory (valid when sclust != 0) */\r
151#endif\r
152#if _FS_LOCK != 0\r
153 UINT lockid; /* File lock ID origin from 1 (index of file semaphore table Files[]) */\r
154#endif\r
155} _FDID;\r
156\r
157\r
158\r
53668523
L
159/* File object structure (FIL) */\r
160\r
161typedef struct {\r
70702af1
L
162 _FDID obj; /* Object identifier (must be the 1st member to detect invalid object pointer) */\r
163 BYTE flag; /* File status flags */\r
53668523 164 BYTE err; /* Abort flag (error code) */\r
70702af1
L
165 FSIZE_t fptr; /* File read/write pointer (Zeroed on file open) */\r
166 DWORD clust; /* Current cluster of fpter (invalid when fprt is 0) */\r
167 DWORD sect; /* Sector number appearing in buf[] (0:invalid) */\r
53668523
L
168#if !_FS_READONLY\r
169 DWORD dir_sect; /* Sector number containing the directory entry */\r
170 BYTE* dir_ptr; /* Pointer to the directory entry in the win[] */\r
171#endif\r
172#if _USE_FASTSEEK\r
70702af1 173 DWORD* cltbl; /* Pointer to the cluster link map table (nulled on open, set by application) */\r
53668523
L
174#endif\r
175#if !_FS_TINY\r
176 BYTE buf[_MAX_SS]; /* File private data read/write window */\r
177#endif\r
178} FIL;\r
179\r
180\r
181\r
182/* Directory object structure (DIR) */\r
183\r
184typedef struct {\r
70702af1
L
185 _FDID obj; /* Object identifier */\r
186 DWORD dptr; /* Current read/write offset */\r
53668523
L
187 DWORD clust; /* Current cluster */\r
188 DWORD sect; /* Current sector */\r
70702af1
L
189 BYTE* dir; /* Pointer to the directory item in the win[] */\r
190 BYTE fn[12]; /* SFN (in/out) {body[8],ext[3],status[1]} */\r
191#if _USE_LFN != 0\r
192 DWORD blk_ofs; /* Offset of current entry block being processed (0xFFFFFFFF:Invalid) */\r
53668523 193#endif\r
70702af1
L
194#if _USE_FIND\r
195 const TCHAR* pat; /* Pointer to the name matching pattern */\r
53668523
L
196#endif\r
197} DIR;\r
198\r
199\r
200\r
70702af1 201/* File information structure (FILINFO) */\r
53668523
L
202\r
203typedef struct {\r
70702af1
L
204 FSIZE_t fsize; /* File size */\r
205 WORD fdate; /* Modified date */\r
206 WORD ftime; /* Modified time */\r
207 BYTE fattrib; /* File attribute */\r
208#if _USE_LFN != 0\r
209 TCHAR altname[13]; /* Altenative file name */\r
210 TCHAR fname[_MAX_LFN + 1]; /* Primary file name */\r
211#else\r
212 TCHAR fname[13]; /* File name */\r
53668523
L
213#endif\r
214} FILINFO;\r
215\r
216\r
217\r
218/* File function return code (FRESULT) */\r
219\r
220typedef enum {\r
221 FR_OK = 0, /* (0) Succeeded */\r
222 FR_DISK_ERR, /* (1) A hard error occurred in the low level disk I/O layer */\r
223 FR_INT_ERR, /* (2) Assertion failed */\r
224 FR_NOT_READY, /* (3) The physical drive cannot work */\r
225 FR_NO_FILE, /* (4) Could not find the file */\r
226 FR_NO_PATH, /* (5) Could not find the path */\r
227 FR_INVALID_NAME, /* (6) The path name format is invalid */\r
228 FR_DENIED, /* (7) Access denied due to prohibited access or directory full */\r
229 FR_EXIST, /* (8) Access denied due to prohibited access */\r
230 FR_INVALID_OBJECT, /* (9) The file/directory object is invalid */\r
231 FR_WRITE_PROTECTED, /* (10) The physical drive is write protected */\r
232 FR_INVALID_DRIVE, /* (11) The logical drive number is invalid */\r
233 FR_NOT_ENABLED, /* (12) The volume has no work area */\r
234 FR_NO_FILESYSTEM, /* (13) There is no valid FAT volume */\r
70702af1 235 FR_MKFS_ABORTED, /* (14) The f_mkfs() aborted due to any problem */\r
53668523
L
236 FR_TIMEOUT, /* (15) Could not get a grant to access the volume within defined period */\r
237 FR_LOCKED, /* (16) The operation is rejected according to the file sharing policy */\r
238 FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */\r
70702af1 239 FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_LOCK */\r
53668523
L
240 FR_INVALID_PARAMETER /* (19) Given parameter is invalid */\r
241} FRESULT;\r
242\r
243\r
244\r
245/*--------------------------------------------------------------*/\r
246/* FatFs module application interface */\r
247\r
248FRESULT f_open (FIL* fp, const TCHAR* path, BYTE mode); /* Open or create a file */\r
249FRESULT f_close (FIL* fp); /* Close an open file object */\r
70702af1
L
250FRESULT f_read (FIL* fp, void* buff, UINT btr, UINT* br); /* Read data from the file */\r
251FRESULT f_write (FIL* fp, const void* buff, UINT btw, UINT* bw); /* Write data to the file */\r
252FRESULT f_lseek (FIL* fp, FSIZE_t ofs); /* Move file pointer of the file object */\r
253FRESULT f_truncate (FIL* fp); /* Truncate the file */\r
254FRESULT f_sync (FIL* fp); /* Flush cached data of the writing file */\r
53668523
L
255FRESULT f_opendir (DIR* dp, const TCHAR* path); /* Open a directory */\r
256FRESULT f_closedir (DIR* dp); /* Close an open directory */\r
257FRESULT f_readdir (DIR* dp, FILINFO* fno); /* Read a directory item */\r
70702af1
L
258FRESULT f_findfirst (DIR* dp, FILINFO* fno, const TCHAR* path, const TCHAR* pattern); /* Find first file */\r
259FRESULT f_findnext (DIR* dp, FILINFO* fno); /* Find next file */\r
53668523
L
260FRESULT f_mkdir (const TCHAR* path); /* Create a sub directory */\r
261FRESULT f_unlink (const TCHAR* path); /* Delete an existing file or directory */\r
262FRESULT f_rename (const TCHAR* path_old, const TCHAR* path_new); /* Rename/Move a file or directory */\r
263FRESULT f_stat (const TCHAR* path, FILINFO* fno); /* Get file status */\r
70702af1
L
264FRESULT f_chmod (const TCHAR* path, BYTE attr, BYTE mask); /* Change attribute of a file/dir */\r
265FRESULT f_utime (const TCHAR* path, const FILINFO* fno); /* Change timestamp of a file/dir */\r
53668523
L
266FRESULT f_chdir (const TCHAR* path); /* Change current directory */\r
267FRESULT f_chdrive (const TCHAR* path); /* Change current drive */\r
268FRESULT f_getcwd (TCHAR* buff, UINT len); /* Get current directory */\r
269FRESULT f_getfree (const TCHAR* path, DWORD* nclst, FATFS** fatfs); /* Get number of free clusters on the drive */\r
270FRESULT f_getlabel (const TCHAR* path, TCHAR* label, DWORD* vsn); /* Get volume label */\r
271FRESULT f_setlabel (const TCHAR* label); /* Set volume label */\r
70702af1
L
272FRESULT f_forward (FIL* fp, UINT(*func)(const BYTE*,UINT), UINT btf, UINT* bf); /* Forward data to the stream */\r
273FRESULT f_expand (FIL* fp, FSIZE_t szf, BYTE opt); /* Allocate a contiguous block to the file */\r
53668523 274FRESULT f_mount (FATFS* fs, const TCHAR* path, BYTE opt); /* Mount/Unmount a logical drive */\r
70702af1
L
275FRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len); /* Create a FAT volume */\r
276FRESULT f_fdisk (BYTE pdrv, const DWORD* szt, void* work); /* Divide a physical drive into some partitions */\r
53668523
L
277int f_putc (TCHAR c, FIL* fp); /* Put a character to the file */\r
278int f_puts (const TCHAR* str, FIL* cp); /* Put a string to the file */\r
279int f_printf (FIL* fp, const TCHAR* str, ...); /* Put a formatted string to the file */\r
280TCHAR* f_gets (TCHAR* buff, int len, FIL* fp); /* Get a string from the file */\r
281\r
70702af1 282#define f_eof(fp) ((int)((fp)->fptr == (fp)->obj.objsize))\r
53668523
L
283#define f_error(fp) ((fp)->err)\r
284#define f_tell(fp) ((fp)->fptr)\r
70702af1
L
285#define f_size(fp) ((fp)->obj.objsize)\r
286#define f_rewind(fp) f_lseek((fp), 0)\r
287#define f_rewinddir(dp) f_readdir((dp), 0)\r
53668523
L
288\r
289#ifndef EOF\r
290#define EOF (-1)\r
291#endif\r
292\r
293\r
294\r
295\r
296/*--------------------------------------------------------------*/\r
297/* Additional user defined functions */\r
298\r
299/* RTC function */\r
7b78a5a2 300#if !_FS_READONLY && !_FS_NORTC\r
53668523
L
301DWORD get_fattime (void);\r
302#endif\r
303\r
304/* Unicode support functions */\r
70702af1 305#if _USE_LFN != 0 /* Unicode - OEM code conversion */\r
53668523
L
306WCHAR ff_convert (WCHAR chr, UINT dir); /* OEM-Unicode bidirectional conversion */\r
307WCHAR ff_wtoupper (WCHAR chr); /* Unicode upper-case conversion */\r
308#if _USE_LFN == 3 /* Memory functions */\r
309void* ff_memalloc (UINT msize); /* Allocate memory block */\r
310void ff_memfree (void* mblock); /* Free memory block */\r
311#endif\r
312#endif\r
313\r
314/* Sync functions */\r
315#if _FS_REENTRANT\r
316int ff_cre_syncobj (BYTE vol, _SYNC_t* sobj); /* Create a sync object */\r
317int ff_req_grant (_SYNC_t sobj); /* Lock sync object */\r
318void ff_rel_grant (_SYNC_t sobj); /* Unlock sync object */\r
319int ff_del_syncobj (_SYNC_t sobj); /* Delete a sync object */\r
320#endif\r
321\r
322\r
323\r
324\r
325/*--------------------------------------------------------------*/\r
326/* Flags and offset address */\r
327\r
328\r
70702af1 329/* File access mode and open method flags (3rd argument of f_open) */\r
53668523 330#define FA_READ 0x01\r
53668523 331#define FA_WRITE 0x02\r
70702af1 332#define FA_OPEN_EXISTING 0x00\r
53668523
L
333#define FA_CREATE_NEW 0x04\r
334#define FA_CREATE_ALWAYS 0x08\r
335#define FA_OPEN_ALWAYS 0x10\r
70702af1 336#define FA_OPEN_APPEND 0x30\r
53668523 337\r
70702af1
L
338/* Fast seek controls (2nd argument of f_lseek) */\r
339#define CREATE_LINKMAP ((FSIZE_t)0 - 1)\r
53668523 340\r
70702af1
L
341/* Format options (2nd argument of f_mkfs) */\r
342#define FM_FAT 0x01\r
343#define FM_FAT32 0x02\r
344#define FM_EXFAT 0x04\r
345#define FM_ANY 0x07\r
346#define FM_SFD 0x08\r
53668523 347\r
70702af1 348/* Filesystem type (FATFS.fs_type) */\r
53668523
L
349#define FS_FAT12 1\r
350#define FS_FAT16 2\r
351#define FS_FAT32 3\r
70702af1 352#define FS_EXFAT 4\r
53668523 353\r
70702af1 354/* File attribute bits for directory entry (FILINFO.fattrib) */\r
53668523
L
355#define AM_RDO 0x01 /* Read only */\r
356#define AM_HID 0x02 /* Hidden */\r
357#define AM_SYS 0x04 /* System */\r
53668523
L
358#define AM_DIR 0x10 /* Directory */\r
359#define AM_ARC 0x20 /* Archive */\r
53668523
L
360\r
361\r
53668523
L
362#ifdef __cplusplus\r
363}\r
364#endif\r
365\r
366#endif /* _FATFS */\r