亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? nftllite.c

?? Tornado 2.2沒有nand flash翻譯層源代碼,希望此文件對需要的朋友有幫助.
?? C
?? 第 1 頁 / 共 5 頁
字號:
    unsigned char sectorFlags = getSectorFlags(&vol,sectorAddress);

    if (sectorFlags == SECTOR_FREE)
      break;

    if (sectorFlags != SECTOR_IGNORE)
      prevSectorAddress = sectorFlags != SECTOR_DELETED ? sectorAddress :
						    UNASSIGNED_ADDRESS;
  }

  return prevSectorAddress;
}


/*----------------------------------------------------------------------*/
/*		         g e t F o l d M a r k				*/
/*									*/
/* Get the fold mark a unit.						*/
/*                                                                      */
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*	unitNo		: Physical unit number				*/
/*                                                                      */
/* Returns:                                                             */
/*	Return the OR of the two words in the fold mark area (the words	*/
/*	should be identical)						*/
/*----------------------------------------------------------------------*/

static unsigned short getFoldMark(Anand vol, UnitNo unitNo)
{
  unsigned short foldMark[2];

  vol.flash.read(&vol.flash,
		  unitBaseAddress(&vol,unitNo) + FOLD_MARK_OFFSET,
		  &foldMark, sizeof foldMark,
		  EXTRA);

  return foldMark[0] | foldMark[1];
}


/*----------------------------------------------------------------------*/
/*		         g e t U n i t T a i l e r			*/
/*									*/
/* Get the erase record of a unit.					*/
/*                                                                      */
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*	unitNo		: Physical unit number				*/
/*	eraseMark	: Receives the erase mark of the unit		*/
/*	eraseCount	: Receives the erase count of the unit		*/
/*                                                                      */
/*----------------------------------------------------------------------*/

static void getUnitTailer(Anand vol,
			  UnitNo unitNo,
			  unsigned short *eraseMark,
			  unsigned long *eraseCount)
{
  UnitTailer unitTailer;

  vol.flash.read(&vol.flash,
		  unitBaseAddress(&vol,unitNo) + UNIT_TAILER_OFFSET,
		  &unitTailer,
		  sizeof(UnitTailer),
		  EXTRA);

  /* Mask out any 1 -> 0 bit faults by or'ing with spare data */
  *eraseMark = LE2(unitTailer.eraseMark) | LE2(unitTailer.eraseMark1);
  *eraseCount = LE4(unitTailer.eraseCount);
}


/*----------------------------------------------------------------------*/
/*		         s e t U n i t T a i l e r			*/
/*									*/
/* Set the erase record of a unit.					*/
/*                                                                      */
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*	unitNo		: Physical unit number				*/
/*	eraseMark	: Erase mark to set				*/
/*	eraseCount	: Erase count to set				*/
/*                                                                      */
/*----------------------------------------------------------------------*/

static FLStatus setUnitTailer(Anand vol,
			    UnitNo unitNo,
			    unsigned short eraseMark,
			    unsigned long eraseCount)
{
  UnitTailer unitTailer;

  toLE2(unitTailer.eraseMark,eraseMark);
  toLE2(unitTailer.eraseMark1,eraseMark);
  toLE4(unitTailer.eraseCount,eraseCount);

  return vol.flash.write(&vol.flash,
			  unitBaseAddress(&vol,unitNo) + UNIT_TAILER_OFFSET,
			  &unitTailer,
			  sizeof(UnitTailer),
			  EXTRA);
}


/*----------------------------------------------------------------------*/
/*      	             i n i t N F T L				*/
/*									*/
/* Initializes essential volume data as a preparation for mount or	*/
/* format.								*/
/*									*/
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*                                                                      */
/* Returns:                                                             */
/*	FLStatus	: 0 on success, failed otherwise		*/
/*----------------------------------------------------------------------*/

static FLStatus initNFTL(Anand vol)
{
  long int size = 1;

  if (!(vol.flash.flags & NFTL_ENABLED)) {
  #ifdef DEBUG_PRINT
    DEBUG_PRINT("Debug: media is not fit for NFTL format.\n");
  #endif
    return flUnknownMedia;
  }

  vol.physicalUnits = NULL;
  vol.virtualUnits = NULL;

  for (vol.erasableBlockSizeBits = 0; size < vol.flash.erasableBlockSize;
       vol.erasableBlockSizeBits++, size <<= 1);
  vol.unitSizeBits = vol.erasableBlockSizeBits;

  vol.noOfUnits = (unsigned short)((vol.flash.noOfChips * vol.flash.chipSize) >> vol.unitSizeBits);

  /* Adjust unit size so header unit fits in one unit */
  while (vol.noOfUnits * sizeof(PhysUnit) + SECTOR_SIZE > (1UL << vol.unitSizeBits)) {
    vol.unitSizeBits++;
    vol.noOfUnits >>= 1;
  }

  vol.badFormat = TRUE;	/* until mount completes*/
  vol.mappedSectorNo = UNASSIGNED_SECTOR;
  /*get pointer to buffer (we assume SINGLE_BUFFER is not defined) */
  vol.buffer = flBufferOf(flSocketNoOf(vol.flash.socket));
  vol.countsValid = 0;		/* No units have a valid count yet */

  return flOK;
}


/*----------------------------------------------------------------------*/
/*      	            i n i t T a b l e s				*/
/*									*/
/* Allocates and initializes the dynamic volume table, including the	*/
/* unit tables and secondary virtual map.				*/
/*									*/
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*                                                                      */
/* Returns:                                                             */
/*	FLStatus	: 0 on success, failed otherwise		*/
/*----------------------------------------------------------------------*/

static FLStatus initTables(Anand vol)
{
  /* Allocate the conversion tables */
#ifdef MALLOC_TFFS
  vol.physicalUnits = (PhysUnit *) MALLOC_TFFS(vol.noOfUnits * sizeof(PhysUnit));
  vol.virtualUnits = (UnitNo *) MALLOC_TFFS(vol.noOfVirtualUnits * sizeof(UnitNo));
  if (vol.physicalUnits == NULL ||
      vol.virtualUnits == NULL) {
  #ifdef DEBUG_PRINT
    DEBUG_PRINT("Debug: failed allocating conversion tables for NFTL.\n");
  #endif
    return flNotEnoughMemory;
  }
#else
  char *heapPtr;

  heapPtr = vol.heap;
  vol.physicalUnits = (PhysUnit *) heapPtr;
  heapPtr += vol.noOfUnits * sizeof(PhysUnit);
  vol.virtualUnits = (UnitNo *) heapPtr;
  heapPtr += vol.noOfVirtualUnits * sizeof(UnitNo);
  if (heapPtr > vol.heap + sizeof vol.heap) {
  #ifdef DEBUG_PRINT
    DEBUG_PRINT("Debug: not enough memory for NFTL conversion tables.\n");
  #endif
    return flNotEnoughMemory;
  }
#endif

  return flOK;
}

/*----------------------------------------------------------------------*/
/*      	            m a r k U n i t B a d			*/
/*									*/
/* Mark a unit as bad in the conversion table and the bad units table.	*/
/*									*/
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*	unitNo		: Physical number of bad unit			*/
/*                                                                      */
/* Returns:                                                             */
/*	FLStatus	: 0 on success, failed otherwise		*/
/*----------------------------------------------------------------------*/

static FLStatus markUnitBad(Anand vol, UnitNo unitNo)
{
  unsigned short eraseMark;
  unsigned long eraseCount;

  vol.physicalUnits[unitNo] = UNIT_BAD_MARKED;

  getUnitTailer(&vol,unitNo,&eraseMark,&eraseCount);

  return setUnitTailer(&vol,unitNo,0,eraseCount);
}


/*----------------------------------------------------------------------*/
/*		          f o r m a t U n i t				*/
/*									*/
/* Format one unit. Erase the unit, and mark the physical units table.  */
/*                                                                      */
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*	unitNo		: Unit to format				*/
/*                                                                      */
/* Returns:                                                             */
/*	FLStatus	: 0 on success, failed otherwise		*/
/*----------------------------------------------------------------------*/

static FLStatus formatUnit(Anand vol, UnitNo unitNo)
{
  unsigned short eraseMark;
  unsigned long eraseCount;
  FLStatus status;

  if (!(vol.physicalUnits[unitNo] & UNIT_AVAILABLE))
    return flWriteFault;

  if (vol.physicalUnits[unitNo] == UNIT_FREE)
    vol.freeUnits--;
  vol.physicalUnits[unitNo] &= ~UNIT_AVAILABLE;

  getUnitTailer(&vol,unitNo,&eraseMark,&eraseCount);

  status = vol.flash.erase(&vol.flash,
			    unitNo << (vol.unitSizeBits - vol.erasableBlockSizeBits),
			    1 << (vol.unitSizeBits - vol.erasableBlockSizeBits));
  if (status != flOK) {
    markUnitBad(&vol,unitNo);	/* make sure unit format is not valid */
    return status;
  }

  eraseCount++;
  if (eraseCount == 0)		/* was hex FF's */
    eraseCount++;

  checkStatus(setUnitTailer(&vol,unitNo,ERASE_MARK,eraseCount));

  vol.physicalUnits[unitNo] = UNIT_FREE;
  vol.freeUnits++;

  return flOK;
}


/*----------------------------------------------------------------------*/
/*      	        w r i t e A n d C h e c k 			*/
/*									*/
/* Write one sector. 							*/
/*									*/
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*	address		: Physical address of the sector to write to	*/
/*	fromAddress	: Buffer of data to write			*/
/*	flags		: Write flags (ECC, overwrite etc.)		*/
/*									*/
/* Returns:                                                             */
/* 	Status 		: 0 on success, failed otherwise.		*/
/*----------------------------------------------------------------------*/

static FLStatus writeAndCheck(Anand vol,
			    CardAddress address,
			    void FAR1 *fromAddress,
			    unsigned flags)
{
  FLStatus status = vol.flash.write(&vol.flash,address,fromAddress,SECTOR_SIZE,flags);
  if (status == flWriteFault) {  /* write failed, ignore this sector */
    unsigned char sectorFlags[2];

    sectorFlags[0] = sectorFlags[1] = SECTOR_IGNORE;
    vol.flash.write(&vol.flash,address + SECTOR_DATA_OFFSET,sectorFlags,sizeof sectorFlags,EXTRA);
  }

  return status;
}


/*----------------------------------------------------------------------*/
/*      	        c o p y S e c t o r	 			*/
/*									*/
/* Copy one sector to another.						*/
/*									*/
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*	sourceSectorAddress	: Physical address of Sector to copy 	*/
/*				  from.					*/
/*	targetSectorAddress	: Physical address of sector to copy	*/
/*				  to.					*/
/*                                                                      */
/* Returns:                                                             */
/* 	FLStatus       		: 0 on success, failed otherwise.	*/
/*----------------------------------------------------------------------*/

static FLStatus copySector(Anand vol,
			 CardAddress sourceSectorAddress,
			 CardAddress targetSectorAddress)
{
  unsigned flags = EDC;

  vol.flash.socket->remapped = TRUE;
  if (vol.flash.read(&vol.flash,
		     sourceSectorAddress,
		     nftlBuffer,
		     SECTOR_SIZE,
		     EDC) == flDataError) {
    /* If there is an uncorrectable ECC error, copy the data as is */
    unsigned short sectorDataInfo[4];

    vol.flash.read(&vol.flash,
		    sourceSectorAddress,
		    sectorDataInfo,
		    sizeof sectorDataInfo,
		    EXTRA);
    checkStatus(vol.flash.write(&vol.flash,
				 sourceSectorAddress,
				 sectorDataInfo,
				 sizeof sectorDataInfo,
				 EXTRA));
    flags &= ~EDC;
  }

  return writeAndCheck(&vol,targetSectorAddress,nftlBuffer,flags);
}


/*----------------------------------------------------------------------*/
/*      	        l a s t I n C h a i n	 			*/
/*									*/
/* Find last unit in chain.						*/
/*									*/
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/* 	unitNo		: Start the search from this unit		*/
/*                                                                      */
/* Returns:                                                             */
/* 	Physical unit number of the last unit in chain.			*/
/*----------------------------------------------------------------------*/

static UnitNo lastInChain(Anand vol, UnitNo unitNo)
{
  UnitNo firstVirtualUnitNo, firstReplacementUnitNo;
  UnitNo lastUnit = unitNo, nextUnitNo;;

  getUnitData(&vol,unitNo,&firstVirtualUnitNo,&firstReplacementUnitNo);
  nextUnitNo = firstReplacementUnitNo;

  while (nextUnitNo < vol.noOfUnits) {  /* Validate replacement unit no. */
    UnitNo nextVirtualUnitNo, nextReplacementUnitNo;

    getUnitData(&vol,nextUnitNo,&nextVirtualUnitNo,&nextReplacementUnitNo);
    if (nextVirtualUnitNo !=
	(firstVirtualUnitNo | REPLACING_UNIT))
      break;        /* Virtual unit no. not validated */
    lastUnit = nextUnitNo;
    nextUnitNo = nextReplacementUnitNo;
  }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区在线免费| 椎名由奈av一区二区三区| 日韩精品一区国产麻豆| 日韩片之四级片| 久久久精品2019中文字幕之3| 精品久久国产字幕高潮| 久久久久久久久97黄色工厂| 精品久久久久久久久久久久久久久 | 精品国产第一区二区三区观看体验| 亚洲电影第三页| 日韩久久免费av| 国内精品国产成人国产三级粉色 | 欧美三片在线视频观看 | 椎名由奈av一区二区三区| 色综合久久久久久久久| 日本强好片久久久久久aaa| 日韩欧美一二三四区| 成人免费的视频| 亚洲第一福利一区| 久久久久久久av麻豆果冻| 91美女蜜桃在线| 国产原创一区二区三区| 亚洲欧美日韩一区| 久久夜色精品一区| 色偷偷久久一区二区三区| 国产一区二区h| 午夜影视日本亚洲欧洲精品| 久久众筹精品私拍模特| 欧洲一区在线观看| 不卡在线观看av| 精品在线一区二区三区| 一区二区三区丝袜| 国产日韩欧美麻豆| 精品国产免费一区二区三区香蕉| 91丨国产丨九色丨pron| 粉嫩av一区二区三区在线播放 | 日本va欧美va欧美va精品| 久久久久九九视频| 欧美mv和日韩mv国产网站| 欧亚洲嫩模精品一区三区| 欧美一区二区性放荡片| 99精品国产一区二区三区不卡| 综合久久国产九一剧情麻豆| 国产欧美日韩三级| 欧美国产精品专区| 国产午夜精品一区二区三区嫩草 | 国产一区二区免费视频| 精品在线免费视频| 激情六月婷婷综合| 国产福利一区在线观看| 成人性视频免费网站| 懂色av中文一区二区三区| 成人做爰69片免费看网站| 99久久99久久精品国产片果冻 | 国产激情一区二区三区四区| 国产一区二区主播在线| 成人国产精品免费观看动漫| 91影院在线观看| 欧美日韩国产一区| 日韩欧美一级特黄在线播放| 久久久久久夜精品精品免费| 中文字幕第一区第二区| 亚洲日本在线a| 日本网站在线观看一区二区三区 | 亚洲欧美偷拍三级| 国产精品久久网站| 视频一区二区欧美| 欧美日韩视频一区二区| 日韩亚洲欧美在线| 亚洲天堂精品视频| 日韩av成人高清| 成人免费黄色大片| 欧美大片在线观看| 欧美国产精品一区| 天天av天天翘天天综合网色鬼国产 | 精品国产青草久久久久福利| 亚洲色图视频网| 国产成人aaa| 日韩一本二本av| ...xxx性欧美| 麻豆中文一区二区| 欧美三级在线看| 中文字幕一区二区日韩精品绯色| 免费欧美日韩国产三级电影| 91片在线免费观看| 国产精品久线在线观看| 国产经典欧美精品| 精品国产青草久久久久福利| 奇米精品一区二区三区四区| 欧美日韩免费视频| 亚洲精品成人精品456| 91丨九色丨尤物| 亚洲另类在线一区| 91亚洲永久精品| 亚洲视频免费观看| 一本色道久久综合亚洲精品按摩| 国产精品国产三级国产普通话99 | 美洲天堂一区二卡三卡四卡视频| 欧美日韩精品欧美日韩精品| 午夜激情综合网| 在线不卡中文字幕播放| 视频一区二区三区中文字幕| 欧美剧在线免费观看网站| 免费黄网站欧美| 久久综合色鬼综合色| 韩国中文字幕2020精品| 日本一区二区三区高清不卡| 99久久er热在这里只有精品66| 一区二区三区四区av| 欧美色涩在线第一页| 国产在线看一区| 中文字幕中文字幕一区二区| 欧洲一区二区三区在线| 国产一区福利在线| 亚洲精品你懂的| 精品美女一区二区| 91同城在线观看| 久久国产欧美日韩精品| 中文字幕一区二区三区色视频| 欧美日韩国产片| 不卡电影一区二区三区| 日韩高清在线电影| 亚洲视频在线观看三级| 精品国产区一区| 欧美日韩成人综合天天影院| 风间由美中文字幕在线看视频国产欧美| 亚洲一区二区精品视频| 久久久久高清精品| 日韩一区二区免费高清| 99国产精品99久久久久久| 久久99精品久久只有精品| 亚洲最大的成人av| 午夜精品久久久久久久久久 | 欧美一区二区人人喊爽| 91丨porny丨最新| 97se亚洲国产综合在线| 国产成人综合亚洲91猫咪| 美女视频第一区二区三区免费观看网站| 日韩毛片高清在线播放| 中文字幕乱码久久午夜不卡| 久久久综合视频| 精品乱码亚洲一区二区不卡| 日韩久久久精品| 日韩女优av电影| 欧美大片一区二区三区| 日韩欧美一级精品久久| 日韩精品专区在线影院观看| 精品卡一卡二卡三卡四在线| 欧美成人艳星乳罩| 久久久久国产成人精品亚洲午夜| 337p日本欧洲亚洲大胆色噜噜| 日韩精品综合一本久道在线视频| 欧美电视剧免费全集观看| 欧美精品一区二区三区久久久| 日韩精品一区二| 国产精品九色蝌蚪自拍| 一区二区三区中文在线| 日本免费新一区视频| 国产一区二区三区四区五区美女| 亚洲视频一区在线观看| 九九**精品视频免费播放| 亚洲男人电影天堂| 亚洲一区二区三区视频在线 | 国产精品久线在线观看| 中文字幕一区二区在线观看| 亚洲欧洲日韩av| 日日摸夜夜添夜夜添精品视频| 久久国产精品免费| 高清不卡在线观看av| 色一情一乱一乱一91av| 日韩午夜电影在线观看| 中文一区二区完整视频在线观看| 国产精品日产欧美久久久久| 亚洲乱码国产乱码精品精的特点| 午夜精品久久久久久久蜜桃app| 国产在线精品免费av| 不卡高清视频专区| 久久精品一区四区| 午夜精品成人在线视频| 色激情天天射综合网| 欧美日韩一级二级| 中文字幕第一区二区| 日本视频中文字幕一区二区三区| 国产在线视频一区二区| 欧美日韩国产在线播放网站| 自拍av一区二区三区| 国内精品伊人久久久久av一坑 | 中文字幕久久午夜不卡| 日韩福利视频导航| 欧美在线短视频| 国产精品福利av| 久久精品国内一区二区三区| 欧美日韩免费一区二区三区| 亚洲一区二区五区| 精品黑人一区二区三区久久| 亚洲一卡二卡三卡四卡| 在线观看免费成人| 亚洲免费观看高清完整版在线观看 | 3d动漫精品啪啪1区2区免费| 午夜在线成人av|