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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? fat.c

?? 用atmega64+vs1003(音頻解碼芯片)+SD制成的板子
?? C
?? 第 1 頁 / 共 2 頁
字號:
/************************************************************/
/*		         	FAT 			 					    */
/*				  											*/
/************************************************************/
#include <avr/io.h>
#include <string.h>
#include <avr/eeprom.h>
#include "sd.h"
#include "fat.h"
#include "lcd.h"
extern uchar BUFFER[512];
extern uchar WorkFlag;
unsigned char FatType;  //0:FAT12  1:FAT16   2:FAT32
unsigned long FAT_MASK;
unsigned int  RootDirEnts;       //根目錄總的項數(shù)(FAT12&FAT16)
unsigned long FirstDataSector;   //數(shù)據(jù)區(qū)
unsigned int  BytesPerSector;
unsigned int  SectorsPerCluster;
unsigned long FirstFATSector;
ROOTDIR_INF   RootDir;  //目錄區(qū)FIND_FILE_INFO	FindInfo;
//********************************************************************************************
//讀一個扇區(qū)
void ReadBlock(unsigned long LBA)
//********************************************************************************************
{   unsigned long temp;
    temp=LBA<<9;
    SD_Read_Block(temp);
}  
void ReadBlockToBuff(unsigned long LBA,unsigned char *pbuff)
{
		unsigned long temp;
    temp=LBA<<9;
    SD_Read_Block2(temp,pbuff);
}
unsigned long  fatGetRootSector(void)
{
	if(FatType == FAT32)
		return ((RootDir.Clust-2)* SectorsPerCluster) +FirstDataSector;
	 return  RootDir.Sector;
}
unsigned long fatGetRootClust(void)
{
	  if(FatType==FAT32)  return RootDir.Clust;
	  	                  return 0x00000000;
	
}

/*-----------------------------------------------------------------------
 查詢數(shù)據(jù)區(qū)一個簇開始扇區(qū)號
-----------------------------------------------------------------------*/
unsigned long fatClustToSect(unsigned long clust)
{
	return ((clust-2) * SectorsPerCluster) + FirstDataSector;
}
/*-----------------------------------------------------------------------
 查詢一個簇所占扇區(qū)數(shù)
-----------------------------------------------------------------------*/
unsigned int fatClusterSize(void)
{
	// return the number of sectors in a disk cluster
	return SectorsPerCluster;
}

//文件系統(tǒng)初始化
unsigned char fatInit()
{ 
	PARTRECORD PartInfo;
	BPB710 *bpb=0;
 	ReadBlock(0);      // 讀取分區(qū)表信息  
	PartInfo = *((PARTRECORD *) ((PARTSECTOR *)BUFFER)->psPart);
	// 引導扇區(qū)號在PartInfo.prStartLBA中
 	ReadBlock(PartInfo.prStartLBA);  //ataReadSectors( DRIVE0, PartInfo.prStartLBA, 1, SectorBuffer );
	bpb = (BPB710 *) &((BOOTSECTOR710 *) BUFFER)->bsBPB;
	FirstDataSector	= PartInfo.prStartLBA;
	if(bpb->bpbFATsecs)
	{
		// bpbFATsecs非0,為FAT16,FAT表所占的扇區(qū)數(shù)在bpbFATsecs里
		FirstDataSector	+= bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs; 
	}
	else
	{
		// bpbFATsecs是0,為FAT32,FAT表所占的扇區(qū)數(shù)在bpbBigFATsecs里
		FirstDataSector	+= bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbBigFATsecs;
	}
	SectorsPerCluster	= bpb->bpbSecPerClust;
	BytesPerSector		= bpb->bpbBytesPerSec;
	FirstFATSector		= bpb->bpbResSectors + PartInfo.prStartLBA;
	switch (PartInfo.prPartType)
	{
		case PART_TYPE_FAT12:   
		 	RootDir.Sector=    FirstDataSector;
		 	FirstDataSector += ((bpb->bpbRootDirEnts*32)/BytesPerSector);
		 	RootDirEnts = bpb->bpbRootDirEnts;
			FatType = FAT12;  
			FAT_MASK=FAT12_MASK;
			break;
		case PART_TYPE_DOSFAT16:
		case PART_TYPE_FAT16: 
		case PART_TYPE_FAT16LBA:
		 	RootDir.Sector =   FirstDataSector;
			FirstDataSector += (bpb->bpbRootDirEnts*32)/BytesPerSector;
			RootDirEnts = bpb->bpbRootDirEnts;
			FatType = FAT16; 
			FAT_MASK=FAT16_MASK;	
			break;
		case PART_TYPE_FAT32LBA:
		case PART_TYPE_FAT32:
			RootDir.Clust = bpb->bpbRootClust;
			FAT_MASK=FAT32_MASK;
			FatType = FAT32; 
			break;
		default:
			return 0;
	}  
	return 1;	
}

#define MP3_TYPE   0
#define WMA_TYPE   1
#define MID_TYPE   2
#define LRC_TYPE   3
unsigned char filetype[][3] PROGMEM ={ {"MP3"},{"WMA"},{"MID"},{"LRC"}};
unsigned char hzk12[][11] PROGMEM =
{{"HZK12      "},
 {"UNITOGB BIN"},
 {".          "},
 {"..         "}
};
unsigned char IsHzk12File(unsigned char *pbuf)
{ 
	unsigned char i;
	for(i=0;i<11;i++){
		if(pgm_read_byte(hzk12[0]+i)!=pbuf[i]) break;
	}
   if(i==11)    return 1;  //find ok    
   return 0;
}
unsigned char IsUnitogbFile(unsigned char *pbuf)
{ 
	unsigned char i;
	for(i=0;i<11;i++){
		if(pgm_read_byte(hzk12[1]+i)!=pbuf[i]) break;
	}
   if(i==11)    return 1;  //find ok    
   return 0;
}
unsigned char IsFatherDir(unsigned char *strName)
{
	unsigned char i;
	for(i=0;i<3;i++){
		if(pgm_read_byte(hzk12[3]+i)!=strName[i]) break;
	}
	if(i==3)    return 1;  //是上層目錄
	return 0;	
	
}

unsigned char IsCurDir(unsigned char *strName)
{
	unsigned char i;
	for(i=0;i<3;i++){
		if(pgm_read_byte(hzk12[2]+i)!=strName[i]) break;
	}
	if(i==3)    return 1;  //是當前目錄
	return 0;	
	
}
unsigned char IsMusicFile(unsigned char *strName)
{
	unsigned char i;
	for(i=0;i<3;i++){
		if(pgm_read_byte(filetype[MP3_TYPE]+i)!=strName[i]) break;
	}
	if(i==3)    return 1;  //是MP3文件
	for(i=0;i<3;i++){
		if(pgm_read_byte(filetype[WMA_TYPE]+i)!=strName[i]) break;
	}
	if(i==3)    return 2; //是WMA文件
/*
	for(i=0;i<3;i++){
		if(pgm_read_byte(filetype[MID_TYPE]+i)!=strName[i]) break;
	}
	if(i==3)    return 3; //是MIDI文件
*/
	return 0; 
}		
/*-----------------------------------------------------------------------
 在FAT表中查詢下一個簇號
-----------------------------------------------------------------------*/
unsigned long fatNextCluster(unsigned long cluster)
{
	unsigned long nextCluster=0;
	unsigned long fatOffset;
	unsigned long sector;
	unsigned int offset;
	if(FatType==FAT32 )	// 一個表項為4bytes(32 bits)
	{
		fatOffset = cluster << 2;
		sector = FirstFATSector + (fatOffset / BytesPerSector);	//計算FAT扇區(qū)號
		offset = fatOffset % BytesPerSector; //計算FAT扇區(qū)號中表項的偏移地址
		nextCluster=SD_Read_Dword(sector,offset);
		//ReadBlock(sector);  // 讀取下一個簇號	
		//nextCluster = (*((unsigned long*) &((char*)BUFFER)[offset])) ;
	}else if(FatType==FAT16){    // 一個表項為2bytes(16 bits)
		fatOffset = cluster << 1; 	//計算FAT扇區(qū)號
	  	sector = FirstFATSector + (fatOffset / BytesPerSector);
	  	offset = fatOffset % BytesPerSector;//計算FAT扇區(qū)號中表項的偏移地址
	  	nextCluster=SD_Read_Word(sector,offset);
//  	ReadBlock(sector);	
//		nextCluster = (*((unsigned int*) &((char*)BUFFER)[offset])) ;
	}else if(FatType==FAT12){	// 一個表項為1.5bytes(12 bits)
		fatOffset = cluster+(cluster>>1);
		sector = FirstFATSector + (fatOffset / BytesPerSector);
		offset = fatOffset % BytesPerSector;
//	ReadBlock(sector);
		if(offset==(BytesPerSector-1)){
			nextCluster=SD_Read_Word(sector,offset-1)>>8;
	//	nextCluster=(unsigned long)BUFFER[offset];	//低位
	//		ReadBlock(sector+1);
			nextCluster|=((SD_Read_Word(sector+1,0)<<8)&0x0000ffff);
//		nextCluster|=(BUFFER[0]<<8)&0x0000ffff;  //高位,必須與,否則會出現(xiàn)錯誤
		}else{
		nextCluster=SD_Read_Word(sector,offset);
//	  	nextCluster =(*((unsigned int*) &((char*)BUFFER)[offset])) ;
		}
		if(cluster&0X00000001){   //取低12位地址
		  	nextCluster>>=4;
		}else{  //取高12位地址
		  	nextCluster&=0x00000fff;
		}
	}
	// 是否文件的結(jié)束簇
	if (nextCluster >= (CLUST_EOFS & FAT_MASK))
	 nextCluster = CLUST_EOFE;
	return nextCluster;
} 
 
//在根目錄中查找漢字庫文件的首簇號及UNITCODE碼轉(zhuǎn)換表文件的首簇號---
// 
void GetSysFileClust(unsigned long *hzk,unsigned long *unit)
{
	DIRENTRY *de=0;	   
	FIND_FILE_INFO	fp;  

	InitSetPath(&fp,fatGetRootClust());
	ReadBlock(fp.Sector);     //重新讀取目錄表
	(*hzk)=(*unit)=0;
	do{
		if(!ReadNextDirEntry(&fp))  break;
		de = (DIRENTRY *)BUFFER;
		de+=fp.Index;
		if(*de->deName != 0xe5){
			if((de->deAttributes&ATTR_LONG_FILENAME)!=ATTR_LONG_FILENAME){
			if((de->deAttributes&ATTR_DIRECTORY)!= ATTR_DIRECTORY)// is it a directory ?
			if(*hzk==0){
				if(IsHzk12File(de->deName))
					*hzk= (unsigned long) ((unsigned long)de->deHighClust << 16) + de->deStartCluster;
			}
			if(*unit==0){
				if(IsUnitogbFile(de->deName))
				   *unit= (unsigned long) ((unsigned long)de->deHighClust << 16) + de->deStartCluster;	
		 	} 
		 	if((*hzk!=0)&&(*unit!=0))   break;
		  }
		}
		de++;
	    fp.Index++;
	 if(de->deName[0]==0)   break;
	}while (1);
}  
void InitSetPath(FIND_FILE_INFO *fp,unsigned long dircluster)
{
	fp->Nums=0x8000;      //高位為1表示不是FAT12&fat16的根目錄
	fp->Clust=dircluster;
		if(dircluster==0x00000000){  //根目錄區(qū)
			if(FatType==FAT32){
				    fp->Sector= fatClustToSect(RootDir.Clust);
					fp->Clust = RootDir.Clust;
				}else{
					fp->Sector = RootDir.Sector;   //得到目錄區(qū)的扇區(qū)號
					fp->Nums = RootDirEnts;
				}                                  //此時根目錄項數(shù)是確定大小的	
		}else{
				 fp->Sector=fatClustToSect(dircluster);
		}		
    fp->Index = 0;
	fp->NumSector=0;
}

//在當前的目錄中查找歌詞文件,找到置相關(guān)數(shù)據(jù)至lyric中
//入口: 1.dircluster    當前目錄的首簇號,若是FAT12或FAT16的根目錄則為0
void FindLrcFile(unsigned long dircluster,unsigned char *strName)
{
	FIND_FILE_INFO	fp;
	DIRENTRY *de=0;	

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品免费在线| 经典三级在线一区| 色综合久久六月婷婷中文字幕| 国产三级精品视频| 不卡影院免费观看| 中文字幕字幕中文在线中不卡视频| 成人午夜在线播放| 亚洲欧美日韩国产综合| 欧美色国产精品| 喷白浆一区二区| 2欧美一区二区三区在线观看视频| 裸体健美xxxx欧美裸体表演| 久久免费精品国产久精品久久久久 | 3751色影院一区二区三区| 日本最新不卡在线| 日韩一区二区影院| 成人三级伦理片| 亚洲在线观看免费视频| 日韩午夜小视频| 99免费精品在线观看| 亚洲一区在线播放| 精品国产免费久久| 91视频国产观看| 麻豆国产欧美日韩综合精品二区| 中文字幕+乱码+中文字幕一区| 日本丶国产丶欧美色综合| 丝袜诱惑亚洲看片| 国产日产欧美精品一区二区三区| 91久久免费观看| 精品中文字幕一区二区| 最新日韩在线视频| 精品欧美一区二区三区精品久久| 成人综合婷婷国产精品久久免费| 亚洲丰满少妇videoshd| 日本一二三不卡| 69堂亚洲精品首页| 色综合一区二区| 韩国女主播一区| 亚洲另类在线视频| 久久一区二区三区四区| 欧美美女喷水视频| 99精品视频中文字幕| 久久精品国产99| 亚洲一线二线三线视频| 国产欧美精品日韩区二区麻豆天美| 欧美视频在线一区二区三区| 风流少妇一区二区| 老司机精品视频一区二区三区| 亚洲欧美一区二区三区久本道91| 久久久久久久综合| 91精品久久久久久久91蜜桃| 色综合久久88色综合天天| 国产91在线观看| 蜜臀av一区二区| 亚洲国产精品精华液网站| 国产精品国产a| 欧美国产日本视频| 久久蜜臀中文字幕| xvideos.蜜桃一区二区| 91精品国产色综合久久不卡蜜臀 | 日本午夜精品一区二区三区电影| 亚洲激情自拍视频| 亚洲欧美日韩成人高清在线一区| 欧美激情综合在线| 国产欧美日韩视频在线观看| 精品久久久久久亚洲综合网| 欧美一区二区人人喊爽| 欧美日韩一级黄| 欧美性受xxxx| 欧洲人成人精品| 欧美在线播放高清精品| 在线日韩av片| 欧美色图一区二区三区| 在线观看不卡一区| 欧美日韩在线播放三区| 91黄色小视频| 欧美色大人视频| 51精品久久久久久久蜜臀| 制服丝袜中文字幕一区| 91精品国产一区二区三区蜜臀| 69堂亚洲精品首页| 精品久久一区二区三区| 亚洲精品在线一区二区| 2020日本不卡一区二区视频| 亚洲精品一区二区精华| 国产性色一区二区| 亚洲欧洲色图综合| 一卡二卡欧美日韩| 日韩极品在线观看| 国产一区二区在线影院| 国产成人精品免费一区二区| 成人激情黄色小说| 在线一区二区三区四区| 欧美日韩精品免费| 欧美电影精品一区二区| 国产网红主播福利一区二区| 国产精品免费视频一区| 一区二区三区在线播放| 午夜久久电影网| 国产乱淫av一区二区三区| 不卡一二三区首页| 精品1区2区3区| 欧美不卡一区二区三区四区| 日本一区二区三区在线不卡| 亚洲美女区一区| 日本中文字幕一区二区有限公司| 国产在线视频一区二区| 99久久精品情趣| 91精品免费在线| 国产精品国产三级国产普通话99 | 亚洲高清视频在线| 秋霞av亚洲一区二区三| 成人免费毛片a| 欧美精品日韩综合在线| 国产亚洲一区二区三区四区| 悠悠色在线精品| 蜜桃av噜噜一区| 91丨九色丨国产丨porny| 欧美一区二区三区视频免费播放 | 91免费在线播放| 91精品国产综合久久精品麻豆| 久久一区二区三区国产精品| 亚洲自拍另类综合| 国产麻豆精品95视频| 欧美日韩免费电影| 国产精品视频在线看| 日本亚洲最大的色成网站www| www.欧美日韩| 欧美tickling挠脚心丨vk| 亚洲精品免费一二三区| 黄色资源网久久资源365| 欧美主播一区二区三区| 国产欧美日韩另类视频免费观看| 亚洲资源在线观看| 成人一级片在线观看| 91精品国产综合久久久久| 一区二区三区精品视频| 国产成人欧美日韩在线电影| 91精品国产综合久久福利软件| 亚洲男人电影天堂| 国产一区二区三区日韩| 制服丝袜av成人在线看| 一区二区三区在线观看动漫| 丁香婷婷综合网| 精品国产乱子伦一区| 丝袜美腿亚洲一区| 欧美三级午夜理伦三级中视频| 中文字幕日韩一区| 成人免费观看男女羞羞视频| 久久这里只有精品视频网| 日韩电影在线免费| 4438x亚洲最大成人网| 亚洲国产日产av| 在线亚洲欧美专区二区| 亚洲欧美另类小说| 91丨九色porny丨蝌蚪| 国产精品大尺度| 成人国产精品视频| 欧美国产日韩精品免费观看| 国产69精品久久99不卡| 久久久不卡网国产精品二区| 久久超碰97人人做人人爱| 日韩亚洲欧美在线| 美日韩黄色大片| 精品福利二区三区| 韩国成人精品a∨在线观看| 精品欧美久久久| 国产乱码精品一品二品| 国产日韩欧美精品一区| 岛国精品在线播放| 欧美激情在线看| 9l国产精品久久久久麻豆| 中文字幕日韩一区二区| 色狠狠色噜噜噜综合网| 亚洲一区二区三区视频在线播放 | 色综合色综合色综合色综合色综合 | 91福利小视频| 亚洲香肠在线观看| 欧美猛男gaygay网站| 日韩不卡一区二区| 欧美成人性福生活免费看| 国产一区二区三区精品欧美日韩一区二区三区 | 欧美三级视频在线播放| 亚洲aaa精品| 日韩精品自拍偷拍| 国产精品性做久久久久久| 国产精品妹子av| 在线欧美小视频| 捆绑调教美女网站视频一区| 久久一二三国产| 色伊人久久综合中文字幕| 日韩制服丝袜先锋影音| 久久免费美女视频| 91成人国产精品| 麻豆精品视频在线| 中文字幕的久久| 欧美撒尿777hd撒尿| 欧美aaaaaa午夜精品| 国产精品女人毛片| 3751色影院一区二区三区|