📄 skipblocknandflash.c
字号:
}
}
// Erase block
error = RawNandFlash_EraseBlock(RAW(skipBlock), block);
if (error) {
// Try to mark the block as BAD
TRACE_ERROR("SkipBlockNandFlash_EraseBlock: Cannot erase block, try to mark it BAD\n\r");
// Retrieve model scheme
scheme = NandFlashModel_GetScheme(MODEL(skipBlock));
memset(spare, 0xFF, NandCommon_MAXPAGESPARESIZE);
NandSpareScheme_WriteBadBlockMarker(scheme, spare, NandBlockStatus_BAD);
return RawNandFlash_WritePage(RAW(skipBlock), block, 0, 0, spare);
}
return 0;
}
//------------------------------------------------------------------------------
/// Reads the data and/or the spare area of a page on a SkipBlock nandflash. If
/// the data pointer is not 0, then the block MUST not be BAD
/// Returns NandCommon_ERROR_BADBLOCK if the block is BAD; Otherwise, returns
/// EccNandFlash_ReadPage().
/// \param skipBlock Pointer to a SkipBlockNandFlash instance.
/// \param block Number of block to read page from.
/// \param page Number of page to read inside the given block.
/// \param data Data area buffer, can be 0.
/// \param spare Spare area buffer, can be 0.
//------------------------------------------------------------------------------
unsigned char SkipBlockNandFlash_ReadPage(
const struct SkipBlockNandFlash *skipBlock,
unsigned short block,
unsigned short page,
void *data,
void *spare)
{
#if !defined(OP_BOOTSTRAP_on)
// Check that the block is not BAD if data is requested
if (CheckBlock(skipBlock, block) != GOODBLOCK) {
TRACE_ERROR("SkipBlockNandFlash_ReadPage: Block is BAD.\n\r");
return NandCommon_ERROR_BADBLOCK;
}
// Read data with ECC verification
return EccNandFlash_ReadPage(ECC(skipBlock), block, page, data, spare);
#else
return RawNandFlash_ReadPage(RAW(skipBlock), block, page, data, spare);
#endif
}
//------------------------------------------------------------------------------
/// Reads the data of a whole block on a SkipBlock nandflash.
/// Returns NandCommon_ERROR_BADBLOCK if the block is BAD; Otherwise, returns
/// EccNandFlash_ReadPage().
/// \param skipBlock Pointer to a SkipBlockNandFlash instance.
/// \param block Number of block to read page from.
/// \param page Number of page to read inside the given block.
/// \param data Data area buffer, can be 0.
/// \param spare Spare area buffer, can be 0.
//------------------------------------------------------------------------------
unsigned char SkipBlockNandFlash_ReadBlock(
const struct SkipBlockNandFlash *skipBlock,
unsigned short block,
void *data)
{
/// Number of pages per block
unsigned int numPagesPerBlock, pageSize;
// Page index
unsigned short i;
// Error returned by SkipBlockNandFlash_WritePage
unsigned char error = 0;
// Retrieve model information
pageSize = NandFlashModel_GetPageDataSize(MODEL(skipBlock));
numPagesPerBlock = NandFlashModel_GetBlockSizeInPages(MODEL(skipBlock));
// Check that the block is not BAD if data is requested
if (CheckBlock(skipBlock, block) != GOODBLOCK) {
TRACE_ERROR("SkipBlockNandFlash_ReadBlock: Block is BAD.\n\r");
return NandCommon_ERROR_BADBLOCK;
}
// Read all the pages of the block
for (i = 0; i < numPagesPerBlock; i++) {
error = EccNandFlash_ReadPage(ECC(skipBlock), block, i, data, 0);
if (error) {
TRACE_ERROR("SkipBlockNandFlash_ReadBlock: Cannot read page %d of block %d.\n\r", i, block);
return error;
}
data = (void *) ((unsigned char *) data + pageSize);
}
return 0;
}
//------------------------------------------------------------------------------
/// Writes the data and/or spare area of a page on a SkipBlock NandFlash.
/// Returns NandCommon_ERROR_BADBLOCK if the page is BAD; otherwise,
/// returns EccNandFlash_WritePage().
/// \param skipBlock Pointer to a SkipBlockNandFlash instance.
/// \param block Number of the block to write.
/// \param page Number of the page to write inside the given block.
/// \param data Data area buffer.
/// \param spare Spare area buffer.
//------------------------------------------------------------------------------
unsigned char SkipBlockNandFlash_WritePage(
const struct SkipBlockNandFlash *skipBlock,
unsigned short block,
unsigned short page,
void *data,
void *spare)
{
// Check that the block is LIVE
if (CheckBlock(skipBlock, block) != GOODBLOCK) {
TRACE_ERROR("SkipBlockNandFlash_WritePage: Block is BAD.\n\r");
return NandCommon_ERROR_BADBLOCK;
}
// Write data with ECC calculation
return EccNandFlash_WritePage(ECC(skipBlock), block, page, data, spare);
}
//------------------------------------------------------------------------------
/// Writes the data of a whole block on a SkipBlock nandflash.
/// Returns NandCommon_ERROR_BADBLOCK if the block is BAD; Otherwise, returns
/// EccNandFlash_ReadPage().
/// \param skipBlock Pointer to a SkipBlockNandFlash instance.
/// \param block Number of block to read page from.
/// \param data Data area buffer, can be 0.
//------------------------------------------------------------------------------
unsigned char SkipBlockNandFlash_WriteBlock(
const struct SkipBlockNandFlash *skipBlock,
unsigned short block,
void *data)
{
// Number of pages per block
unsigned int numPagesPerBlock;
// Page size
unsigned int pageSize;
// Page index
unsigned short i;
// Error returned by SkipBlockNandFlash_WritePage
unsigned char error = 0;
// Retrieve model information
pageSize = NandFlashModel_GetPageDataSize(MODEL(skipBlock));
numPagesPerBlock = NandFlashModel_GetBlockSizeInPages(MODEL(skipBlock));
// Check that the block is LIVE
if (CheckBlock(skipBlock, block) != GOODBLOCK) {
TRACE_ERROR("SkipBlockNandFlash_WriteBlock: Block is BAD.\n\r");
return NandCommon_ERROR_BADBLOCK;
}
for (i = 0; i < numPagesPerBlock; i++) {
error = EccNandFlash_WritePage(ECC(skipBlock), block, i, data, 0);
if (error) {
TRACE_ERROR("SkipBlockNandFlash_WriteBlock: Cannot write page %d of block %d.\n\r", i, block);
return NandCommon_ERROR_CANNOTWRITE;
}
data = (void *) ((unsigned char *) data + pageSize);
}
return 0;
}
//------------------------------------------------------------------------------
/// Writes the data of a whole block on a SkipBlock nandflash.
/// Returns NandCommon_ERROR_BADBLOCK if the block is BAD; Otherwise, returns
/// EccNandFlash_ReadPage().
/// \param skipBlock Pointer to a SkipBlockNandFlash instance.
/// \param block Number of block to read page from.
/// \param page Number of page to read inside the given block.
/// \param data Data area buffer, can be 0.
/// \param spare Spare area buffer, can be 0.
//------------------------------------------------------------------------------
//unsigned char SkipBlockNandFlash_WriteBlockUnaligned(
// const struct SkipBlockNandFlash *skipBlock,
// unsigned short block,
// void *data,
// void *tmpBuffer,
// )
//{
// // Number of pages per block
// unsigned int numPagesPerBlock;
// // Page size
// unsigned int pageSize;
// // Page index
// unsigned short i;
// // Error returned by SkipBlockNandFlash_WritePage
// unsigned char error = 0;
//
// // Retrieve model information
// pageSize = NandFlashModel_GetPageDataSize(MODEL(skipBlock));
// numPagesPerBlock = NandFlashModel_GetBlockSizeInPages(MODEL(skipBlock));
//
// for (i = 0; i < numPagesPerBlock; i++) {
// error = SkipBlockNandFlash_WritePage(skipBlock, block, i, data, 0);
// if (error == NandCommon_ERROR_BADBLOCK) {
//
// TRACE_ERROR("SkipBlockNandFlash_WriteBlock: Cannot write page %d of block %d.\n\r", i, block);
// return NandCommon_ERROR_BADBLOCK;
// }
// else if (error) {
//
// TRACE_ERROR("SkipBlockNandFlash_WriteBlock: Cannot write page %d of block %d.\n\r", i, block);
// return NandCommon_ERROR_CANNOTWRITE;
// }
// data += pageSize;
// }
//
// return 0;
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -