flashmng.c

来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 1,302 行 · 第 1/5 页

C
1,302
字号
/********************************************************************************/
INT FlashMngReadPhyEraseUnit(INT dwPhysicalPage, INT dwLogicalPage)
{
    INT curEraseNum, dwOffset;
    INT retVal;

    // get erase unit number which contains "dwPhysicalPage"
    curEraseNum = dwPhysicalPage * NORMAL_PAGE_SIZE / g_pFlashPara->uDataPerBlock;
    dwOffset = (dwPhysicalPage % (g_pFlashPara->uDataPerBlock / NORMAL_PAGE_SIZE)) / (g_pFlashPara->uDataPerPage / NORMAL_PAGE_SIZE);

    if(curEraseNum != g_FlashPhyNum0){          // block update
        if(g_FlashPhyNum0 != -1){
            if((retVal = FlashMngBlockUpdate()) != NFLS_ERR_NO){
                return retVal;
            }
        }
        g_FlashPhyNum0 = curEraseNum;
        g_FlashPhyNum1 = -1;
        g_FlashPageOffset = dwOffset;
        g_FlashModify = FALSE;
        g_FlashDirty = FALSE;
    }else if(dwOffset != g_FlashPageOffset){    // page update
        if((retVal = FlashMngPageUpdate()) != NFLS_ERR_NO){
            return retVal;
        }
        g_FlashPageOffset = dwOffset;
        g_FlashModify = FALSE;
    }else{
        return (dwPhysicalPage % (g_pFlashPara->uDataPerPage / NORMAL_PAGE_SIZE)) * NORMAL_PAGE_SIZE;
    }

    if((retVal = FlashMngReadDriver(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;
    }
    if((g_FlashDirty == TRUE) && !(PAGE_STATUS(g_pFlashSpareBuf) & PAGE_STATUS_AVAILABLE)){
        if((retVal = FlashMngReadDriver(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;
        }
    }
    
    return (dwPhysicalPage % (g_pFlashPara->uDataPerPage / NORMAL_PAGE_SIZE)) * NORMAL_PAGE_SIZE;
}

/********************************************************************************/
/* FUNCTION:   FlashUpdate                                                     */
/* DESCRIPTION:Update buffer to flash, incorporate org block and swap block    */
/* INPUTS:                                                                      */
/* OUTPUTS:                                                                    */
/* RETURN:     NFLS_ERR_NO         ok                                          */
/*              return from FlashMngBlockUpdate                                 */
/********************************************************************************/
/*    NAME        DATE                REMARKS                                   */
/* ==========  ============   ==================================================*/
/*   Victor     2005-05-10      create                                          */
/********************************************************************************/
INT FlashUpdate()
{
    INT     retVal;
    
    if(g_FlashPhyNum0 != -1){
        if((retVal = FlashMngBlockUpdate()) != NFLS_ERR_NO){
            return retVal;
        }
    }
    g_FlashModify = FALSE;
    g_FlashDirty = FALSE;
    return NFLS_ERR_NO;
}

/********************************************************************************/
/* FUNCTION:   FlashModInitial                                                 */
/* DESCRIPTION:Initial Flash manager model                                     */
/* INPUTS:                                                                      */
/* OUTPUTS:                                                                    */
/* RETURN:     NFLS_ERR_DRIVER     nucleus driver manager error                */
/*              return from FlashMngGetDriver                                   */
/*              retrun from FlashMngTableRead                                   */
/********************************************************************************/
/*    NAME        DATE                REMARKS                                   */
/* ==========  ============   ==================================================*/
/*   Victor     2005-05-10      create                                          */
/********************************************************************************/
INT FlashModInitial()
{
    INT     retVal;
    
    // Get flash device handle
    if ((g_pFlashDriver = GetIODriverFromName((UINT8*)DRV_NAME_NFLASH))== NULL){
        return NFLS_ERR_DRIVER;
    }

    // Get flash parameter
    if((retVal = FlashMngGetDriver(&g_pFlashPara)) != NFLS_ERR_NO){
        return retVal;
    }

    // initial global variable
    g_pFlashDataBuf = &g_FlashBuf[0];
    g_pFlashSpareBuf = &g_FlashBuf[CURRENT_PAGE_SIZE];
    g_FlashPhyNum0 = -1;
    g_FlashPhyNum1 = -1;
    g_FlashPageOffset = -1;
    g_FlashModify = FALSE;
    g_FlashDirty = FALSE;
    g_multiTest = 0;
    
    // load table of contrast between logical block to physical block
    return FlashMngTableRead();
}

/********************************************************************************/
/* FUNCTION:   FlashOpen                                                       */
/* DESCRIPTION:open flash device                                               */
/* INPUTS:      driveno             device number                               */
/* OUTPUTS:                                                                    */
/* RETURN:     TRUE                ;NFLS_ERR_NO         ok                     */
/********************************************************************************/
/*    NAME        DATE                REMARKS                                   */
/* ==========  ============   ==================================================*/
/*   Victor     2005-05-10      create                                          */
/********************************************************************************/
INT FlashOpen(UINT16 driveno)
{
    driveno = driveno;
    //return NFLS_ERR_NO;
    return TRUE;
}

/********************************************************************************/
/* FUNCTION:   FlashClose                                                      */
/* DESCRIPTION:close flash device                                              */
/* INPUTS:      driveno             device number                               */
/* OUTPUTS:                                                                    */
/* RETURN:     NFLS_ERR_NO         ok                                          */
/********************************************************************************/
/*    NAME        DATE                REMARKS                                   */
/* ==========  ============   ==================================================*/
/*   Victor     2005-05-10      create                                          */
/********************************************************************************/
INT FlashClose(UINT16 driveno)
{
    driveno = driveno;
    return NFLS_ERR_NO;
}

/********************************************************************************/
/* FUNCTION:   FlashIo                                                         */
/* DESCRIPTION:reads or writes data from or to the flash based on the          */
/*              'reading' parameter.                                            */
/* INPUTS:      driveno             device number                               */
/*              dwLogicalPage       The page number to read or write            */
/*              buffer              'reading' == 0: data write to flash         */
/*              uPages              Number of pages to be read or written       */
/*              reading             Indicates reading or writing                */
/* OUTPUTS:    buffer              'reading' == 1: data read from flash        */
/* RETURN:     0                   some error occur                            */
/*              >0                  read or write data length                   */
/********************************************************************************/
/*    NAME        DATE                REMARKS                                   */
/* ==========  ============   ==================================================*/
/*   Victor     2005-05-10      create                                          */
/********************************************************************************/
INT FlashIo(UINT16 driveno, UINT32 dwLogicalPage, VOID *buffer, UINT16 uPages, INT reading)
{
    INT         dwPhysicalPage;
    INT         offset;
    INT         dwTotalLen;
    UINT8       *pB;

    dwLogicalPage += FLASH_RESERVE_SECTOR;
    
    if(g_multiTest == 1){
        GraphDrawText(0x10, 0x90, 0, 0, (UINT8 *)"Device over run!");
    }
    g_multiTest = 1;
    
    /* We don't use drive no. You could have multiple drives if wanted */
    driveno = driveno;
    pB = buffer;
    dwTotalLen = 0;

    while (uPages){
        
        // logical page to physical page
        dwPhysicalPage = FlashMngGetPhysicalPage((INT)dwLogicalPage);
        if(dwPhysicalPage < 0){
            return 0;               // address is out of range
        }

        // buffer current page
        offset = FlashMngReadPhyEraseUnit(dwPhysicalPage, dwLogicalPage);
        if(offset < 0)
            return 0;

        if (reading){
            memcpy(pB, g_pFlashDataBuf + offset, NORMAL_PAGE_SIZE);
        }else{
            memcpy(g_pFlashDataBuf + offset, pB, NORMAL_PAGE_SIZE);
            g_FlashModify = TRUE;
            
            // get a swap block
            if((!g_FlashDirty) && (!(PAGE_STATUS(g_pFlashSpareBuf) & PAGE_STATUS_NODIRTY))){
                g_FlashDirty = TRUE;
                g_FlashPhyNum1 = g_FlashTablePrepare[0];
                if(FlashMngEraseDriver(g_FlashPhyNum1*g_pFlashPara->uDataPerBlock) != NFLS_ERR_NO){
                    return 0;
                }
                memset(g_pFlashOnlySpareBuf, 0xff, CURRENT_SPARE_SIZE);
                BLOCK_STATUS(g_pFlashOnlySpareBuf) = FLASH_STATUS_SWAP;
                BLOCK_LOGIC(g_pFlashOnlySpareBuf) = dwLogicalPage / (g_pFlashPara->uDataPerBlock / NORMAL_PAGE_SIZE);
                if(FlashMngWriteDriver(FLASH_IO_ONLYSPARE, g_FlashPhyNum1 * g_pFlashPara->uDataPerBlock, 
                    g_pFlashOnlySpareBuf, CURRENT_SPARE_SIZE) != CURRENT_SPARE_SIZE){
                    return 0;
                }
            }
        }
        uPages--;
        dwLogicalPage++;
        pB += NORMAL_PAGE_SIZE;
        dwTotalLen += NORMAL_PAGE_SIZE;
    }

    g_multiTest = 0;
    
    return dwTotalLen;
}

INT FlashIoEx(UINT16 driveno, UINT32 dwLogicalPage, VOID *buffer, UINT16 uPages, INT reading)
{
    dwLogicalPage -= FLASH_RESERVE_SECTOR;
    return FlashIo(driveno, dwLogicalPage, buffer, uPages, reading);
}

/********************************************************************************/
/* FUNCTION:   FlashIoCtrl                                                     */
/* DESCRIPTION:device format and special parameter return                      */
/* INPUTS:      driveno             device number                               */
/*              command             FLASH_COMMAND_FORMAT: device format         */
/*                                  FLASH_COMMAND_GETINFO:get flash parameter   */
/* OUTPUTS:    buffer              command == FLASH_COMMAND_GETINFO: pointer   */
/*                                  to flash infor pointer                      */
/* RETURN:     NFLS_ERR_NO         ok                                          */
/*              NFLS_ERR_COMMAND    illegal command                             */
/*              retrun from FlashMngTableCreate                                 */
/*              return from FlashMngTableRead                                   */
/********************************************************************************/
/*    NAME        DATE                REMARKS                                   */
/* ==========  ============   ==================================================*/
/*   Victor     2005-05-10      create                                          */
/********************************************************************************/
INT FlashIoCtrl(UINT16 driveno, UINT16 command, VOID *buffer)
{
    INT     retVal;

    driveno = driveno;

    switch(command){
        case FLASH_COMMAND_FORMAT:
            if((retVal = FlashMngTableCreate((FP_FORMAT_UI)NULL, (VOID *)NULL)) != NFLS_ERR_NO){

⌨️ 快捷键说明

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