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