/* * 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_*/