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

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

?? fat.c

?? SD卡的讀寫(xiě)
?? C
字號(hào):
//鎮(zhèn)關(guān)西編寫(xiě) QQ 191635418
#define fat_h
#include "fat.h"
extern unsigned char SD_Buffer[512];
extern UCHAR SD_Read_Block(ULONG addr);
extern void UDRT0_print(unsigned char d);
extern unsigned char getch();
void Debug_Pstr(const unsigned char *str);
void Debug_Pdata(unsigned long data);
void Debug_P16(unsigned char d);
void Debug_Msg(const unsigned char *str,unsigned long data);

unsigned long Block0_offset;
unsigned long FirstDataSector;
unsigned int  BytesPerSector;
unsigned int  SectorsPerCluster;
unsigned long FirstFATSector;
unsigned long FirstDirSector;
unsigned int  FirstDirCluster;	//Fat32時(shí)候根目錄所在的簇
unsigned long FileSize;
unsigned long FatInCache = 0;

FOPT fopen_rcd[MAXFILES];			//用于記錄被打開(kāi)的文件的多少的

unsigned long FatSetBlock0()					
{
	//設(shè)置分區(qū)開(kāi)始的偏移量
	//邏輯扇區(qū)0 相對(duì)于物理扇區(qū)0的偏移量
	Block0_offset=*((ULONG*)(&SD_Buffer[0x1c6]));
	return Block0_offset;
}
/*
unsigned char FatReadBlock(ULONG addr)
{
	return SD_Read_Block(Block0_offset+addr);
}
*/
#define	FatReadBlock(addr)	SD_Read_Block(Block0_offset+addr)
unsigned long ClustToSector(unsigned long Clust)
{
	return (Clust-2)*SectorsPerCluster+FirstDataSector;
}

unsigned long FindNextClust(unsigned long NowClust)
{
	unsigned int offset;
	//unsigned long ret;
	NowClust<<=2;
	offset=NowClust%BytesPerSector;
	NowClust/=BytesPerSector;
	FatReadBlock(NowClust+FirstFATSector);
	//Debug_Msg("偏移:",offset);
	//Debug_Msg("扇區(qū):",NowClust);
	//Debug_Msg("扇區(qū)數(shù)據(jù):",SD_Buffer[offset]);
	//ret=*( (unsigned long*)(&SD_Buffer[offset]) );		//可能要考慮大端小端的問(wèn)題 在不同的編譯器中
	//return ret;
	return *( (unsigned long*)(&SD_Buffer[offset]) );
}

void InitFat32()
{
	struct bpb710 *bpb;
	SD_Read_Block(0);		
	FatSetBlock0();
	FatReadBlock(0);		//讀取邏輯扇區(qū)0 系統(tǒng)引導(dǎo)區(qū)
	//Debug_Msg("邏輯0扇區(qū)地址:",Block0_offset);
	bpb=(struct bpb710 *)(&SD_Buffer[0x0B]);	//獲取相關(guān)信息
	BytesPerSector=bpb->bpbBytesPerSec;
	//Debug_Msg("每個(gè)扇區(qū)的字節(jié)數(shù)",BytesPerSector);
	SectorsPerCluster=bpb->bpbSecPerClust;
	//Debug_Msg("每個(gè)簇的扇區(qū)數(shù)",SectorsPerCluster);
	FirstDataSector=bpb->bpbResSectors+bpb->bpbFATs*bpb->bpbBigFATsecs;
	//Debug_Msg("數(shù)據(jù)區(qū)的開(kāi)始位置:",FirstDataSector);
	FirstFATSector= bpb->bpbResSectors;
	//Debug_Msg("FAT表格大小",bpb->bpbBigFATsecs);
	//Debug_Msg("Fat表格的開(kāi)始位置:",FirstFATSector);
	FirstDirCluster=bpb->bpbRootClust;
	//Debug_Msg("根目錄所在簇:",FirstDirCluster);
	FirstDirSector=bpb->bpbResSectors+bpb->bpbFATs*bpb->bpbBigFATsecs;
	//FatReadBlock(FirstFATSector);
	//FatReadBlock(FirstDataSector);
	/*
	{
		unsigned int i;
		for(i=0;i<512;i++)
		{
			if(((i&0x0f)==0)) {UDRT0_print('\n');UDRT0_print('\r');}
			Debug_P16(SD_Buffer[i]);
		}
	}
	*/
}

unsigned char Cmpstr_withnum(unsigned char *d1,unsigned char *d2,unsigned char len)
{
	while(len--)
	{
		if(*d1++!=*d2++)	return 0;
	}
	return 1;
}
unsigned char GetFileName(unsigned char *filename,const unsigned char **instr )
{
	unsigned char i,d;
	for(i=0;i<11;i++)	filename[i]=0x20;
	while(**instr=='/')	 (*instr)++;
	i=0;d=**instr;
	while(d!=0 && d!='.' && d!='/' && i<8)
	{
		if(d>='a' && d<='z')	filename[i]=d+'A'-'a';
		else					filename[i]=d;
		++i;
		++(*instr);
		d=**instr;
	}
	if(d!=0 && d!='/')
	{
		if(d!='.')	return 0;		//文件名字大于8個(gè)字節(jié) 錯(cuò)誤
		++(*instr);
		i=0;d=**instr;
		while(d!=0 && d!='/' && i<3)
		{
			if(d>='a' && d<='z')	filename[i+8]=d+'A'-'a';
			else					filename[i+8]=d;
			++i;
			++(*instr);
			d=**instr;
		}
	}
	return 1;
}

unsigned long GetFileInf(unsigned char *filename,unsigned long curclust)
{
	unsigned int FileCnt,SectorsCnt;
	unsigned long CurSetor;
	while(curclust<0xFFFFFF0F){
		CurSetor=ClustToSector(curclust);
		for(SectorsCnt=0;SectorsCnt<SectorsPerCluster;SectorsCnt++)
		{
			FatReadBlock(CurSetor);
			for(FileCnt=0;FileCnt<BytesPerSector;FileCnt+=32)
			{
				if(Cmpstr_withnum(&SD_Buffer[FileCnt],filename,11))	
					return FileCnt/32+CurSetor*16;	//返回文件名字在那個(gè)扇區(qū)的第幾個(gè)文件項(xiàng)
			}
			++CurSetor;
		}
		curclust=FindNextClust(curclust);
	}
	return 0;
}

unsigned char fopen( const unsigned char *file)	//只針對(duì)根目錄
{
	unsigned char i;
	unsigned char file_number;
	unsigned char filename[11];
	unsigned long curclust;
	unsigned long fileinfat;
	FFS	*fatfilestruct;
	for(file_number=0;file_number<sizeof(fopen_rcd)/sizeof(fopen_rcd[0]);i++)
	{
		if(fopen_rcd[file_number].StartClust==0)	break;
	}
	if(file_number>=sizeof(fopen_rcd)/sizeof(fopen_rcd[0]))	return 0;
	curclust=FirstDirCluster;

	while(1){
		if(!GetFileName(filename,&file))	return 0;
		//Debug_Pstr("\n\r");	
		//for(i=0;i<11;i++)	UDRT0_print(filename[i]);
		//Debug_Pstr("\n\r");	
		fileinfat=GetFileInf(filename,curclust);
		if(!fileinfat)	return 0;									//can't find the file
		fatfilestruct=(FFS*)(&SD_Buffer[ (fileinfat&0x0f)*32]);
		curclust=fatfilestruct->StartHight;
		curclust<<=16;
		curclust+=fatfilestruct->StartLow;
		//Debug_Msg("文件所在簇:",curclust);
		if(*file==0)	break;
	}
	fopen_rcd[file_number].StartClust=curclust;		//set used mark of fopen_rcd[file_number]
	fopen_rcd[file_number].FatPos=fileinfat;		//記錄文件在fat表格位置,為刪除 修改文件做準(zhǔn)備
	fopen_rcd[file_number].Seek=0;
	fopen_rcd[file_number].CurClust=curclust;
	fopen_rcd[file_number].CurSector=ClustToSector(curclust);
	fopen_rcd[file_number].Size=fatfilestruct->Size;
	return file_number;
}

unsigned char fread(void *save,unsigned long len,unsigned char file_number)
{
	unsigned int block_len,blockoffset,i;
	unsigned char *buf=(unsigned char *)save;
	if(len+fopen_rcd[file_number].Seek>fopen_rcd[file_number].Size)
	if(fopen_rcd[file_number].Seek>=fopen_rcd[file_number].Size)	return 0;
	blockoffset=fopen_rcd[file_number].Seek%BytesPerSector;
	block_len=BytesPerSector-blockoffset;
	if(block_len>len)	block_len=len;
	while(len)
	{
		FatReadBlock(fopen_rcd[file_number].CurSector);		//讀取當(dāng)前塊
		for(i=0;i<block_len;i++)	{
			*buf++=SD_Buffer[blockoffset+i];
        }
		fopen_rcd[file_number].Seek+=block_len;
		if(fopen_rcd[file_number].Seek%BytesPerSector==0)
		{
			if( (fopen_rcd[file_number].Seek/BytesPerSector)%SectorsPerCluster ==0 )
			{
				fopen_rcd[file_number].CurClust=FindNextClust(fopen_rcd[file_number].CurClust);
				fopen_rcd[file_number].CurSector=ClustToSector(fopen_rcd[file_number].CurClust);
			}
			else	++fopen_rcd[file_number].CurSector;
		}
		len=len-block_len;
		if(len>BytesPerSector)	block_len=BytesPerSector;
		else					block_len=len;
		blockoffset=0;
	}
    return 1;
}

unsigned char fseek(unsigned char file_number,unsigned long addr,unsigned char type)		//文件定位	主要設(shè)置 clust sector and seek
{
	unsigned long TempCnt;
	if(fopen_rcd[file_number].StartClust==0)	return 0;	//no files
	if(type==0)	//絕對(duì)地址
	{
		if(addr>=fopen_rcd[file_number].Size)		return 0;
		fopen_rcd[file_number].CurClust=fopen_rcd[file_number].StartClust;
		fopen_rcd[file_number].Seek=addr;
		TempCnt=fopen_rcd[file_number].Seek/SectorsPerCluster/BytesPerSector;
	}else if(type==1)		//相對(duì)地址
	{
		TempCnt=(fopen_rcd[file_number].Seek%(SectorsPerCluster*BytesPerSector)+addr)
			/SectorsPerCluster/BytesPerSector;
		addr+=fopen_rcd[file_number].Seek;
		if(addr>=fopen_rcd[file_number].Size)		return 0;
		fopen_rcd[file_number].Seek=addr;
	}
	while(TempCnt--){
		fopen_rcd[file_number].CurClust=FindNextClust(fopen_rcd[file_number].CurClust);
	}
	TempCnt=(fopen_rcd[file_number].Seek/BytesPerSector)%SectorsPerCluster;
	fopen_rcd[file_number].CurSector=ClustToSector(fopen_rcd[file_number].CurClust);
	fopen_rcd[file_number].CurSector+=TempCnt;
	return 1;
}

unsigned long ftell(unsigned char file_number)
{
	if(fopen_rcd[file_number].StartClust==0)	return 0xFFFFFFFF;	//error
	else	return fopen_rcd[file_number].Seek;		//讀寫(xiě)指針位置
}
unsigned char fclose(unsigned char file_number)
{
	if(fopen_rcd[file_number].StartClust==0)	return 0;
	fopen_rcd[file_number].StartClust=0;
	return 1;
}

void fprtfile(unsigned char file_number)
{
	Debug_Msg("文件指針?biāo)诘拇?quot;,fopen_rcd[file_number].CurClust);
	Debug_Msg("文件指針?biāo)诘纳葏^(qū)",fopen_rcd[file_number].CurSector);
	Debug_Msg("文件指針的大小",fopen_rcd[file_number].Seek);
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美卡一卡二| 免费看日韩精品| 18欧美亚洲精品| 国产精品视频免费看| 国产欧美一区二区三区鸳鸯浴| 久久综合资源网| 欧美经典一区二区三区| 国产精品理伦片| 国产精品传媒入口麻豆| 一区二区三区欧美| 亚洲成av人片一区二区梦乃 | 一区二区三区精密机械公司| ...xxx性欧美| 亚洲综合成人在线视频| 午夜精品爽啪视频| 美脚の诱脚舐め脚责91| 国产精品资源在线| 高清不卡一区二区| 99久久婷婷国产综合精品| 一本大道综合伊人精品热热 | 精品国产一区二区三区四区四 | 久久久久久日产精品| 久久一二三国产| 亚洲丝袜另类动漫二区| 一区二区三区在线观看动漫| 亚洲不卡在线观看| 精品在线免费观看| 国产成人综合网| 91久久一区二区| 日韩欧美在线影院| 2欧美一区二区三区在线观看视频| 久久久久久毛片| 亚洲视频香蕉人妖| 亚洲国产婷婷综合在线精品| 奇米精品一区二区三区在线观看一 | 久久综合狠狠综合久久综合88 | 国产电影一区二区三区| 丰满少妇久久久久久久| 在线看国产日韩| 日韩三级视频在线看| 国产精品久久看| 亚洲综合一二三区| 国内精品国产成人国产三级粉色 | 波多野结衣中文字幕一区二区三区| 97se亚洲国产综合自在线不卡| 精品视频色一区| 久久久久高清精品| 亚洲高清视频在线| 国产成a人亚洲| 69堂精品视频| 最新久久zyz资源站| 免费精品视频最新在线| 一本到高清视频免费精品| 精品福利av导航| 亚洲一区二区三区四区的| 国产69精品久久久久777| 欧美日韩三级一区| 欧美韩日一区二区三区四区| 日本中文字幕一区二区有限公司| 成人免费视频一区| 日韩欧美卡一卡二| 亚洲宅男天堂在线观看无病毒| 免费成人在线视频观看| 日本韩国一区二区| 亚洲h在线观看| 成人深夜福利app| 欧美大片国产精品| 亚洲妇女屁股眼交7| 99久久免费精品| 久久精品一区二区三区不卡 | 精品视频在线免费观看| 中文字幕在线免费不卡| 韩国精品一区二区| 欧美老年两性高潮| 有码一区二区三区| 成人av在线观| 久久久精品一品道一区| 蜜臀久久久99精品久久久久久| 欧美性做爰猛烈叫床潮| 国产精品国产三级国产aⅴ中文 | 欧美精品日韩一本| 一区二区三区四区蜜桃| 成人国产精品免费观看视频| 久久亚洲一级片| 久久精品国内一区二区三区| 欧美日韩视频在线一区二区| 一区二区三区欧美激情| 一本色道a无线码一区v| 国产精品久久99| a4yy欧美一区二区三区| 日本一区二区三区视频视频| 国产主播一区二区| 精品国产一区二区精华| 美日韩一区二区三区| 日韩欧美在线观看一区二区三区| 水蜜桃久久夜色精品一区的特点| 欧美中文字幕不卡| 亚洲一区二区欧美| 欧美视频在线一区二区三区 | 亚洲美女屁股眼交3| 91在线无精精品入口| 国产精品人人做人人爽人人添| 国产成人综合视频| 国产精品嫩草99a| 成人午夜电影小说| 国产精品久久影院| 成人高清免费在线播放| 国产精品毛片无遮挡高清| 99免费精品视频| 一区二区三区四区在线播放| 欧美性受xxxx黑人xyx性爽| 亚洲一区二区黄色| 777奇米成人网| 久久av中文字幕片| 久久综合九色综合欧美就去吻| 国产精品一级黄| 中文字幕在线观看不卡视频| 欧美美女网站色| 日韩高清欧美激情| 欧美aⅴ一区二区三区视频| 午夜国产精品一区| 亚洲欧洲日产国码二区| 日韩精品中文字幕一区| 欧美性感一类影片在线播放| 国产乱人伦偷精品视频免下载 | 久久精品理论片| 国产欧美精品一区二区色综合朱莉| 日韩精品一区二区三区四区视频| 亚洲一区二区三区四区的| 欧美色图第一页| 九一久久久久久| 国产精品天天摸av网| 色88888久久久久久影院按摩 | 日本不卡一二三| 国产亚洲成av人在线观看导航| 不卡一区二区在线| 亚洲第一成人在线| www国产精品av| 99精品视频一区| 日韩vs国产vs欧美| 欧美激情在线一区二区| 日本高清不卡在线观看| 青青草国产成人99久久| 国产精品美女一区二区三区| 欧美日韩欧美一区二区| 国产一区欧美日韩| 一区二区三区精品视频| 久久久久久夜精品精品免费| 色中色一区二区| 九九**精品视频免费播放| 亚洲人成精品久久久久| 日韩精品一区二区三区视频| 成年人午夜久久久| 七七婷婷婷婷精品国产| 国产精品国产三级国产a| 91精品国产综合久久蜜臀| www.亚洲激情.com| 免费成人美女在线观看.| 亚洲人快播电影网| 精品国产免费一区二区三区香蕉| av中文字幕不卡| 美脚の诱脚舐め脚责91| 亚洲精品欧美激情| 2022国产精品视频| 7777精品伊人久久久大香线蕉最新版| 成人深夜视频在线观看| 看电影不卡的网站| 亚洲成人免费在线| 亚洲欧洲日韩在线| 国产日韩三级在线| 日韩欧美一级二级三级| 在线一区二区三区四区五区 | 久久久久久毛片| 91麻豆精品国产91久久久| 91在线免费视频观看| 国产精品 日产精品 欧美精品| 日韩中文字幕av电影| 亚洲精品五月天| 亚洲国产激情av| 久久亚洲精品国产精品紫薇| 欧美精品久久一区| 欧美怡红院视频| 色综合一区二区| 成人爽a毛片一区二区免费| 国产美女精品一区二区三区| 美女网站色91| 无吗不卡中文字幕| 一区二区三区国产| 亚洲一区二区在线观看视频| 欧美日本不卡视频| 一区二区三区四区在线免费观看| 91麻豆福利精品推荐| 九九视频精品免费| 美女国产一区二区三区| 亚洲成精国产精品女| 亚洲小说欧美激情另类| 亚洲人成精品久久久久久| 亚洲图片欧美激情| 日韩欧美一区二区视频| 色呦呦国产精品|