/*\r
- * FreeRTOS+FAT FS V1.0.0 (C) 2013 HCC Embedded\r
+ * FreeRTOS+FAT SL V1.0.1 (C) 2014 HCC Embedded\r
*\r
* The FreeRTOS+FAT SL license terms are different to the FreeRTOS license \r
* terms.\r
#include "file.h"\r
\r
#include "../../version/ver_fat_sl.h"\r
-#if VER_FAT_SL_MAJOR != 3 || VER_FAT_SL_MINOR != 2\r
+#if VER_FAT_SL_MAJOR != 5 || VER_FAT_SL_MINOR != 2\r
#error Incompatible FAT_SL version number!\r
#endif\r
\r
-static unsigned char _f_emptywritebuffer ( void );\r
+static unsigned char _f_stepnextsector ( void );\r
\r
\r
/****************************************************************************\r
* error code or zero if successful\r
*\r
***************************************************************************/\r
-\r
-\r
-static unsigned char _f_emptywritebuffer ( void )\r
+static unsigned char _f_stepnextsector ( void )\r
{\r
unsigned char ret;\r
+ unsigned char b_alloc;\r
\r
- ret = _f_writeglsector( gl_file.pos.sector );\r
- if ( ret )\r
+ b_alloc = 0;\r
+ gl_volume.fatsector = (unsigned long)-1;\r
+ if ( gl_file.startcluster == 0 )\r
{\r
- return ret;\r
+ b_alloc = 1;\r
}\r
+ else\r
+ {\r
+ ++gl_file.pos.sector;\r
+ if ( gl_file.pos.sector >= gl_file.pos.sectorend )\r
+ {\r
+ unsigned long value;\r
\r
- gl_file.modified = 0;\r
+ ret = _f_getclustervalue( gl_file.pos.cluster, &value );\r
+ if ( ret )\r
+ {\r
+ return ret;\r
+ }\r
\r
- gl_file.pos.sector++;\r
+ if ( ( value >= 2 ) && ( value < F_CLUSTER_RESERVED ) ) /*we are in chain*/\r
+ {\r
+ _f_clustertopos( value, &gl_file.pos ); /*go to next cluster*/\r
+ }\r
+ else\r
+ {\r
+ b_alloc = 1;\r
+ }\r
+ }\r
+ }\r
\r
- if ( gl_file.pos.sector >= gl_file.pos.sectorend )\r
+ if ( b_alloc != 0 )\r
{\r
- unsigned long value;\r
+ unsigned long nextcluster;\r
+\r
+ ret = _f_alloccluster( &nextcluster );\r
+ if ( ret )\r
+ {\r
+ return ret;\r
+ }\r
\r
- gl_volume.fatsector = (unsigned long)-1;\r
- ret = _f_getclustervalue( gl_file.pos.cluster, &value );\r
+ ret = _f_setclustervalue( nextcluster, F_CLUSTER_LAST );\r
if ( ret )\r
{\r
return ret;\r
}\r
\r
- if ( ( value >= 2 ) && ( value < F_CLUSTER_RESERVED ) ) /*we are in chain*/\r
+ if ( gl_file.startcluster == 0 )\r
{\r
- gl_file.prevcluster = gl_file.pos.cluster;\r
- _f_clustertopos( value, &gl_file.pos ); /*go to next cluster*/\r
+ gl_file.startcluster = nextcluster;\r
}\r
else\r
{\r
- unsigned long nextcluster;\r
-\r
- ret = _f_alloccluster( &nextcluster );\r
- if ( ret )\r
- {\r
- return ret;\r
- }\r
-\r
- ret = _f_setclustervalue( nextcluster, F_CLUSTER_LAST );\r
- if ( ret )\r
- {\r
- return ret;\r
- }\r
-\r
ret = _f_setclustervalue( gl_file.pos.cluster, nextcluster );\r
if ( ret )\r
{\r
return ret;\r
}\r
+ }\r
\r
- gl_file.prevcluster = gl_file.pos.cluster;\r
-\r
- _f_clustertopos( nextcluster, &gl_file.pos );\r
+ _f_clustertopos( nextcluster, &gl_file.pos );\r
\r
- return _f_writefatsector();\r
- }\r
+ return _f_writefatsector();\r
}\r
\r
-\r
return F_NO_ERROR;\r
-} /* _f_emptywritebuffer */\r
-\r
-\r
+} /* _f_stepnextsector */\r
\r
\r
/****************************************************************************\r
size -= gl_file.filesize;\r
_size = (unsigned long)size;\r
\r
- rc = _f_getcurrsector();\r
- if ( rc )\r
+ if ( gl_file.startcluster == 0 )\r
+ {\r
+ if ( _f_stepnextsector() )\r
+ {\r
+ return F_ERR_WRITE;\r
+ }\r
+ }\r
+ else\r
{\r
- return rc;\r
+ if ( ( gl_file.relpos > 0 ) && ( gl_file.relpos < F_SECTOR_SIZE ) )\r
+ {\r
+ rc = _f_getcurrsector();\r
+ if ( rc )\r
+ {\r
+ return rc;\r
+ }\r
+ }\r
}\r
\r
- psp_memset( gl_sector + gl_file.relpos, 0, ( F_SECTOR_SIZE - gl_file.relpos ) );\r
-\r
- if ( gl_file.relpos + _size > F_SECTOR_SIZE )\r
+ if ( gl_file.relpos + _size >= F_SECTOR_SIZE )\r
{\r
- _size -= ( F_SECTOR_SIZE - gl_file.relpos );\r
- while ( _size )\r
+ if ( gl_file.relpos < F_SECTOR_SIZE )\r
{\r
- if ( _f_emptywritebuffer() )\r
+ psp_memset( gl_sector + gl_file.relpos, 0, ( F_SECTOR_SIZE - gl_file.relpos ) );\r
+ _size -= ( F_SECTOR_SIZE - gl_file.relpos );\r
+\r
+ if ( _f_writeglsector( gl_file.pos.sector ) )\r
+ {\r
+ return F_ERR_WRITE;\r
+ }\r
+ }\r
+\r
+ if ( _f_stepnextsector() )\r
+ {\r
+ return F_ERR_WRITE;\r
+ }\r
+\r
+ psp_memset( gl_sector, 0, F_SECTOR_SIZE );\r
+\r
+ while ( _size >= F_SECTOR_SIZE )\r
+ {\r
+ if ( _f_writeglsector( gl_file.pos.sector ) )\r
+ {\r
+ return F_ERR_WRITE;\r
+ }\r
+\r
+ if ( _f_stepnextsector() )\r
{\r
return F_ERR_WRITE;\r
}\r
\r
psp_memset( gl_sector, 0, F_SECTOR_SIZE );\r
- _size -= ( _size > F_SECTOR_SIZE ? F_SECTOR_SIZE : _size );\r
+\r
+ _size -= F_SECTOR_SIZE;\r
}\r
}\r
else\r
{\r
+ psp_memset( gl_sector + gl_file.relpos, 0, ( F_SECTOR_SIZE - gl_file.relpos ) );\r
_size += gl_file.relpos;\r
}\r
\r
{\r
gl_file.abspos = 0;\r
gl_file.relpos = 0;\r
- gl_file.prevcluster = 0;\r
gl_file.pos.cluster = gl_file.startcluster;\r
remain = gl_file.filesize;\r
\r
break;\r
}\r
\r
- gl_file.prevcluster = gl_file.pos.cluster;\r
gl_file.pos.cluster = cluster;\r
}\r
\r
gl_file.relpos = (unsigned short)offset;\r
}\r
}\r
+ else\r
+ {\r
+ ret = _f_extend( offset );\r
+ }\r
}\r
\r
return ret;\r
return 0;\r
}\r
\r
- psp_memset( &gl_file, 0, 21 );\r
+ psp_memset( &gl_file, 0, sizeof( F_FILE ) );\r
\r
if ( !_f_findpath( &fsname, &gl_file.dirpos ) )\r
{\r
return 0; /*invalid mode*/\r
} /* switch */\r
\r
- if ( ( m_mode != F_FILE_RD ) && ( gl_file.startcluster == 0 ) )\r
- {\r
- gl_volume.fatsector = (unsigned long)-1;\r
- if ( _f_alloccluster( &( gl_file.startcluster ) ) )\r
- {\r
- return 0;\r
- }\r
-\r
- _f_clustertopos( gl_file.startcluster, &gl_file.pos );\r
- if ( _f_setclustervalue( gl_file.startcluster, F_CLUSTER_LAST ) )\r
- {\r
- return 0;\r
- }\r
-\r
- if ( _f_writefatsector() )\r
- {\r
- return 0;\r
- }\r
- }\r
-\r
-\r
gl_file.mode = m_mode; /* lock it */\r
return (F_FILE *)1;\r
} /* fn_open */\r
_size_st = retsize;\r
retsize = 0;\r
\r
+ if ( size == 0 )\r
+ {\r
+ return 0;\r
+ }\r
+\r
if ( _f_getvolume() )\r
{\r
return 0; /*can't write*/\r
}\r
}\r
\r
- if ( _f_getcurrsector() )\r
+ if ( gl_file.startcluster == 0 )\r
{\r
- gl_file.mode = F_FILE_CLOSE;\r
- return 0;\r
+ if ( _f_stepnextsector() )\r
+ {\r
+ gl_file.mode = F_FILE_CLOSE;\r
+ return 0;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if ( _f_getcurrsector() )\r
+ {\r
+ gl_file.mode = F_FILE_CLOSE;\r
+ return 0;\r
+ }\r
}\r
\r
for( ; ; )\r
{ /*now full*/\r
if ( gl_file.modified )\r
{\r
- if ( _f_emptywritebuffer() )\r
+ if ( _f_writeglsector( gl_file.pos.sector ) )\r
{\r
gl_file.mode = F_FILE_CLOSE;\r
if ( _f_updatefileentry( 0 ) == 0 )\r
return 0;\r
}\r
}\r
+\r
+ gl_file.modified = 0;\r
}\r
- else\r
+\r
+ if ( _f_stepnextsector() )\r
{\r
- gl_file.pos.sector++; /*goto next*/\r
+ gl_file.mode = F_FILE_CLOSE;\r
+ if ( _f_updatefileentry( 0 ) == 0 )\r
+ {\r
+ return retsize;\r
+ }\r
+ else\r
+ {\r
+ return 0;\r
+ }\r
}\r
\r
gl_file.abspos += gl_file.relpos;\r