/* | |
* FreeRTOS+FAT FS V1.0.0 (C) 2013 HCC Embedded | |
* | |
* The FreeRTOS+FAT SL license terms are different to the FreeRTOS license | |
* terms. | |
* | |
* FreeRTOS+FAT SL uses a dual license model that allows the software to be used | |
* under a standard GPL open source license, or a commercial license. The | |
* standard GPL license (unlike the modified GPL license under which FreeRTOS | |
* itself is distributed) requires that all software statically linked with | |
* FreeRTOS+FAT SL is also distributed under the same GPL V2 license terms. | |
* Details of both license options follow: | |
* | |
* - Open source licensing - | |
* FreeRTOS+FAT SL is a free download and may be used, modified, evaluated and | |
* distributed without charge provided the user adheres to version two of the | |
* GNU General Public License (GPL) and does not remove the copyright notice or | |
* this text. The GPL V2 text is available on the gnu.org web site, and on the | |
* following URL: http://www.FreeRTOS.org/gpl-2.0.txt. | |
* | |
* - Commercial licensing - | |
* Businesses and individuals who for commercial or other reasons cannot comply | |
* with the terms of the GPL V2 license must obtain a commercial license before | |
* incorporating FreeRTOS+FAT SL into proprietary software for distribution in | |
* any form. Commercial licenses can be purchased from | |
* http://shop.freertos.org/fat_sl and do not require any source files to be | |
* changed. | |
* | |
* FreeRTOS+FAT SL is distributed in the hope that it will be useful. You | |
* cannot use FreeRTOS+FAT SL unless you agree that you use the software 'as | |
* is'. FreeRTOS+FAT SL is provided WITHOUT ANY WARRANTY; without even the | |
* implied warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A | |
* PARTICULAR PURPOSE. Real Time Engineers Ltd. and HCC Embedded disclaims all | |
* conditions and terms, be they implied, expressed, or statutory. | |
* | |
* http://www.FreeRTOS.org | |
* http://www.FreeRTOS.org/FreeRTOS-Plus | |
* | |
*/ | |
#ifndef _API_FAT_SL_H_ | |
#define _API_FAT_SL_H_ | |
#include "config_fat_sl.h" | |
#include "../version/ver_fat_sl.h" | |
#if VER_FAT_SL_MAJOR != 3 || VER_FAT_SL_MINOR != 2 | |
#error Incompatible FAT_SL version number! | |
#endif | |
#ifdef __cplusplus | |
extern "C" { | |
#endif | |
#define F_MAXNAME 8 /* 8 byte name */ | |
#define F_MAXEXT 3 /* 3 byte extension */ | |
typedef struct | |
{ | |
char path[F_MAXPATH]; /* /directory1/dir2/ */ | |
char filename[F_MAXNAME]; /* filename */ | |
char fileext[F_MAXEXT]; /* extension */ | |
} F_NAME; | |
typedef struct | |
{ | |
unsigned long cluster; | |
unsigned long sector; | |
unsigned long sectorend; | |
unsigned long pos; | |
} F_POS; | |
typedef struct | |
{ | |
char filename[F_MAXPATH]; /*file name+ext*/ | |
char name[F_MAXNAME]; /*file name*/ | |
char ext[F_MAXEXT]; /*file extension*/ | |
unsigned char attr; /*attribute of the file*/ | |
unsigned short ctime; /*creation time*/ | |
unsigned short cdate; /*creation date*/ | |
unsigned long cluster; | |
long filesize; /*length of file*/ | |
F_NAME findfsname; /*find properties*/ | |
F_POS pos; | |
} F_FIND; | |
/* definitions for ctime */ | |
#define F_CTIME_SEC_SHIFT 0 | |
#define F_CTIME_SEC_MASK 0x001f /*0-30 in 2seconds*/ | |
#define F_CTIME_MIN_SHIFT 5 | |
#define F_CTIME_MIN_MASK 0x07e0 /*0-59 */ | |
#define F_CTIME_HOUR_SHIFT 11 | |
#define F_CTIME_HOUR_MASK 0xf800 /*0-23*/ | |
/* definitions for cdate */ | |
#define F_CDATE_DAY_SHIFT 0 | |
#define F_CDATE_DAY_MASK 0x001f /*0-31*/ | |
#define F_CDATE_MONTH_SHIFT 5 | |
#define F_CDATE_MONTH_MASK 0x01e0 /*1-12*/ | |
#define F_CDATE_YEAR_SHIFT 9 | |
#define F_CDATE_YEAR_MASK 0xfe00 /*0-119 (1980+value)*/ | |
#define F_ATTR_ARC 0x20 | |
#define F_ATTR_DIR 0x10 | |
#define F_ATTR_VOLUME 0x08 | |
#define F_ATTR_SYSTEM 0x04 | |
#define F_ATTR_HIDDEN 0x02 | |
#define F_ATTR_READONLY 0x01 | |
#define F_CLUSTER_FREE ( (unsigned long)0x00000000 ) | |
#define F_CLUSTER_RESERVED ( (unsigned long)0x0ffffff0 ) | |
#define F_CLUSTER_BAD ( (unsigned long)0x0ffffff7 ) | |
#define F_CLUSTER_LAST ( (unsigned long)0x0ffffff8 ) | |
#define F_CLUSTER_LASTF32R ( (unsigned long)0x0fffffff ) | |
#define F_ST_MISSING 0x00000001 | |
#define F_ST_CHANGED 0x00000002 | |
#define F_ST_WRPROTECT 0x00000004 | |
typedef struct | |
{ | |
unsigned long abspos; | |
unsigned long filesize; | |
unsigned long startcluster; | |
unsigned long prevcluster; | |
unsigned long relpos; | |
unsigned char modified; | |
unsigned char mode; | |
unsigned char _tdata[F_SECTOR_SIZE]; | |
F_POS pos; | |
F_POS dirpos; | |
#if F_FILE_CHANGED_EVENT | |
char filename[F_MAXPATH]; /* filename with full path */ | |
#endif | |
} F_FILE; | |
enum | |
{ | |
F_UNKNOWN_MEDIA | |
, F_FAT12_MEDIA | |
, F_FAT16_MEDIA | |
, F_FAT32_MEDIA | |
}; | |
enum | |
{ | |
/* 0 */ | |
F_NO_ERROR, | |
/* 1 */ F_ERR_RESERVED_1, | |
/* 2 */ F_ERR_NOTFORMATTED, | |
/* 3 */ F_ERR_INVALIDDIR, | |
/* 4 */ F_ERR_INVALIDNAME, | |
/* 5 */ F_ERR_NOTFOUND, | |
/* 6 */ F_ERR_DUPLICATED, | |
/* 7 */ F_ERR_NOMOREENTRY, | |
/* 8 */ F_ERR_NOTOPEN, | |
/* 9 */ F_ERR_EOF, | |
/* 10 */ F_ERR_RESERVED_2, | |
/* 11 */ F_ERR_NOTUSEABLE, | |
/* 12 */ F_ERR_LOCKED, | |
/* 13 */ F_ERR_ACCESSDENIED, | |
/* 14 */ F_ERR_NOTEMPTY, | |
/* 15 */ F_ERR_INITFUNC, | |
/* 16 */ F_ERR_CARDREMOVED, | |
/* 17 */ F_ERR_ONDRIVE, | |
/* 18 */ F_ERR_INVALIDSECTOR, | |
/* 19 */ F_ERR_READ, | |
/* 20 */ F_ERR_WRITE, | |
/* 21 */ F_ERR_INVALIDMEDIA, | |
/* 22 */ F_ERR_BUSY, | |
/* 23 */ F_ERR_WRITEPROTECT, | |
/* 24 */ F_ERR_INVFATTYPE, | |
/* 25 */ F_ERR_MEDIATOOSMALL, | |
/* 26 */ F_ERR_MEDIATOOLARGE, | |
/* 27 */ F_ERR_NOTSUPPSECTORSIZE | |
/* 28 */, F_ERR_ALLOCATION | |
#if F_FS_THREAD_AWARE == 1 | |
/* 29 */, F_ERR_OS = 29 | |
#endif /* F_FS_THREAD_AWARE */ | |
}; | |
typedef struct | |
{ | |
unsigned long total; | |
unsigned long free; | |
unsigned long used; | |
unsigned long bad; | |
unsigned long total_high; | |
unsigned long free_high; | |
unsigned long used_high; | |
unsigned long bad_high; | |
} F_SPACE; | |
enum | |
{ | |
F_SEEK_SET /*Beginning of file*/ | |
, F_SEEK_CUR /*Current position of file pointer*/ | |
, F_SEEK_END /*End of file*/ | |
}; | |
/**************************************************************************** | |
* | |
* for file changed events | |
* | |
***************************************************************************/ | |
#ifndef F_FILE_CHANGED_EVENT | |
#define F_FILE_CHANGED_EVENT 0 | |
#endif | |
#if F_FILE_CHANGED_EVENT | |
typedef struct | |
{ | |
unsigned char action; | |
unsigned char flags; | |
unsigned char attr; | |
unsigned short ctime; | |
unsigned short cdate; | |
unsigned long filesize; | |
char filename[F_MAXPATH]; | |
} ST_FILE_CHANGED; | |
typedef void ( *F_FILE_CHANGED_EVENTFUNC )( ST_FILE_CHANGED * fc ); | |
extern F_FILE_CHANGED_EVENTFUNC f_filechangedevent; | |
#define f_setfilechangedevent( filechangeevent ) f_filechangedevent = filechangeevent | |
/* flags */ | |
#define FFLAGS_NONE 0x00000000 | |
#define FFLAGS_FILE_NAME 0x00000001 | |
#define FFLAGS_DIR_NAME 0x00000002 | |
#define FFLAGS_NAME 0x00000003 | |
#define FFLAGS_ATTRIBUTES 0x00000004 | |
#define FFLAGS_SIZE 0x00000008 | |
#define FFLAGS_LAST_WRITE 0x00000010 | |
/* actions */ | |
#define FACTION_ADDED 0x00000001 | |
#define FACTION_REMOVED 0x00000002 | |
#define FACTION_MODIFIED 0x00000003 | |
#endif /* if F_FILE_CHANGED_EVENT */ | |
unsigned char fn_initvolume ( F_DRIVERINIT initfunc ); | |
unsigned char fn_delvolume ( void ); | |
unsigned char fn_getfreespace ( F_SPACE * pspace ); | |
unsigned char fn_chdir ( const char * dirname ); | |
unsigned char fn_mkdir ( const char * dirname ); | |
unsigned char fn_rmdir ( const char * dirname ); | |
unsigned char fn_findfirst ( const char * filename, F_FIND * find ); | |
unsigned char fn_findnext ( F_FIND * find ); | |
long fn_filelength ( const char * filename ); | |
unsigned char fn_close ( F_FILE * filehandle ); | |
F_FILE * fn_open ( const char * filename, const char * mode ); | |
long fn_read ( void * buf, long size, long _size_t, F_FILE * filehandle ); | |
long fn_write ( const void * buf, long size, long _size_t, F_FILE * filehandle ); | |
unsigned char fn_seek ( F_FILE * filehandle, long offset, unsigned char whence ); | |
long fn_tell ( F_FILE * filehandle ); | |
int fn_getc ( F_FILE * filehandle ); | |
int fn_putc ( int ch, F_FILE * filehandle ); | |
unsigned char fn_rewind ( F_FILE * filehandle ); | |
unsigned char fn_eof ( F_FILE * filehandle ); | |
unsigned char fn_delete ( const char * filename ); | |
unsigned char fn_seteof ( F_FILE * ); | |
F_FILE * fn_truncate ( const char *, long ); | |
unsigned char fn_getcwd ( char * buffer, unsigned char maxlen, char root ); | |
unsigned char fn_hardformat ( unsigned char fattype ); | |
unsigned char fn_format ( unsigned char fattype ); | |
unsigned char fn_getserial ( unsigned long * ); | |
#if F_FS_THREAD_AWARE == 1 | |
#include "FreeRTOS.h" | |
#include "semphr.h" | |
#ifndef FS_MUTEX_DEFINED | |
extern xSemaphoreHandle fs_lock_semaphore; | |
#endif /* FS_MUTEX_DEFINED */ | |
unsigned char fn_init ( void ); | |
#define f_init fn_init | |
#define f_initvolume fn_initvolume | |
#define f_delvolume fn_delvolume | |
unsigned char fr_hardformat ( unsigned char fattype ); | |
#define f_hardformat( fattype ) fr_hardformat( fattype ) | |
#define f_format( fattype ) fr_hardformat( fattype ) | |
unsigned char fr_getcwd ( char * buffer, unsigned char maxlen, char root ); | |
#define f_getcwd( buffer, maxlen ) fr_getcwd( buffer, maxlen, 1 ) | |
unsigned char fr_getfreespace ( F_SPACE * pspace ); | |
#define f_getfreespace fr_getfreespace | |
unsigned char fr_chdir ( const char * dirname ); | |
#define f_chdir( dirname ) fr_chdir( dirname ) | |
unsigned char fr_mkdir ( const char * dirname ); | |
#define f_mkdir( dirname ) fr_mkdir( dirname ) | |
unsigned char fr_rmdir ( const char * dirname ); | |
#define f_rmdir( dirname ) fr_rmdir( dirname ) | |
unsigned char fr_findfirst ( const char * filename, F_FIND * find ); | |
unsigned char fr_findnext ( F_FIND * find ); | |
#define f_findfirst( filename, find ) fr_findfirst( filename, find ) | |
#define f_findnext( find ) fr_findnext( find ) | |
long fr_filelength ( const char * filename ); | |
#define f_filelength( filename ) fr_filelength( filename ) | |
unsigned char fr_close ( F_FILE * filehandle ); | |
F_FILE * fr_open ( const char * filename, const char * mode ); | |
long fr_read ( void * buf, long size, long _size_t, F_FILE * filehandle ); | |
unsigned char fr_getserial ( unsigned long * ); | |
#define f_getserial( serial ) fr_getserial( serial ) | |
unsigned char fr_flush ( F_FILE * f ); | |
#define f_flush( filehandle ) fr_flush( filehandle ) | |
long fr_write ( const void * buf, long size, long _size_t, F_FILE * filehandle ); | |
#define f_write( buf, size, _size_t, filehandle ) fr_write( buf, size, _size_t, filehandle ) | |
unsigned char fr_seek ( F_FILE * filehandle, long offset, unsigned char whence ); | |
#define f_seek( filehandle, offset, whence ) fr_seek( filehandle, offset, whence ) | |
long fr_tell ( F_FILE * filehandle ); | |
#define f_tell( filehandle ) fr_tell( filehandle ) | |
int fr_getc ( F_FILE * filehandle ); | |
#define f_getc( filehandle ) fr_getc( filehandle ) | |
int fr_putc ( int ch, F_FILE * filehandle ); | |
#define f_putc( ch, filehandle ) fr_putc( ch, filehandle ) | |
unsigned char fr_rewind ( F_FILE * filehandle ); | |
#define f_rewind( filehandle ) fr_rewind( filehandle ) | |
unsigned char fr_eof ( F_FILE * filehandle ); | |
#define f_eof( filehandle ) fr_eof( filehandle ) | |
unsigned char fr_delete ( const char * filename ); | |
#define f_delete( filename ) fr_delete( filename ) | |
unsigned char fr_seteof ( F_FILE * ); | |
#define f_seteof( file ) fr_seteof( file ) | |
F_FILE * fr_truncate ( const char *, long ); | |
#define f_truncate( filename, filesize ) fr_truncate( filename, filesize ) | |
#define f_close( filehandle ) fr_close( filehandle ) | |
#define f_open( filename, mode ) fr_open( filename, mode ) | |
#define f_read( buf, size, _size_t, filehandle ) fr_read( buf, size, _size_t, filehandle ) | |
#else /* F_FS_THREAD_AWARE */ | |
unsigned char fn_init ( void ); | |
#define f_init fn_init | |
#define f_initvolume fn_initvolume | |
#define f_delvolume fn_delvolume | |
#define f_hardformat( fattype ) fn_hardformat( fattype ) | |
#define f_format( fattype ) fn_hardformat( fattype ) | |
#define f_getcwd( buffer, maxlen ) fn_getcwd( buffer, maxlen, 1 ) | |
unsigned char fn_getfreespace ( F_SPACE * pspace ); | |
#define f_getfreespace fn_getfreespace | |
unsigned char fn_chdir ( const char * dirname ); | |
#define f_chdir( dirname ) fn_chdir( dirname ) | |
unsigned char fn_mkdir ( const char * dirname ); | |
#define f_mkdir( dirname ) fn_mkdir( dirname ) | |
unsigned char fn_rmdir ( const char * dirname ); | |
#define f_rmdir( dirname ) fn_rmdir( dirname ) | |
unsigned char fn_findfirst ( const char * filename, F_FIND * find ); | |
unsigned char fn_findnext ( F_FIND * find ); | |
#define f_findfirst( filename, find ) fn_findfirst( filename, find ) | |
#define f_findnext( find ) fn_findnext( find ) | |
#define f_filelength( filename ) fn_filelength( filename ) | |
#define f_getserial( serial ) fn_getserial( serial ) | |
unsigned char fn_flush ( F_FILE * f ); | |
#define f_flush( filehandle ) fn_flush( filehandle ) | |
#define f_write( buf, size, _size_t, filehandle ) fn_write( buf, size, _size_t, filehandle ) | |
#define f_seek( filehandle, offset, whence ) fn_seek( filehandle, offset, whence ) | |
long fn_tell ( F_FILE * filehandle ); | |
#define f_tell( filehandle ) fn_tell( filehandle ) | |
int fn_getc ( F_FILE * filehandle ); | |
#define f_getc( filehandle ) fn_getc( filehandle ) | |
int fn_putc ( int ch, F_FILE * filehandle ); | |
#define f_putc( ch, filehandle ) fn_putc( ch, filehandle ) | |
unsigned char fn_rewind ( F_FILE * filehandle ); | |
#define f_rewind( filehandle ) fn_rewind( filehandle ) | |
unsigned char fn_eof ( F_FILE * filehandle ); | |
#define f_eof( filehandle ) fn_eof( filehandle ) | |
unsigned char fn_delete ( const char * filename ); | |
#define f_delete( filename ) fn_delete( filename ) | |
unsigned char fn_seteof ( F_FILE * ); | |
#define f_seteof( file ) fn_seteof( file ) | |
F_FILE * fn_truncate ( const char *, long ); | |
#define f_truncate( filename, filesize ) fn_truncate( filename, filesize ) | |
#define f_close( filehandle ) fn_close( filehandle ) | |
#define f_open( filename, mode ) fn_open( filename, mode ) | |
#define f_read( buf, size, _size_t, filehandle ) fn_read( buf, size, _size_t, filehandle ) | |
#endif /* F_FS_THREAD_AWARE */ | |
/**************************************************************************** | |
* | |
* end of fat_sl.h | |
* | |
***************************************************************************/ | |
#ifdef __cplusplus | |
} | |
#endif | |
#endif /*_API_FAT_SL_H_*/ | |