📄 ffs_nand.c
字号:
#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 + -