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

📄 ffs_nand.c

📁 嵌入式系统中文件系统源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	#ifdef NAND_FFS_USE_CACHE
		NAND_FFS_showCacheStatusN(0);
	#endif
  #endif
*/
  #ifdef NAND_FFS_DEBUG
	sprintf(NAND_FFS_DebugString, "NAND_FFS_init done NAND_FFS_Init_OK=%d", NAND_FFS_Init_OK);
	SprintStringLn(NAND_FFS_DebugString);
  #endif
/*
  #ifdef NAND_FFS_DEBUG
	#ifdef NAND_FFS_USE_CACHE
		NAND_FFS_showCacheStatusN(0);
	#endif
  #endif
*/

// init the NAND flash driver
//  real_flash_size = nfshInit();	// jason
	
	real_flash_block_num = nfshInit() / NAND_FLASH_BLOCK_SIZE  ;
#ifdef NAND_FFS_DEBUG
	printf("{Block_cou=%d}",real_flash_block_num);
#endif
	real_flash_block_num -= NAND_FFS_START_BLOCK ;
	for (i = real_flash_block_num; i < NAND_FFS_BLOCK_NUM; i++)
		NAND_FFS_Block[i] = NAND_FB_FULL ;



#ifdef NAND_FFS_CACHE_DEBUG
  begin = sc_getTimeStamp();
#endif
  // initialize lump map table
  for (i = 0; i < NAND_FFS_BLOCK_NUM; i++)
   {
  	for (j = 0; j < NAND_LumpNum; j++)
  	{
  		if (NAND_readLumpStructure(i*NAND_LumpNum+j, 2) == NULL)
  		{
  			NAND_FFS_lumpMapTable[(i*NAND_LumpNum+j)/8] |=
  				1 << ((i*NAND_LumpNum+j)%8);

  			// set curFreeLumpNo as the last used lump so that
  			// we can sort of avoid some blocks being erased too often
  			if (NAND_FFS_curFreeLumpNo < NAND_FFS_BLOCK_NUM*NAND_LumpNum - 1)
  				NAND_FFS_curFreeLumpNo = i * NAND_LumpNum + j + 1;
  			else
  				NAND_FFS_curFreeLumpNo = 1;
  		}
  		
  		/*
  		if (NAND_readLumpStructure(i*NAND_LumpNum+j, 2) == NULL)
  		{
  			NAND_FFS_lumpMapTable[(i*NAND_LumpNum+j)/8] |=
  				1 << ((i*NAND_LumpNum+j)%8);

  			// set curFreeLumpNo as the last used lump so that
  			// we can sort of avoid some blocks being erased too often
  			if (i <= NAND_FFS_BLOCK_NUM - 2)
  				NAND_FFS_curFreeLumpNo = (i+1) * NAND_LumpNum + j;
  			else
  				NAND_FFS_curFreeLumpNo = j;
  		}
  		*/
  	}
  }

#ifdef NAND_FFS_CACHE_DEBUG
  end = sc_getTimeStamp();
#endif
	
  // find first used lump
  NAND_FFS_rootLumpNo = NAND_END_LUMP;
  for (i = 0; i < sizeof(NAND_FFS_lumpMapTable); i++)
  {
  	for (j = 0; j < 8; j++)
  	{
  		if ( (NAND_FFS_lumpMapTable[i] & (1 << j)) == (1 << j))
  		{
  			NAND_FFS_rootLumpNo = i*NAND_LumpNum+j;
  			break;
  		}
  	}
  	
  	if (NAND_FFS_rootLumpNo != NAND_END_LUMP)
  		break;
  }
  
  
  if (NAND_FFS_rootLumpNo == NAND_END_LUMP)
  {
#ifdef NAND_FFS_DEBUG
	  printf("{Re_format}");	// jason
#endif
  	NAND_FFS_clear_r();
  }
  else
  {
	
  	// check if this lump is root lump
  	if (NAND_FFS_readLump(NAND_FFS_rootLumpNo, (unsigned char **)&rootLump) == -1)
  	{
		NAND_FFS_Init_OK = FALSE;
		
//		sc_free(NAND_LumpBuf2);
//		sc_free(NAND_LumpBuf1);
	
		sc_free(NAND_FlashAccessBuffer1);
		sc_free(NAND_FlashAccessBuffer2);
	
		#ifdef NAND_FFS_USE_CACHE
			sc_free(NAND_FFS_BlockCache);
			sc_free(NAND_FFS_CacheStatus);
		#endif
		sc_free(NAND_FFS_ProgramCount);
		sc_free(NAND_FFS_EraseCount);
		sc_free(NAND_FFS_ReadCount);
		sc_deleteSemaphore(NAND_FFS_SemaphoreID);

		return -1;
  	}
  
  	if (rootLump->type != NAND_LUMP_TYPE_ROOT)
  		NAND_FFS_clear_r();
  }
  
  return 0;
}



/*************************************************************
Function: NAND_FFS_clear
Description:
	Clear all blocks in FFS
Input:
Output:
	0	SUCCESS
	-1	FAILURE
**************************************************************/
int NAND_FFS_clear(void)
{
  int returnValue = 0;

  sc_waitSemaphore(NAND_FFS_SemaphoreID);

  #ifdef NAND_FFS_DEBUG
	sprintf(NAND_FFS_DebugString, "[NAND_FFS_clear] start");
	SprintStringLn(NAND_FFS_DebugString);
  #endif

  returnValue = NAND_FFS_clear_r();

  #ifdef NAND_FFS_DEBUG
	sprintf(NAND_FFS_DebugString, "[NAND_FFS_clear] done");
	SprintStringLn(NAND_FFS_DebugString);
  #endif

  sc_signalSemaphore(NAND_FFS_SemaphoreID);

  return returnValue;
}


int NAND_FFS_clear_r(void)
{
  int i, j;

  struct NAND_diskLump *rootLump;
  
  // all opened files must be closed
  for (i = 0; i < MAX_OPEN_FILE; i++)
  {
	if (NAND_FFS_HandleTable[i] != NULL)
	{
		// handle i in use, check device type
		if (NAND_FFS_HandleTable[i]->deviceID == NAND_FLASH_DISK_ID)
		{
			// ah, this file/AP has been opened and is on flash disk
			// close it
			NAND_FFS_close_r(NAND_FFS_HandleTable[i]);
			NAND_FFS_HandleTable[i] = NULL;
		}
	}
  }

  #ifdef NAND_FFS_USE_CACHE
	// clear the cache
	for (i = 0; i < NAND_FFS_CACHE_BLOCK_NUM; i++)
		NAND_FFS_clearCache(i);
  #endif

  // clear all blocks
//jason
//  for (i = 0; i < NAND_FFS_BLOCK_NUM; i++)
  for (i = 0; i < real_flash_block_num ;i++)
  {
	// continue next block if the current one is not usable for AP storage
	if (NAND_FFS_Block[i] == NAND_FB_UNUSED)
		continue;

	#ifdef NAND_FFS_DEBUG
		sprintf(NAND_FFS_DebugString, "    Erasing block %d", i);
		SprintStringLn(NAND_FFS_DebugString);
	#endif

	NAND_FFS_Block[i] = NAND_FB_OK;

	if (NAND_FFS_eraseFlashBlock(i) == -1)
	{
		#ifdef NAND_FFS_DEBUG
			sprintf(NAND_FFS_DebugString, "    Erase block %d error", i);
			SprintStringLn(NAND_FFS_DebugString);
		#endif

		// errno set by NAND_FFS_eraseFlashBlock()
		return -1;
	}
  }

  /**** modified by chilong 01/21/2002 ****/
  // find a proper lump to be root lump from the current lumpMapTable
  NAND_FFS_rootLumpNo = NAND_END_LUMP;
// jason
//  for (i = 0; i < NAND_FFS_BLOCK_NUM; i++)
  for (i = 0; i < real_flash_block_num ;i++)
    {
  	for (j = 0; j < NAND_LumpNum; j++)
  	{
  		if (NAND_readLumpStructure(i*NAND_LumpNum+j, 2) != NULL)
  		{
  			NAND_FFS_rootLumpNo = i*NAND_LumpNum + j;
  			break;
  		}
  	}
  	
  	if (NAND_FFS_rootLumpNo != NAND_END_LUMP)
  		break;
  }
  /**** modified by chilong 01/21/2002 ****/
  
  memoryZero(NAND_FFS_lumpMapTable, NAND_FFS_BLOCK_NUM * NAND_LumpNum / 8);
  
  // set the flag bit of the lumps before rootLumpNo and rootLumpNo to 1(bad or used)
  for (i = 0; i < NAND_FFS_rootLumpNo+1; i++)
  {
	NAND_FFS_lumpMapTable[i/8] |= (1 << (i % 8));
  }
  
  // format root lump  
  if (NAND_FFS_readLump(NAND_FFS_rootLumpNo, (unsigned char **)&rootLump) == -1)
	return -1;
	
  rootLump->type = NAND_LUMP_TYPE_ROOT;
  rootLump->prevLump = NAND_END_LUMP;
  rootLump->nextLump = NAND_END_LUMP;
  rootLump->size = NAND_LUMP_SIZE - sizeof(struct NAND_diskLump);
  rootLump->actualSize = 0;
  //rootLump->userCount = 0;

  if (NAND_FFS_writeLump(NAND_FFS_rootLumpNo, (unsigned char *)rootLump) == -1)
	return -1;

  if (NAND_LumpNum == 1)
  	NAND_FFS_Block[NAND_FFS_START_BLOCK] = NAND_FB_FULL;

  
/*
  // initialize NAND_FFS_curFreeLumpNo
  if (NAND_FFS_rootLumpNo < NAND_TotalLumpNum - 1 - NAND_LumpNum)
  	NAND_FFS_curFreeLumpNo = NAND_FFS_rootLumpNo + NAND_LumpNum;
  else
 	NAND_FFS_curFreeLumpNo = NAND_LumpNum;
*/ 	

  // initialize NAND_FFS_curFreeLumpNo
  if (NAND_FFS_rootLumpNo < NAND_TotalLumpNum - 1)
  	NAND_FFS_curFreeLumpNo = NAND_FFS_rootLumpNo + 1;
  else
 	NAND_FFS_curFreeLumpNo = 1;
  
  /**** added by chilong 01/22/2002 ****/
#ifdef NAND_FFS_USE_CACHE
  if (NAND_FFS_flushAllCache() == -1)
  {
	return -1;
  }
#endif
  /**** added by chilong 01/22/2002 ****/
  
  return 0;
}

/* marked by chilong 01/24/2002
int NAND_FFS_clear_r(void)
{
  int i, j;

  // added by chilong 01/12/2002
  struct NAND_diskLump *rootLump;
  
  // added by chilong 01/12/2002
  
  // all opened files must be closed
  for (i = 0; i < MAX_OPEN_FILE; i++)
  {
	if (NAND_FFS_HandleTable[i] != NULL)
	{
		// handle i in use, check device type
		if (NAND_FFS_HandleTable[i]->deviceID == NAND_FLASH_DISK_ID)
		{
			// ah, this file/AP has been opened and is on flash disk
			// close it
			NAND_FFS_close_r(NAND_FFS_HandleTable[i]);
			NAND_FFS_HandleTable[i] = NULL;
		}
	}
  }

  #ifdef NAND_FFS_USE_CACHE
	// clear the cache
	for (i = 0; i < NAND_FFS_CACHE_BLOCK_NUM; i++)
		NAND_FFS_clearCache(i);
  #endif

  // clear all blocks
  for (i = 0; i < NAND_FFS_BLOCK_NUM; i++)
  {
	// continue next block if the current one is not usable for AP storage
	if (NAND_FFS_Block[i] == NAND_FB_UNUSED)
		continue;

	#ifdef NAND_FFS_DEBUG
		sprintf(NAND_FFS_DebugString, "    Erasing block %d", i);
		SprintStringLn(NAND_FFS_DebugString);
	#endif

	NAND_FFS_Block[i] = NAND_FB_OK;

	if (NAND_FFS_eraseFlashBlock(i) == -1)
	{
		#ifdef NAND_FFS_DEBUG
			sprintf(NAND_FFS_DebugString, "    Erase block %d error", i);
			SprintStringLn(NAND_FFS_DebugString);
		#endif

		// errno set by NAND_FFS_eraseFlashBlock()
		return -1;
	}
  }


  // modified by chilong 01/19/2002

  // modified by chilong 01/21/2002
  // find a proper lump to be root lump from the current lumpMapTable
  NAND_FFS_rootLumpNo = NAND_END_LUMP;
  for (i = 0; i < NAND_FFS_BLOCK_NUM; i++)
  {
  	for (j = 0; j < NAND_LumpNum; j++)
  	{
  		if (NAND_readLumpStructure(i*NAND_LumpNum+j, 2) != NULL)
  		{
  			NAND_FFS_rootLumpNo = i*NAND_LumpNum + j;
  			break;
  		}
  	}
  	
  	if (NAND_FFS_rootLumpNo != NAND_END_LUMP)
  		break;
  }
  // modified by chilong 01/21/2002
  
  memoryZero(NAND_FFS_lumpMapTable, NAND_FFS_BLOCK_NUM * NAND_LumpNum / 8);
  
  // set the flag bit of the lumps before rootLumpNo and rootLumpNo to 1(bad or used)
  for (i = 0; i < NAND_FFS_rootLumpNo+1; i++)
  {
	NAND_FFS_lumpMapTable[i/8] |= (1 << (i % 8));
  }
  // modified by chilong 01/19/2002

  // format root lump  
  if (NAND_FFS_readLump(NAND_FFS_rootLumpNo, (unsigned char **)&rootLump) == -1)
	return -1;
	
  rootLump->type = NAND_LUMP_TYPE_ROOT;
  rootLump->prevLump = NAND_END_LUMP;
  rootLump->nextLump = NAND_END_LUMP;
  rootLump->size = NAND_LUMP_SIZE - sizeof(struct NAND_diskLump);
  rootLump->actualSize = 0;
  //rootLump->userCount = 0;

  if (NAND_FFS_writeLump(NAND_FFS_rootLumpNo, (unsigned char *)rootLump) == -1)
	return -1;

  if (NAND_LumpNum == 1)
  	NAND_FFS_Block[NAND_FFS_START_BLOCK] = NAND_FB_FULL;

  // added by chilong 01/12/2002
  
  // initialize NAND_FFS_curFreeLumpNo
  if (NAND_FFS_rootLumpNo < NAND_TotalLumpNum - 1 - NAND_LumpNum)
  	NAND_FFS_curFreeLumpNo = NAND_FFS_rootLumpNo + NAND_LumpNum;
  else
  	NAND_FFS_curFreeLumpNo = NAND_LumpNum;
  
  return 0;
}
   marked by chilong 01/24/2002 */


// not implemented yet
char NAND_FFS_scanDisk(char interactive, char fix)
{
  //return -1;
	return 0;
}

int NAND_FFS_defrag(void)
{
  return -1;
}

// by zhang xue ping
int NAND_FSS_Erase(void)
{                                         
	int i, offset, ret;

	offset = NAND_FFS_START_BLOCK*NAND_FLASH_BLOCK_SIZE;
                                                       
	for(i=0; i<NAND_FFS_BLOCK_NUM; i++)
	{
		ret = nfshEraseBlock(offset);
		if(ret==NFLASH_FAIL)
			return -1;

		offset += NAND_FLASH_BLOCK_SIZE;
	}                 

	return 0;

}

#endif	// #ifdef NAND_FLASH_DISK_ID


⌨️ 快捷键说明

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