Projectkk2glider/fatfs 0.12 (#3925)

* Re #3815: Disk cache: Write statistic added. Bigger disk cache. Show disk cache misses in CLI.

* Update to the latest FatFS R0.12b (all existing OpenTX patches have been already applied in upstream, only few ff.h modifications needed for simulator)

* Missing file

* SD card manager: do not show parent dir [..] for root directory
This commit is contained in:
Damjan Adamic
2016-10-18 18:14:17 +02:00
committed by Bertrand Songis
parent eb24bbacbb
commit 4513cf89f2
29 changed files with 8322 additions and 6633 deletions
+46 -35
View File
@@ -657,20 +657,20 @@ FRESULT f_open (FIL * fil, const TCHAR *name, BYTE flag)
{
char * path = convertSimuPath(name);
char * realPath = findTrueFileName(path);
fil->fs = 0;
fil->obj.fs = 0;
if (!(flag & FA_WRITE)) {
struct stat tmp;
if (stat(realPath, &tmp)) {
TRACE("f_open(%s) = INVALID_NAME (FIL %p)", path, fil);
return FR_INVALID_NAME;
}
fil->fsize = tmp.st_size;
fil->obj.objsize = tmp.st_size;
fil->fptr = 0;
}
fil->fs = (FATFS*)fopen(realPath, (flag & FA_WRITE) ? ((flag & FA_CREATE_ALWAYS) ? "wb+" : "ab+") : "rb+");
fil->obj.fs = (FATFS*)fopen(realPath, (flag & FA_WRITE) ? ((flag & FA_CREATE_ALWAYS) ? "wb+" : "ab+") : "rb+");
fil->fptr = 0;
if (fil->fs) {
TRACE("f_open(%s, %x) = %p (FIL %p)", path, flag, fil->fs, fil);
if (fil->obj.fs) {
TRACE("f_open(%s, %x) = %p (FIL %p)", path, flag, fil->obj.fs, fil);
return FR_OK;
}
TRACE("f_open(%s) = error %d (%s) (FIL %p)", path, errno, strerror(errno), fil);
@@ -679,39 +679,39 @@ FRESULT f_open (FIL * fil, const TCHAR *name, BYTE flag)
FRESULT f_read (FIL* fil, void* data, UINT size, UINT* read)
{
if (fil && fil->fs) {
*read = fread(data, 1, size, (FILE*)fil->fs);
if (fil && fil->obj.fs) {
*read = fread(data, 1, size, (FILE*)fil->obj.fs);
fil->fptr += *read;
// TRACE("fread(%p) %u, %u", fil->fs, size, *read);
// TRACE("fread(%p) %u, %u", fil->obj.fs, size, *read);
}
return FR_OK;
}
FRESULT f_write (FIL* fil, const void* data, UINT size, UINT* written)
{
if (fil && fil->fs) {
*written = fwrite(data, 1, size, (FILE*)fil->fs);
if (fil && fil->obj.fs) {
*written = fwrite(data, 1, size, (FILE*)fil->obj.fs);
fil->fptr += size;
// TRACE("fwrite(%p) %u, %u", fil->fs, size, *written);
// TRACE("fwrite(%p) %u, %u", fil->obj.fs, size, *written);
}
return FR_OK;
}
FRESULT f_lseek (FIL* fil, DWORD offset)
{
if (fil && fil->fs) fseek((FILE*)fil->fs, offset, SEEK_SET);
if (fil && fil->obj.fs) fseek((FILE*)fil->obj.fs, offset, SEEK_SET);
fil->fptr = offset;
return FR_OK;
}
UINT f_size(FIL* fil)
{
if (fil && fil->fs) {
long curr = ftell((FILE*)fil->fs);
fseek((FILE*)fil->fs, 0, SEEK_END);
long size = ftell((FILE*)fil->fs);
fseek((FILE*)fil->fs, curr, SEEK_SET);
TRACE("f_size(%p) %u", fil->fs, size);
if (fil && fil->obj.fs) {
long curr = ftell((FILE*)fil->obj.fs);
fseek((FILE*)fil->obj.fs, 0, SEEK_END);
long size = ftell((FILE*)fil->obj.fs);
fseek((FILE*)fil->obj.fs, curr, SEEK_SET);
TRACE("f_size(%p) %u", fil->obj.fs, size);
return size;
}
return 0;
@@ -719,10 +719,10 @@ UINT f_size(FIL* fil)
FRESULT f_close (FIL * fil)
{
TRACE("f_close(%p) (FIL:%p)", fil->fs, fil);
if (fil->fs) {
fclose((FILE*)fil->fs);
fil->fs = NULL;
TRACE("f_close(%p) (FIL:%p)", fil->obj.fs, fil);
if (fil->obj.fs) {
fclose((FILE*)fil->obj.fs);
fil->obj.fs = NULL;
}
return FR_OK;
}
@@ -736,8 +736,8 @@ FRESULT f_chdir (const TCHAR *name)
FRESULT f_opendir (DIR * rep, const TCHAR * name)
{
char *path = convertSimuPath(name);
rep->fs = (FATFS *)simu::opendir(path);
if ( rep->fs ) {
rep->obj.fs = (FATFS *)simu::opendir(path);
if ( rep->obj.fs ) {
TRACE("f_opendir(%s) = OK", path);
return FR_OK;
}
@@ -748,15 +748,19 @@ FRESULT f_opendir (DIR * rep, const TCHAR * name)
FRESULT f_closedir (DIR * rep)
{
TRACE("f_closedir(%p)", rep);
if (rep->fs) simu::closedir((simu::DIR *)rep->fs);
if (rep->obj.fs) simu::closedir((simu::DIR *)rep->obj.fs);
return FR_OK;
}
FRESULT f_readdir (DIR * rep, FILINFO * fil)
{
if (!rep->fs) return FR_NO_FILE;
simu::dirent * ent = simu::readdir((simu::DIR *)rep->fs);
if (!ent) return FR_NO_FILE;
simu::dirent * ent;
if (!rep->obj.fs) return FR_NO_FILE;
for(;;) {
ent = simu::readdir((simu::DIR *)rep->obj.fs);
if (!ent) return FR_NO_FILE;
if (strcmp(ent->d_name, ".") && strcmp(ent->d_name, "..") ) break;
}
#if defined(WIN32) || !defined(__GNUC__) || defined(__APPLE__)
fil->fattrib = (ent->d_type == DT_DIR ? AM_DIR : 0);
@@ -773,15 +777,13 @@ FRESULT f_readdir (DIR * rep, FILINFO * fil)
}
#endif
memset(fil->fname, 0, 13);
memset(fil->lfname, 0, SD_SCREEN_FILE_LENGTH);
strncpy(fil->fname, ent->d_name, 13-1);
strcpy(fil->lfname, ent->d_name);
memset(fil->fname, 0, SD_SCREEN_FILE_LENGTH);
strcpy(fil->fname, ent->d_name);
// TRACE("f_readdir(): %s", fil->fname);
return FR_OK;
}
FRESULT f_mkfs (const TCHAR * path, BYTE, UINT)
FRESULT f_mkfs (const TCHAR* path, BYTE opt, DWORD au, void* work, UINT len)
{
TRACE("Format SD...");
return FR_OK;
@@ -830,7 +832,7 @@ FRESULT f_rename(const TCHAR *oldname, const TCHAR *newname)
int f_putc (TCHAR c, FIL * fil)
{
if (fil && fil->fs) fwrite(&c, 1, 1, (FILE*)fil->fs);
if (fil && fil->obj.fs) fwrite(&c, 1, 1, (FILE*)fil->obj.fs);
return FR_OK;
}
@@ -847,7 +849,7 @@ int f_printf (FIL *fil, const TCHAR * format, ...)
{
va_list arglist;
va_start(arglist, format);
if (fil && fil->fs) vfprintf((FILE*)fil->fs, format, arglist);
if (fil && fil->obj.fs) vfprintf((FILE*)fil->obj.fs, format, arglist);
va_end(arglist);
return 0;
}
@@ -867,9 +869,18 @@ FRESULT f_getcwd (TCHAR *path, UINT sz_path)
return FR_NO_PATH;
}
if (sz_path < (strlen(cwd) - strlen(simuSdDirectory))) {
TRACE("f_getcwd(): buffer too short");
return FR_NOT_ENOUGH_CORE;
}
// remove simuSdDirectory from the cwd
strcpy(path, cwd + strlen(simuSdDirectory));
if (strlen(path) == 0) {
strcpy(path, "/"); // fix for the root directory
}
TRACE("f_getcwd() = %s", path);
return FR_OK;
}