⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scanvat.c

📁 在flash上实现vsb文件系统的源码资料
💻 C
📖 第 1 页 / 共 2 页
字号:
   DWORD    FlashAddr;        /* Physical flash address */   WORD     RetVal;   extern MEMORY_STATUS status[];     /* GlobalMediaStatistics: */   extern MEMORY_STATUS *status_ptr;  /* GlobalMediaStatistics: */   status_ptr=&status[ComponentID];   /* GlobalMediaStatistics: */   /* loop through all blocks */   do   {      if( (( bi != SpareBlock[ComponentID] ) && (Entry == MAXIMUM_VSB+2)) ||         ( Entry != (MAXIMUM_VSB+2) ) )      {         FlashAddr = CalculateFlashAddr( ComponentID, /* calculate physical */                                         bi,          /* address of block */                                         sizeof(vi) );         VATEntry = (WORD *) VSBbuffer;        /* point to first VAT entry */         /* read VAT entry */         /*E2.3.41,Added VAT_SIZE_VSB-1 after VSB_PER_BLOCK*/         if ((RetVal = FlashDevRead(FlashAddr, ((VSB_PER_BLOCK -(VAT_SIZE_VSB-1))* sizeof(vi)),             (BYTE *)VATEntry )) != ERR_NONE)            return (RetVal);         vi = 1;                                /* set VAT count */         do                                     /* loop through all VATs */         {            if(Entry != (MAXIMUM_VSB+2))            {               if( *VATEntry == Entry )  /* if it's what we're look'n for */               {                  FoundIt = TRUE;                  break;                            /* exit loop */               }            }            else /* CountVSB  and update global mediastatistics variable */            {               if( *VATEntry == VSB_FREE )          /* if it's free */               {                  ++status_ptr->clean_sectors; /* count free sectors */               }               else if((*VATEntry & VSB_DISCARD_MASK) == 0)               {                  ++status_ptr->dirty_sectors;    /* count dirty sectors */               }               else               {                  ++status_ptr->valid_sectors;     /* count valid sectors */               }            }            VATEntry++;          /*E2.3.41, Added -VAT_SIZE_VSB-1 after VSB_PER_BLOCK*/           } while( ++vi < (VSB_PER_BLOCK-(VAT_SIZE_VSB-1)) );      }      if( FoundIt )      {         break;      }   } while( ++bi < BLOCK_COUNT );   if( FoundIt == FALSE )                   /* find what we're looking for? */   {      return ( 0 );                        /* nope, return value 0 */   }   /*E2.3.49*/   return( CalculateFlashAddr( ComponentID, /* calculate physical */	                       bi,          /* address of block */	                      (vi * 2 )));   /*E2.3.49*/	                      }/******************************************************************************     ScanVAT -- Scan VAT for valid entries**     ENTRY -*        BYTE -   Flash component block is in*        BYTE -   Block to scan**     EXIT -*        WORD -   ERR_NONE      ERR_WRITE******************************************************************************/WORD ScanVAT( BYTE ComponentID,  /* Component number to search */              BYTE BlockID )     /* Block number to search */{   WORD     vi;               /* VAT counter */   WORD     VATEntry;         /* VAT entry value */   DWORD    FlashAddr;        /* Physical flash address */   WORD     PrevEntry;        /* Previous VSB VAT entry */   DWORD    PrevAddr;         /* Previous VSB physical address */   WORD     RetVal;   FlashAddr = CalculateFlashAddr( ComponentID, /* get physical address */                                    BlockID,     /* of first VAT entry */                                    0 );   FlashAddr += sizeof( VATEntry );   vi = 1;                 /* set up VAT counter */   do   {      /* read VAT entry */      if ((RetVal = FlashDevRead(FlashAddr, sizeof(VATEntry), (BYTE *)&VATEntry))          != ERR_NONE)         return (RetVal);      /* incomplete allocation? */      if( (VATEntry & VSB_VAT_FLAGS) == VSB_ALLOCATING_MASK )      {         /* prepare discard for PLR */         VATEntry &= VSB_PLR_DISCARDED;#if PLR_TESTING         if (PowerLossFlags.breakpoint_number == PLR_BP13)            PowerLossFlags.current_iteration++;#endif         if ((FlashDevWrite(FlashAddr, sizeof(VATEntry),             (BYTE *)&VATEntry)) != ERR_NONE)         {            return( ERR_WRITE ); /* fail if write error */         }         /* discard VSB */         VATEntry &= VSB_DISCARDED;#if PLR_TESTING         if (PowerLossFlags.breakpoint_number == PLR_BP14)            PowerLossFlags.current_iteration++;#endif         if ((FlashDevWrite(FlashAddr, sizeof(VATEntry),                            (BYTE *) &VATEntry)) != ERR_NONE)         {            return( ERR_WRITE ); /* give up if write error */         }      }      /* previous not discarded? */      else if (((VATEntry & VSB_VAT_FLAGS) == VSB_ALLOCATED_MASK)#if MLC_DEVICE               ||((VATEntry & VSB_VAT_FLAGS) == VSB_MLC_ALLOCATED_MASK )#endif               ) /* end else if */      {         PrevAddr = SearchForEntry(ComponentID, (VATEntry & VSB_VALID));         if (PrevAddr != 0L)         {            /* Discard previous VSB */            if ((FlashDevRead(PrevAddr, sizeof(PrevEntry), (BYTE *)&PrevEntry)) == ERR_NONE )               PrevEntry &= VSB_DISCARDED;#if PLR_TESTING            if (PowerLossFlags.breakpoint_number == PLR_BP15)               PowerLossFlags.current_iteration++;#endif            if ((FlashDevWrite(PrevAddr, sizeof(PrevEntry), (BYTE *)&PrevEntry)) != ERR_NONE )            {               return( ERR_WRITE ); /* give up if write error */            }         }         /* Mark current VSB as valid */         VATEntry &= VSB_VALID;#if PLR_TESTING         if (PowerLossFlags.breakpoint_number == PLR_BP16)            PowerLossFlags.current_iteration++;#endif         if ((FlashDevWrite(FlashAddr, sizeof(VATEntry), (BYTE *)&VATEntry)) != ERR_NONE )         {            return( ERR_WRITE );         }      }      /* if it was in the middle of discarding, complete discard */      else if (((VATEntry & VSB_VAT_FLAGS ) != VSB_DISCARDED) &&               !(VATEntry &  VSB_DISCARD_MASK))      {         VATEntry &= VSB_DISCARDED;#if PLR_TESTING         if (PowerLossFlags.breakpoint_number == PLR_BP17)            PowerLossFlags.current_iteration++;#endif         if ((FlashDevWrite(FlashAddr, sizeof(VATEntry),             (BYTE *)&VATEntry )) != ERR_NONE )         {            return( ERR_WRITE ); /* give up if write error */         }      }      FlashAddr += sizeof(VATEntry);    /* point to next VAT entry */      /*E2.3.41, Added -VAT_SIZE_VSB-1 after VSB_PER_BLOCK*/     } while (++vi < (VSB_PER_BLOCK-(VAT_SIZE_VSB-1)));      return( ERR_NONE );}#elsestatic const char file_name[] = "scanvat.c";#endif /* EXCLUDE_VSB */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -