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

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

?? fat.c

?? Atmel ATMEGA32 Serial controlled SD card MP3 Player.
?? C
字號:
/*************************************************************/
/*                   MP3 FAT操作函數庫                         */
/*  環境WinAVR 20060421                                      */
/*  作者:Bozai(章其波)                                    */
/*  E-mail:sudazqb@163.com                                  */
/*  2006年12月3日                                           */
/*************************************************************/
/*          FAT diriver for  MiniMP3 Player                        */
/*                                                                 */
/* Platform   : AVRStudio4.12 sp4 + WinAVR20060421                 */
/*              optimize -0s                                       */
/* Author     : bozai(Zhang Qibo)                                  */
/* E-mail     : sudazqb@163.com                                    */
/* MSN        : zhangqibo_1985@hotmail.com                         */
/* Date       : 2006-12-29                                         */
/*******************************************************************/

#include"FAT.h"

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

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

//函數指針指向sd卡的讀寫函數
//function pointer to the sd card read & write single block
//wirte sector are not use in this player
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;

	WORD hidsec=0;

	BYTE buffer[512];
	if(FAT_ReadSector(0,buffer))return 1;
	bs = (struct bootsector710 *)buffer;
	if(bs->bsJump[0]!=0xE9 && bs->bsJump[0]!=0xEB)
	{
		pr = (struct partrecord *)((struct partsector *)buffer)->psPart;//first partition
		hidsec = pr->prStartLBA;//the hidden sectors
		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)//對付沒有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;
}

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


//讀下一簇簇號
//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
}


//在給定目錄下查找文件
//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 char 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;}
			for(offset=0;offset<512;offset+=32)
			{
				item=(struct direntry *)(&buffer[offset]);
				if((item->deName[0] != 0x00) & (item->deName[0] != 0xe5) & (item->deAttributes != 0x0f))
				{
					for(i=0;i<11;i++)
					{
						if(buffer[offset+i]!=name[i])break;
					}
					if(i==11)
					{
						//return the parameter of the item
						FileInfo->StartCluster = item->deStartCluster + (((unsigned long)item->deHighClust)<<16);//don't care
						FileInfo->Size         = item->deFileSize;
						FileInfo->Attr         = item->deAttributes;
						FileInfo->Sector       = FirstDirSector+cnt;
						FileInfo->Offset       = offset;
						free(buffer);
						return 0;
					}
				}
			}
		}
		free(buffer);//release
	}
	else//other folders
	{
		tempclust=cluster;
		while(1)
		{
			sector=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] != 0x00) & (item->deName[0] != 0xe5) & (item->deAttributes != 0x0f))
					{
						for(i=0;i<11;i++)
						{
							if(buffer[offset+i]!=name[i])break;
						}
						if(i==11)
						{
							FileInfo->StartCluster = item->deStartCluster + (((unsigned long)item->deHighClust)<<16);//don't care
							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(tempclust == 0x0fffffff || tempclust == 0x0ffffff8 || (FAT32_Enable == 0 && tempclust == 0xffff))break;
		}
	}
	return 1;
}

// find a directory with the given path
unsigned long FAT_OpenDir(BYTE * dir)
{
	BYTE name[11];
	BYTE *p=dir;
	BYTE deep=0;
	BYTE i,j;
	DWORD cluster=0;
	if(FAT32_Enable)cluster = FirstDirClust;
	if(*p != '\\')return 1;//invalid path
	while(*p)
	{
		if(*p == '\\')
		{
			deep++;
		}
		p++;
	}
	p=dir;
	for(i=0;i<deep-1;i++)
	{
		p++;
		for(j=0;j<11;j++)name[j]=0x20;
		j=0;
		while(*p != '\\')
		{
			if((*p) >= 'a' && (*p) <= 'z')name[j] = (*p++)-0x20;
			else name[j] = *p++;
			j++;
		}
		if(FAT_FindItem(cluster,name, &FileInfo))return 1;//find the directory
		cluster = FileInfo.StartCluster;
	}
	p++;
	for(j=0;j<11;j++)name[j]=0x20;
	j=0;
	while(*p)
	{
		if(*p>='a' && *p<='z')name[j]=(*p++)-0x20;
		else name[j]=*p++;
		j++;
	}
	if(j == 0)return cluster;
	if(FAT_FindItem(cluster,name, &FileInfo))return 1;//find the final directory
	cluster = FileInfo.StartCluster;
	return cluster;
}

//復制記錄項信息  //copy item
void CopyDirentruyItem(struct direntry *Desti,struct direntry *Source)
{
	BYTE i;
	for(i=0;i<8;i++)Desti->deName[i] = Source->deName[i];
	for(i=0;i<3;i++)Desti->deExtension[i] = Source->deExtension[i];
	Desti->deAttributes = Source->deAttributes;
	Desti->deLowerCase = Source->deLowerCase;
	Desti->deCHundredth = Source->deCHundredth;
	for(i=0;i<2;i++)Desti->deCTime[i] = Source->deCTime[i];
	for(i=0;i<2;i++)Desti->deCDate[i] = Source->deCDate[i];
	for(i=0;i<2;i++)Desti->deADate[i] = Source->deADate[i];
	Desti->deHighClust = Source->deHighClust;
	for(i=0;i<2;i++)Desti->deMTime[i] = Source->deMTime[i];
	for(i=0;i<2;i++)Desti->deMDate[i] = Source->deMDate[i];
	Desti->deStartCluster = Source->deStartCluster;
	Desti->deFileSize = Source->deFileSize;
}

//search the file , when *count = 0 it will bring the number whole songs, when *cout != 0 the *MusicInfo will bring the infomation of the file
BYTE Search(BYTE *dir,struct direntry *MusicInfo,WORD *Count,BYTE *type)//當COUNT為零時,有它帶回這個目錄下總共有多少首音樂
{                                                            //不為零時有MusicInfo帶回第Count首歌的詳細文件信息
	BYTE *buffer;
	//BYTE buff[3];
	DWORD sector;
	DWORD cluster;
	DWORD tempclust;
	unsigned char cnt;
	unsigned int offset;
	unsigned int i=0;
	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))
				{
					if((item->deExtension[0] == 'M')&&(item->deExtension[1] == 'P')&&(item->deExtension[2] == '3'))
					{
						CopyDirentruyItem(MusicInfo,item);
						*type=1;
						i++;
						if(i==*Count){free(buffer);return 0;}	
					}
					else if((item->deExtension[0] == 'W')&&(item->deExtension[1] == 'M')&&(item->deExtension[2] == 'A'))
					{
						CopyDirentruyItem(MusicInfo,item);
						*type=2;
						i++;
						if(i==*Count){free(buffer);return 0;}	
					}
					else if((item->deExtension[0] == 'M')&&(item->deExtension[1] == 'I')&&(item->deExtension[2] == 'D'))
					{
						CopyDirentruyItem(MusicInfo,item);
						*type=3;
						i++;
						if(i==*Count){free(buffer);return 0;}	
					}
				}
			}
		}
		free(buffer);//release
	}
	else//other folders
	{
		tempclust=cluster;
		while(1)
		{
			sector=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))
					{
						if((item->deExtension[0] == 'M')&&(item->deExtension[1] == 'P')&&(item->deExtension[2] == '3'))
						{
							CopyDirentruyItem(MusicInfo,item);
							i++;
							if(i==*Count){free(buffer);return 0;}	
						}
						else if((item->deExtension[0] == 'W')&&(item->deExtension[1] == 'M')&&(item->deExtension[2] == 'A'))
						{
							CopyDirentruyItem(MusicInfo,item);
							i++;
							if(i==*Count){free(buffer);return 0;}	
						}
						else if((item->deExtension[0] == 'M')&&(item->deExtension[1] == 'I')&&(item->deExtension[2] == 'D'))
						{
							CopyDirentruyItem(MusicInfo,item);
							i++;
							if(i==*Count){free(buffer);return 0;}	
						}
						else if((item->deExtension[0] == 'W')&&(item->deExtension[1] == 'A')&&(item->deExtension[2] == 'V'))
						{
							CopyDirentruyItem(MusicInfo,item);
							i++;
							if(i==*Count){free(buffer);return 0;}	
						}

					}
				}
			}
			free(buffer);//release
			tempclust=FAT_NextCluster(tempclust);//next cluster
			if(tempclust == 0x0fffffff || tempclust == 0x0ffffff8 || (FAT32_Enable == 0 && tempclust == 0xffff))break;
		}
	}
	if(*Count==0)*Count=i;
	return 0;	
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
另类欧美日韩国产在线| 欧美日韩高清影院| 国产激情视频一区二区三区欧美| 日韩电影在线观看一区| 亚洲成a人v欧美综合天堂| 亚洲综合成人网| 又紧又大又爽精品一区二区| 依依成人精品视频| 亚洲一区二三区| 亚洲国产另类精品专区| 午夜精品福利在线| 亚洲国产aⅴ成人精品无吗| 性感美女极品91精品| 日本aⅴ免费视频一区二区三区| 性久久久久久久久久久久| 蜜臀av国产精品久久久久 | 高清成人免费视频| 丰满放荡岳乱妇91ww| 成人av午夜电影| 91老师国产黑色丝袜在线| 色综合天天综合| 欧美日韩在线观看一区二区| 欧美日韩的一区二区| 日韩午夜精品视频| 久久久不卡网国产精品二区 | 国产成人午夜电影网| 国产999精品久久久久久| av不卡一区二区三区| 色综合久久天天综合网| 欧美日韩精品免费| 日韩精品一区二区三区老鸭窝| 亚洲精品在线一区二区| 国产精品嫩草影院com| 亚洲欧美另类久久久精品2019| 亚洲超碰精品一区二区| 精品在线视频一区| 成人av资源在线观看| 欧美日韩亚洲综合| 亚洲精品一区二区三区四区高清| 亚洲国产激情av| 亚洲电影中文字幕在线观看| 六月婷婷色综合| a4yy欧美一区二区三区| 欧美人牲a欧美精品| 久久精品无码一区二区三区| 亚洲最大的成人av| 韩国精品主播一区二区在线观看 | 国产美女视频91| 色婷婷香蕉在线一区二区| 欧美一区二区三区人| 国产精品免费视频观看| 日韩国产欧美在线观看| 成人深夜视频在线观看| 91精品在线麻豆| 国产精品久久毛片| 麻豆成人91精品二区三区| 91丝袜国产在线播放| 91麻豆精品国产91久久久更新时间| 亚洲国产精品传媒在线观看| 婷婷综合在线观看| 不卡一区二区三区四区| 日韩亚洲国产中文字幕欧美| 亚洲色图欧美偷拍| 国产在线播放一区| 欧美精品日韩精品| 综合精品久久久| 国产揄拍国内精品对白| 欧美日韩三级一区二区| 亚洲欧洲成人自拍| 国产久卡久卡久卡久卡视频精品| 欧美日韩一级二级三级| 国产精品欧美一区二区三区| 老汉av免费一区二区三区| 在线观看不卡视频| 国产精品美女久久久久aⅴ| 精品一二三四在线| 欧美日韩大陆一区二区| 一区二区三区不卡视频在线观看| 国产高清亚洲一区| 精品第一国产综合精品aⅴ| 亚洲h动漫在线| 在线观看91精品国产入口| 国产精品视频九色porn| 精品一二三四在线| 欧美一区二区成人6969| 性久久久久久久久久久久| 91久久人澡人人添人人爽欧美| 国产精品免费视频一区| 国产成人无遮挡在线视频| 欧美成人三级在线| 日韩电影免费一区| 欧美日韩在线播| 亚洲在线免费播放| 91精品福利在线| 亚洲激情男女视频| 欧美在线观看18| 亚洲黄色av一区| 在线视频观看一区| 玉米视频成人免费看| 免费观看日韩电影| 国产黄人亚洲片| 久久久亚洲精品一区二区三区| 麻豆精品在线看| 精品久久久影院| 精品一区二区在线免费观看| 欧美电影免费观看完整版| 麻豆国产欧美一区二区三区| 欧美一区二区免费视频| 蜜臀91精品一区二区三区| 日韩欧美成人午夜| 九九热在线视频观看这里只有精品| 日韩欧美一区二区不卡| 蜜桃视频一区二区| 精品精品国产高清一毛片一天堂| 狠狠色狠狠色综合| 国产喷白浆一区二区三区| 粉嫩aⅴ一区二区三区四区 | 极品尤物av久久免费看| 2020国产精品| 国产盗摄一区二区| 日韩伦理av电影| 在线一区二区三区四区| 日日摸夜夜添夜夜添国产精品| 日韩一区二区三| 国产老肥熟一区二区三区| 国产精品嫩草99a| 欧美午夜电影在线播放| 奇米一区二区三区| 欧美国产精品v| 在线看国产一区二区| 日韩成人av影视| 国产欧美一区二区三区在线老狼| 成人免费看视频| 亚洲第一久久影院| 精品99久久久久久| 北岛玲一区二区三区四区| 亚洲一区二区影院| 欧美成人三级在线| 99re亚洲国产精品| 日韩一区欧美二区| 国产香蕉久久精品综合网| 色综合久久综合网97色综合| 日日摸夜夜添夜夜添亚洲女人| 久久蜜桃av一区二区天堂| 91色porny在线视频| 日本午夜精品视频在线观看| 欧美国产一区二区| 欧美日韩免费在线视频| 成人综合在线观看| 亚洲一区二区av在线| 久久综合久久久久88| 91黄视频在线观看| 国产一区二区在线看| 亚洲欧美乱综合| 精品欧美黑人一区二区三区| 99在线视频精品| 久久国产乱子精品免费女| 亚洲欧洲另类国产综合| 91精品国产免费| 一本一本大道香蕉久在线精品| 久久av中文字幕片| 一区二区三区免费观看| 337p粉嫩大胆色噜噜噜噜亚洲| 91蝌蚪porny| 国产伦精品一区二区三区在线观看| 亚洲影视在线观看| 国产精品久久久久影视| 欧美一区二区三区视频免费播放| 91蜜桃视频在线| 国产成人精品亚洲日本在线桃色| 一区二区三区免费在线观看| 欧美经典一区二区三区| 91精品国产综合久久久久久| 91视频免费观看| 麻豆国产一区二区| 日韩精品一二区| 亚洲制服丝袜在线| 一色桃子久久精品亚洲| 久久精品欧美一区二区三区不卡| 8v天堂国产在线一区二区| 成人不卡免费av| 国产麻豆精品在线观看| 麻豆精品精品国产自在97香蕉| 香港成人在线视频| 亚洲伦在线观看| 国产精品毛片无遮挡高清| www国产成人| 国产毛片一区二区| 亚洲欧洲精品成人久久奇米网| 久久久久国产精品免费免费搜索| 欧美一区日韩一区| 欧美精品成人一区二区三区四区| 国产宾馆实践打屁股91| 精品一二三四区| 日韩电影免费在线| 亚洲一区影音先锋| 亚洲欧美日本韩国| 最新久久zyz资源站| 国产精品久久久久久久久快鸭| 久久精品视频一区|