📄 fatif.c
字号:
/**
* @file $RCSfile: fatIF.c,v $
*
* Copyright (c) 2006 XXXXX INC., All Rights Reserved
*
* @author YongJian Guo <XXX@XXX>
*
* @version $Revision: 1.2.0.00 $
* @date $Date: 2006/10/13 06:46:18 $
* @update $Date: 2007/01/24 14:06:17 $
* $Header: $
**/
#include "SDShare.h"
#include "fat.h"
#include "fatif.h"
#define MAXFILE 5
static uint16 _errcode = 0; /* last errer code */
static FATFS fs;
static FIL __fp[MAXFILE]={0};
/* get free file handle */
static FIL *getfreeFH(void)
{
uint16 i;
for(i = 0; i < MAXFILE; i++)
{
if( __fp[i].isused == FALSE )
{
__fp[i].isused = TRUE;
return &__fp[i];
}
}
return NULL;
}
/* free file handle */
static void freeFH(FIL *f)
{
memset(f,0,sizeof(FIL));
}
/********************************************************************************
* @func ff_open
*
* @note Open or create a file
*
* @param path :(IN) file full name
* mod :(IN) open mode
*
* @return FHANDLE :success return file handle,errer return NULL
*******************************************************************************/
FHANDLE ff_open (const sint8 *path, uint8 mod)
{
FIL *fil = NULL;
/* get file buffer struct */
fil = getfreeFH();
if(!fil)
{
_errcode = EC_MEM_INVALID;
}
else
{
_errcode = f_open(fil, path, mod);
if(_errcode != EC_SUCCESS)
{
freeFH(fil);
fil = NULL;
}
}
return (FHANDLE)fil;
}
/********************************************************************************
* @func ff_read
*
* @note Read file
*
* @param fp :(IN) file handle
* buf :(IN) read buffer
* len :(IN) read len
*
* @return uint16 :success return read length,errer return value not valid: see geterrcode()
*******************************************************************************/
uint16 ff_read (FHANDLE fp, void *buf, uint16 len)
{
uint16 rlen;
if(!(fp || buf))
return (_errcode = EC_ERROR);
_errcode = f_read((FIL*)fp,buf,len,&rlen);
if(_errcode != EC_SUCCESS)
return EC_ERROR;
return rlen;
}
/********************************************************************************
* @func ff_close
*
* @note Close file
*
* @param fp :(IN) file handle
*
* @return uint16 :success return EC_SUCCESS,errer return errer code
*******************************************************************************/
uint16 ff_close (FHANDLE fp)
{
if(!fp)
return (_errcode = EC_ERROR);
_errcode = f_close((FIL*)fp);
freeFH(fp);
return _errcode;
}
/********************************************************************************
* @func ff_lseek
*
* @note Seek file pointer
*
* @param fp :(IN) file handle
* ofs :(IN) offset
*
* @return uint16 :success return EC_SUCCESS,errer return errer code
*******************************************************************************/
uint16 ff_lseek (FHANDLE fp, uint32 ofs)
{
if(!fp)
return (_errcode = EC_ERROR);
_errcode = f_lseek((FIL*)fp,ofs);
return _errcode;
}
/********************************************************************************
* @func ff_getcurpos
*
* @note get file pointer pos
*
* @param fp :(IN) file handle
* ofs :(OUT) offset
*
* @return uint16 :success return EC_SUCCESS,errer return errer code
*******************************************************************************/
uint16 ff_getcurpos (FHANDLE fp, uint32* offset)
{
if(!(fp || offset))
return (_errcode = EC_ERROR);
*offset = ((FIL*)fp)->fptr;
return (_errcode = EC_SUCCESS);
}
/********************************************************************************
* @func ff_getfreecluters
*
* @note Get number of free clusters
*
* @param NULL
*
* @return uint32 :success return number of free clusters count,errer return value not valid :see geterrcode()
*******************************************************************************/
uint32 ff_getfreecluters (void)
{
uint32 nclust;
_errcode = f_getfree(&nclust);
if(_errcode == EC_SUCCESS)
return nclust;
return 0xFFFFFFFF;
}
/********************************************************************************
* @func ff_initdrv
*
* @note Force initialized the file system
*
* @param NULL
*
* @return uint16 :success return EC_SUCCESS,errer return errer code
*******************************************************************************/
uint16 ff_initdrv (void)
{
memset(&fs,0,sizeof(FATFS));
FatFs = &fs;
return (_errcode = f_mountdrv());
}
/********************************************************************************
* @func ff_write
*
* @note Write file
*
* @param fp :(IN) file handle
* buf :(IN) write buffer
* len :(IN) write len
*
* @return uint16 :success return write len,errerreturn value not valid:see geterrcode()
*******************************************************************************/
uint16 ff_write (FHANDLE fp, const void *buf, uint16 len)
{
uint16 wlen;
if(!fp)
return (_errcode = EC_ERROR);
_errcode = f_write((FIL*)fp,buf,len,&wlen);
if(_errcode != EC_SUCCESS)
return EC_ERROR;
return wlen;
}
/********************************************************************************
* @func ff_flush
*
* @note Flush cached data of a writing file
*
* @param fp :(IN) file handle
*
* @return uint16 :success return EC_SUCCESS,errer return errer code
*******************************************************************************/
uint16 ff_flush (FHANDLE fp)
{
return (_errcode = f_sync((FIL*)fp));
}
/********************************************************************************
* @func ff_delete
*
* @note Delete a file or directory
*
* @param path :(IN) file or folder full name
*
* @return uint16 :success return EC_SUCCESS,errer return errer code
*******************************************************************************/
uint16 ff_delete (const sint8 *path)
{
return (_errcode = f_unlink(path));
}
/********************************************************************************
* @func ff_createdir
*
* @note Create a directory
*
* @param path :(IN) folder full name
*
* @return uint16 :success return EC_SUCCESS,errer return errer code
*******************************************************************************/
uint16 ff_createdir (const sint8 *path)
{
return (_errcode = f_mkdir(path));
}
/********************************************************************************
* @func ff_changemod
*
* @note Change file attriburte
*
* @param path :(IN) folder full name
* value :(IN) Attribute bits
* newmask :(IN) Attribute mask to change
*
* @return uint16 :success return EC_SUCCESS,errer return errer code
*******************************************************************************/
uint16 ff_changemod (const sint8 *path, uint8 value, uint8 newmask)
{
return (_errcode = f_chmod(path,value,newmask));
}
/********************************************************************************
* @func ff_changemod
*
* @note Rename a file or directory
*
* @param old_path :(IN) old file or folder full name
* new_path :(IN) new file or folder full name
*
* @return uint16 :success return EC_SUCCESS,errer return errer code
*******************************************************************************/
uint16 ff_rename (const sint8 *old_path, const sint8 *new_path)
{
return (_errcode = f_rename(old_path,new_path));
}
/********************************************************************************
* @func ff_getfilesize
*
* @note get file size
*
* @param fp : file handle
*
* @return uint32 : return file size
*******************************************************************************/
uint32 ff_getfilesize(FHANDLE fp)
{
_errcode = EC_SUCCESS;
return ((FIL*)fp)->fsize;
}
/********************************************************************************
* @func ff_geterrcode
*
* @note get last errer code
*
* @param NULL
*
* @return uint16 : return errer code
*******************************************************************************/
uint16 ff_geterrcode(void)
{
return _errcode;
}
/********************************************************************************
* @func ff_getfilesystem
*
* @note get file system
*
* @param NULL
*
* @return uint16 : return errer code
*******************************************************************************/
uint16 ff_getfilesystem(void)
{
_errcode = EC_SUCCESS;
return (uint16)FatFs->fs_type;
}
/********************************************************************************
* @func ff_format16
*
* @note format file system fat16
*
* @param NULL
*
* @return uint16 : return errer code
*******************************************************************************/
uint16 ff_formatfat16(void)
{
memset(&fs,0,sizeof(FATFS));
FatFs = &fs;
return ( _errcode = f_formatfat16() );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -