181 lines
3.2 KiB
C
181 lines
3.2 KiB
C
/*
|
|
* This file is subject to the terms of the GFX License. If a copy of
|
|
* the license was not distributed with this file, you can obtain one at:
|
|
*
|
|
* http://ugfx.org/license.html
|
|
*/
|
|
|
|
/**
|
|
* This file is included by src/gfile/gfile.c
|
|
*/
|
|
|
|
#include "ff.h"
|
|
#include "ffconf.h"
|
|
|
|
/*
|
|
* ToDo:
|
|
*
|
|
* - fatfsExists()
|
|
* - f_mount has to be called before the disk can be accessed
|
|
* - complete _flags2mode()
|
|
* - restructure provided diskio.c files
|
|
* - do full testing
|
|
*/
|
|
/********************************************************
|
|
* The FAT file-system VMT
|
|
********************************************************/
|
|
|
|
static bool_t fatfsDel(const char* fname);
|
|
static bool_t fatfsExists(const char* fname);
|
|
static long int fatfsFileSize(const char* fname);
|
|
static bool_t fatfsRename(const char* oldname, const char* newname);
|
|
static bool_t fatfsOpen(GFILE* f, const char* fname);
|
|
static void fatfsClose(GFILE* f);
|
|
static int fatfsRead(GFILE* f, void* buf, int size);
|
|
static int fatfsWrite(GFILE* f, const void* buf, int size);
|
|
static bool_t fatfsSetPos(GFILE* f, long int pos);
|
|
static long int fatfsGetSize(GFILE* f);
|
|
static bool_t fatfsEOF(GFILE* f);
|
|
|
|
static const GFILEVMT FsFatFSVMT = {
|
|
GFILE_CHAINHEAD,
|
|
GFSFLG_SEEKABLE,
|
|
'F',
|
|
fatfsDel,
|
|
fatfsExists,
|
|
fatfsFileSize,
|
|
fatfsRename,
|
|
fatfsOpen,
|
|
fatfsClose,
|
|
fatfsRead,
|
|
fatfsWrite,
|
|
fatfsSetPos,
|
|
fatfsGetSize,
|
|
fatfsEOF
|
|
};
|
|
|
|
#undef GFILE_CHAINHEAD
|
|
#define GFILE_CHAINHEAD &FsFatFSVMT
|
|
|
|
static void _flags2mode(GFILE* f, BYTE* mode)
|
|
{
|
|
*mode = 0;
|
|
|
|
if (f->flags & GFILEFLG_MUSTEXIST)
|
|
*mode |= FA_READ;
|
|
else if (f->flags & GFILEFLG_APPEND)
|
|
*mode |= 0; /* ToDO */
|
|
else
|
|
*mode |= FA_WRITE;
|
|
|
|
/* ToDo - Complete */
|
|
}
|
|
|
|
static bool_t fatfsDel(const char* fname)
|
|
{
|
|
FRESULT ferr;
|
|
|
|
ferr = f_unlink( (const TCHAR*)fname );
|
|
if (ferr != FR_OK)
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static bool_t fatfsExists(const char* fname)
|
|
{
|
|
(void)fname;
|
|
|
|
/* ToDo */
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static long int fatfsFileSize(const char* fname)
|
|
{
|
|
FRESULT ferr;
|
|
FILINFO fno;
|
|
|
|
ferr = f_stat( (const TCHAR*)fname, &fno );
|
|
if (ferr != FR_OK)
|
|
return 0;
|
|
|
|
return (long int)fno.fsize;
|
|
}
|
|
|
|
static bool_t fatfsRename(const char* oldname, const char* newname)
|
|
{
|
|
FRESULT ferr;
|
|
|
|
ferr = f_rename( (const TCHAR*)oldname, (const TCHAR*)newname );
|
|
if (ferr != FR_OK)
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static bool_t fatfsOpen(GFILE* f, const char* fname)
|
|
{
|
|
FIL* fd = 0;
|
|
BYTE mode;
|
|
FRESULT ferr;
|
|
|
|
_flags2mode(f, &mode);
|
|
|
|
ferr = f_open(fd, fname, mode);
|
|
if (ferr != FR_OK)
|
|
return FALSE;
|
|
|
|
f->obj = (void*)fd;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static void fatfsClose(GFILE* f)
|
|
{
|
|
f_close( (FIL*)f->obj );
|
|
}
|
|
|
|
static int fatfsRead(GFILE* f, void* buf, int size)
|
|
{
|
|
int br;
|
|
|
|
f_read( (FIL*)f->obj, buf, size, (UINT*)&br);
|
|
|
|
return br;
|
|
}
|
|
|
|
static int fatfsWrite(GFILE* f, const void* buf, int size)
|
|
{
|
|
int wr;
|
|
|
|
f_write( (FIL*)f->obj, buf, size, (UINT*)&wr);
|
|
|
|
return wr;
|
|
}
|
|
|
|
static bool_t fatfsSetPos(GFILE* f, long int pos)
|
|
{
|
|
FRESULT ferr;
|
|
|
|
ferr = f_lseek( (FIL*)f->obj, (DWORD)pos );
|
|
if (ferr != FR_OK)
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static long int fatfsGetSize(GFILE* f)
|
|
{
|
|
return (long int)f_tell( (FIL*)f->obj );
|
|
}
|
|
|
|
static bool_t fatfsEOF(GFILE* f)
|
|
{
|
|
if ( f_eof( (FIL*)f->obj ) != 0)
|
|
return TRUE;
|
|
else
|
|
return FALSE;
|
|
}
|
|
|