Revised FAT bugfix

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4104 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2011-11-19 20:30:39 +00:00
parent 90f114ee4f
commit acf0e4160b
4 changed files with 29 additions and 87 deletions

View File

@ -46,13 +46,7 @@
* Pre-processor Definitions
************************************************************************************/
/* Alternate Pin Functions */
/* Additional effort is required to select specific GPIO options such as frequency,
* open-drain/push-pull, and pull-up/down!
*/
#warning "Missing logic"
/* Alternate Pin Functions: */
/* TIMERS */

View File

@ -62,6 +62,12 @@
* The driver will then automatically configre PA11 as the CAN1 RX pin.
*/
/* Additional effort is required to select specific GPIO options such as frequency,
* open-drain/push-pull, and pull-up/down!
*/
#warning "Missing logic"
/* CAN */
#define GPIO_CAN1_RX_1 (GPIO_ALT|GPIO_AF9|GPIO_PORTA|GPIO_PIN11)

View File

@ -1494,7 +1494,7 @@ static int fat_rewinddir(struct inode *mountpt, struct fs_dirent_s *dir)
}
/* Check if this is the root directory. If it is the root directory, we
* reset the fd_index to 1, skipping over the initial, unused entry.
* reset the fd_index to 0, starting with the initial, entry.
*/
if (fs->fs_type != FSTYPE_FAT32 &&
@ -1504,7 +1504,7 @@ static int fat_rewinddir(struct inode *mountpt, struct fs_dirent_s *dir)
dir->u.fat.fd_currcluster = 0;
dir->u.fat.fd_currsector = fs->fs_rootbase;
dir->u.fat.fd_index = 1;
dir->u.fat.fd_index = 0;
}
else if (fs->fs_type == FSTYPE_FAT32 &&
dir->u.fat.fd_startcluster == fs->fs_rootbase)
@ -1513,7 +1513,7 @@ static int fat_rewinddir(struct inode *mountpt, struct fs_dirent_s *dir)
dir->u.fat.fd_currcluster = dir->u.fat.fd_startcluster;
dir->u.fat.fd_currsector = fat_cluster2sector(fs, fs->fs_rootbase);
dir->u.fat.fd_index = 1;
dir->u.fat.fd_index = 0;
}
/* This is not the root directory. Here the fd_index is set to 2, skipping over

View File

@ -144,8 +144,6 @@ static inline int fat_getsfname(uint8_t *direntry, char *buffer,
static void fat_getlfnchunk(uint8_t *chunk, uint8_t *dest, int nchunk);
static inline int fat_getlfname(struct fat_mountpt_s *fs, struct fs_dirent_s *dir);
#endif
static int fat_dirverify(struct fat_mountpt_s *fs, struct fat_dirinfo_s *dirinfo,
uint16_t offset);
static int fat_putsfname(struct fat_mountpt_s *fs, struct fat_dirinfo_s *dirinfo);
#ifdef CONFIG_FAT_LFN
static void fat_initlfname(uint8_t *chunk, int nchunk);
@ -794,14 +792,13 @@ static inline int fat_findalias(struct fat_mountpt_s *fs,
memcpy(&tmpinfo, dirinfo, sizeof(struct fat_dirinfo_s));
/* Then re-initialize to the beginning of the current directory, skipping
* over the first entry (unused in the root directory and '.' entry in other
* directories).
/* Then re-initialize to the beginning of the current directory, starting
* with the first entry.
*/
tmpinfo.dir.fd_startcluster = tmpinfo.dir.fd_currcluster;
tmpinfo.dir.fd_currsector = tmpinfo.fd_seq.ds_startsector;
tmpinfo.dir.fd_index = 1;
tmpinfo.dir.fd_index = 0;
/* Search for the single short file name directory entry in this directory */
@ -1911,56 +1908,6 @@ static inline int fat_getlfname(struct fat_mountpt_s *fs, struct fs_dirent_s *di
}
#endif
/****************************************************************************
* Name: fat_dirverify
*
* Desciption:
* Verify that every entry preceding this one is marked with something
* other than DIR0_ALLEMPTY. This is necessary only in the root directory
* of freshly formatted volumes. In that case, all entries are set to
* zero.
*
* This function also assures that the sector containing the entry is in
* the sector cache.
*
****************************************************************************/
static int fat_dirverify(struct fat_mountpt_s *fs, struct fat_dirinfo_s *dirinfo,
uint16_t offset)
{
uint8_t *direntry;
uint16_t i;
int ret;
/* Make sure that the sector containing the directory entry is in the sector
* cache.
*/
ret = fat_fscacheread(fs, dirinfo->dir.fd_currsector);
if (ret < 0)
{
return ret;
}
/* Check every entry preceding this one */
for (i = 0; i < offset; i += DIR_SIZE)
{
/* Is the rest of the directory marked empty? */
direntry = &fs->fs_buffer[i];
if (direntry[DIR_NAME] == DIR0_ALLEMPTY)
{
/* Then mark the just the entry as empty */
fs->fs_dirty = true;
direntry[DIR_NAME] = DIR0_EMPTY;
}
}
return OK;
}
/****************************************************************************
* Name: fat_putsfname
*
@ -2067,12 +2014,6 @@ static int fat_putlfname(struct fat_mountpt_s *fs, struct fat_dirinfo_s *dirinfo
int namelen;
int ret;
/* Some special handling in case we are writing the first entry of the
* root directory in a freshly formatted volume.
*/
(void)fat_dirverify(fs, dirinfo, dirinfo->fd_seq.ds_lfnoffset);
/* Get the length of the long file name (size of the fd_lfname array is
* LDIR_MAXFNAME+1 we do not have to check the length of the string).
* NOTE that remainder is conditionally incremented to include the NUL
@ -2126,10 +2067,17 @@ static int fat_putlfname(struct fat_mountpt_s *fs, struct fat_dirinfo_s *dirinfo
seqno = LDIR0_LAST | nentries;
/* Now loop, writing each long file name entry. We know that the sector
* is in the sector cache because fat_dirverify() assures us that that is
* so.
*/
/* Make sure that the sector containing the "last" long file name entry
* is in the sector cache (it probably is not).
*/
ret = fat_fscacheread(fs, dirinfo->dir.fd_currsector);
if (ret < 0)
{
return ret;
}
/* Now loop, writing each long file name entry */
for (;;)
{
@ -2255,12 +2203,6 @@ static int fat_putsfdirentry(struct fat_mountpt_s *fs,
{
uint8_t *direntry;
/* Some special handling in case we are writing the first entry of the
* root directory in a freshly formatted volume.
*/
(void)fat_dirverify(fs, dirinfo, dirinfo->fd_seq.ds_offset);
/* Initialize the 32-byte directory entry */
direntry = &fs->fs_buffer[dirinfo->fd_seq.ds_offset];
@ -2336,11 +2278,11 @@ int fat_finddirentry(struct fat_mountpt_s *fs, struct fat_dirinfo_s *dirinfo,
dirinfo->dir.fd_currsector = cluster;
}
/* fd_index is the index into the current directory table. It is set to one
* to skip over the first, unused entry in the root directory.
/* fd_index is the index into the current directory table. It is set to the
* the first, entry in the root directory.
*/
dirinfo->dir.fd_index = 1;
dirinfo->dir.fd_index = 0;
/* If no path was provided, then the root directory must be exactly what
* the caller is looking for.
@ -2489,9 +2431,9 @@ int fat_allocatedirentry(struct fat_mountpt_s *fs, struct fat_dirinfo_s *dirinfo
dirinfo->dir.fd_currsector = fs->fs_rootbase;
}
/* Skip over the first, unused entry in the root directory. */
/* Start at the first entry in the root directory. */
dirinfo->dir.fd_index = 1;
dirinfo->dir.fd_index = 0;
/* Is this a path segment a long or a short file. Was a long file
* name parsed?