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;
}