main
Default mainpagebasic-nandflash-projectmain
Description Source Call Graph
Start Line: 202
int main()
{
    unsigned char testFailed;
    // Temporary buffer used for non block aligned read / write
    unsigned char * pBuffer;
    unsigned short block;
    unsigned int i;
    // Errors returned by SkipNandFlash functions
    unsigned char error = 0;

    // Configure the DBGU
    TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
    printf("-- Basic NandFlash Project %s --\n\r", SOFTPACK_VERSION);
    printf("-- %s\n\r", BOARD_NAME);
    printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__);

#if !defined(sdram)
    BOARD_ConfigureSdram(BOARD_SDRAM_BUSWIDTH);
#endif

    // Configure SMC for Nandflash accesses (done each time applet is launched because of old ROM codes)
    BOARD_ConfigureNandFlash(nfBusWidth);
    PIO_Configure(pPinsNf, PIO_LISTSIZE(pPinsNf));

    memset(&skipBlockNf, 0, sizeof(skipBlockNf));

    if (SkipBlockNandFlash_Initialize(&skipBlockNf,
                                              0,
                                              cmdBytesAddr,
                                              addrBytesAddr,
                                              dataBytesAddr,
                                              nfCePin,
                                              nfRbPin)) {

        TRACE_ERROR("\tDevice Unknown\n\r");
        return 0;
    }

    // Check the data bus width of the NandFlash
    nfBusWidth = NandFlashModel_GetDataBusWidth((struct NandFlashModel *)&skipBlockNf);
    // Reconfigure bus width
    BOARD_ConfigureNandFlash(nfBusWidth);

    TRACE_INFO("\tNandflash driver initialized\n\r");

    // Get device parameters
    memSize = NandFlashModel_GetDeviceSizeInBytes(&skipBlockNf.ecc.raw.model);
    blockSize = NandFlashModel_GetBlockSizeInBytes(&skipBlockNf.ecc.raw.model);
    numBlocks = NandFlashModel_GetDeviceSizeInBlocks(&skipBlockNf.ecc.raw.model);
    pageSize = NandFlashModel_GetPageDataSize(&skipBlockNf.ecc.raw.model);
    numPagesPerBlock = NandFlashModel_GetBlockSizeInPages(&skipBlockNf.ecc.raw.model);

    TRACE_INFO("Size of the whole device in bytes : 0x%x \n\r",memSize);
    TRACE_INFO("Size in bytes of one single block of a device : 0x%x \n\r",blockSize);
    TRACE_INFO("Number of blocks in the entire device : 0x%x \n\r",numBlocks);
    TRACE_INFO("Size of the data area of a page in bytes : 0x%x \n\r",pageSize);
    TRACE_INFO("Number of pages in the entire device : 0x%x \n\r",numPagesPerBlock);
    TRACE_INFO("Bus width : 0x%x \n\r",nfBusWidth);

    // Test all blocks
    testFailed = 0;
    block = 0;
    pBuffer = (unsigned char *) BUFFER_ADDRESS;

    while (!testFailed && (block < numBlocks)) {
        TRACE_INFO("Test in progress on block: %6d\r", block);

        // Erase block
        error = SkipBlockNandFlash_EraseBlock(&skipBlockNf, block, NORMAL_ERASE);
        if (error == NandCommon_ERROR_BADBLOCK) {
            TRACE_INFO("Skip bad block %6d: \n\r", block);
            block++;
            continue;
        }

        // Verify that block has been erased correctly
        memset(pBuffer, 0, blockSize);
        SkipBlockNandFlash_ReadBlock(&skipBlockNf, block, pBuffer);
        for (i=0; i < blockSize; i++) {
            if (pBuffer[i] != 0xff) {
                TRACE_ERROR("Could not erase block %d\n\r", block);
                testFailed = 1;
                break;
            }
        }

        // Write block
        for (i=0; i < blockSize; i++) {

            pBuffer[i] = i & 0xFF;
        }
        // Write target block
        SkipBlockNandFlash_WriteBlock(&skipBlockNf, block, pBuffer);

        // Check that data has been written correctly
        memset(pBuffer, 0, blockSize);
        SkipBlockNandFlash_ReadBlock(&skipBlockNf, block, pBuffer);

        for (i=0; i < blockSize; i++) {
            if (pBuffer[i] != (i & 0xFF)) {
                TRACE_ERROR("Could not write block %d\n\r", block);
                testFailed = 1;
                break;
            }
        }
        block++;
    }
    // Display test result
    if (testFailed) {

        TRACE_ERROR("Test failed.\n\r");
    }
    else {

         TRACE_INFO("Test passed.\n\r");
    }

    return 0;
}