文件系统FatFsR0.09a翻译(三):ff.h

//本译文只供学习使用,未经作者许可,不得用于其它任何用途  

//译者:xiaofeng

//修改日期:2013/03/19

//版本:V1.0

//版权所有,盗版必究。

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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
153
154
155
156
157
158
159
160
161
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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
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
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
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
/*---------------------------------------------------------------------------/
/  FatFs - FAT file system module include file  R0.09a    (C)ChaN, 2012
/----------------------------------------------------------------------------/
/ FatFs module is a generic FAT file system module for small embedded systems.
/ This is a free software that opened for education, research and commercial
/ developments under license policy of following terms.
/
/  Copyright (C) 2012, ChaN, all right reserved.
/
/ * The FatFs module is a free software and there is NO WARRANTY.
/ * No restriction on use. You can use, modify and redistribute it for
/   personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY.
/ * Redistributions of source code must retain the above copyright notice.
/
/----------------------------------------------------------------------------*/
   
#ifndef _FATFS
#define _FATFS  4004    /* 版本ID Revision ID */
   
#ifdef __cplusplus
extern  "C"  {
#endif
   
#include "integer.h"    /* 基本整数类型 Basic integer types */
#include "ffconf.h"     /* FatFs配置选项 FatFs configuration options */
   
#if _FATFS != _FFCONF
#error Wrong configuration file (ffconf.h).
#endif
   
   
   
/* 容量管理的定义 Definitions of volume management */
   
#if _MULTI_PARTITION        /* 多分区配置 Multiple partition configuration */
typedef  struct  {
     BYTE  pd;     /* 物理驱动号 Physical drive number */
     BYTE  pt;     /* 分区:0:自动检测,1-4:强制分区Partition: 0:Auto detect, 1-4:Forced partition) */
} PARTITION;
extern  PARTITION VolToPart[];    /* 卷分区解析表 Volume - Partition resolution table */
#define LD2PD(vol) (VolToPart[vol].pd)  /* 获取物理驱动号 Get physical drive number */
#define LD2PT(vol) (VolToPart[vol].pt)  /* 获取分区索引 Get partition index */
   
#else                           /* 单分区配置 Single partition configuration */
#define LD2PD(vol) (BYTE)(vol)  /* 每个逻辑驱动器都和一个物理驱动号对应 Each logical drive is bound to the same physical drive number */
#define LD2PT(vol) 0            /* 始终安装在第一分区或者SFD Always mounts the 1st partition or in SFD */
   
#endif
   
   
   
/* FatFs API路径名称字符串类型 Type of path name strings on FatFs API */
   
#if _LFN_UNICODE            /* Unicode string */
#if !_USE_LFN
#error _LFN_UNICODE must be 0 in non-LFN cfg.
#endif
#ifndef _INC_TCHAR
typedef  WCHAR  TCHAR ;
#define _T(x) L ## x
#define _TEXT(x) L ## x
#endif
   
#else                       /* ANSI / OEM字符串 ANSI/OEM string */
#ifndef _INC_TCHAR
typedef  char  TCHAR ;
#define _T(x) x
#define _TEXT(x) x
#endif
   
#endif
   
   
   
/* 文件系统对象结构 File system object structure (FATFS) */
   
typedef  struct  {
     BYTE     fs_type;         /* FAT子类型(0:没安装)FAT sub-type (0:Not mounted) */
     BYTE     drv;               /* 物理驱动器号 Physical drive number */
     BYTE     csize;           /* 每簇的扇区数 Sectors per cluster (1,2,4...128) */
     BYTE     n_fats;          /* 文件配置表(FAT)的副本数 Number of FAT copies (1,2) */
     BYTE     wflag;           /* ?? win[] dirty flag (1:must be written back) */
     BYTE     fsi_flag;        /* ??fsinfo dirty flag (1:must be written back) */
     WORD     id;                /* 文件系统安装ID File system mount ID */
     WORD     n_rootdir;   /* 根目录的数量 Number of root directory entries (FAT12/16) */
#if _MAX_SS != 512
     WORD     ssize;           /* 每扇区字节 Bytes per sector (512, 1024, 2048 or 4096) */
#endif
#if _FS_REENTRANT
     _SYNC_t sobj;            /* 同步对象标识符 Identifier of sync object */
#endif
#if !_FS_READONLY
     DWORD    last_clust;  /* 最后分配的簇 Last allocated cluster */
     DWORD    free_clust;  /* 多余的簇数 Number of free clusters */
     DWORD    fsi_sector;  /* fsinfo sector (FAT32) */
#endif
#if _FS_RPATH
     DWORD    cdir;                /* 当前目录的起始簇(0根)Current directory start cluster (0:root) */
#endif
     DWORD    n_fatent;        /* 文件配置表的数 Number of FAT entries (= number of clusters + 2) */
     DWORD    fsize;           /* 扇区的文档配置表 Sectors per FAT */
     DWORD    fatbase;         /* 文档配置表开始的扇区 FAT start sector */
     DWORD    dirbase;         /* 根目录开始的扇区 Root directory start sector (FAT32:Cluster#) */
     DWORD    database;        /* 数据开始的扇区 Data start sector */
     DWORD    winsect;         /* 当前扇区出现在win[] Current sector appearing in the win[] */
     BYTE     win[_MAX_SS];    /* 目录的磁盘访问窗口,文件配置表(和小的CFG数据)Disk access window for Directory, FAT (and Data on tiny cfg) */
} FATFS;
   
   
   
/* 文件对象的结构 File object structure (FIL) */
   
typedef  struct  {
     FATFS*  fs;              /* 对相关文件系统对象的指针 Pointer to the related file system object */
     WORD     id;                /* 相关的文件系统的文件系统挂载对象ID File system mount ID of the related file system object */
     BYTE     flag;              /* 文件状态标志 File status flags */
     BYTE     pad1;
     DWORD    fptr;              /* 文件的读/写指针 File read/write pointer (0ed on file open) */
     DWORD    fsize;           /* 文件大小 File size */
     DWORD    sclust;          /* 文件数据的起始簇 File data start cluster (0:no data cluster, always 0 when fsize is 0) */
     DWORD    clust;           /* 文件读写指针的当前簇 Current cluster of fpter */
     DWORD    dsect;           /* 文件读写的当前数据扇区 Current data sector of fpter */
#if !_FS_READONLY
     DWORD    dir_sect;        /* 扇区包含的目录条目 Sector containing the directory entry */
     BYTE *   dir_ptr;         /* 在窗口中的目录项的指针 Pointer to the directory entry in the window */
#endif
#if _USE_FASTSEEK
     DWORD *  cltbl;       /* 链簇映射表指针 Pointer to the cluster link map table (null on file open) */
#endif
#if _FS_LOCK
     UINT     lockid;          /* 文件锁定ID File lock ID (index of file semaphore table Files[]) */
#endif
#if !_FS_TINY
     BYTE     buf[_MAX_SS];    /* 文件数据读/写缓冲 File data read/write buffer */
#endif
} FIL;
   
   
   
/* 目录结构对象 Directory object structure (DIR) */
   
typedef  struct  {
     FATFS*  fs;              /* 主文件系统对象的指针 Pointer to the owner file system object */
     WORD     id;                /* 主文件系统安装ID Owner file system mount ID */
     WORD     index;           /* 当前读写索引数 Current read/write index number */
     DWORD    sclust;          /* 表的起始簇 Table start cluster (0:Root dir) */
     DWORD    clust;           /* 当前簇Current cluster */
     DWORD    sect;              /* 当前扇区 Current sector */
     BYTE *   dir;               /* 当前SFN指针在win[] Pointer to the current SFN entry in the win[] */
     BYTE *   fn;                /* SFN的指针 Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */
#if _USE_LFN
     WCHAR *  lfn;             /* LFN工作缓冲区指针 Pointer to the LFN working buffer */
     WORD     lfn_idx;         /* 最后匹配的LFN索引数 Last matched LFN index number (0xFFFF:No LFN) */
#endif
} DIR;
   
   
   
/* 文件状态结构 File status structure (FILINFO) */
   
typedef  struct  {
     DWORD    fsize;           /* File size */
     WORD     fdate;           /* Last modified date */
     WORD     ftime;           /* Last modified time */
     BYTE     fattrib;         /* Attribute */
     TCHAR    fname[13];       /* Short file name (8.3 format) */
#if _USE_LFN
     TCHAR *  lfname;          /* Pointer to the LFN buffer */
     UINT     lfsize;          /* Size of LFN buffer in TCHAR */
#endif
} FILINFO;
   
   
   
/* 文件函数的返回代码 File function return code (FRESULT) */
   
typedef  enum  {
     FR_OK = 0,                   /* (0) 成功 Succeeded */
     FR_DISK_ERR,                 /* (1) 在低电平的磁盘I / O层发生硬件错误 A hard error occurred in the low level disk I/O layer */
     FR_INT_ERR,                  /* (2) 使用错误 Assertion failed */
     FR_NOT_READY,                /* (3) 物理驱动器不工作 The physical drive cannot work */
     FR_NO_FILE,                  /* (4) 找不到文件 Could not find the file */
     FR_NO_PATH,                  /* (5) 找不到路径 Could not find the path */
     FR_INVALID_NAME,         /* (6) 路径名格式无效 The path name format is invalid */
     FR_DENIED,                   /* (7) 访问拒绝由于禁止访问或者目录满 Access denied due to prohibited access or directory full */
     FR_EXIST,                        /* (8) 拒绝访问由于禁止访问 Access denied due to prohibited access */
     FR_INVALID_OBJECT,   /* (9) 文件/目录对象是无效的 The file/directory object is invalid */
     FR_WRITE_PROTECTED,  /* (10) 物理驱动器写保护 The physical drive is write protected */
     FR_INVALID_DRIVE,        /* (11) 逻辑驱动器号无效 The logical drive number is invalid */
     FR_NOT_ENABLED,          /* (12) 卷没有工作空间 The volume has no work area */
     FR_NO_FILESYSTEM,        /* (13) 没有可用的卷 There is no valid FAT volume */
     FR_MKFS_ABORTED,         /* (14) f_mkfs()由于任何参数误差中止 The f_mkfs() aborted due to any parameter error */
     FR_TIMEOUT,                  /* (15) 不能获得授权在规定的时间内访问卷 Could not get a grant to access the volume within defined period */
     FR_LOCKED,                   /* (16) 操作被拒绝根据文件共享政策 The operation is rejected according to the file sharing policy */
     FR_NOT_ENOUGH_CORE,  /* (17) LFN无法分配工作缓冲区 LFN working buffer could not be allocated */
     FR_TOO_MANY_OPEN_FILES,  /* (18) 打开文件数大于FS_SHARE Number of open files > _FS_SHARE */
     FR_INVALID_PARAMETER         /* (19) 给定的参数无效 Given parameter is invalid */
} FRESULT;
   
   
   
/*--------------------------------------------------------------*/
/* FatFs模块应用程序接口 FatFs module application interface                           */
   
FRESULT f_mount ( BYTE , FATFS*);                                      /* 安装/卸载一个逻辑驱动器 Mount/Unmount a logical drive */
FRESULT f_open (FIL*,  const  TCHAR *,  BYTE );               /* 打开或创建一个文件 Open or create a file */
FRESULT f_read (FIL*,  void *,  UINT UINT *);               /* 从文件中读取数据 Read data from a file */
FRESULT f_lseek (FIL*,  DWORD );                                       /* 改变一个文件对象文件指针 Move file pointer of a file object */
FRESULT f_close (FIL*);                                                      /* 关闭打开的文件对象 Close an open file object */
FRESULT f_opendir (DIR*,  const  TCHAR *);                      /* 打开一个已经存在的目录 Open an existing directory */
FRESULT f_readdir (DIR*, FILINFO*);                              /* 读一个目录项 Read a directory item */
FRESULT f_stat ( const  TCHAR *, FILINFO*);                     /* 获取文件状态 Get file status */
FRESULT f_write (FIL*,  const  void *,  UINT UINT *);    /* 写数据到一个文件 Write data to a file */
FRESULT f_getfree ( const  TCHAR *,  DWORD *, FATFS**); /* 获取驱动器上的空闲簇数 Get number of free clusters on the drive */
FRESULT f_truncate (FIL*);                                               /* 截断文件 Truncate file */
FRESULT f_sync (FIL*);                                                       /* 刷新正写入文件的缓存数据Flush cached data of a writing file */
FRESULT f_unlink ( const  TCHAR *);                                     /* 删除现有文件或目录 Delete an existing file or directory */
FRESULT f_mkdir ( const  TCHAR *);                                      /* 创建新目录 Create a new directory */
FRESULT f_chmod ( const  TCHAR *,  BYTE BYTE );              /* 改变文件/目录属性 Change attribute of the file/dir */
FRESULT f_utime ( const  TCHAR *,  const  FILINFO*);      /* 改变文件/目录的时间戳 Change times-tamp of the file/dir */
FRESULT f_rename ( const  TCHAR *,  const  TCHAR *);       /* 重命名/移动文件或目录 Rename/Move a file or directory */
FRESULT f_chdrive ( BYTE );                                                    /* 改变当前的驱动器 Change current drive */
FRESULT f_chdir ( const  TCHAR *);                                      /* 改变当前目录 Change current directory */
FRESULT f_getcwd ( TCHAR *,  UINT );                                     /* 获取当前目录 Get current directory */
FRESULT f_forward (FIL*,  UINT (*)( const  BYTE *, UINT ),  UINT UINT *);    /* 向流发送数据 Forward data to the stream */
FRESULT f_mkfs ( BYTE BYTE UINT );                               /* 创建一个驱动器上的文件系统 Create a file system on the drive */
FRESULT f_fdisk ( BYTE const  DWORD [],  void *);            /* 将一个物理驱动器为若干分区 Divide a physical drive into some partitions */
int  f_putc ( TCHAR , FIL*);                                                    /* 放一个字符在文件中 Put a character to the file */
int  f_puts ( const  TCHAR *, FIL*);                                     /* 放一组字符串在文件中 Put a string to the file */
int  f_printf (FIL*,  const  TCHAR *, ...);                      /* 将格式化后的字符串的文件 Put a formatted string to the file */
TCHAR * f_gets ( TCHAR *,  int , FIL*);                               /* 从文件中获得字符串 Get a string from the file */
   
#define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0)
#define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0)
#define f_tell(fp) ((fp)->fptr)
#define f_size(fp) ((fp)->fsize)
   
#ifndef EOF
#define EOF (-1)
#endif
   
   
   
   
/*--------------------------------------------------------------*/
/* 额外的用户定义函数 Additional user defined functions        */
   
/* RTC函数 RTC function */
#if !_FS_READONLY
DWORD  get_fattime ( void );
#endif
   
/* Union支持函数 Unicode support functions */
#if _USE_LFN                                        /* Unicode - OEM码转换 Unicode - OEM code conversion */
WCHAR  ff_convert ( WCHAR UINT );  /* OEM-Unicode双向转换 OEM-Unicode bidirectional conversion */
WCHAR  ff_wtoupper ( WCHAR );           /* Unicode大写转换 Unicode upper-case conversion */
#if _USE_LFN == 3                               /* 内存函数 Memory functions */
void * ff_memalloc ( UINT );                /* 分配内存块 Allocate memory block */
void  ff_memfree ( void *);                 /* 空闲内存块 Free memory block */
#endif
#endif
   
/* 同步函数 Sync functions */
#if _FS_REENTRANT
int  ff_cre_syncobj ( BYTE , _SYNC_t*); /* 创建一个同步对象 Create a sync object */
int  ff_req_grant (_SYNC_t);                  /* 锁同步对象 Lock sync object */
void  ff_rel_grant (_SYNC_t);                 /* 解锁同步对象 Unlock sync object */
int  ff_del_syncobj (_SYNC_t);                /* D删除同步对象 elete a sync object */
#endif
   
   
   
   
/*--------------------------------------------------------------*/
/* 标志和偏移地址 Flags and offset address                     */
   
   
/* 文件访问控制和文件状态标志 File access control and file status flags (FIL.flag) */
   
#define FA_READ             0x01
#define FA_OPEN_EXISTING    0x00
#define FA__ERROR           0x80
   
#if !_FS_READONLY
#define FA_WRITE            0x02
#define FA_CREATE_NEW       0x04
#define FA_CREATE_ALWAYS    0x08
#define FA_OPEN_ALWAYS      0x10
#define FA__WRITTEN         0x20
#define FA__DIRTY           0x40
#endif
   
   
/* FAT副类型 FAT sub type (FATFS.fs_type) */
   
#define FS_FAT12    1
#define FS_FAT16    2
#define FS_FAT32    3
   
   
/* 目录项的文件属性字节 File attribute bits for directory entry */
   
#define AM_RDO  0x01    /* 只读 Read only */
#define AM_HID  0x02    /* 隐藏 Hidden */
#define AM_SYS  0x04    /* 系统 System */
#define AM_VOL  0x08    /* 卷标 Volume label */
#define AM_LFN  0x0F    /* LFN项 LFN entry */
#define AM_DIR  0x10    /* 目录Directory */
#define AM_ARC  0x20    /* 存档 Archive */
#define AM_MASK 0x3F    /* 掩码位 Mask of defined bits */
   
   
/* 快速查找功能 Fast seek feature */
#define CREATE_LINKMAP  0xFFFFFFFF
   
   
   
/*--------------------------------*/
/* 多字节字访问宏 Multi-byte word access macros  */
   
#if _WORD_ACCESS == 1   /* FAT结构使字访问 Enable word access to the FAT structure */
#define LD_WORD(ptr)        (WORD)(*(WORD*)(BYTE*)(ptr))
#define LD_DWORD(ptr)       (DWORD)(*(DWORD*)(BYTE*)(ptr))
#define ST_WORD(ptr,val)    *(WORD*)(BYTE*)(ptr)=(WORD)(val)
#define ST_DWORD(ptr,val)   *(DWORD*)(BYTE*)(ptr)=(DWORD)(val)
#else                                   /* FAT结构用位访问 Use byte-by-byte access to the FAT structure */
#define LD_WORD(ptr)        (WORD)(((WORD)*((BYTE*)(ptr)+1)<<8)|(WORD)*(BYTE*)(ptr))
#define LD_DWORD(ptr)       (DWORD)(((DWORD)*((BYTE*)(ptr)+3)<<24)|((DWORD)*((BYTE*)(ptr)+2)<<16)|((WORD)*((BYTE*)(ptr)+1)<<8)|*(BYTE*)(ptr))
#define ST_WORD(ptr,val)    *(BYTE*)(ptr)=(BYTE)(val); *((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8)
#define ST_DWORD(ptr,val)   *(BYTE*)(ptr)=(BYTE)(val); *((BYTE*)(ptr)+1)=(BYTE)((WORD)(val)>>8); *((BYTE*)(ptr)+2)=(BYTE)((DWORD)(val)>>16); *((BYTE*)(ptr)+3)=(BYTE)((DWORD)(val)>>24)
#endif
   
#ifdef __cplusplus
}
#endif
   
#endif /* _FATFS */


posted @ 2013-04-21 10:16  javawebsoa  Views(1418)  Comments(0Edit  收藏  举报