You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
482 lines
14 KiB
C
482 lines
14 KiB
C
/*
|
|
* 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_*/
|
|
|