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 + -
显示快捷键?