main
Default mainpagebasic-norflash-projectmain
Description Source Call Graph
Start Line: 161
int main(void)
{
    unsigned int blockNumber, block, blockSize, blockAddress, pageSize, packetSize, i;
    unsigned char testFailed;
    const unsigned char busWidth[3] = {FLASH_CHIP_WIDTH_8BITS, FLASH_CHIP_WIDTH_16BITS, FLASH_CHIP_WIDTH_32BITS};

    // Configure pins and DBGU
#ifdef PINS_NORFLASH
    PIO_Configure(pPins, PIO_LISTSIZE(pPins));
#endif
    TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
    printf("-- Basic NorFlash Project %s --\n\r", SOFTPACK_VERSION);
    printf("-- %s\n\r", BOARD_NAME);
    printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__);

    norFlash.norFlashInfo.baseAddress = BOARD_NORFLASH_ADDR;
    // Check device CFI and get Vendor setting from it.
    printf("-I- \t Common Flash Interface detecting...\n\r");
    for (i = 0; i < 3; i++) {
        // Configure SMC for Norflash accesses 
        TRACE_INFO("\t Try bus width %d bits\n\r", busWidth[i] * 8);
        BOARD_ConfigureNorFlash48MHz(busWidth[i] * 8);
        if(! NorFlash_CFI_Detect(&norFlash, busWidth[i])) break;
    }

    if (norFlash.norFlashInfo.cfiCompatible == 0) {
        TRACE_ERROR("Device Unknown\n\r");
        testFailed = 1;
        goto exit;
    }
       
    printf("-I- \t CFI detected and driver initialized\n\r");
    printf("-I- \t manufactureID : 0x%08x, deviceID : 0x%08x\n\r",
            NORFLASH_ReadManufactoryID(&norFlash),
            NORFLASH_ReadDeviceID(&norFlash));

    // Test all pages
      testFailed = 0;
    block = 0;
    blockNumber = NorFlash_GetDeviceNumOfBlocks(&(norFlash.norFlashInfo));
    pageSize = min(NorFlash_GetDeviceMinBlockSize(&(norFlash.norFlashInfo)), 1024);

    while (!testFailed && (block < blockNumber)) {

        TRACE_INFO("Test in progress on block: %6d\r", block);
        // Erase block
        NORFLASH_EraseSector(&norFlash, NorFlash_GetDeviceSectorAddress(&(norFlash.norFlashInfo), block));
        
        blockSize =  NorFlash_GetDeviceBlockSize(&(norFlash.norFlashInfo), block);
        blockAddress = NorFlash_GetDeviceSectorAddress(&(norFlash.norFlashInfo), block);
        packetSize = pageSize;
        
        while (blockSize) {
            // Verify that page has been erased correctly
            memset(pBuffer, 0, packetSize);
            NORFLASH_ReadData(&norFlash, blockAddress, pBuffer, packetSize);
            for (i=0; i < packetSize; i++) {
            
                if (pBuffer[i] != 0xFF) {
                    TRACE_ERROR("Could not erase block %d\n\r", block);
                    testFailed = 1;
                    goto exit;
                }
            }
            
            blockAddress += packetSize;
            blockSize -= packetSize;
            if (blockSize < pageSize) {
                 packetSize = blockSize;
            }
        }
        
        blockSize =  NorFlash_GetDeviceBlockSize(&(norFlash.norFlashInfo), block);
        blockAddress = NorFlash_GetDeviceSectorAddress(&(norFlash.norFlashInfo), block);
        packetSize = pageSize;
        
        while (blockSize) {
            // Write page
            for (i = 0; i < packetSize; i++) {
                pBuffer[i] = i & 0xFF;
            }
            NORFLASH_WriteData(&norFlash, blockAddress, pBuffer, packetSize);
            // Check that data has been written correctly                    
            memset(pBuffer, 0, packetSize);
            NORFLASH_ReadData(&norFlash, blockAddress, pBuffer, packetSize);
        
            for (i = 0; i < packetSize; i++) {
                if (pBuffer[i] != (i & 0xFF)) {
                    TRACE_ERROR("Could not write block %d\n\r", block);
                    testFailed = 1;
                    goto exit;
                }
            }
            blockAddress += packetSize;
            blockSize -= packetSize;
            if (blockSize < pageSize) {
                 packetSize = blockSize;
            }
        }
        block++;    
    }
    exit:
    // Display test result
    if (testFailed) {
    
        printf("-E- Test failed.\n\r");
    }
    else {
    
         printf("\n\r-I- Test passed.\n\r");
    }

    return 0;
}