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

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

?? 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;       //根目錄總的項數(FAT12&FAT16)
unsigned long FirstDataSector;   //數據區
unsigned int  BytesPerSector;
unsigned int  SectorsPerCluster;
unsigned long FirstFATSector;
ROOTDIR_INF   RootDir;  //目錄區FIND_FILE_INFO	FindInfo;
//********************************************************************************************
//讀一個扇區
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;
	
}

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

//文件系統初始化
unsigned char fatInit()
{ 
	PARTRECORD PartInfo;
	BPB710 *bpb=0;
 	ReadBlock(0);      // 讀取分區表信息  
	PartInfo = *((PARTRECORD *) ((PARTSECTOR *)BUFFER)->psPart);
	// 引導扇區號在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表所占的扇區數在bpbFATsecs里
		FirstDataSector	+= bpb->bpbResSectors + bpb->bpbFATs * bpb->bpbFATsecs; 
	}
	else
	{
		// bpbFATsecs是0,為FAT32,FAT表所占的扇區數在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扇區號
		offset = fatOffset % BytesPerSector; //計算FAT扇區號中表項的偏移地址
		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扇區號
	  	sector = FirstFATSector + (fatOffset / BytesPerSector);
	  	offset = fatOffset % BytesPerSector;//計算FAT扇區號中表項的偏移地址
	  	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;  //高位,必須與,否則會出現錯誤
		}else{
		nextCluster=SD_Read_Word(sector,offset);
//	  	nextCluster =(*((unsigned int*) &((char*)BUFFER)[offset])) ;
		}
		if(cluster&0X00000001){   //取低12位地址
		  	nextCluster>>=4;
		}else{  //取高12位地址
		  	nextCluster&=0x00000fff;
		}
	}
	// 是否文件的結束簇
	if (nextCluster >= (CLUST_EOFS & FAT_MASK))
	 nextCluster = CLUST_EOFE;
	return nextCluster;
} 
 
//在根目錄中查找漢字庫文件的首簇號及UNITCODE碼轉換表文件的首簇號---
// 
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){  //根目錄區
			if(FatType==FAT32){
				    fp->Sector= fatClustToSect(RootDir.Clust);
					fp->Clust = RootDir.Clust;
				}else{
					fp->Sector = RootDir.Sector;   //得到目錄區的扇區號
					fp->Nums = RootDirEnts;
				}                                  //此時根目錄項數是確定大小的	
		}else{
				 fp->Sector=fatClustToSect(dircluster);
		}		
    fp->Index = 0;
	fp->NumSector=0;
}

//在當前的目錄中查找歌詞文件,找到置相關數據至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一区二区三区免费野_久草精品视频
欧美日韩亚洲综合| 一区二区三区免费看视频| 国产午夜精品在线观看| 中文字幕av一区二区三区免费看| 综合色天天鬼久久鬼色| 日本不卡123| 国产激情一区二区三区四区| 91精品福利视频| 精品国产乱码久久久久久久 | 免费在线观看一区二区三区| 蜜臀久久久99精品久久久久久| 国产成人精品三级| 欧美老肥妇做.爰bbww视频| 欧美精选一区二区| 国产精品久久久久aaaa| 蜜桃视频一区二区三区在线观看| 日韩高清中文字幕一区| 成人国产精品免费| 日韩一级片在线观看| 国产精品麻豆99久久久久久| 视频一区欧美精品| 91麻豆国产香蕉久久精品| 欧美刺激脚交jootjob| 一区二区三区四区蜜桃| 国产真实乱偷精品视频免| 精品视频一区二区三区免费| 国产亚洲精品资源在线26u| 性做久久久久久免费观看欧美| 高清shemale亚洲人妖| 日韩欧美一区二区视频| 亚洲国产色一区| 91丝袜美腿高跟国产极品老师| 欧美精品一区二区三区一线天视频| 一区二区三区免费看视频| 国产精品一区二区在线播放| 日韩西西人体444www| 亚洲一区二区成人在线观看| av成人动漫在线观看| 国产精品久线在线观看| 精品一区二区综合| 日韩免费视频线观看| 婷婷久久综合九色综合绿巨人| 91久久精品午夜一区二区| 中文字幕第一区二区| 国产精品一区一区三区| 久久久噜噜噜久噜久久综合| 久久成人久久爱| 精品第一国产综合精品aⅴ| 免费成人av在线播放| 欧美一区二区三区婷婷月色| 亚洲福利一二三区| 91精品国产麻豆国产自产在线 | 欧美日韩高清一区| 亚洲一区二区精品视频| 欧美亚洲国产一区二区三区| 亚洲综合在线电影| 欧美日韩在线三区| 天天操天天干天天综合网| 欧美日韩卡一卡二| 热久久免费视频| 日韩精品一区二区三区在线观看| 久久国产三级精品| 欧美激情一区二区三区全黄| bt欧美亚洲午夜电影天堂| 亚洲乱码一区二区三区在线观看| 在线观看不卡一区| 蜜臀久久99精品久久久画质超高清| 日韩精品在线一区二区| 国产乱国产乱300精品| 亚洲国产高清aⅴ视频| 97se亚洲国产综合在线| 亚洲成av人片在线| 欧美r级电影在线观看| 国产成人av电影在线观看| 最新高清无码专区| 欧美日韩国产小视频在线观看| 秋霞午夜av一区二区三区| 精品成人一区二区三区四区| 国产精品99精品久久免费| 亚洲美女在线一区| 欧美一区二区黄色| 丁香六月综合激情| 亚洲国产成人porn| 久久精品这里都是精品| 91免费视频网址| 久久丁香综合五月国产三级网站| 国产精品系列在线| 欧美日韩亚州综合| 国产91精品在线观看| 日日夜夜免费精品视频| 欧美激情在线观看视频免费| 欧美主播一区二区三区美女| 国产一区二区女| 偷拍亚洲欧洲综合| 中文字幕亚洲一区二区av在线 | 欧美日韩午夜在线视频| 国产在线播放一区| 午夜视频久久久久久| 欧美国产1区2区| 日韩亚洲国产中文字幕欧美| 91官网在线免费观看| 成人黄色软件下载| 久久99久久99| 午夜伊人狠狠久久| 亚洲色图视频网站| 久久久久久久久99精品| 欧美视频一区二区在线观看| 夫妻av一区二区| 韩国一区二区视频| 日韩电影在线免费| 亚洲成人激情综合网| 久久亚洲综合色| 欧美丝袜丝交足nylons| 国产91综合网| 久久av资源网| 亚洲成人资源网| 中文字幕一区二区三| 精品欧美乱码久久久久久| 色呦呦国产精品| 国产成人一级电影| 激情久久久久久久久久久久久久久久| 亚洲欧美日韩中文播放 | 五月婷婷色综合| 一区二区欧美精品| 亚洲黄色片在线观看| 1区2区3区欧美| 国产精品久久毛片a| 国产日韩欧美一区二区三区综合| 欧美mv日韩mv国产| 欧美精品一区二| 久久综合丝袜日本网| 久久综合色之久久综合| 欧美日韩国产精品成人| 欧美体内she精视频| 一本久道久久综合中文字幕| 色婷婷久久久亚洲一区二区三区| 色综合一区二区三区| 欧美色欧美亚洲另类二区| 欧美性淫爽ww久久久久无| 欧美性猛交xxxx乱大交退制版| 在线观看亚洲成人| 欧美丝袜第三区| 日韩一级欧美一级| 欧美精品一区二区三区四区 | 欧美国产一区在线| 国产精品女主播av| 国产精品成人免费在线| 亚洲三级电影网站| 亚洲高清中文字幕| 激情综合色综合久久综合| 国产福利一区二区三区视频在线| 国产成人精品免费一区二区| 99久久精品免费| 在线影视一区二区三区| 717成人午夜免费福利电影| 欧美精品一区二区三区在线| 国产精品色哟哟| 亚洲精品成人天堂一二三| 日韩av一区二| 裸体一区二区三区| 激情久久五月天| 成人免费观看av| 欧美伊人久久大香线蕉综合69| 欧美一卡二卡三卡| 国产欧美一区二区三区鸳鸯浴| 日韩va欧美va亚洲va久久| 国内成人自拍视频| 色琪琪一区二区三区亚洲区| 欧美一区二区三级| 国产精品国产三级国产普通话三级| 亚洲一区二区三区激情| 国产精品一色哟哟哟| 欧美三级乱人伦电影| 国产精品亚洲成人| 欧美午夜电影在线播放| xfplay精品久久| 国产精品久久久久久久第一福利| 午夜a成v人精品| 国产成人av电影在线播放| 666欧美在线视频| 国产精品嫩草影院com| 日本欧美一区二区| 91成人国产精品| 国产精品五月天| 韩日欧美一区二区三区| 欧美日本韩国一区二区三区视频| 国产欧美精品一区二区色综合| 日韩电影在线观看网站| 一本久久a久久免费精品不卡| 亚洲精品在线观看网站| 亚洲午夜成aⅴ人片| 丰满岳乱妇一区二区三区| 日韩区在线观看| 亚洲福利视频一区二区| 国产精品 日产精品 欧美精品| 欧美综合一区二区三区| 欧美一区二区免费| 欧美激情一二三区| 精品亚洲免费视频| 91精品在线观看入口|