From fa09debae62c900129855fe03932ab0ceef2d0b0 Mon Sep 17 00:00:00 2001 From: patacongo Date: Sat, 19 Nov 2011 20:30:39 +0000 Subject: Revised FAT bugfix git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@4104 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/arch/arm/src/stm32/chip/stm32f103ze_pinmap.h | 8 +- nuttx/arch/arm/src/stm32/chip/stm32f40xxx_pinmap.h | 6 ++ nuttx/fs/fat/fs_fat32.c | 6 +- nuttx/fs/fat/fs_fat32dirent.c | 96 +++++----------------- 4 files changed, 29 insertions(+), 87 deletions(-) diff --git a/nuttx/arch/arm/src/stm32/chip/stm32f103ze_pinmap.h b/nuttx/arch/arm/src/stm32/chip/stm32f103ze_pinmap.h index c6d4a727a..3caf54279 100644 --- a/nuttx/arch/arm/src/stm32/chip/stm32f103ze_pinmap.h +++ b/nuttx/arch/arm/src/stm32/chip/stm32f103ze_pinmap.h @@ -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 */ diff --git a/nuttx/arch/arm/src/stm32/chip/stm32f40xxx_pinmap.h b/nuttx/arch/arm/src/stm32/chip/stm32f40xxx_pinmap.h index ec02146a3..ee0ed7daa 100644 --- a/nuttx/arch/arm/src/stm32/chip/stm32f40xxx_pinmap.h +++ b/nuttx/arch/arm/src/stm32/chip/stm32f40xxx_pinmap.h @@ -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) diff --git a/nuttx/fs/fat/fs_fat32.c b/nuttx/fs/fat/fs_fat32.c index b0ee57a18..22c285c40 100644 --- a/nuttx/fs/fat/fs_fat32.c +++ b/nuttx/fs/fat/fs_fat32.c @@ -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 diff --git a/nuttx/fs/fat/fs_fat32dirent.c b/nuttx/fs/fat/fs_fat32dirent.c index 54633004f..0c8d19f24 100644 --- a/nuttx/fs/fat/fs_fat32dirent.c +++ b/nuttx/fs/fat/fs_fat32dirent.c @@ -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? -- cgit v1.2.3