/** * \brief Writes the data and/or spare area of a page on a SkipBlock NandFlash. * * \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. * \return NandCommon_ERROR_BADBLOCK if the block is BAD; Otherwise, returns EccNandFlash_WritePage(). */ uint8_t SkipBlockNandFlash_WritePage( const struct SkipBlockNandFlash *skipBlock, uint16_t block, uint16_t page, void *data, void *spare) { /* Check that the block is LIVE */ if (SkipBlockNandFlash_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 and/or spare area of a LIVE page on a managed NandFlash. /// Returns NandCommon_ERROR_WRONGSTATUS if the page is not LIVE; otherwise, /// returns EccNandFlash_WritePage(). /// \param managed Pointer to a ManagedNandFlash instance. /// \param block The block to write, in managed area. /// \param page Number of the page to write inside the given block. /// \param data Data area buffer. /// \param spare Spare area buffer. //------------------------------------------------------------------------------ unsigned char ManagedNandFlash_WritePage( const struct ManagedNandFlash *managed, unsigned short block, unsigned short page, void *data, void *spare) { // Check that the block is LIVE if (managed->blockStatuses[block].status != NandBlockStatus_LIVE) { TRACE_ERROR("ManagedNandFlash_WritePage: Block must be LIVE.\n\r"); return NandCommon_ERROR_WRONGSTATUS; } // Write data with ECC calculation return EccNandFlash_WritePage(ECC(managed), managed->baseBlock + block, page, data, spare); }
/** * \brief Writes the data of a whole block on a SkipBlock nandflash. * * \param skipBlock Pointer to a SkipBlockNandFlash instance. * \param block Number of the block to write. * \param data Data area buffer. * \return NandCommon_ERROR_BADBLOCK if the block is BAD; Otherwise, returns EccNandFlash_WritePage(). */ uint8_t SkipBlockNandFlash_WriteBlock( const struct SkipBlockNandFlash *skipBlock, uint16_t block, void *data) { /* Number of pages per block */ uint32_t numPagesPerBlock; /* Page size */ uint32_t pageSize; /* Page index*/ uint16_t i; /* Error returned by SkipBlockNandFlash_WritePage*/ uint8_t error = 0; /* Retrieve model information*/ pageSize = NandFlashModel_GetPageDataSize(MODEL(skipBlock)); numPagesPerBlock = NandFlashModel_GetBlockSizeInPages(MODEL(skipBlock)); /* Check that the block is LIVE*/ if (SkipBlockNandFlash_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 *) ((uint8_t *) data + pageSize); } return 0; }