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

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

?? nftllite.c

?? Tornado 2.2沒有nand flash翻譯層源代碼,希望此文件對需要的朋友有幫助.
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*
 * $Log:   V:/nftllite.c_v  $
 *
 *    Rev 1.21   01 Mar 1998 12:59:46   amirban
 * Add parameter to mapSector, and use fast-mount procedure
 *
 *    Rev 1.20   23 Feb 1998 17:08:38   Yair
 * Added casts
 *
 *    Rev 1.19   23 Nov 1997 17:20:52   Yair
 * Get rid of warnings (with Danny)
 *
 *    Rev 1.18   11 Nov 1997 15:26:22   ANDRY
 * get rid of compiler warnings
 *
 *    Rev 1.17   10 Sep 1997 16:30:10   danig
 * Got rid of generic names
 *
 *    Rev 1.16   04 Sep 1997 16:18:06   danig
 * Debug messages
 *
 *    Rev 1.15   31 Aug 1997 15:21:04   danig
 * Registration routine return status
 *
 *    Rev 1.14   28 Aug 1997 16:44:46   danig
 * Share buffer with MTD
 *
 *    Rev 1.13   21 Aug 1997 14:06:28   unknown
 * Unaligned4
 *
 *    Rev 1.12   14 Aug 1997 14:10:42   danig
 * Fixed defragment bug
 *
 *    Rev 1.11   28 Jul 1997 14:51:16   danig
 * volForCallback
 *
 *    Rev 1.10   24 Jul 1997 17:57:42   amirban
 * FAR to FAR0
 *
 *    Rev 1.9   20 Jul 1997 18:27:44   danig
 * Initialize vol.flash in formatNFTL
 *
 *    Rev 1.8   07 Jul 1997 15:22:28   amirban
 * Ver 2.0
 *
 *    Rev 1.7   29 Jun 1997 17:56:36   danig
 * Comments
 *
 *    Rev 1.6   29 Jun 1997 15:00:12   danig
 * Fixed formatted size
 *
 *    Rev 1.5   08 Jun 1997 17:02:52   amirban
 * SECTOR_USED is default
 *
 *    Rev 1.4   03 Jun 1997 17:08:16   amirban
 * setBusy change
 *
 *    Rev 1.3   01 Jun 1997 13:43:40   amirban
 * Big-endian & use sector-map caching
 *
 *    Rev 1.2   25 May 1997 17:51:10   danig
 * Adjust unitSizeBits so header unit fits in one unit
 *
 *    Rev 1.1   25 May 1997 15:20:46   danig
 * Changes to format
 *
 *    Rev 1.0   18 May 1997 17:57:56   amirban
 * Initial revision.
 */

/************************************************************************/
/*                                                                      */
/*		FAT-FTL Lite Software Development Kit			*/
/*		Copyright (C) M-Systems Ltd. 1995-1997			*/
/*									*/
/************************************************************************/


#include "tffs/fltl.h"
#include "tffs/flflash.h"
#include "tffs/flbuffer.h"

typedef long int VirtualAddress;
typedef unsigned char PhysUnit;
typedef unsigned short UnitNo;

#define UNASSIGNED_ADDRESS 0xffffffffl

#define UNIT_DATA_OFFSET 8
#define	SECTOR_ECC_OFFSET 0
#define SECTOR_DATA_OFFSET 6
#define UNIT_TAILER_OFFSET (SECTOR_SIZE + 8)
#define FOLD_MARK_OFFSET (2 * SECTOR_SIZE + 8)

#define ERASE_MARK 0x3c69

#define MAX_UNIT_CHAIN 20

#define UNIT_FREE	0xff
#define	UNIT_AVAILABLE	0x80
#define UNIT_REPLACED	0x40
#define UNIT_COUNT	0x3f

#define	UNIT_BAD_ORIGINAL 0
#define	UNIT_BAD_MARKED	7


#define	NO_UNIT		0xffff
#define REPLACING_UNIT  0x8000


/* Block flags */

#define SECTOR_FREE	0xff
#define	SECTOR_USED	0x55
#define SECTOR_IGNORE	0x11
#define	SECTOR_DELETED	0x00

#define FOLDING_IN_PROGRESS 0x5555
#define FOLDING_COMPLETE    0x1111

#define ERASE_NOT_IN_PROGRESS -1

/* unit header  */
typedef struct {
  LEushort virtualUnitNo;
  LEushort replacementUnitNo;
  LEushort spareVirtualUnitNo;
  LEushort spareReplacementUnitNo;
} UnitHeader;

/* erase record */
typedef struct {
  LEulong  eraseCount;
  LEushort eraseMark;
  LEushort eraseMark1;
} UnitTailer;


/* Medium Boot Record */

typedef struct {
  char      bootRecordId[6];          /* = "ANAND" */
  LEushort  noOfUnits;
  LEushort  bootUnits;
  Unaligned4 virtualMediumSize;
} BootRecord;


#ifndef MALLOC_TFFS

#define HEAP_SIZE	(0x100000l / ASSUMED_NFTL_UNIT_SIZE) *       \
			(sizeof(UnitNo) + sizeof(PhysUnit)) *  	\
			MAX_VOLUME_MBYTES

#endif


struct tTLrec {
  FLBoolean	    badFormat;		/* true if TFFS format is bad*/

  UnitNo	    orgUnit,           	/* Unit no. of boot record */
		    spareOrgUnit;		/* ... and spare copy of it*/
  UnitNo	    freeUnits;		/* Free units on media*/
  unsigned int	    erasableBlockSizeBits;	/* log2 of erasable block size*/
  UnitNo	    noOfVirtualUnits;
  UnitNo	    noOfTransferUnits;
  unsigned long     unitOffsetMask; 	/* = 1 << unitSizeBits - 1 */
  unsigned int	    sectorsPerUnit;

  UnitNo	    noOfUnits,
		    bootUnits;
  unsigned int	    unitSizeBits;
  SectorNo	    virtualSectors;

  UnitNo            roverUnit,          /* Starting point for allocation search */
		    countsValid;	/* Number of units for which unit
					   count was set */
  PhysUnit	    *physicalUnits; 	/* unit table by physical no. */
  UnitNo	    *virtualUnits; 	/* unit table by logical no. */

  SectorNo 	    mappedSectorNo;
  const void FAR0   *mappedSector;
  CardAddress	    mappedSectorAddress;

  /* Accumulated statistics. */
  long int	    sectorsRead,
		    sectorsWritten,
		    sectorsDeleted,
		    parasiteWrites,
		    unitsFolded;

  FLFlash	    flash;
  FLBuffer          *buffer;

#ifndef MALLOC_TFFS
  char		    heap[HEAP_SIZE];
#endif
};

#define nftlBuffer  vol.buffer->data

typedef TLrec Anand;

static Anand vols[DRIVES];



/*----------------------------------------------------------------------*/
/*		         u n i t B a s e A d d r e s s			*/
/*									*/
/* Returns the physical address of a unit.				*/
/*                                                                      */
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*	unitNo		: Physical unit number				*/
/*                                                                      */
/* Returns:                                                             */
/*	physical address of unitNo					*/
/*----------------------------------------------------------------------*/

static CardAddress unitBaseAddress(Anand vol, UnitNo unitNo)
{
  return (CardAddress)unitNo << vol.unitSizeBits;
}


/*----------------------------------------------------------------------*/
/*		         g e t U n i t D a t a 				*/
/*									*/
/* Get virtual unit No. and replacement unit no. of a unit.		*/
/*                                                                      */
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*	unitNo		  : Physical unit number			*/
/*	virtualUnitNo	  : Receives the virtual unit no.		*/
/*	replacementUnitNo : Receives the replacement unit no.		*/
/*                                                                      */
/*----------------------------------------------------------------------*/

static void getUnitData(Anand vol,
			UnitNo unitNo,
			UnitNo *virtualUnitNo,
			UnitNo *replacementUnitNo)
{
  UnitHeader unitData;

  vol.flash.read(&vol.flash,
		  unitBaseAddress(&vol,unitNo) + UNIT_DATA_OFFSET,
		  &unitData,
		  sizeof(UnitHeader),
		  EXTRA);

  /* Mask out any 1 -> 0 bit faults by or'ing with spare data */
  *virtualUnitNo = LE2(unitData.virtualUnitNo) |
		   LE2(unitData.spareVirtualUnitNo);
  *replacementUnitNo = LE2(unitData.replacementUnitNo) |
		       LE2(unitData.spareReplacementUnitNo);
}


/*----------------------------------------------------------------------*/
/*		         s e t U n i t D a t a 				*/
/*									*/
/* Set virtual unit No. and replacement unit no. of a unit.		*/
/*                                                                      */
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*	unitNo		  : Physical unit number			*/
/*	virtualUnitNo	  : Virtual unit no.				*/
/*	replacementUnitNo : Replacement unit no.			*/
/*									*/
/* Returns:								*/
/*	FLStatus	  : 0 on success, failed otherwise		*/
/*                                                                      */
/*----------------------------------------------------------------------*/

static FLStatus setUnitData(Anand vol,
			  UnitNo unitNo,
			  UnitNo virtualUnitNo,
			  UnitNo replacementUnitNo)
{
  UnitHeader unitData;
  UnitNo newVirtualUnitNo, newReplacementUnitNo;

  toLE2(unitData.virtualUnitNo,virtualUnitNo);
  toLE2(unitData.spareVirtualUnitNo,virtualUnitNo);
  toLE2(unitData.replacementUnitNo,replacementUnitNo);
  toLE2(unitData.spareReplacementUnitNo,replacementUnitNo);

  checkStatus(vol.flash.write(&vol.flash,
			       unitBaseAddress(&vol,unitNo) + UNIT_DATA_OFFSET,
			       &unitData,
			       sizeof(UnitHeader),
			       EXTRA));

  /* Verify the new unit data */
  getUnitData(&vol,unitNo,&newVirtualUnitNo, &newReplacementUnitNo);
  if (virtualUnitNo != newVirtualUnitNo ||
      replacementUnitNo != newReplacementUnitNo)
    return flWriteFault;
  else
    return flOK;
}


/*----------------------------------------------------------------------*/
/*		         g e t N e x t U n i t 				*/
/*									*/
/* Get next unit in chain.						*/
/*                                                                      */
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*	unitNo		  : Physical unit number			*/
/*									*/
/* Returns:								*/
/* 	Physical unit number of the unit following unitNo in the chain.	*/
/*	If such unit do not exist, return NO_UNIT.			*/
/*----------------------------------------------------------------------*/

static UnitNo getNextUnit(Anand vol, UnitNo unitNo)
{
  UnitNo virtualUnitNo, replacementUnitNo;

  if (!(vol.physicalUnits[unitNo] & UNIT_REPLACED))
    return NO_UNIT;

  getUnitData(&vol,unitNo,&virtualUnitNo,&replacementUnitNo);

  return replacementUnitNo;
}


/*----------------------------------------------------------------------*/
/*      	        g e t S e c t o r F l a g s			*/
/*									*/
/* Get sector status. 							*/
/*									*/
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/* 	sectorAddress		: Physical address of the sector	*/
/*                                                                      */
/* Returns:                                                             */
/*	Return the OR of the two bytes in the sector status area (the	*/
/*	bytes should contain the same data).				*/
/*----------------------------------------------------------------------*/

static unsigned char getSectorFlags(Anand vol, CardAddress sectorAddress)
{
  unsigned char flags[2];

  vol.flash.read(&vol.flash,
		  sectorAddress + SECTOR_DATA_OFFSET,
		  &flags,
		  sizeof flags,
		  EXTRA);

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


/*----------------------------------------------------------------------*/
/*		         v i r t u a l 2 P h y s i c a l		*/
/*									*/
/* Translate virtual sector number to physical address.			*/
/*                                                                      */
/* Parameters:                                                          */
/*	vol		: Pointer identifying drive			*/
/*	sectorNo	: Virtual sector number				*/
/*                                                                      */
/* Returns:                                                             */
/*	physical address of sectorNo					*/
/*----------------------------------------------------------------------*/

static CardAddress virtual2Physical(Anand vol, SectorNo sectorNo)
{
  unsigned unitOffset = (sectorNo % vol.sectorsPerUnit) << SECTOR_SIZE_BITS;
  CardAddress prevSectorAddress = UNASSIGNED_ADDRESS;
  UnitNo unitNo;

  /* follow the chain */
  for (unitNo = vol.virtualUnits[sectorNo / vol.sectorsPerUnit];
       unitNo != NO_UNIT;
       unitNo = getNextUnit(&vol,unitNo)) {
    CardAddress sectorAddress = unitBaseAddress(&vol,unitNo) + unitOffset;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91在线小视频| 国产网站一区二区| 欧美日韩视频在线一区二区| 欧美精品黑人性xxxx| 日韩女优电影在线观看| 欧美一区二区三区视频免费播放| 精品日韩在线一区| 国产三级欧美三级日产三级99 | 99久免费精品视频在线观看 | 欧美日韩高清不卡| 91精品国产综合久久久久久久| 亚洲精品一线二线三线| 亚洲精品美腿丝袜| 国产又粗又猛又爽又黄91精品| 色哟哟国产精品| 欧美视频三区在线播放| 欧美大肚乱孕交hd孕妇| 中文字幕av一区二区三区高| 亚洲第一搞黄网站| 岛国精品在线观看| 日韩一级二级三级精品视频| 国产日韩精品一区二区浪潮av| 一区二区三区中文字幕| 国产成人精品影院| 日韩一区二区影院| 亚洲午夜免费视频| jizzjizzjizz欧美| 精品免费日韩av| 亚洲成人在线网站| 成人av资源下载| 午夜视频在线观看一区二区| 在线电影欧美成精品| 国产成人亚洲综合a∨猫咪| 欧美日韩在线三区| 国产无一区二区| 91麻豆精品秘密| 中文字幕亚洲成人| 成人91在线观看| 国产欧美一二三区| 粉嫩嫩av羞羞动漫久久久| 亚洲欧美影音先锋| 国产丝袜美腿一区二区三区| 亚洲香肠在线观看| 本田岬高潮一区二区三区| 精品久久久久久久久久久院品网| 亚洲蜜臀av乱码久久精品蜜桃| 国产成人av电影| 中日韩免费视频中文字幕| 国产乱码一区二区三区| 国产婷婷色一区二区三区四区| 国产精品白丝jk黑袜喷水| 国产喷白浆一区二区三区| 成人污视频在线观看| 亚洲三级小视频| 欧美亚洲综合色| 午夜精品久久久久影视| 日韩美女主播在线视频一区二区三区| 激情图片小说一区| 国产精品国产精品国产专区不片| 不卡高清视频专区| 一区二区三区蜜桃| 欧洲国内综合视频| 午夜日韩在线电影| 欧美人与z0zoxxxx视频| 蜜臂av日日欢夜夜爽一区| 精品国产伦一区二区三区观看体验| 麻豆国产精品视频| 国产欧美一区二区在线| 国产suv精品一区二区6| 中文字幕亚洲一区二区av在线 | 国产亚洲精品超碰| 本田岬高潮一区二区三区| 亚洲欧美另类小说视频| 欧美综合在线视频| 蜜桃久久精品一区二区| 久久这里只有精品6| 精品一区二区三区免费播放| 中文字幕中文字幕在线一区| 欧美在线|欧美| 国产一区二区三区四区五区美女| 中文字幕色av一区二区三区| 这里只有精品免费| 国产精品一区二区久久精品爱涩 | 欧美日韩精品欧美日韩精品| 日本视频一区二区三区| 国产欧美一区二区精品秋霞影院| 色噜噜狠狠色综合中国| 国产真实乱偷精品视频免| 悠悠色在线精品| 久久蜜臀中文字幕| 欧美在线制服丝袜| 国产精品中文字幕欧美| 亚洲自拍与偷拍| 欧美激情一区在线观看| 日韩午夜三级在线| 91久久精品国产91性色tv| 国产精品91xxx| 视频一区二区中文字幕| 中文字幕中文字幕中文字幕亚洲无线| 日韩视频一区二区三区在线播放| 波多野结衣欧美| 国产一区二区三区四区五区美女 | 日韩国产精品久久久| 精品日产卡一卡二卡麻豆| 成人一级黄色片| 首页综合国产亚洲丝袜| 国产亚洲女人久久久久毛片| 欧美在线观看一二区| 成人精品国产福利| 国产剧情av麻豆香蕉精品| 免费成人av资源网| 五月综合激情网| 亚洲一区二区三区精品在线| 国产精品视频九色porn| 久久综合色一综合色88| 日韩免费一区二区| 91精品国产麻豆国产自产在线 | 国内精品伊人久久久久影院对白| 夜夜操天天操亚洲| 亚洲欧美激情视频在线观看一区二区三区| 精品国产伦一区二区三区观看方式 | 日韩欧美的一区二区| 在线观看国产91| 99精品视频中文字幕| 丁香啪啪综合成人亚洲小说| 国模套图日韩精品一区二区| 另类专区欧美蜜桃臀第一页| 日韩在线卡一卡二| 石原莉奈在线亚洲二区| 亚洲成人免费视频| 天天综合天天综合色| 视频一区中文字幕国产| 日本不卡视频一二三区| 蜜桃av噜噜一区| 精品一区二区在线观看| 精品一区二区在线播放| 狠狠色丁香九九婷婷综合五月| 久久国产人妖系列| 精品无人区卡一卡二卡三乱码免费卡| 日韩电影免费在线看| 蓝色福利精品导航| 日日夜夜精品视频免费| 亚洲第一主播视频| 香蕉成人啪国产精品视频综合网| 亚洲欧洲中文日韩久久av乱码| 久久色视频免费观看| 久久久国产综合精品女国产盗摄| 制服丝袜中文字幕一区| 日韩欧美电影在线| 欧美精品一区二区三区很污很色的| 欧美一区二区啪啪| 日韩欧美亚洲一区二区| 国产欧美综合在线观看第十页| 久久久久久久综合色一本| 久久亚洲精品小早川怜子| 精品国产sm最大网站| 久久精品一区二区| 久久精品人人做人人综合 | 日韩视频在线永久播放| 欧美人牲a欧美精品| 91精品国产综合久久久久久漫画| 日韩精品一区二区在线观看| 久久久天堂av| 欧美经典一区二区三区| 136国产福利精品导航| 亚洲一区二区综合| 图片区小说区区亚洲影院| 狠狠色综合日日| 99精品欧美一区二区蜜桃免费 | 日韩亚洲欧美在线观看| 中文字幕第一区二区| 亚洲成人你懂的| 成人性视频网站| 欧美精品在欧美一区二区少妇| 久久精品人人爽人人爽| 亚洲欧美一区二区三区国产精品 | 国产91丝袜在线播放九色| 欧美色窝79yyyycom| 久久久精品影视| 亚洲男帅同性gay1069| 美腿丝袜亚洲一区| 在线欧美一区二区| 国产亚洲精品aa午夜观看| 偷拍与自拍一区| 懂色av一区二区在线播放| 欧美在线免费播放| 国产欧美日韩在线| 免费成人你懂的| 色婷婷狠狠综合| 欧美mv日韩mv| 亚洲午夜私人影院| 91在线观看视频| 久久免费国产精品| 欧美aⅴ一区二区三区视频| 97久久精品人人爽人人爽蜜臀 | 中文字幕欧美日本乱码一线二线| 性感美女久久精品| 91福利资源站| 亚洲免费三区一区二区| 国产suv一区二区三区88区|