flashmng.c
来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 1,302 行 · 第 1/5 页
C
1,302 行
if((retVal = FlashMngReadDriver(FLASH_IO_DATASPARE, g_FlashPhyNum1 * g_pFlashPara->uDataPerBlock + i * g_pFlashPara->uDataPerPage,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
return retVal;
}
}
// write page to the new prepare block
if(i == 0){
if(PAGE_STATUS(g_pFlashSpareBuf) & PAGE_STATUS_AVAILABLE){
BLOCK_STATUS(g_pFlashSpareBuf) = FLASH_STATUS_SWAP;
if((retVal = FlashMngWriteDriver(FLASH_IO_DATASPARE, flashPhyNum2 * g_pFlashPara->uDataPerBlock + i * g_pFlashPara->uDataPerPage,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
return retVal;
}
}
}else{
if((PAGE_STATUS(g_pFlashSpareBuf) & PAGE_STATUS_AVAILABLE)
&& (!(PAGE_STATUS(g_pFlashSpareBuf) & PAGE_STATUS_NODIRTY))){
if((retVal = FlashMngWriteDriver(FLASH_IO_DATASPARE, flashPhyNum2 * g_pFlashPara->uDataPerBlock + i * g_pFlashPara->uDataPerPage,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
return retVal;
}
}
}
}
}
// set transfered flag(end transfer)
if((retVal = FlashMngReadDriver(FLASH_IO_ONLYSPARE, flashPhyNum2 * g_pFlashPara->uDataPerBlock,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
return retVal;
}
BLOCK_STATUS(g_pFlashSpareBuf) = FLASH_STATUS_ORG;
if((retVal = FlashMngWriteDriver(FLASH_IO_ONLYSPARE, flashPhyNum2 * g_pFlashPara->uDataPerBlock,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
return retVal;
}
BLOCK_STATUS(g_pFlashSpareBuf) = FLASH_STATUS_PREPARE;
if((retVal = FlashMngWriteDriver(FLASH_IO_ONLYSPARE, g_FlashPhyNum0 * g_pFlashPara->uDataPerBlock,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
return retVal;
}
if((retVal = FlashMngWriteDriver(FLASH_IO_ONLYSPARE, g_FlashPhyNum1 * g_pFlashPara->uDataPerBlock,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
return retVal;
}
// update tables and flags
g_FlashTablePrepare[0] = g_FlashPhyNum0;
g_FlashTablePrepare[1] = g_FlashPhyNum1;
for(i = 0; i < g_pFlashPara->uUserBlockNum; i++){
if(g_FlashTableLog2Phy[i] == g_FlashPhyNum0){
g_FlashTableLog2Phy[i] = flashPhyNum2;
break;
}
}
g_FlashPhyNum0 = flashPhyNum2;
g_FlashPhyNum1 = -1;
g_FlashModify = FALSE;
g_FlashDirty = FALSE;
return NFLS_ERR_NO;
}
/********************************************************************************/
/* FUNCTION: FlashMngBlockUpdate */
/* DESCRIPTION:Update buffer to flash, incorporate org block and swap block */
/* INPUTS: */
/* OUTPUTS: */
/* RETURN: NFLS_ERR_NO ok */
/* return from FlashMngWriteDriver */
/* return from FlashMngReadDriver */
/* return from FlashMngBlockSwap */
/********************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==================================================*/
/* Victor 2005-05-10 create */
/********************************************************************************/
INT FlashMngBlockUpdate(void)
{
UINT i;
INT retVal;
UINT8 flashSpareBuf[64];
// update buffer to flash
if(g_FlashModify){ // need update buffer to flash
if(g_FlashDirty){ // update to swap block
// if current page has been modified, must update block
FlashMngReadDriver(FLASH_IO_ONLYSPARE, g_FlashPhyNum1 * g_pFlashPara->uDataPerBlock + g_FlashPageOffset * g_pFlashPara->uDataPerPage, &flashSpareBuf[0], CURRENT_SPARE_SIZE);
if(!(PAGE_STATUS(flashSpareBuf) & PAGE_STATUS_NODIRTY)){
return FlashMngBlockSwap();
}
PAGE_STATUS(g_pFlashSpareBuf) &= ~PAGE_STATUS_NODIRTY; // set dirty flag
PAGE_STATUS(g_pFlashSpareBuf) |= PAGE_STATUS_AVAILABLE; // set available flag
if(g_FlashPageOffset == 0){
BLOCK_STATUS(g_pFlashSpareBuf) = FLASH_STATUS_SWAP;
}
// write buffer to swap block
if((retVal = FlashMngWriteDriver(FLASH_IO_DATASPARE, g_FlashPhyNum1 * g_pFlashPara->uDataPerBlock + g_FlashPageOffset * g_pFlashPara->uDataPerPage,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
return retVal;
}
// abolish page in org block
PAGE_STATUS(g_pFlashSpareBuf) &= ~PAGE_STATUS_AVAILABLE; // set inavailable flag
if((retVal = FlashMngWriteDriver(FLASH_IO_ONLYSPARE, g_FlashPhyNum0 * g_pFlashPara->uDataPerBlock + g_FlashPageOffset * g_pFlashPara->uDataPerPage,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
return retVal;
}
}else{ // update to org block
PAGE_STATUS(g_pFlashSpareBuf) &= ~PAGE_STATUS_NODIRTY; // set dirty flag
PAGE_STATUS(g_pFlashSpareBuf) |= PAGE_STATUS_AVAILABLE; // set available flag
// write buffer to org block
if((retVal = FlashMngWriteDriver(FLASH_IO_DATASPARE, g_FlashPhyNum0 * g_pFlashPara->uDataPerBlock + g_FlashPageOffset * g_pFlashPara->uDataPerPage,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
return retVal;
}
}
}
//incorporate org block and swap block
//if(g_FlashPhyNum0 != g_FlashPhyNum1){
if(g_FlashDirty){
// set transfering flag(begin transfer)
if((retVal = FlashMngReadDriver(FLASH_IO_DATASPARE, g_FlashPhyNum0 * g_pFlashPara->uDataPerBlock,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
return retVal;
}
BLOCK_STATUS(g_pFlashSpareBuf) = FLASH_STATUS_SWAPING;
if((retVal = FlashMngWriteDriver(FLASH_IO_ONLYSPARE, g_FlashPhyNum0 * g_pFlashPara->uDataPerBlock,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
return retVal;
}
// updata first page to swap block
if(PAGE_STATUS(g_pFlashSpareBuf) & PAGE_STATUS_AVAILABLE){
BLOCK_STATUS(g_pFlashSpareBuf) = FLASH_STATUS_SWAP;
if((retVal = FlashMngWriteDriver(FLASH_IO_DATASPARE, g_FlashPhyNum1 * g_pFlashPara->uDataPerBlock,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
return retVal;
}
}
for(i = 1; i < g_pFlashPara->uPagePerBlock; i++){
// read page from org block
if((retVal = FlashMngReadDriver(FLASH_IO_DATASPARE, g_FlashPhyNum0 * g_pFlashPara->uDataPerBlock + i * g_pFlashPara->uDataPerPage,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
return retVal;
}
// write page to swap block
if((PAGE_STATUS(g_pFlashSpareBuf) & PAGE_STATUS_AVAILABLE)
&& (!(PAGE_STATUS(g_pFlashSpareBuf) & PAGE_STATUS_NODIRTY))){
if((retVal = FlashMngWriteDriver(FLASH_IO_DATASPARE, g_FlashPhyNum1 * g_pFlashPara->uDataPerBlock + i * g_pFlashPara->uDataPerPage,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
return retVal;
}
}
}
// set transfered flag(end transfer)
if((retVal = FlashMngReadDriver(FLASH_IO_ONLYSPARE, g_FlashPhyNum1 * g_pFlashPara->uDataPerBlock,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
return retVal;
}
BLOCK_STATUS(g_pFlashSpareBuf) = FLASH_STATUS_ORG;
if((retVal = FlashMngWriteDriver(FLASH_IO_ONLYSPARE, g_FlashPhyNum1 * g_pFlashPara->uDataPerBlock,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
return retVal;
}
BLOCK_STATUS(g_pFlashSpareBuf) = FLASH_STATUS_PREPARE;
if((retVal = FlashMngWriteDriver(FLASH_IO_ONLYSPARE, g_FlashPhyNum0 * g_pFlashPara->uDataPerBlock,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
return retVal;
}
for(i = 0; i < g_pFlashPara->uUserBlockNum; i++){
if(g_FlashTableLog2Phy[i] == g_FlashPhyNum0){
g_FlashTableLog2Phy[i] = g_FlashPhyNum1;
break;
}
}
g_FlashTablePrepare[0] = g_FlashPhyNum0;
}
return NFLS_ERR_NO;
}
/********************************************************************************/
/* FUNCTION: FlashMngPageUpdate */
/* DESCRIPTION:Update buffer to flash */
/* INPUTS: */
/* OUTPUTS: */
/* RETURN: NFLS_ERR_NO ok */
/* return from FlashMngWriteDriver */
/* return from FlashMngReadDriver */
/* return from FlashMngBlockSwap */
/********************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==================================================*/
/* Victor 2005-05-10 create */
/********************************************************************************/
INT FlashMngPageUpdate(void)
{
INT retVal;
UINT8 flashSpareBuf[64];
if(g_FlashModify){ // need update buffer to flash
if(g_FlashDirty){ // update to swap block
// if current page has been modified, must update block
FlashMngReadDriver(FLASH_IO_ONLYSPARE, g_FlashPhyNum1 * g_pFlashPara->uDataPerBlock + g_FlashPageOffset * g_pFlashPara->uDataPerPage, &flashSpareBuf[0], CURRENT_SPARE_SIZE);
if(!(PAGE_STATUS(flashSpareBuf) & PAGE_STATUS_NODIRTY)){
return FlashMngBlockSwap();
}
PAGE_STATUS(g_pFlashSpareBuf) &= ~PAGE_STATUS_NODIRTY; // set dirty flag
PAGE_STATUS(g_pFlashSpareBuf) |= PAGE_STATUS_AVAILABLE; // set available flag
if(g_FlashPageOffset == 0){
BLOCK_STATUS(g_pFlashSpareBuf) = FLASH_STATUS_SWAP;
}
// write buffer to swap block
if((retVal = FlashMngWriteDriver(FLASH_IO_DATASPARE, g_FlashPhyNum1 * g_pFlashPara->uDataPerBlock + g_FlashPageOffset * g_pFlashPara->uDataPerPage,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
return retVal;
}
// abolish page in org block
PAGE_STATUS(g_pFlashSpareBuf) &= ~PAGE_STATUS_AVAILABLE; // set inavailable flag
if((retVal = FlashMngWriteDriver(FLASH_IO_ONLYSPARE, g_FlashPhyNum0 * g_pFlashPara->uDataPerBlock + g_FlashPageOffset * g_pFlashPara->uDataPerPage,
g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
return retVal;
}
}else{ // update to org block
PAGE_STATUS(g_pFlashSpareBuf) &= ~PAGE_STATUS_NODIRTY; // set dirty flag
PAGE_STATUS(g_pFlashSpareBuf) |= PAGE_STATUS_AVAILABLE; // set available flag
// write buffer to org block
if((retVal = FlashMngWriteDriver(FLASH_IO_DATASPARE, g_FlashPhyNum0 * g_pFlashPara->uDataPerBlock + g_FlashPageOffset * g_pFlashPara->uDataPerPage,
&g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
return retVal;
}
}
}
return NFLS_ERR_NO;
}
/********************************************************************************/
/* FUNCTION: FlashMngReadPhyEraseUnit */
/* DESCRIPTION:updata buffer to flash and load current page to buffer */
/* INPUTS: dwPhysicalPage physical page */
/* dwLogicalPage logical page */
/* OUTPUTS: */
/* RETURN: >=0 page offset in buffer */
/********************************************************************************/
/* NAME DATE REMARKS */
/* ========== ============ ==================================================*/
/* Victor 2005-05-10 create */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?