📄 oren_lgc.c
字号:
{
DBG_PRINT_ERR(FLZONE_MTD,"ERROR - ACCESS outside the media space - logicalRead entered.\r\n");
return flGeneralFailure;
}
#endif /* FL_SKIP_ARGS_CHECK */
DBG_PRINT_FLOW(FLZONE_MTD,"Flow: logicalRead entered.\r\n");
checkStatus (OREN_asicSetInNormalMode (flashPtr)) ;
argsPackPtr->maxBitError = 0 ;
argsPackPtr->noOfSectorsPassed = 0 ;
argsPackPtr->freeSectorFound = 0 ;
bMainBufferPtr = (FLByte FAR1 *)argsPackPtr->readMainBuf ;
bExtraBufferPtr = (FLByte FAR1 *)argsPackPtr->extraBuf ;
dwNoOfSectorsLeft = argsPackPtr->noOfSectors ;
dwLogicalSector = argsPackPtr->startSector ;
while (dwNoOfSectorsLeft)
{
dwLogicalSectorOffset = dwLogicalSector ;
/*** Step 1: Find the floor that this sector belongs to,And set the floor ***/
readArgs.floor = (FLByte)(dwLogicalSectorOffset/MTD_VARS->dwSectorsInFloor) ;
/*** Step 2: Mask the LogicalSectorOffset to be the logical sector offset ***/
/*** from the currect floor ***/
dwLogicalSectorOffset = dwLogicalSectorOffset % MTD_VARS->dwSectorsInFloor ;
/*** Step 3: Find the bank that this sector belongs to,And set the floor ***/
readArgs.bank = (FLByte)(dwLogicalSectorOffset/MTD_VARS->dwSectorsInBank) ;
/*** Step 4: Mask the LogicalSectorOffset to be the logical sector offset ***/
/*** from the currect bank ***/
dwLogicalSectorOffset = dwLogicalSectorOffset % MTD_VARS->dwSectorsInBank ;
/*** Step 5: Find the Logical unit that this Logical sector belongs to ***/
wLogicalUnit = (LogicUnitType)(dwLogicalSector / MTD_VARS->dwSectorsInLogicalUnit) ;
/*** Step 6: Mask the LogicalSectorOffset to be the logical sector offset ***/
/*** from the currect LogicalUnit ***/
dwLogicalSectorOffset = dwLogicalSectorOffset % MTD_VARS->dwSectorsInLogicalUnit ;
/*** Step 7: Find the page & plane that matched to the LogicalSectorNo ***/
if ((argsPackPtr->opFlags & MTD_NO_MATCHING)==0)
{
readArgs.phyPage = (FLByte)(dwLogicalSectorOffset >> MTD_VARS->bNoOfPlanesBits)/MTD_VARS->bSectorsInPage ;
bPlane = (FLByte)(dwLogicalSectorOffset % flashPtr->noOfPlanes) ;
}
else
{ /* We work with the MTD_NO_MATCHING flag */
readArgs.phyPage = (FLByte)(dwLogicalSectorOffset % MTD_VARS->dwSectorsInUnit)/MTD_VARS->bSectorsInPage ;
bPlane = (FLByte)(dwLogicalSectorOffset / MTD_VARS->dwSectorsInUnit) ;
}
readArgs.sectorOffset = (FLByte)dwLogicalSectorOffset % MTD_VARS->bSectorsInPage ;
/*** Step 8 : Find the Physiacl units that matched to this logical unit ***/
checkStatus ((MTD_VARS->MATCH_unitLogicalToPhysical (flashPtr,wLogicalUnit,wPhysicalUnitArray))) ;
/*** Step 9 : Read the page to the buffer ***/
readArgs.phyUnits = &(wPhysicalUnitArray[bPlane]) ;
if (argsPackPtr->opFlags & MTD_DATA)
readArgs.noOfPhySectors = (FLWord) TFFSMIN (MTD_VARS->bSectorsInPage - readArgs.sectorOffset,
(FLWord)dwNoOfSectorsLeft) ;
else
readArgs.noOfPhySectors = 1 ;
readArgs.mainBuffer = bMainBufferPtr ;
readArgs.extraBuffer = bExtraBufferPtr ;
readArgs.opFlags = argsPackPtr->opFlags ;
readArgs.offset = argsPackPtr->offset ;
readArgs.length = argsPackPtr->length ;
status = OREN_read_Seq (flashPtr,&readArgs);
/*** If we Fail Try "second chance" to read ***/
/*** and if it doesnt succeed return the status error ***/
if ((status==flSequenceError) || (status==flDataError))
status = OREN_read_Seq (flashPtr,&readArgs); /* If the error is Data/Sequence erro => Try to read again */
/*** Calculate the output parameters of the routine ***/
/*** 1.freeSectorFound field ***/
/*** 2.noOfSectorsPassed field ***/
/*** 3.maxBitError field ***/
if ( ((argsPackPtr->opFlags&MTD_DATA)==0) && ((argsPackPtr->opFlags & MTD_RAW_MODE)==0) )
argsPackPtr->freeSectorFound += readArgs.freeSectorsFound ;
argsPackPtr->noOfSectorsPassed += readArgs.noOfSectorsPassed ;
if (readArgs.maxBitErrors>argsPackPtr->maxBitError)
argsPackPtr->maxBitError = readArgs.maxBitErrors ;
if (status)
{
DBG_PRINT_FLOW(FLZONE_MTD,"Flow: logicalRead exited.\r\n");
return status ;
}
#ifdef QA_ACCESORIES
QA_CountBitFlips (flashPtr,readArgs.maxBitErrors) ;
#endif
/*** Advance the logical Sector ***/
dwLogicalSector += readArgs.noOfPhySectors ;
dwNoOfSectorsLeft -= readArgs.noOfPhySectors ;
/*** Advance the MainBuffer & ExtraBuffer pointers ***/
if (bMainBufferPtr)
bMainBufferPtr = BYTE_ADD_FAR (bMainBufferPtr,FLASH_SECTOR_DATA_SIZE * readArgs.noOfPhySectors) ;
#ifndef NO_PHYSICAL_IO
if (readArgs.opFlags & MTD_SW_EDC)
bExtraBufferPtr = BYTE_ADD_FAR (bExtraBufferPtr,FLASH_EXTRA_AREA_SIZE * readArgs.noOfPhySectors) ;
else
#endif /* NO_PHYSICAL_IO */
if ((readArgs.extraBuffer) && (readArgs.opFlags & MTD_EXTRA))
bExtraBufferPtr = BYTE_ADD_FAR (bExtraBufferPtr,FLASH_EXTRA_BUFFER_SIZE*readArgs.noOfPhySectors) ;
}
DBG_PRINT_FLOW(FLZONE_MTD,"Flow: logicalRead exited.\r\n");
return flOK ;
}
#ifndef FL_READ_ONLY
/************************************************************************
* OREN_logicalWrite *
* *
* MTD specific Flash write routine *
* *
* Parameters: *
* flash : Pointer identifying drive *
* *
* The routine uses the following inputs: *
* flash.arguments.noOfSectors : The number of sectors to read. *
* flash.arguments.startSector : First sector to start reading from *
* flash.arguments.writeMainBuf: Pointer to user buffer *
* flash.arguments.extraBuf : Pointer to user buffer *
* flash.arguments.verifyWriteMode: An indicator of the read after *
* write mode. FL_ON will force a *
* read after write operation while *
* FL_OFF will disable it. *
* flash.arguments.delayedStatus : A pointer to where the output of *
* the operation will be returned, *
* when adding the MTD_DO_NOT_WAIT *
* flag. *
* flash.arguments.opFlags : Available flags are: *
* MTD_DATA : Write to sector info area to mainBuf. *
* MTD_EXTRA : Write to sector extra area to extraBuf. *
* MTD_DO_NOT_WAIT : Forces the MTD to return without polling *
* the last sector write operation. *
* *
* The routine sets the following outputs: *
* flash.arguments.maxBitsError : Returns maximum bit error found*
* in read after write operation *
* flash.arguments.noOfSectorsPassed: The number of sectors that were*
* successfully written. *
* *
* The routine return the following error codes: *
* Returns: *
* flOK : Success *
* flWriteFault : The write operation failed to one of the *
* required sectors. *
* flHWProtection : A protection violation has occurred while *
* attempting to write to one of the sectors.. *
* flTimedOut : The maximum delay time has expired, but the *
* device is not ready yet. *
* *
************************************************************************/
FLStatus OREN_logicalWrite (FLFlash *flashPtr)
{
MTDArgumentPacket *argsPackPtr ;
LogicUnitType wLogicalUnit ;
FLByte bFloor,bBank ;
PhyUnitType wPhysicalUnitArray[OREN_MAX_NUMBER_OF_PLANES] ;
const FLByte FAR1 *bMainBufferPtr ;
FLByte FAR1 *bExtraBufferPtr ;
FLDword dwDoNotPollFlag ;
FLDword dwOpFlags ;
OREN_OperationArgsStruct writeArgs ;
FLDword dwLogicalSectorOffset,dwNoOfSectors,dwLogicalSectorNo ;
FLByte bPlane ;
FLWord wNoOfWrittenSectors ;
argsPackPtr = &flashPtr->args ;
#ifndef FL_SKIP_ARGS_CHECK
if(argsPackPtr->startSector >= (flashPtr->mediaSize >> FL_SECTOR_SIZE_BITS))
{
DBG_PRINT_ERR(FLZONE_MTD,"ERROR - ACCESS outside the media space - logicalWrite entered.\r\n");
return flGeneralFailure;
}
#endif /* FL_SKIP_ARGS_CHECK */
DBG_PRINT_FLOW(FLZONE_MTD,"Flow: logicalWrite entered.\r\n");
checkStatus (OREN_asicSetInNormalMode (flashPtr)) ;
argsPackPtr->maxBitError = 0 ;
argsPackPtr->noOfSectorsPassed = 0 ;
bMainBufferPtr = (FLByte FAR1 *)argsPackPtr->writeMainBuf ;
bExtraBufferPtr = (FLByte FAR1 *)argsPackPtr->extraBuf ;
dwLogicalSectorNo = argsPackPtr->startSector ;
dwNoOfSectors = argsPackPtr->noOfSectors ;
dwOpFlags = argsPackPtr->opFlags ;
dwDoNotPollFlag = argsPackPtr->opFlags & MTD_DO_NOT_WAIT ;
dwOpFlags = argsPackPtr->opFlags & ~dwDoNotPollFlag ;
while (dwNoOfSectors)
{
dwLogicalSectorOffset = dwLogicalSectorNo ;
/*** Step 1: Find the floor that this sector belongs to,And set the floor ***/
bFloor = (FLByte)(dwLogicalSectorOffset/MTD_VARS->dwSectorsInFloor) ;
/*** Step 2: Mask the LogicalSectorOffset to be the logical sector offset ***/
/*** from the currect floor ***/
dwLogicalSectorOffset = dwLogicalSectorOffset%MTD_VARS->dwSectorsInFloor ;
/*** Step 3: Find the bank that this sector belongs to,And set the floor ***/
bBank = (FLByte)(dwLogicalSectorOffset/MTD_VARS->dwSectorsInBank) ;
/*** Step 4: Mask the LogicalSectorOffset to be the logical sector offset ***/
/*** from the currect bank ***/
dwLogicalSectorOffset = dwLogicalSectorOffset % MTD_VARS->dwSectorsInBank ;
/*** Step 5: Find the Logical unit that this Logical sector belongs to ***/
wLogicalUnit = (LogicUnitType)(dwLogicalSectorNo / MTD_VARS->dwSectorsInLogicalUnit) ;
/*** Step 6: Mask the LogicalSectorOffset to be the logical sector offset ***/
/*** from the currect LogicalUnit ***/
dwLogicalSectorOffset = dwLogicalSectorOffset % MTD_VARS->dwSectorsInLogicalUnit ;
/*** Step 7: Find the page & plane that matched to the LogicalSectorNo ***/
if ((dwOpFlags & MTD_NO_MATCHING)==0)
{
writeArgs.phyPage = (FLByte)(dwLogicalSectorOffset >> MTD_VARS->bNoOfPlanesBits)/MTD_VARS->bSectorsInPage ;
bPlane = (FLByte)(dwLogicalSectorOffset % flashPtr->noOfPlanes) ;
}
else
{ /* We work with the MTD_NO_MATCHING flag */
writeArgs.phyPage = (FLByte)(dwLogicalSectorOffset % MTD_VARS->dwSectorsInUnit)/MTD_VARS->bSectorsInPage ;
bPlane = (FLByte)(dwLogicalSectorOffset / MTD_VARS->dwSectorsInUnit) ;
}
writeArgs.sectorOffset = (FLByte)dwLogicalSectorOffset % MTD_VARS->bSectorsInPage ;
/*** Step 8 : Find the Physiacl units that matched to this logical unit ***/
checkStatus ((MTD_VARS->MATCH_unitLogicalToPhysical (flashPtr,wLogicalUnit,wPhysicalUnitArray))) ;
/*** Step 9 : Write a sequence that writes to NoOfPlanes-Plane pages ***/
writeArgs.floor = bFloor ;
writeArgs.bank = bBank ;
writeArgs.phyUnits = &(wPhysicalUnitArray[bPlane]) ;
/*** Determine how many sectors to write ***/
/*** If we work with NO_MATCHING write only one sector ***/
if (flashPtr->flashTechnology & FL_2K_ADDRESS_SPACE)
{
wNoOfWrittenSectors = (FLWord) TFFSMIN ((FLWord)dwNoOfSectors,
MTD_VARS->dwSectorsInLogicalUnit - (writeArgs.phyPage*MTD_VARS->bSectorsInPage + writeArgs.sectorOffset)) ;
}
else
{
if (dwOpFlags & MTD_NO_MATCHING)
wNoOfWrittenSectors = 1 ;
else
wNoOfWrittenSectors = (FLWord)(TFFSMIN (dwNoOfSectors,(FLDword)(flashPtr->noOfPlanes-bPlane))) ;
}
if (dwNoOfSectors<=flashPtr->noOfPlanes)
writeArgs.opFlags = argsPackPtr->opFlags | dwDoNotPollFlag ;
else
writeArgs.opFlags = argsPackPtr->opFlags ;
writeArgs.noOfPhySectors = wNoOfWrittenSectors ;
writeArgs.mainBuffer = (FLByte FAR1 *)(bMainBufferPtr) ;
writeArgs.extraBuffer = (FLByte FAR1 *)(bExtraBufferPtr) ;
writeArgs.verifyWrite = argsPackPtr->verifyWriteMode ;
writeArgs.offset = argsPackPtr->offset ;
writeArgs.length = argsPackPtr->length ;
checkStatus (OREN_pageProgram_Seq (flashPtr,&writeArgs));
argsPackPtr->noOfSectorsPassed += writeArgs.noOfSectorsPassed ;
if (writeArgs.maxBitErrors>argsPackPtr->maxBitError)
argsPackPtr->maxBitError = writeArgs.maxBitErrors ;
/*** Advance the MainBuffer ***/
bMainBufferPtr = BYTE_ADD_FAR (bMainBufferPtr,wNoOfWrittenSectors*FLASH_SECTOR_DATA_SIZE) ; /* Advance pointer by 512 * NoOfWrittenSectors */
/*** Advance the ExtraBuffer ***/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -