Subversion Repositories svnkaklik

Rev

Details | Last modification | View Log

Rev Author Line No. Line
507 kaklik 1
/*--------------------------------------------------------------------------/
2
/  FatFs - FAT file system module include file  R0.06        (C)ChaN, 2008
3
/---------------------------------------------------------------------------/
4
/ FatFs module is an experimenal project to implement FAT file system to
5
/ cheap microcontrollers. This is a free software and is opened for education,
6
/ research and development under license policy of following trems.
7
/
8
/  Copyright (C) 2008, ChaN, all right reserved.
9
/
10
/ * The FatFs module is a free software and there is no warranty.
11
/ * You can use, modify and/or redistribute it for personal, non-profit or
12
/   commercial use without any restriction under your responsibility.
13
/ * Redistributions of source code must retain the above copyright notice.
14
/
15
/---------------------------------------------------------------------------*/
16
 
17
#ifndef _FATFS
18
 
19
#define _MCU_ENDIAN		1
20
/* The _MCU_ENDIAN defines which access method is used to the FAT structure.
21
/  1: Enable word access.
22
/  2: Disable word access and use byte-by-byte access instead.
23
/  When the architectural byte order of the MCU is big-endian and/or address
24
/  miss-aligned access results incorrect behavior, the _MCU_ENDIAN must be set to 2.
25
/  If it is not the case, it can also be set to 1 for good code efficiency. */
26
 
27
#define _FS_READONLY	0
28
/* Setting _FS_READONLY to 1 defines read only configuration. This removes
29
/  writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename,
30
/  f_truncate and useless f_getfree. */
31
 
32
#define _FS_MINIMIZE	0
33
/* The _FS_MINIMIZE option defines minimization level to remove some functions.
34
/  0: Full function.
35
/  1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename are removed.
36
/  2: f_opendir and f_readdir are removed in addition to level 1.
37
/  3: f_lseek is removed in addition to level 2. */
38
 
39
#define	_USE_STRFUNC	0
40
/* To enable string functions, set _USE_STRFUNC to 1 or 2. */
41
 
42
#define	_USE_MKFS	1
43
/* When _USE_MKFS is set to 1 and _FS_READONLY is set to 0, f_mkfs function is
44
/  enabled. */
45
 
46
#define _DRIVES		2
47
/* Number of logical drives to be used. This affects the size of internal table. */
48
 
49
#define	_MULTI_PARTITION	0
50
/* When _MULTI_PARTITION is set to 0, each logical drive is bound to same
51
/  physical drive number and can mount only 1st primaly partition. When it is
52
/  set to 1, each logical drive can mount a partition listed in Drives[]. */
53
 
54
#define _USE_FSINFO	1
55
/* To enable FSInfo support on FAT32 volume, set _USE_FSINFO to 1. */
56
 
57
#define	_USE_SJIS	1
58
/* When _USE_SJIS is set to 1, Shift-JIS code transparency is enabled, otherwise
59
/  only US-ASCII(7bit) code can be accepted as file/directory name. */
60
 
61
#define	_USE_NTFLAG	1
62
/* When _USE_NTFLAG is set to 1, upper/lower case of the file name is preserved.
63
/  Note that the files are always accessed in case insensitive. */
64
 
65
 
66
#include "integer.h"
67
 
68
 
69
 
70
/* Definitions corresponds to multiple sector size (not tested) */
71
#define	S_MAX_SIZ	512U			/* Do not change */
72
#if S_MAX_SIZ > 512U
73
#define	SS(fs)	((fs)->s_size)
74
#else
75
#define	SS(fs)	512U
76
#endif
77
 
78
 
79
/* File system object structure */
80
typedef struct _FATFS {
81
	WORD	id;				/* File system mount ID */
82
	WORD	n_rootdir;		/* Number of root directory entries */
83
	DWORD	winsect;		/* Current sector appearing in the win[] */
84
	DWORD	sects_fat;		/* Sectors per fat */
85
	DWORD	max_clust;		/* Maximum cluster# + 1 */
86
	DWORD	fatbase;		/* FAT start sector */
87
	DWORD	dirbase;		/* Root directory start sector (cluster# for FAT32) */
88
	DWORD	database;		/* Data start sector */
89
#if !_FS_READONLY
90
	DWORD	last_clust;		/* Last allocated cluster */
91
	DWORD	free_clust;		/* Number of free clusters */
92
#if _USE_FSINFO
93
	DWORD	fsi_sector;		/* fsinfo sector */
94
	BYTE	fsi_flag;		/* fsinfo dirty flag (1:must be written back) */
95
	BYTE	pad2;
96
#endif
97
#endif
98
	BYTE	fs_type;		/* FAT sub type */
99
	BYTE	csize;			/* Number of sectors per cluster */
100
#if S_MAX_SIZ > 512U
101
	WORD	s_size;			/* Sector size */
102
#endif
103
	BYTE	n_fats;			/* Number of FAT copies */
104
	BYTE	drive;			/* Physical drive number */
105
	BYTE	winflag;		/* win[] dirty flag (1:must be written back) */
106
	BYTE	pad1;
107
	BYTE	win[S_MAX_SIZ];	/* Disk access window for Directory/FAT */
108
} FATFS;
109
 
110
 
111
/* Directory object structure */
112
typedef struct _DIR {
113
	WORD	id;			/* Owner file system mount ID */
114
	WORD	index;		/* Current index */
115
	FATFS*	fs;			/* Pointer to the owner file system object */
116
	DWORD	sclust;		/* Start cluster */
117
	DWORD	clust;		/* Current cluster */
118
	DWORD	sect;		/* Current sector */
119
} DIR;
120
 
121
 
122
/* File object structure */
123
typedef struct _FIL {
124
	WORD	id;				/* Owner file system mount ID */
125
	BYTE	flag;			/* File status flags */
126
	BYTE	csect;			/* Sector address in the cluster */
127
	FATFS*	fs;				/* Pointer to the owner file system object */
128
	DWORD	fptr;			/* File R/W pointer */
129
	DWORD	fsize;			/* File size */
130
	DWORD	org_clust;		/* File start cluster */
131
	DWORD	curr_clust;		/* Current cluster */
132
	DWORD	curr_sect;		/* Current sector */
133
#if _FS_READONLY == 0
134
	DWORD	dir_sect;		/* Sector containing the directory entry */
135
	BYTE*	dir_ptr;		/* Ponter to the directory entry in the window */
136
#endif
137
	BYTE	buffer[S_MAX_SIZ];	/* File R/W buffer */
138
} FIL;
139
 
140
 
141
/* File status structure */
142
typedef struct _FILINFO {
143
	DWORD fsize;			/* Size */
144
	WORD fdate;				/* Date */
145
	WORD ftime;				/* Time */
146
	BYTE fattrib;			/* Attribute */
147
	char fname[8+1+3+1];	/* Name (8.3 format) */
148
} FILINFO;
149
 
150
 
151
 
152
/* Definitions corresponds to multi partition */
153
 
154
#if _MULTI_PARTITION != 0	/* Multiple partition cfg */
155
 
156
typedef struct _PARTITION {
157
	BYTE pd;	/* Physical drive # (0-255) */
158
	BYTE pt;	/* Partition # (0-3) */
159
} PARTITION;
160
extern
161
const PARTITION Drives[];			/* Logical drive# to physical location conversion table */
162
#define LD2PD(drv) (Drives[drv].pd)	/* Get physical drive# */
163
#define LD2PT(drv) (Drives[drv].pt)	/* Get partition# */
164
 
165
#else						/* Single partition cfg */
166
 
167
#define LD2PD(drv) (drv)		/* Physical drive# is equal to logical drive# */
168
#define LD2PT(drv) 0			/* Always mounts the 1st partition */
169
 
170
#endif
171
 
172
 
173
/* File function return code (FRESULT) */
174
 
175
typedef enum {
176
	FR_OK = 0,			/* 0 */
177
	FR_NOT_READY,		/* 1 */
178
	FR_NO_FILE,			/* 2 */
179
	FR_NO_PATH,			/* 3 */
180
	FR_INVALID_NAME,	/* 4 */
181
	FR_INVALID_DRIVE,	/* 5 */
182
	FR_DENIED,			/* 6 */
183
	FR_EXIST,			/* 7 */
184
	FR_RW_ERROR,		/* 8 */
185
	FR_WRITE_PROTECTED,	/* 9 */
186
	FR_NOT_ENABLED,		/* 10 */
187
	FR_NO_FILESYSTEM,	/* 11 */
188
	FR_INVALID_OBJECT,	/* 12 */
189
	FR_MKFS_ABORTED		/* 13 */
190
} FRESULT;
191
 
192
 
193
 
194
/*-----------------------------------------------------*/
195
/* FatFs module application interface                  */
196
 
197
FRESULT f_mount (BYTE, FATFS*);						/* Mount/Unmount a logical drive */
198
FRESULT f_open (FIL*, const char*, BYTE);			/* Open or create a file */
199
FRESULT f_read (FIL*, void*, UINT, UINT*);			/* Read data from a file */
200
FRESULT f_write (FIL*, const void*, UINT, UINT*);	/* Write data to a file */
201
FRESULT f_lseek (FIL*, DWORD);						/* Move file pointer of a file object */
202
FRESULT f_close (FIL*);								/* Close an open file object */
203
FRESULT f_opendir (DIR*, const char*);				/* Open an existing directory */
204
FRESULT f_readdir (DIR*, FILINFO*);					/* Read a directory item */
205
FRESULT f_stat (const char*, FILINFO*);				/* Get file status */
206
FRESULT f_getfree (const char*, DWORD*, FATFS**);	/* Get number of free clusters on the drive */
207
FRESULT f_truncate (FIL*);							/* Truncate file */
208
FRESULT f_sync (FIL*);								/* Flush cached data of a writing file */
209
FRESULT f_unlink (const char*);						/* Delete an existing file or directory */
210
FRESULT	f_mkdir (const char*);						/* Create a new directory */
211
FRESULT f_chmod (const char*, BYTE, BYTE);			/* Change file/dir attriburte */
212
FRESULT f_utime (const char*, const FILINFO*);		/* Change file/dir timestamp */
213
FRESULT f_rename (const char*, const char*);		/* Rename/Move a file or directory */
214
FRESULT f_mkfs (BYTE, BYTE, WORD);					/* Create a file system on the drive */
215
#if _USE_STRFUNC
216
#define feof(fp) ((fp)->fptr == (fp)->fsize)
217
#define EOF -1
218
int fputc (int, FIL*);								/* Put a character to the file */
219
int fputs (const char*, FIL*);						/* Put a string to the file */
220
int fprintf (FIL*, const char*, ...);				/* Put a formatted string to the file */
221
char* fgets (char*, int, FIL*);						/* Get a string from the file */
222
#endif
223
 
224
/* User defined function to give a current time to fatfs module */
225
 
226
DWORD get_fattime (void);	/* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */
227
							/* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */
228
 
229
 
230
 
231
/* File access control and file status flags (FIL.flag) */
232
 
233
#define	FA_READ				0x01
234
#define	FA_OPEN_EXISTING	0x00
235
#if _FS_READONLY == 0
236
#define	FA_WRITE			0x02
237
#define	FA_CREATE_NEW		0x04
238
#define	FA_CREATE_ALWAYS	0x08
239
#define	FA_OPEN_ALWAYS		0x10
240
#define FA__WRITTEN			0x20
241
#define FA__DIRTY			0x40
242
#endif
243
#define FA__ERROR			0x80
244
 
245
 
246
/* FAT sub type (FATFS.fs_type) */
247
 
248
#define FS_FAT12	1
249
#define FS_FAT16	2
250
#define FS_FAT32	3
251
 
252
 
253
/* File attribute bits for directory entry */
254
 
255
#define	AM_RDO	0x01	/* Read only */
256
#define	AM_HID	0x02	/* Hidden */
257
#define	AM_SYS	0x04	/* System */
258
#define	AM_VOL	0x08	/* Volume label */
259
#define AM_LFN	0x0F	/* LFN entry */
260
#define AM_DIR	0x10	/* Directory */
261
#define AM_ARC	0x20	/* Archive */
262
 
263
 
264
 
265
/* Offset of FAT structure members */
266
 
267
#define BS_jmpBoot			0
268
#define BS_OEMName			3
269
#define BPB_BytsPerSec		11
270
#define BPB_SecPerClus		13
271
#define BPB_RsvdSecCnt		14
272
#define BPB_NumFATs			16
273
#define BPB_RootEntCnt		17
274
#define BPB_TotSec16		19
275
#define BPB_Media			21
276
#define BPB_FATSz16			22
277
#define BPB_SecPerTrk		24
278
#define BPB_NumHeads		26
279
#define BPB_HiddSec			28
280
#define BPB_TotSec32		32
281
#define BS_55AA				510
282
 
283
#define BS_DrvNum			36
284
#define BS_BootSig			38
285
#define BS_VolID			39
286
#define BS_VolLab			43
287
#define BS_FilSysType		54
288
 
289
#define BPB_FATSz32			36
290
#define BPB_ExtFlags		40
291
#define BPB_FSVer			42
292
#define BPB_RootClus		44
293
#define BPB_FSInfo			48
294
#define BPB_BkBootSec		50
295
#define BS_DrvNum32			64
296
#define BS_BootSig32		66
297
#define BS_VolID32			67
298
#define BS_VolLab32			71
299
#define BS_FilSysType32		82
300
 
301
#define	FSI_LeadSig			0
302
#define	FSI_StrucSig		484
303
#define	FSI_Free_Count		488
304
#define	FSI_Nxt_Free		492
305
 
306
#define MBR_Table			446
307
 
308
#define	DIR_Name			0
309
#define	DIR_Attr			11
310
#define	DIR_NTres			12
311
#define	DIR_CrtTime			14
312
#define	DIR_CrtDate			16
313
#define	DIR_FstClusHI		20
314
#define	DIR_WrtTime			22
315
#define	DIR_WrtDate			24
316
#define	DIR_FstClusLO		26
317
#define	DIR_FileSize		28
318
 
319
 
320
 
321
/* Multi-byte word access macros  */
322
 
323
#if _MCU_ENDIAN == 1	/* Use word access */
324
#define	LD_WORD(ptr)		(WORD)(*(WORD*)(BYTE*)(ptr))
325
#define	LD_DWORD(ptr)		(DWORD)(*(DWORD*)(BYTE*)(ptr))
326
#define	ST_WORD(ptr,val)	*(WORD*)(BYTE*)(ptr)=(WORD)(val)
327
#define	ST_DWORD(ptr,val)	*(DWORD*)(BYTE*)(ptr)=(DWORD)(val)
328
#elif _MCU_ENDIAN == 2	/* Use byte-by-byte access */
329
#define	LD_WORD(ptr)		(WORD)(((WORD)*(volatile BYTE*)((ptr)+1)<<8)|(WORD)*(volatile BYTE*)(ptr))
330
#define	LD_DWORD(ptr)		(DWORD)(((DWORD)*(volatile BYTE*)((ptr)+3)<<24)|((DWORD)*(volatile BYTE*)((ptr)+2)<<16)|((WORD)*(volatile BYTE*)((ptr)+1)<<8)|*(volatile BYTE*)(ptr))
331
#define	ST_WORD(ptr,val)	*(volatile BYTE*)(ptr)=(BYTE)(val); *(volatile BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8)
332
#define	ST_DWORD(ptr,val)	*(volatile BYTE*)(ptr)=(BYTE)(val); *(volatile BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8); *(volatile BYTE*)((ptr)+2)=(BYTE)((DWORD)(val)>>16); *(volatile BYTE*)((ptr)+3)=(BYTE)((DWORD)(val)>>24)
333
#else
334
#error Do not forget to set _MCU_ENDIAN properly!
335
#endif
336
 
337
 
338
#define _FATFS
339
#endif /* _FATFS */