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

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

?? fat.c

?? 基于ATmega64單片機以及vs1003的SD卡方案的MP3播放源代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*************************************************************/
/*                   FAT操作函數庫                           */
/*  環境WinAVR 20060421                                      */
/*  作者:Bozai(章其波)                                    */
/*  E-mail:sudazqb@163.com                                  */
/*  2007年2月13日                                            */
/*************************************************************/
/*  20071109: add & modify function for any directory music file playing */
/*  20071103: add function for lyric display */
/*History: 2007年2月13日                                     */
/*			添加了適合于RAM豐富的AVR單片機操作 的FAT表函數	 */
/*	改進了查找FAT表的函數,使在硬盤操作時不需頻繁去讀FAT表.   */
/*        	注: 只適合RAM足夠多的單片機                      */
/*************************************************************/

#include"FAT.h"

DWORD FirstDirClust;    //first directory cluster
DWORD FirstDataSector;	// The first sector number of data
WORD BytesPerSector;	// Bytes per sector
DWORD FATsectors;		// The amount sector a FAT occupied
WORD SectorsPerClust;	// Sector per cluster
DWORD FirstFATSector;	// The first FAT sector
DWORD FirstDirSector;	// The first Dir sector
DWORD RootDirSectors;	// The sector number a Root dir occupied 
DWORD RootDirCount;		// The count of directory in root dir
BYTE FAT32_Enable;

BYTE TABLE_READ = 0;
DWORD START_CLUSTER = 0x0ffffff8;	//when the mcu has large ram
//BYTE FAT_TABLE[512];				//when the mcu has large ram


BYTE LongNameBuffer[MAX_LONG_NAME_SIZE];
BYTE LongNameFlag = 0;

BYTE (* FAT_ReadSector)(DWORD,BYTE *);
BYTE (* FAT_WriteSector)(DWORD,BYTE *);
DWORD (* FAT_ReadCapacity)(void);

//函數指針指向sd卡的讀寫函數
//BYTE (* FAT_ReadSector)(DWORD sector, BYTE * buffer) = CH375_ReadOneSector;
//BYTE (* FAT_WriteSector)(DWORD sector, BYTE * buffer) =  CH375_WriteOneSector;
//BYTE (* FAT_ReadSector)(DWORD sector, BYTE * buffer)=MMC_SD_ReadSingleBlock;//device read
//BYTE (* FAT_WriteSector)(DWORD sector, BYTE * buffer)=MMC_SD_WriteSingleBlock;//device write

struct FileInfoStruct FileInfo;//temporarily buffer for file information

//FAT初始化,不含SD的初始化,用之前應先調用sd的初始化
unsigned char FAT_Init()//Initialize of FAT  need initialize SD first
{
	struct bootsector710 *bs  = 0;
	struct bpb710        *bpb = 0;
//	struct partsector    *ps  = 0;
	struct partrecord    *pr  = 0;

	BYTE buffer[512];
	DWORD hidsec=0;
	DWORD Capacity;

	Capacity = FAT_ReadCapacity();
	if(Capacity<0xff)return 1;


	if(FAT_ReadSector(0,buffer))return 1;
	bs = (struct bootsector710 *)buffer;

	pr = (struct partrecord *)((struct partsector *)buffer)->psPart;//first partition
	hidsec = pr->prStartLBA;//the hidden sectors
	if(hidsec >= Capacity/512)
	{
		hidsec = 0;
	}
	else 
	{
		if(FAT_ReadSector(pr->prStartLBA,buffer))return 1;//read the bpb sector
		bs = (struct bootsector710 *)buffer;
		if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)
		{
			hidsec = 0;
			if(FAT_ReadSector(0,buffer))return 1;//read the bpb sector
			bs = (struct bootsector710 *)buffer;	
		}
	}

	if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)//對付沒有bootsect的sd卡	//dead with the card which has no bootsect
	{
		return 1;
	}
	bpb = (struct bpb710 *)bs->bsBPB;

	
	if(bpb->bpbFATsecs)//detemine thd FAT type  //do not support FAT12
	{
		FAT32_Enable=0;	//FAT16
		FATsectors		= bpb->bpbFATsecs;//FAT占用的扇區數	//the sectors number occupied by one fat talbe
		FirstDirClust = 2;
	}
	else
	{
		FAT32_Enable=1;	//FAT32
		FATsectors		= bpb->bpbBigFATsecs;//FAT占用的扇區數	//the sectors number occupied by one fat talbe
		FirstDirClust = bpb->bpbRootClust;
	}

	BytesPerSector	= bpb->bpbBytesPerSec;//每扇區字節數
	SectorsPerClust	= (BYTE)bpb->bpbSecPerClust;//每簇扇區數
	FirstFATSector	= bpb->bpbResSectors+hidsec;//第一個FAT表扇區
	RootDirCount	= bpb->bpbRootDirEnts;//根目錄項數
	RootDirSectors	= (RootDirCount*32)>>9;//根目錄占用的扇區數
	FirstDirSector	= FirstFATSector+bpb->bpbFATs*FATsectors;//第一個目錄扇區
	FirstDataSector	= FirstDirSector+RootDirSectors;//第一個數據扇區
	return 0;
}

//讀一個簇中的一個扇區
unsigned char FAT_LoadPartCluster(unsigned long cluster,unsigned part,BYTE * buffer)
{
	DWORD sector;
	sector=(DWORD)FirstDataSector+(DWORD)(cluster-2)*(DWORD)SectorsPerClust;//calculate the actual sector number
	if(FAT_ReadSector(sector+part,buffer))return 1;
	else return 0;
}

/*
//讀整個簇
//Read the a cluster
//Not suitable for system which has few data RAM  
unsigned char FAT_LoadCluster(unsigned long cluster,BYTE * buffer)
{
	DWORD sector;
	unsigned char i;
	sector=FirstDataSector+(DWORD)(cluster-2)*(DWORD)SectorsPerClust;//calculate the actual sector number
	for(i=0;i<SectorsPerClust;i++)
	{
		if(FAT_ReadSector(sector+i,buffer+(i<<9)))break;
	}
	if(i==SectorsPerClust)return 0;
	else return 1;
}*/

//讀下一簇簇號
//Return the cluster number of next cluster of file
//Suitable for system which has limited RAM
unsigned long FAT_NextCluster(unsigned long cluster)
{
	BYTE buffer[512];
	DWORD sector;
	DWORD offset;
	if(FAT32_Enable)offset = cluster/128;
	else offset = cluster/256;
	if(cluster<2)return 0x0ffffff8;
	sector=FirstFATSector+offset;//calculate the actual sector
	if(FAT_ReadSector(sector,buffer))return 0x0ffffff8;//read fat table / return 0xfff8 when error occured

	if(FAT32_Enable)
	{
		offset=cluster%128;//find the position
		sector=((unsigned long *)buffer)[offset];	
	}
	else
	{
		offset=cluster%256;//find the position
		sector=((unsigned int *)buffer)[offset];
	}
	return (unsigned long)sector;//return the cluste number
}

/*unsigned long FAT_NextCluster_NEW(unsigned long cluster)
{
	//BYTE buffer[512];
	BYTE temp;
	DWORD sector;
	DWORD offset;

	if(cluster<2)return 0x0ffffff8;

	if(FAT32_Enable)temp = 127;
	else temp = 255;
	
	offset = cluster/(temp+1);		
	sector=FirstFATSector+offset;//calculate the actual sector where the FAT placed

	offset=cluster%(temp+1);//find the position //計算出在表中的偏移量
	cluster -= offset;//找出需要的起始位置 ,以便于當前保存的起始簇號比較

	if(TABLE_READ == 0 || cluster != START_CLUSTER)//從未讀過 or 不在已有的FAT表內 需重新讀
	{
		if(FAT_ReadSector(sector,FAT_TABLE))return 0x0ffffff8;//read fat table / return 0xfff8 when error occured
		START_CLUSTER = cluster;
		TABLE_READ = 1;
	}
	
//	if(cluster != START_CLUSTER)//不在已有的FAT表內 需重新讀
//	{
//		if(FAT_ReadSector(sector,FAT_TABLE))return 0x0ffffff8;//read fat table / return 0xfff8 when error occured
//		START_CLUSTER = cluster;
//		TABLE_READ = 1;
//	}

	if(FAT32_Enable)
	{
	//	offset=cluster%128;//find the position
		sector=((unsigned long *)FAT_TABLE)[offset];	
	}
	else
	{
	//	offset=cluster%256;//find the position
		sector=((unsigned int *)FAT_TABLE)[offset];
	}
	return (unsigned long)sector;//return the cluste number
}*/

//在FAT表內找空簇
//Find a free cluster return the cluster number
unsigned long FAT_FindFreeCluster()
{
	BYTE buffer[512];
	//DWORD sector;
	unsigned int i;
	unsigned long cnt;
//	sector=FirstFATSector+offset;//calculate the actual sector
	//sector=FirstFATSector;
	if(FAT32_Enable)
	{
		for(cnt=0;cnt<FATsectors;cnt++)//find in the FAT table
		{
			if(FAT_ReadSector(FirstFATSector+cnt,buffer))return 1;//error
			for(i=0;i<128;i++)
			{
				if(((unsigned long *)buffer)[i]==0x00000000)break;//an unused cluster
			}
			if(i!=128)
			{
				cnt=cnt*128+i;
				return cnt;//return the free cluster number
			}
		}
	}
	else
	{
		for(cnt=0;cnt<FATsectors;cnt++)//find in the FAT table
		{
			if(FAT_ReadSector(FirstFATSector+cnt,buffer))return 1;//error
			for(i=0;i<256;i++)
			{
				if(((unsigned int *)buffer)[i]==0x0000)break;//an unused cluster
			}
			if(i!=256)
			{
				cnt=cnt*256+i;
				return cnt;//return the free cluster number
			}
		}
	}
	return 1;//error
}

//在cluster指向的目錄下找一個空位置記錄文件
//find a position to place a item withe the given directory, the parameter is FileInfo who brought the message
unsigned int FAT_FindFreeItem(unsigned long cluster, struct FileInfoStruct *FileInfo)
{
	BYTE *buffer;
	DWORD tempclust;
	DWORD sector;
	unsigned int cnt;
	unsigned int offset;
//	unsigned char i;
	struct direntry *item = 0;
	if(cluster==0 && FAT32_Enable==0)// root directory//當這個目錄是根目錄
	{
		buffer=malloc(512);//apply memory
		if(buffer==0)return 1;//if failed
		for(cnt=0;cnt<RootDirSectors;cnt++)
		{
			if(FAT_ReadSector(FirstDirSector+cnt,buffer)){free(buffer);return 1;}//read sector
			for(offset=0;offset<512;offset+=32)
			{
				item=(struct direntry *)(&buffer[offset]);
				//used item
				if(item->deName[0] == 0x00 || item->deName[0] == 0xe5)
				//unused item
				{

					FileInfo->StartCluster = item->deStartCluster + (((unsigned long)item->deHighClust)<<16);//don't care
					FileInfo->Size         = item->deFileSize;//don't care
					FileInfo->Attr         = item->deAttributes;//don't care
					FileInfo->Sector       = FirstDirSector+cnt;//The key parameter record the secoter nuber which the item stored
					FileInfo->Offset       = offset;			//The key parameter record the offset in the sector
					free(buffer);//realease
					return 0;//done
				}
			}
		}
		free(buffer);//release
	}
	else//other folders//當這是一個其它目錄時,程序暫且沒考慮到目錄內沒有空余項是需要另找一個簇來記錄
	{
		tempclust=cluster;
		while(1)
		{
			sector=(unsigned long)FirstDataSector+(tempclust-2)*(unsigned long)SectorsPerClust;//calculate the actual sector number
			buffer=malloc(512);//apply memory
			if(buffer==0)return 1;//if failed
			for(cnt=0;cnt<SectorsPerClust;cnt++)
			{
				if(FAT_ReadSector(sector+cnt,buffer)){free(buffer);return 1;}
				for(offset=0;offset<512;offset+=32)
				{
					item=(struct direntry *)(&buffer[offset]);
					if(item->deName[0] == 0x00 || item->deName[0] == 0xe5)
					{
						FileInfo->StartCluster = item->deStartCluster + (((unsigned long)item->deHighClust)<<16);						
						FileInfo->Size         = item->deFileSize;
						FileInfo->Attr         = item->deAttributes;
						FileInfo->Sector       = sector+cnt;
						FileInfo->Offset       = offset;
						free(buffer);
						return 0;
					}
				}
			}
			free(buffer);//release
			tempclust=FAT_NextCluster(tempclust);//next cluster
			if( (FAT32_Enable == 0 && tempclust == 0xffff) || tempclust == 0x0ffffff8 || tempclust == 0x0fffffff)return 1;
		}
	}
	return 1;
}

//顯示給定路徑下的文件
//display the content of a foler , 0 as root directory
unsigned char FAT_DisDir(BYTE *dir)
{
	BYTE *buffer;
	DWORD sector;
	DWORD cluster;
	DWORD tempclust;
	unsigned int cnt;
	unsigned int offset;
	unsigned char i;
	struct direntry *item = 0;
	cluster = FAT_OpenDir(dir);
	if(cluster == 1)return 1;
	if(cluster==0 && FAT32_Enable==0)// root directory
	{
		buffer=malloc(512);//apply memory
		if(buffer==0)return 1;//if failed
		for(cnt=0;cnt<RootDirSectors;cnt++)
		{
			if(FAT_ReadSector(FirstDirSector+cnt,buffer)){free(buffer);return 1;}
			for(offset=0;offset<512;offset+=32)
			{
				item=(struct direntry *)(&buffer[offset]);//pointer convert
				//find a valid item and display it
				if((item->deName[0] != '.') && (item->deName[0] != 0x00) && (item->deName[0] != 0xe5) && (item->deAttributes != 0x0f))
				{
					USART_putchar(0x0d);
					USART_putchar(0x0a);
					for(i=0;i<8;i++)//name
					{
						USART_putchar(item->deName[i]);	
					}
					if((item->deAttributes & 0x10)==0)USART_putchar('.');
					for(i=0;i<3;i++)//extention
					{
						USART_putchar(item->deExtension[i]);
					}
				}
			}
		}
		free(buffer);//release
	}
	else//other folders
	{
		tempclust=cluster;
		while(1)
		{
			sector=(DWORD)FirstDataSector+(DWORD)(tempclust-2)*(DWORD)SectorsPerClust;//calculate the actual sector number
			buffer=malloc(512);//apply memory
			if(buffer==0)return 1;//if failed
			for(cnt=0;cnt<SectorsPerClust;cnt++)
			{
				if(FAT_ReadSector(sector+cnt,buffer)){free(buffer);return 1;}
				for(offset=0;offset<512;offset+=32)
				{
					item=(struct direntry *)(&buffer[offset]);
					if((item->deName[0] != '.') && (item->deName[0] != 0x00) && (item->deName[0] != 0xe5) && (item->deAttributes != 0x0f))
					{
						USART_putchar(0x0d);
						USART_putchar(0x0a);
						for(i=0;i<8;i++)
						{
							USART_putchar(item->deName[i]);	
						}
						if((item->deAttributes & 0x10)==0)USART_putchar('.');
						for(i=0;i<3;i++)
						{
							USART_putchar(item->deExtension[i]);
						}
					}
				}
			}
			free(buffer);//release
			tempclust=FAT_NextCluster(tempclust);//next cluster
			if( tempclust == 0x0ffffff8 )return 1;
			if((FAT32_Enable == 0 && tempclust == 0xffff) || tempclust == 0x0fffffff)break;
		}
	}
	return 0;
}

//在給定目錄下查找文件
//Find a item in the directory which specify by the parameter "cluster"
//Return the start cluster number
unsigned int FAT_FindItem(unsigned long cluster, BYTE *name, struct FileInfoStruct *FileInfo)
{
	BYTE *buffer;
	DWORD tempclust;
	DWORD sector;
	unsigned int cnt;
	unsigned int offset;
	unsigned char i;
	struct direntry *item = 0;
	if((cluster==0) && (FAT32_Enable == 0))// root directory
	{
		buffer=malloc(512);//apply memory
		if(buffer==0)return 1;//if failed

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久久精品免费观看国产蜜| 欧美bbbbb| 午夜不卡av在线| 国产拍欧美日韩视频二区| 色婷婷精品大视频在线蜜桃视频| 日韩一区二区三区在线观看| 国产日韩欧美电影| 男男gaygay亚洲| 色噜噜夜夜夜综合网| 久久网站热最新地址| 午夜不卡在线视频| 欧美视频精品在线观看| 中文字幕中文字幕一区| 国产精品99久| 精品播放一区二区| 乱一区二区av| 日韩精品中文字幕一区二区三区| 午夜久久久久久久久| 欧美伊人久久久久久午夜久久久久| 国产精品系列在线| 国产精品 日产精品 欧美精品| 91精品国产aⅴ一区二区| 亚洲成人av电影在线| 精品国精品自拍自在线| 天堂蜜桃91精品| 欧美日韩一区二区在线观看| 亚洲精品视频自拍| 色噜噜久久综合| 亚洲欧美区自拍先锋| 色综合久久综合网欧美综合网| 国产精品伦理在线| av一区二区三区四区| 欧美激情中文不卡| 成人av在线资源网站| 国产精品麻豆久久久| 波多野结衣中文字幕一区| 国产欧美日韩在线| 99久精品国产| 亚洲一区在线电影| 欧美日韩综合不卡| 五月婷婷综合激情| 日韩欧美自拍偷拍| 国产激情视频一区二区三区欧美| 国产日韩av一区| 99精品国产一区二区三区不卡| 亚洲色图视频免费播放| 在线中文字幕不卡| 欧美aaa在线| 久久久美女艺术照精彩视频福利播放| 国产精品一区二区久久精品爱涩| 国产视频一区二区三区在线观看 | 欧美三级资源在线| 天堂在线亚洲视频| 久久精品水蜜桃av综合天堂| 国产69精品一区二区亚洲孕妇| 国产精品久久久久久妇女6080| 成+人+亚洲+综合天堂| 一区二区三区四区中文字幕| 欧美性生活大片视频| 久久精品免费观看| 一区二区中文视频| 欧美精品日韩一本| 国产成人在线视频播放| 亚洲精品免费视频| 精品久久一二三区| 色综合久久久网| 精品一二三四在线| 亚洲免费av高清| 精品国产91亚洲一区二区三区婷婷| 国产91综合一区在线观看| 亚洲午夜在线视频| 国产欧美日韩综合精品一区二区| 欧美在线观看18| 国产成人精品aa毛片| 日韩影视精彩在线| 亚洲图片激情小说| 精品动漫一区二区三区在线观看| 色悠久久久久综合欧美99| 毛片av一区二区三区| 亚洲色图在线播放| 久久精品视频在线看| 欧美一区中文字幕| 91高清视频在线| 粉嫩在线一区二区三区视频| 天堂午夜影视日韩欧美一区二区| **网站欧美大片在线观看| 日韩免费高清av| 欧美日韩国产首页在线观看| 成人高清av在线| 韩国欧美一区二区| 欧美aa在线视频| 午夜免费久久看| 亚洲一区二区精品视频| 久久夜色精品国产欧美乱极品| 欧美私模裸体表演在线观看| hitomi一区二区三区精品| 国产呦萝稀缺另类资源| 美女一区二区视频| 视频一区二区三区中文字幕| 亚洲狠狠丁香婷婷综合久久久| 国产日韩欧美a| 久久婷婷国产综合精品青草| 这里是久久伊人| 91精品免费观看| 欧美日本韩国一区二区三区视频| 色婷婷久久久综合中文字幕| 国产1区2区3区精品美女| 国产在线播放一区| 九一久久久久久| 日韩中文字幕1| 亚洲国产欧美另类丝袜| 一区二区在线电影| 亚洲已满18点击进入久久| 亚洲天堂2016| 亚洲线精品一区二区三区八戒| 亚洲欧美国产高清| 亚洲一区二区三区视频在线播放| 日韩一区中文字幕| 亚洲欧美日韩国产成人精品影院 | 自拍偷拍欧美激情| 国产精品国产成人国产三级| 国产精品卡一卡二| 国产精品色噜噜| 一区二区中文视频| 一区二区三区不卡在线观看 | 欧美日韩三级一区| 91精品免费在线观看| 日韩欧美高清dvd碟片| 精品福利视频一区二区三区| 久久久www成人免费毛片麻豆 | 高清日韩电视剧大全免费| 成人免费va视频| 在线看不卡av| 91麻豆精品国产91久久久久久久久| 日韩欧美一区二区在线视频| 欧美成人video| 国产亚洲一区二区三区在线观看| 国产欧美一区二区在线观看| 亚洲婷婷综合久久一本伊一区| 洋洋成人永久网站入口| 免费成人在线观看视频| 成人在线视频一区二区| 在线观看日韩一区| 欧美精品一区二区不卡 | 91蝌蚪porny| 91精品国产手机| 国产三级欧美三级| 亚洲国产一区二区在线播放| 裸体在线国模精品偷拍| 成人免费毛片app| 欧美日韩高清一区二区三区| 欧美精品一区二区不卡| 一区二区三区高清在线| 久久不见久久见免费视频7| 97超碰欧美中文字幕| 91精品国产入口在线| 国产精品电影一区二区| 亚洲成人免费在线| 成人一区二区三区视频在线观看 | 色94色欧美sute亚洲线路一久 | 一区二区三区在线影院| 久久www免费人成看片高清| 99久久精品国产一区二区三区| 欧美夫妻性生活| 亚洲视频香蕉人妖| 国产乱人伦偷精品视频不卡| 欧美日韩中文字幕一区二区| 国产色爱av资源综合区| 奇米亚洲午夜久久精品| 91色婷婷久久久久合中文| 久久蜜桃av一区精品变态类天堂| 亚洲三级电影网站| 国产成人在线视频网站| 欧美电影免费观看高清完整版在线| 亚洲视频一区二区在线观看| 国产在线精品一区二区三区不卡| 欧美人xxxx| 亚洲精品欧美激情| 99精品久久只有精品| 国产三级精品在线| 精品一区二区三区免费观看 | 日本精品一区二区三区四区的功能| 精品国产乱码久久久久久图片 | 欧美午夜影院一区| 亚洲天天做日日做天天谢日日欢| 国产精品资源站在线| 日韩一区二区三区精品视频| 亚洲精品国产无天堂网2021| 成人av网站免费观看| 国产精品无遮挡| 成人精品免费看| 国产婷婷色一区二区三区四区| 美国十次综合导航| 日韩视频免费直播| 久久国产精品区| 久久嫩草精品久久久精品一| 久久国产综合精品| 久久久久青草大香线综合精品| 麻豆成人91精品二区三区| 日韩三级视频中文字幕|