//------------------------------------------------------------------------------ /// Initializes an EccNandFlash instance. /// \param ecc Pointer to an EccNandFlash instance. /// \param model Pointer to the underlying nand chip model. Can be 0. /// \param commandAddress Address at which commands are sent. /// \param addressAddress Address at which addresses are sent. /// \param dataAddress Address at which data is sent. /// \param pinChipEnable Pin controlling the CE signal of the NandFlash. /// \param pinReadyBusy Pin used to monitor the ready/busy signal of the Nand. //------------------------------------------------------------------------------ unsigned char EccNandFlash_Initialize( struct EccNandFlash *ecc, const struct NandFlashModel *model, unsigned int commandAddress, unsigned int addressAddress, unsigned int dataAddress, const Pin pinChipEnable, const Pin pinReadyBusy) { unsigned char rc; rc = RawNandFlash_Initialize(RAW(ecc), model, commandAddress, addressAddress, dataAddress, pinChipEnable, pinReadyBusy); #if defined(HARDWARE_ECC) { unsigned int ecc_page; switch(NandFlashModel_GetPageDataSize(MODEL(ecc))) { case 512: ecc_page = AT91C_HSMC4_PAGESIZE_528_Bytes; break; case 1024: ecc_page = AT91C_HSMC4_PAGESIZE_1056_Bytes; break; case 2048: ecc_page = AT91C_HSMC4_PAGESIZE_2112_Bytes; break; case 4096: ecc_page = AT91C_HSMC4_PAGESIZE_4224_Bytes; break; default: TRACE_ERROR("PageSize %d not compatible with ECC\n\r", NandFlashModel_GetPageDataSize(MODEL(ecc))); return NandCommon_ERROR_ECC_NOT_COMPATIBLE; } HSMC4_EccConfigure(AT91C_ECC_TYPCORRECT_ONE_EVERY_256_BYTES, ecc_page); } #endif return rc; }
//------------------------------------------------------------------------------ /// Initializes an EccNandFlash instance. /// \param ecc Pointer to an EccNandFlash instance. /// \param model Pointer to the underlying nand chip model. Can be 0. /// \param commandAddress Address at which commands are sent. /// \param addressAddress Address at which addresses are sent. /// \param dataAddress Address at which data is sent. /// \param pinChipEnable Pin controlling the CE signal of the NandFlash. /// \param pinReadyBusy Pin used to monitor the ready/busy signal of the Nand. //------------------------------------------------------------------------------ unsigned char EccNandFlash_Initialize( struct EccNandFlash *ecc, const struct NandFlashModel *model, unsigned int commandAddress, unsigned int addressAddress, unsigned int dataAddress, const Pin pinChipEnable, const Pin pinReadyBusy) { return RawNandFlash_Initialize(RAW(ecc), model, commandAddress, addressAddress, dataAddress, pinChipEnable, pinReadyBusy); }
/** * \brief Initializes a SkipBlockNandFlash instance. Scans the device to retrieve or * create block status information. * * \param skipBlock Pointer to a SkipBlockNandFlash instance. * \param model Pointer to the underlying nand chip model. Can be 0. * \param commandAddress Address at which commands are sent. * \param addressAddress Address at which addresses are sent. * \param dataAddress Address at which data is sent. * \param pinChipEnable Pin controlling the CE signal of the NandFlash. * \param pinReadyBusy Pin used to monitor the ready/busy signal of the Nand. */ uint8_t SkipBlockNandFlash_Initialize( struct SkipBlockNandFlash *skipBlock, const struct NandFlashModel *model, uint32_t commandAddress, uint32_t addressAddress, uint32_t dataAddress, const Pin pinChipEnable, const Pin pinReadyBusy) { uint8_t error; #if !defined(OP_BOOTSTRAP_on) uint32_t numBlocks; uint32_t block; #endif TRACE_DEBUG("SkipBlockNandFlash_Initialize()\n\r"); /* Initialize SkipBlockNandFlash */ #if !defined(OP_BOOTSTRAP_on) error = EccNandFlash_Initialize(ECC(skipBlock), model, commandAddress, addressAddress, dataAddress, pinChipEnable, pinReadyBusy); #else error = RawNandFlash_Initialize(RAW(skipBlock), model, commandAddress, addressAddress, dataAddress, pinChipEnable, pinReadyBusy); #endif #if !defined(OP_BOOTSTRAP_on) if (error) { return error; } /* Retrieve model information */ numBlocks = NandFlashModel_GetDeviceSizeInBlocks(MODEL(skipBlock)); /* Initialize block statuses */ TRACE_DEBUG("Retrieving bad block information ...\n\r"); /* Retrieve block status from their first page spare area */ for (block = 0; block < numBlocks; block++) { /* Read spare of first page */ error = SkipBlockNandFlash_CheckBlock(skipBlock, block); if (error != GOODBLOCK) { if (error == BADBLOCK) { TRACE_DEBUG("Block #%d is bad\n\r", (unsigned int)block); } else { TRACE_ERROR( "SkipBlockNandFlash_Initialize: Cannot retrieve info from block #%u\n\r",(unsigned int) block); } } } #endif return 0; }