flashmng.c

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

C
1,302 行
字号
                return retVal;
            }
            return FlashMngTableRead();

        case FLASH_COMMAND_GETINFO:
    		((MFlashInfo *)buffer)->uPageSum = g_uFlashBlockUser * g_pFlashPara->uPagePerBlock * g_pFlashPara->uDataPerPage / NORMAL_PAGE_SIZE - FLASH_RESERVE_SECTOR;
    		((MFlashInfo *)buffer)->uPageSize = NORMAL_PAGE_SIZE;
            return NFLS_ERR_NO;
        default:
            return NFLS_ERR_COMMAND;
    }
}

#ifdef FLASH_TEST
/********************************************************************************/
/* FUNCTION:   FlashTest                                                       */
/* DESCRIPTION:Test flash read, write and erase                                */
/*              Test logical read and write                                     */
/*              Test bad block manager(include ECC)                             */
/* INPUTS:                                                                      */
/* OUTPUTS:                                                                    */
/* RETURN:                                                                     */
/********************************************************************************/
/*    NAME        DATE                REMARKS                                   */
/* ==========  ============   ==================================================*/
/*   Victor     2005-05-09      create                                          */
/********************************************************************************/
const unsigned char *errStr[] = {
    (const unsigned char *)"ok",
    (const unsigned char *)"format error, need format",
    (const unsigned char *)"battery low",
    (const unsigned char *)"bad blocks are too many to use",
    (const unsigned char *)"nucleus driver manager error",
    (const unsigned char *)"address is out of range",
    (const unsigned char *)"illegal command",
    (const unsigned char *)"not align linear address with page boundary",
    (const unsigned char *)"NFLASH_PARAMETER in not available",
    (const unsigned char *)"unknown chip ID",
    (const unsigned char *)"busy phase is too long",
    (const unsigned char *)"some internal error occur"
};

void FlashTest(void)
{
    INT     retVal;
    UINT    i;
    UINT    j;
    UINT    k;

    GraphClearScreen();

    //if((retVal = FlashModInitial()) < 0){
        if((retVal = FlashIoCtrl(NFLASH_DRIVENO, FLASH_COMMAND_FORMAT, NULL)) < 0){
            goto displayErr;
        }
    //}
    
    g_pFlashTestDataBuf = &g_FlashTestBuf[0];
    g_pFlashTestSpareBuf = &g_FlashTestBuf[CURRENT_PAGE_SIZE];

    // Test flash read, write and erase

#ifdef FLASH_PHY_TEST
    // flash erase
    for(i = FLASH_RESERVE_BLOCK; i < g_pFlashPara->uBlockSum; i ++){
        // read block spare
        if((retVal = FlashMngReadDriver(FLASH_IO_ONLYSPARE, i*g_pFlashPara->uDataPerBlock, 
            g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
            goto displayErr;
        }
        if(BLOCK_ATTRIBUTE(g_pFlashSpareBuf) == FLASH_ATTRIBUTE_GOOD){  // this block is a good block
            // erase this block
            if((retVal = FlashMngEraseDriver(i*g_pFlashPara->uDataPerBlock)) != NFLS_ERR_NO){
                goto displayErr;
            }
        }
    }
    // flash read: all bytes will be 0xff
    for(i = FLASH_RESERVE_BLOCK; i < g_pFlashPara->uBlockSum; i ++){
        // read block spare
        if((retVal = FlashMngReadDriver(FLASH_IO_ONLYSPARE, i*g_pFlashPara->uDataPerBlock, 
            g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
            goto displayErr;
        }
        if(BLOCK_ATTRIBUTE(g_pFlashSpareBuf) == FLASH_ATTRIBUTE_GOOD){  // this block is a good block
            for(j = 0; j < g_pFlashPara->uPagePerBlock; j++){
                // read data and spare
                if((retVal = FlashMngReadDriver(FLASH_IO_DATASPARE, i * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage,
                    &g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
                    goto displayErr;
                }
                // check data and spare
                for(k = 0; k < CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE; k++){
                    if(g_FlashBuf[k] != 0xff){
                        retVal = -13;
                        goto displayErr;
                    }
                }
            }
        }
    }
    // flash write
    for(i = FLASH_RESERVE_BLOCK; i < g_pFlashPara->uBlockSum; i ++){
        // read block spare
        if((retVal = FlashMngReadDriver(FLASH_IO_ONLYSPARE, i*g_pFlashPara->uDataPerBlock, 
            g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
            goto displayErr;
        }
        if(BLOCK_ATTRIBUTE(g_pFlashSpareBuf) == FLASH_ATTRIBUTE_GOOD){  // this block is a good block
            for(j = 0; j < g_pFlashPara->uPagePerBlock; j++){
                // set data and spare
                for(k = 0; k < (CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)/4; k++){
                    ((UINT32 *)g_FlashBuf)[k] = i * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k;
                }
                BLOCK_ATTRIBUTE(g_pFlashSpareBuf) = FLASH_ATTRIBUTE_GOOD;
                // write data and spare
                if((retVal = FlashMngWriteDriver(FLASH_IO_DATASPARE, i * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage,
                    &g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
                    goto displayErr;
                }
            }
        }
    }
    // flash read
    for(i = FLASH_RESERVE_BLOCK; i < g_pFlashPara->uBlockSum; i ++){
        // read block spare
        if((retVal = FlashMngReadDriver(FLASH_IO_ONLYSPARE, i*g_pFlashPara->uDataPerBlock, 
            g_pFlashSpareBuf, CURRENT_SPARE_SIZE)) != CURRENT_SPARE_SIZE){
            goto displayErr;
        }
        if(BLOCK_ATTRIBUTE(g_pFlashSpareBuf) == FLASH_ATTRIBUTE_GOOD){  // this block is a good block
            for(j = 0; j < g_pFlashPara->uPagePerBlock; j++){
                // read data and spare
                if((retVal = FlashMngReadDriver(FLASH_IO_DATASPARE, i * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage,
                    &g_FlashBuf[0], CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)) != CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE){
                    goto displayErr;
                }
                // check data and spare
                for(k = 0; k < (CURRENT_PAGE_SIZE + CURRENT_SPARE_SIZE)/4; k++){
                    if(((UINT32 *)g_FlashBuf)[k] != i * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k){
                        if(k != (CURRENT_PAGE_SIZE + BLOCK_ATTRIBUTE_OFFSET)/4){
                            retVal = -13;
                            goto displayErr;
                        }
                    }
                }
            }
        }
    }

    retVal = 0;             // all ok
#endif          // FLASH_PHY_TEST

    //Test logical read and write

#ifdef FLASH_LOG_TEST
    // write half block 3
    for(j = 0; j < g_pFlashPara->uPagePerBlock/2; j++){
        // set data
        for(k = 0; k < CURRENT_PAGE_SIZE/4; k++){
            ((UINT32 *)g_pFlashTestDataBuf)[k] = 3 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k;
        }

        // write data to logical page
        if(FlashIo(0, (3 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage)/512, 
            g_pFlashTestDataBuf, 4, FALSE) == 0){
            retVal = -11;
            goto displayErr;
        }
    }

    // write half block 4
    for(j = 0; j < g_pFlashPara->uPagePerBlock/2; j++){
        // set data
        for(k = 0; k < CURRENT_PAGE_SIZE/4; k++){
            ((UINT32 *)g_pFlashTestDataBuf)[k] = 4 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k;
        }

        // write data to logical page
        if(FlashIo(0, (4 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage)/512, 
            g_pFlashTestDataBuf, 4, FALSE) == 0){
            retVal = -11;
            goto displayErr;
        }
    }
    
    ///////////////////////////////////////////////////////////////////////////////////////    

    // read half block 3
    for(j = 0; j < g_pFlashPara->uPagePerBlock/2; j++){
        // read data from logical page
        if(FlashIo(0, (3 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage)/512, 
            g_pFlashTestDataBuf, 4, TRUE) == 0){
            retVal = -11;
            goto displayErr;
        }

        // check data
        for(k = 0; k < CURRENT_PAGE_SIZE/4; k++){
            if(((UINT32 *)g_pFlashTestDataBuf)[k] != 3 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k){
                retVal = -11;
                goto displayErr;
            }
        }
    }

    // read half block 4
    for(j = 0; j < g_pFlashPara->uPagePerBlock/2; j++){
        // read data from logical page
        if(FlashIo(0, (4 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage)/512, 
            g_pFlashTestDataBuf, 4, TRUE) == 0){
            retVal = -11;
            goto displayErr;
        }

        // check data
        for(k = 0; k < CURRENT_PAGE_SIZE/4; k++){
            if(((UINT32 *)g_pFlashTestDataBuf)[k] != 4 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k){
                retVal = -11;
                goto displayErr;
            }
        }
    }

    ///////////////////////////////////////////////////////////////////////////////////////    

    // write another half block 3
    for(j = g_pFlashPara->uPagePerBlock/2; j < g_pFlashPara->uPagePerBlock; j++){
        // set data
        for(k = 0; k < CURRENT_PAGE_SIZE/4; k++){
            ((UINT32 *)g_pFlashTestDataBuf)[k] = 3 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k;
        }

        // write data to logical page
        if(FlashIo(0, (3 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage)/512, 
            g_pFlashTestDataBuf, 4, FALSE) == 0){
            retVal = -11;
            goto displayErr;
        }
    }

    // write another half block 4
    for(j = g_pFlashPara->uPagePerBlock/2; j < g_pFlashPara->uPagePerBlock; j++){
        // set data
        for(k = 0; k < CURRENT_PAGE_SIZE/4; k++){
            ((UINT32 *)g_pFlashTestDataBuf)[k] = 4 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage + k;
        }

        // write data to logical page
        if(FlashIo(0, (4 * g_pFlashPara->uDataPerBlock + j * g_pFlashPara->uDataPerPage)/512, 
            g_pFlashTestDataBuf, 4, FALSE) == 0){
            retVal = -11;
            goto displayErr;
        }
    }

    ///////////////////////////////////////////////////////////////////////////////////////    
   

⌨️ 快捷键说明

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