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

📄 oren_lgc.c

📁 M-System DOC(Disk on a Chip) Flash芯片的诊断工具, 可以从Flash芯片中获取特定的数据信息, 用于判断芯片当前的状态.
💻 C
📖 第 1 页 / 共 5 页
字号:
  {
     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 + -