⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fatif.c

📁 SD卡FAT文件系统
💻 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 + -