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

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

?? fat.c

?? 基于m128的fat16/32 和ata文件系統
?? C
?? 第 1 頁 / 共 4 頁
字號:
//*****************************************************************************
//
// Title		: FAT16/32 file system driver for ATMEL AVR
// Authors		: Angelo Bannack, Giordano Bruno Wolaniuk
// File Name	: 'fat.c'
// Date			: April 26, 2004
// Version		: 1.00
// Target MCU	: Atmel AVR Series
// Editor Tabs	: 4
//
// NOTE: This code is based on original library "FAT16/32 file system driver"
//       from Pascal Stang.
//
//	     The authors in no way will be responsible for damages that you coul'd be using this code.
//       Use this code at your own risk.
//
//       This code is distributed under the GNU Public License
//       which can be found at http://www.gnu.org/licenses/gpl.txt
//
//*****************************************************************************

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <string.h>


#include "ata.h"
#include "fat.h"
#include "fatconf.h"
#include "fattime.h"

// globals
unsigned char *SectorBuffer  =		(unsigned char *) SECTOR_BUFFER_ADDR;	// Sector Buffer
unsigned char *FatCache =			(unsigned char *) FAT_CACHE_ADDR;		// Fat Buffer
char VolLabel[12];							// Volume Label

struct partrecord PartInfo;					// Partition Information
TFILE File;									// File Information
unsigned long FSInfo;						// File System Information
unsigned char Fat32Enabled;					// Indicates if is FAT32 or FAT16
unsigned long FirstDataSector;				// First Data Sector Address
unsigned int  SectorsPerCluster;			// Number of Sectors per Cluster
unsigned long FirstFATSector;				// First FAT Sector Address
unsigned long FirstFAT2Sector;				// First FAT2 Sector Address
unsigned long FirstDirCluster;				// First Directory (Data) Cluster Address
unsigned long FatInCache = 0xFFFFFFFF;		// Address of the FAT Cluster in FatCache
unsigned long FatSectors;					// Number of FAT Sectors
unsigned long currentDirCluster;			// Actual Dir Cluster Number
unsigned long NumClusters;					// ATA Dispositive Cluster Numbers
unsigned long SectorInCache = 0xFFFFFFFF;	// Address of the Sector Cluster in SectorBuffer



//*****************************************************************************
// Function: fatClustToSect
// Parameters: cluster
// Returns: sector
//
// Description: Converts Sectors in Clusters
//*****************************************************************************
unsigned long fatClustToSect(unsigned long clust)
{
	if (clust == 0)
		clust=2;
	return ((clust-2) * SectorsPerCluster) + FirstDataSector;
}


//*****************************************************************************
// Function: fatSectToClust
// Parameters: sector
// Returns: cluster
//
// Description: Converts Clusters in Sectors
//*****************************************************************************
unsigned long fatSectToClust(unsigned long sect)
{
	return (((sect - FirstDataSector) / SectorsPerCluster) + 2);
}


//*****************************************************************************
// Function: fatInit
// Parameters: none
// Returns: TRUE if a FAT drive was found, FALSE otherwise
//
// Description: Get FAT info from ATA dispositive and initialize internal variables
//*****************************************************************************
unsigned char fatInit(void)
{
	struct bpb710 *bpb;

	// read partition table
	ataReadSectors(DRIVE0, 0, SectorBuffer, &SectorInCache);

	// map first partition record
	// save partition information to global PartInfo
	PartInfo = *((struct partrecord *) ((struct partsector *) SectorBuffer)->psPart);

	// Read the Partition BootSector
	// **first sector of partition in PartInfo.prStartLBA
	ataReadSectors( DRIVE0, PartInfo.prStartLBA, SectorBuffer, &SectorInCache );

	bpb = (struct bpb710 *) ((struct bootsector710 *) SectorBuffer)->bsBPB;

	// setup global disk constants
	FirstDataSector	= PartInfo.prStartLBA;
	if(bpb->bpbFATsecs)
	{
		// bpbFATsecs is non-zero and is therefore valid
		FirstDataSector	+= bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs;
	}
	else
	{
		// bpbFATsecs is zero, real value is in bpbBigFATsecs
		FirstDataSector	+= bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbBigFATsecs;
	}
	SectorsPerCluster	= bpb->bpbSecPerClust;
	FirstFATSector		= bpb->bpbResSectors + PartInfo.prStartLBA;
	FatSectors			= bpb->bpbBigFATsecs;
	NumClusters			= ataGetSizeInSectors()/(bpb->bpbSecPerClust);

	// initialize Volume Label
	memcpy(&VolLabel, bpb->bpbVolLabel, 11);
	VolLabel[11]='\0';

	switch (PartInfo.prPartType)
	{
		case PART_TYPE_DOSFAT16:
		case PART_TYPE_FAT16:
		case PART_TYPE_FAT16LBA:
			// first directory cluster is 2 by default (clusters range 2->big)
			FirstDirCluster	= CLUST_FIRST;
			// push data sector pointer to end of root directory area
			//FirstDataSector += (bpb->bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;
			Fat32Enabled = FALSE;
			break;
		case PART_TYPE_FAT32LBA:
		case PART_TYPE_FAT32:
			// bpbRootClust field exists in FAT32 bpb710, but not in lesser bpb's
			FirstDirCluster = bpb->bpbRootClust;
			// push data sector pointer to end of root directory area
			// need this? FirstDataSector += (bpb->bpbRootDirEnts)/DIRENTRIES_PER_SECTOR;
			Fat32Enabled = TRUE;
			break;
		default:
			//Found: No Partition!
			return FALSE;
			break;
	}

	if (Fat32Enabled)
		FirstFAT2Sector=FirstFATSector+bpb->bpbBigFATsecs;
	else
		FirstFAT2Sector=FirstFATSector+bpb->bpbFATsecs;
	FSInfo=bpb->bpbFSInfo+PartInfo.prStartLBA;

	currentDirCluster= FirstDirCluster;

	return TRUE;
}


//*****************************************************************************
// Function: fatNextCluster
// Parameters: cluster
// Returns: the next cluster
//
// Description: Find next cluster in the FAT chain
//*****************************************************************************
unsigned long fatNextCluster(unsigned long cluster)
{
	unsigned long nextCluster;
	unsigned long fatMask;
	unsigned long fatOffset;
	unsigned long sector;
	unsigned int offset;

	// get fat offset in bytes
	if(Fat32Enabled)
	{
		// four FAT bytes (32 bits) for every cluster
		fatOffset = cluster << 2;
		// set the FAT bit mask
		fatMask = FAT32_MASK;
	}
	else
	{
		// two FAT bytes (16 bits) for every cluster
		fatOffset = cluster << 1;
		// set the FAT bit mask
		fatMask = FAT16_MASK;
	}

	// calculate the FAT sector that we're interested in
	sector = FirstFATSector + (fatOffset / BYTES_PER_SECTOR);
	// calculate offset of the our entry within that FAT sector
	offset = fatOffset % BYTES_PER_SECTOR;

	// if we don't already have this FAT chunk loaded, go get it
	ataReadSectors( DRIVE0, sector, (unsigned char*)FAT_CACHE_ADDR, &FatInCache);


	// read the nextCluster value
	nextCluster = (*((unsigned long*) &((char*)FAT_CACHE_ADDR)[offset])) & fatMask;

	// check to see if we're at the end of the chain
	if (nextCluster == (CLUST_EOFE & fatMask))
		nextCluster = 0;

	return nextCluster;
}



//*****************************************************************************
// Function: fatClusterSize
// Parameters: none
// Returns: the size of a cluster in sectors
//
// Description: return the number of sectors in a disk cluster
//*****************************************************************************
unsigned int fatClusterSize(void)
{
	return SectorsPerCluster;
}


//*****************************************************************************
// Function: fatGetFirstDirCluster
// Parameters: none
// Returns: the cluster number of the first dir entry in FAT
//
// Description: return the first dir entry cluster in FAT
//*****************************************************************************
unsigned long fatGetFirstDirCluster(void)
{
	return(FirstDirCluster);
}


//*****************************************************************************
// Function: fatGetPartInfo
// Parameters: none
// Returns: FAT partition information
//
// Description: return the partition information read in fatInit routine
//*****************************************************************************
struct partrecord *fatGetPartInfo(void)
{
	return (&PartInfo);
}



//*****************************************************************************
// Function: fatGetSecPerClust
// Parameters: none
// Returns: the number of Sectors per Cluster
//
// Description: return the number of Sectors per Cluster read in fatInit
//*****************************************************************************
unsigned int fatGetSecPerClust(void)
{
	return SectorsPerCluster;
}


//*****************************************************************************
// Function: fatGetFirstFATSector
// Parameters: none
// Returns: the address of the first FAT Sector
//
// Description: return the sector address of the first FAT
//*****************************************************************************
unsigned long fatGetFirstFATSector(void)
{
	return(FirstFATSector);
}


//*****************************************************************************
// Function: fatGetFirstFAT2Sector
// Parameters: none
// Returns: the address of the first second FAT Sector
//
// Description: return the sector address of the second FAT
//*****************************************************************************
unsigned long fatGetFirstFAT2Sector(void)
{
	return(FirstFAT2Sector);
}


//*****************************************************************************
// Function: fatGetFirstDataSector
// Parameters: none
// Returns: the address of the first data Sector
//
// Description: return the sector address of the data in FAT
//*****************************************************************************
unsigned long fatGetFirstDataSector(void)
{
	return(FirstDataSector);
}


//*****************************************************************************
// Function: fatGetNumClusters
// Parameters: none
// Returns: the total number of clusters
//
// Description: return the total number of clusters in the ata dispositive
//*****************************************************************************
unsigned long fatGetNumClusters(void)
{
	return(NumClusters);
}



//*****************************************************************************
// Function: fatDir
// Parameters: initial cluster, offset
// Returns: On SUSCEFULL returns the sector with direntries info, otherwise
//          returns NULL
//
// Description: return the sector with direntries info starting in the cluster,
//              and with offset sectors from the begining cluster sector
//*****************************************************************************
unsigned char *fatDir(unsigned long cluster, unsigned long offset)
{
	unsigned long index;

	for (index=0; index < offset/SectorsPerCluster; index++)
		cluster=fatNextCluster(cluster);

	if (cluster == 0)
		return NULL;

	ataReadSectors(DRIVE0, fatClustToSect(cluster)+ offset%SectorsPerCluster, SectorBuffer, &SectorInCache);
	return SectorBuffer;
}



//*****************************************************************************
// Function: fatGetFileInfo
// Parameters: address of direntry struct, short name of the file
// Returns: On SUSCEFULL, return the direntry struct filled out with the file info,
//          otherwise returns NULL;
//
// Description: return the direntry struct of a short name file given
//              this function will search for a filename only in the current
//              directory, given by currentDirCluster
//*****************************************************************************
struct direntry *fatGetFileInfo(struct direntry *rde, char *shortName)
{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一区二区视频在线| 欧美日韩在线播| 麻豆精品一区二区| 午夜久久久影院| 亚洲国产精品一区二区久久恐怖片 | 成人av资源站| 久久久精品2019中文字幕之3| 欧美精品自拍偷拍| 欧美日韩和欧美的一区二区| 欧美日韩一本到| 欧美人动与zoxxxx乱| 91精品国产色综合久久久蜜香臀| 欧美日韩黄视频| 欧美精品日韩精品| 3atv一区二区三区| 久久精品夜色噜噜亚洲a∨| 精品三级在线看| 久久久久久久国产精品影院| 国产欧美精品一区二区三区四区 | 欧美系列一区二区| 欧美日韩欧美一区二区| 在线播放亚洲一区| 日韩视频123| 久久九九99视频| 亚洲人成7777| 男人的j进女人的j一区| 国产在线麻豆精品观看| 菠萝蜜视频在线观看一区| 97精品电影院| 欧美一区二区三区在线视频| 精品国产网站在线观看| 国产精品素人视频| 亚洲国产另类精品专区| 看国产成人h片视频| 不卡视频在线看| 欧美少妇性性性| 精品国产乱码久久久久久免费| 国产精品美女久久久久av爽李琼| 一区二区三国产精华液| 久久99热99| 91久久国产综合久久| 精品av久久707| 亚洲人午夜精品天堂一二香蕉| 性做久久久久久久久| 国产一区二区三区黄视频 | 亚洲男同性视频| 免费观看在线色综合| 成人免费毛片片v| 91精品国产品国语在线不卡| 中文字幕欧美国产| 免费成人在线视频观看| 91成人在线免费观看| 一级精品视频在线观看宜春院| 久久精品国产亚洲a| 91久久线看在观草草青青| 久久精品人人爽人人爽| 日韩专区一卡二卡| 一本到不卡免费一区二区| 久久久久国产精品人| 奇米四色…亚洲| 欧洲色大大久久| 亚洲欧美一区二区三区久本道91| 国内外精品视频| 日韩欧美中文字幕精品| 偷偷要91色婷婷| 色哟哟国产精品| 亚洲欧美在线观看| 国产成人精品aa毛片| 精品va天堂亚洲国产| 日韩国产一二三区| 欧美日韩精品欧美日韩精品| 亚洲一区免费视频| 日本高清免费不卡视频| 国产精品色眯眯| 成人激情综合网站| 久久久久国产精品免费免费搜索| 精品亚洲成a人在线观看| 欧美一区二区三区免费大片| 午夜视黄欧洲亚洲| 6080午夜不卡| 日本欧美在线看| 欧美一卡在线观看| 美女视频一区二区| 2023国产精华国产精品| 久久成人av少妇免费| 精品国产伦一区二区三区免费 | 久草这里只有精品视频| 日韩一区二区三区观看| 男女男精品网站| 日韩欧美国产一区二区在线播放 | 久久综合九色综合97_久久久| 国产一区欧美二区| 欧美国产在线观看| 91麻豆免费观看| 亚洲国产中文字幕在线视频综合| 欧美性猛交一区二区三区精品| 亚洲国产wwwccc36天堂| 欧美一区午夜精品| 国产精品资源在线看| 中文字幕中文字幕一区| 欧美日韩在线三级| 免费精品视频在线| 欧美国产日本视频| 在线观看区一区二| 麻豆极品一区二区三区| 国产视频一区在线播放| 在线精品亚洲一区二区不卡| 秋霞电影网一区二区| 久久九九影视网| 欧美一a一片一级一片| 另类的小说在线视频另类成人小视频在线| 欧美精品一区二区不卡| 色婷婷激情久久| 久久精品国产精品青草| 亚洲色图丝袜美腿| 日韩欧美专区在线| eeuss鲁片一区二区三区| 日韩av在线发布| 国产精品毛片久久久久久| 在线综合视频播放| 不卡一区二区中文字幕| 日本成人中文字幕在线视频| 国产精品久久久久9999吃药| 宅男在线国产精品| 99视频精品全部免费在线| 蜜桃视频在线观看一区二区| 最新国产成人在线观看| 久久综合色播五月| 欧美天堂一区二区三区| 福利91精品一区二区三区| 天天av天天翘天天综合网色鬼国产| 国产亚洲欧美一区在线观看| 欧美裸体一区二区三区| 99re这里只有精品6| 久草中文综合在线| 日日骚欧美日韩| 一区二区三区在线视频免费观看| 久久九九久久九九| 91精品免费观看| 欧美色欧美亚洲另类二区| 99久久精品国产精品久久 | 日韩精品自拍偷拍| 欧美日韩不卡在线| 91视频xxxx| www.视频一区| 国产宾馆实践打屁股91| 国内欧美视频一区二区 | 欧美白人最猛性xxxxx69交| 欧美日韩亚洲综合在线| 欧美伊人久久大香线蕉综合69 | 一本色道亚洲精品aⅴ| 成a人片亚洲日本久久| 国产精品一区二区久久精品爱涩| 精品一区二区av| 韩国成人精品a∨在线观看| 精品一区二区三区在线视频| 青青草伊人久久| 美国欧美日韩国产在线播放| 日本女人一区二区三区| 日本视频一区二区| 六月婷婷色综合| 精品亚洲aⅴ乱码一区二区三区| 蜜桃视频一区二区三区| 青青草国产精品97视觉盛宴| 麻豆成人久久精品二区三区红 | 丰满白嫩尤物一区二区| 国产高清不卡二三区| 成人av电影在线观看| 91视频精品在这里| 在线成人免费观看| 精品日韩欧美在线| 欧美激情一区二区在线| 国产精品久久久久久亚洲伦| 综合久久久久综合| 亚洲福利国产精品| 青青国产91久久久久久| 国产精品69毛片高清亚洲| 波多野结衣一区二区三区 | 欧美日韩免费在线视频| 欧美一区二区三区人| 欧美一区二区在线播放| 欧美国产亚洲另类动漫| 亚洲乱码国产乱码精品精的特点| 亚洲va欧美va人人爽午夜| 裸体在线国模精品偷拍| 成人手机电影网| 欧美日韩久久不卡| 欧美经典三级视频一区二区三区| 亚洲男人电影天堂| 精品在线视频一区| 色综合色综合色综合色综合色综合| 欧美精品欧美精品系列| 国产亚洲成av人在线观看导航 | 91麻豆精品国产91久久久久| 久久久久一区二区三区四区| 亚洲精品久久久蜜桃| 久久99国产精品成人| 色拍拍在线精品视频8848| 精品精品国产高清一毛片一天堂| 中文字幕日韩欧美一区二区三区|