⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skipblocknandflash.c

📁 at91sam9263 keilv3 一级启动代码,其中晶振频率为16m
💻 C
📖 第 1 页 / 共 2 页
字号:
        }
    }

    // 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 + -