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

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

?? fat.c

?? 基于SPI方式的MMC卡的FAT代碼,可修改用于SD卡的管理.
?? C
?? 第 1 頁 / 共 2 頁
字號:
/**********************************************************************************************
**
**	Copyright(c) Semitek
**
**	模 塊 名:fat.c
**
**	模塊功能:實現有關FAT16文件系統的操作
**
**	修改日期:2007年4月5日
**
**********************************************************************************************/
#include "fat.h"

BYTE cluster_size = 0;//每簇的扇區數
WORD sector_size = 0;//每扇區的字節數
DWORD RootDir_Start_SecNum = 0;//根目錄開始扇區號
DWORD Data_Start_SecNum = 0;//數據區開始扇區號
DWORD FAT1_Start_SecNum = 0;//FAT1開始扇區號
DWORD FAT2_Start_SecNum = 0;//FAT2開始扇區號

WORD DIR_FstClusHI = 0;//起始簇號的高16位
WORD DIR_FstClusLO = 0;//起始簇號的低16位

DWORD EmptyCluster = 0;//FAT中空閑的簇號

DWORD TotalSector = 0;


DWORD WriteData_Addr = 0;//寫數據地址

extern BYTE MMCRDData[MMC_DATA_SIZE];
extern BYTE MMCWRData[MMC_DATA_SIZE];

/**********************************************************************************************
**
**	函數名稱:GetFatInfo
**
**	函數功能:讀MMC的0扇區,獲得有關FAT的基本信息
**
**	輸入參數:無
**
**	返 回 值:無
**
**	影響參數:cluster_size,fat_offset,cluster_offset,RootDir_Start_SecNum,Data_Start_SecNum
**
**	調用模塊:mmc_read_block()
**
**	說    明:無
**
**********************************************************************************************/
void GetFatInfo()
{
	BYTE	BS_jmpBoot[3];	//跳轉指令
	BYTE	BS_OEMName[8];	//制造商名稱
	WORD	BPB_BytesPerSec;//字節/扇區
	BYTE	BPB_SecPerClus;	//扇區/簇
	WORD	BPB_RsvdSecCnt;	//保留扇區數
	BYTE	BPB_NumFATs;	//FAT表數目
	WORD	BPB_RootEntCnt;	//根目錄項數
	WORD	BPB_TotSec16;	//小于32MB的扇區數
	BYTE	BPB_Media;		//媒體描述符
	WORD	BPB_FATSz16;	//每個FAT表所占扇區數
	WORD	BPB_SecPerTrk;	//每磁道上的扇區數
	WORD	BPB_NumHeads;	//磁頭數
	
	DWORD	BPB_HiddSec;	//隱藏扇區數
	DWORD	BPB_TotSec32;	//大于32MB的扇區數

	mmc_read_block(MASTER_BOOT_RECORD);
	
	BPB_BytesPerSec = MMCRDData[OFFSET_BPB_BytesPerSec] | (MMCRDData[OFFSET_BPB_BytesPerSec+1]<<8);
	BPB_SecPerClus  = MMCRDData[OFFSET_BPB_SecPerClus];
	BPB_RsvdSecCnt  = MMCRDData[OFFSET_BPB_RsvdSec] | (MMCRDData[OFFSET_BPB_RsvdSec+1]<<8);
	BPB_NumFATs	    = MMCRDData[OFFSET_BPB_NumFATs];
	BPB_RootEntCnt  = MMCRDData[OFFSET_BPB_RootEntCnt] | (MMCRDData[OFFSET_BPB_RootEntCnt+1]<<8);
	BPB_TotSec16	= MMCRDData[OFFSET_BPB_TotSec16] | (MMCRDData[OFFSET_BPB_TotSec16+1]<<8);
	BPB_Media	    = MMCRDData[OFFSET_BPB_Media];
	BPB_FATSz16	    = MMCRDData[OFFSET_BPB_FATSz16] | (MMCRDData[OFFSET_BPB_FATSz16+1]<<8);
	BPB_SecPerTrk   = MMCRDData[OFFSET_BPB_SecPerTrk] | (MMCRDData[OFFSET_BPB_SecPerTrk+1]<<8);
	BPB_NumHeads	= MMCRDData[OFFSET_BPB_NumHeads] | (MMCRDData[OFFSET_BPB_NumHeads+1]<<8);
	BPB_HiddSec	    = MMCRDData[OFFSET_BPB_HiddSec] | (MMCRDData[OFFSET_BPB_HiddSec+1]<<8) | (MMCRDData[OFFSET_BPB_HiddSec+2]<<16) | (MMCRDData[OFFSET_BPB_HiddSec+3]<<24);
	BPB_TotSec32	= MMCRDData[OFFSET_BPB_TotSec32] | (MMCRDData[OFFSET_BPB_TotSec32+1]<<8) | (MMCRDData[OFFSET_BPB_TotSec32+2]<<16) | (MMCRDData[OFFSET_BPB_TotSec32+3]<<24);

	RootDir_Start_SecNum = BPB_RsvdSecCnt + (BPB_NumFATs * BPB_FATSz16);

	Data_Start_SecNum = RootDir_Start_SecNum + (32*BPB_RootEntCnt + (BPB_BytesPerSec -1))/BPB_BytesPerSec;

	cluster_size = BPB_SecPerClus;

	sector_size = BPB_BytesPerSec;

	FAT1_Start_SecNum = BPB_RsvdSecCnt;
	
	FAT2_Start_SecNum = BPB_RsvdSecCnt + BPB_FATSz16;

	TotalSector = BPB_TotSec32;

	return;
}




/**********************************************************************************************
**
**	函數名稱:UpDataRootDir
**
**	函數功能:更新根目錄內容
**
**	輸入參數:文件名,文件大小
**
**	返 回 值:暫無
**
**	影響參數:暫無
**
**	調用模塊:mmc_read_block,mmc_write_block
**
**	說    明:根目錄是以32字節為單位進行讀寫,讀寫前要將文件名轉換成大寫字母
**
**********************************************************************************************/
void UpDataRootDir(BYTE *Name,DWORD FileSize,BYTE FileAttrib)
{
	BYTE Buffer[11];
	BYTE i,j,k = 0;

	for(i=0;i<8;i++)
	{		
		if(*Name != '.' && *Name != '\0') 
		{
			Buffer[i] = *Name;
		}
		else
		{
			goto Label;
		}
		Name++;
		Label:	Buffer[i+1] = 0x20;
	}
	for(i=0;i<3;i++)
	{
		Name++;
		if(*Name != 0)	Buffer[i+8] = *Name;
		else	Buffer[i+8] = 0x20;
	}

 	mmc_read_block(RootDir_Start_SecNum);

	for(i=0;i<16;i++)
	{
		if(MMCRDData[i*32] == 0x00 || MMCRDData[i*32] == 0xE5)
		{
		 	break;
		}
	}
			
	k = i << 5;
	for(j=0;j<11;j++)
		MMCRDData[k + j] = Buffer[j];//主文件名+擴展文件名,為8.3格式

	MMCRDData[k + 11] = FileAttrib;//文件屬性

	MMCRDData[k + 12] = 0x00;//僅長文件名目錄使用,對于FAT16不使用
	MMCRDData[k + 13] = 0x00;

	MMCRDData[k + 14] = 0X79;//文件建立時間
	MMCRDData[k + 15] = 0X6C;

	MMCRDData[k + 16] = 0X85;//文件建立日期
	MMCRDData[k + 17] = 0X36;

	MMCRDData[k + 18] = 0x85;//文件最近訪問日期
	MMCRDData[k + 19] = 0x36;

	MMCRDData[k + 20] = 0x00;//系統保留
	MMCRDData[k + 21] = 0x00;

	MMCRDData[k + 22] = 0x68;//最新修改時間
	MMCRDData[k + 23] = 0X77;
		     
	MMCRDData[k + 24] = 0x83;//最新修改日期
	MMCRDData[k + 25] = 0x36;

	MMCRDData[k + 26] = (DIR_FstClusLO & 0x00FF) >> 0x00;//起始簇號16位
	MMCRDData[k + 27] = (DIR_FstClusLO & 0xFF00) >> 0x08;

	MMCRDData[k + 28] = (FileSize & 0x000000FF) >> 0x00;//文件大小
	MMCRDData[k + 29] = (FileSize & 0x0000FF00) >> 0x08;
	MMCRDData[k + 30] = (FileSize & 0x00FF0000) >> 0x10;
	MMCRDData[k + 31] = (FileSize & 0xFF000000) >> 0x18;

	mmc_write_block(RootDir_Start_SecNum,MMCRDData);

	return;
}



/**********************************************************************************************
**
**	函數名稱:FATGetNextClus
**
**	函數功能:返回FAT表指定簇的下一個簇號
**
**	輸入參數:從FAT表中讀到的數組
**
**	返 回 值:下一個簇號
**
**	影響參數:暫無
**
**	調用模塊:暫無
**
**	說    明:暫無
**
**********************************************************************************************/
DWORD FATGetNextClus(BYTE *Buf)
{
	WORD i;

	for(i=0;i<512;i+=2)
	{
		if(*(Buf+i) == 0xFF && *(Buf+i+1)== 0xFF && *(Buf+i+2) == 0x00 && *(Buf+i+3) == 0x00) break;
	}
	return ((i+2) >> 1);
}



/**********************************************************************************************
**
**	函數名稱:UpDataFAT
**
**	函數功能:更新FAT表
**
**	輸入參數:文件大小
**
**	返 回 值:暫無
**
**	影響參數:暫無
**
**	調用模塊:mmc_read_block,mmc_write_block,FATGetNextClus
**
**	說    明:FAT表是個鏈表,在根目錄中得到簇號,然后根據文件所占的簇數進行寫入
**
**********************************************************************************************/
void UpDataFAT(DWORD FileSize)
{
	DWORD File_TolCluster = 0;
	WORD i = 0,j = 0,k = 0,cluster = 0;

	for(k=0;k<64;k++)
	{
		mmc_read_block(FAT1_Start_SecNum+k);
	
		if(k ==0)
		{
			EmptyCluster = FATGetNextClus(MMCRDData);
			j = EmptyCluster+1;
			cluster = EmptyCluster;
		}
		for(i = 0;i < 512;i += 2)
		{
			cluster++;
			if(k == 0)
			{
				MMCRDData[i+4] = cluster & 0x00FF;
				MMCRDData[i+5] = (cluster & 0xFF00) >> 8;
				if(i == 506) break;
			}
			else
			{
				MMCRDData[i] = cluster & 0x00FF;
				MMCRDData[i+1] = (cluster & 0xFF00) >> 8;
			}
		}
		if(k == 63)
		{
			MMCRDData[i-2] = 0xFF;
			MMCRDData[i-1] = 0xFF;
		}
		mmc_write_block(FAT1_Start_SecNum+k,MMCRDData);
		mmc_write_block(FAT2_Start_SecNum+k,MMCRDData);
	}

	DIR_FstClusHI = (EmptyCluster & 0xFFFF0000) >> 0x10;
	DIR_FstClusLO = (EmptyCluster & 0x0000FFFF) >> 0x00;

	File_TolCluster = FileSize >> 0x0A;	 //文件所占的簇數 = 文件大小 >> 10
	WriteData_Addr = Data_Start_SecNum + (EmptyCluster - 2) * sector_size;//文件內容所寫的地址=數據區起始扇區號+(簇號-2)*每扇區所占字節數

	return;
}

/**********************************************************************************************
**
**	函數名稱:CreateFile
**
**	函數功能:創建以FileName為文件名、WriteData為文件內容的文件
**
**	輸入參數:FileName->文件名;WriteData->待寫數據
**
**	返 回 值:暫無
**
**	影響參數:暫無
**
**	調用模塊:UpDataFAT,UpDataRootDir,WriteFile
**
**	說    明:創建文件流程:WriteFat->WriteRootDir->WriteData
**
**********************************************************************************************/
void CreateFile(BYTE *FileName,BYTE *WriteData,DWORD FileSize)
{
	BYTE Rt,Name_Buffer[12];
	DWORD Time=0,LastAddr = 0;

	memcpy(Name_Buffer,FileName,12);

	strupr(Name_Buffer);

	Time = GetRecord();
	LastAddr = FindFileEnd();
	Rt = ChkFileExist(Name_Buffer);
	if(Rt == 0)//文件不存在,新建文件并寫入數據
	{
		UpDataFAT(FileSize);//寫FAT表

		UpDataRootDir(Name_Buffer,FileSize,0x01);//寫根目錄

		WriteFile(WriteData_Addr,FileSize,WriteData);//寫數據

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美天天综合网| 欧美成人女星排名| 日韩精品一区二区三区四区视频| 久久综合久久99| 亚洲国产精品自拍| 成人精品高清在线| 日韩欧美专区在线| 一区二区三区四区高清精品免费观看| 国内偷窥港台综合视频在线播放| 欧美亚洲另类激情小说| 国产欧美一区二区三区沐欲| 蜜臀久久久99精品久久久久久| 91丝袜美女网| 中文字幕欧美三区| 久久91精品久久久久久秒播| 欧美人体做爰大胆视频| 亚洲蜜臀av乱码久久精品| 国产98色在线|日韩| 精品日韩欧美一区二区| 天堂蜜桃一区二区三区| 在线观看精品一区| 日韩伦理av电影| 成人国产精品免费| 国产欧美精品一区二区三区四区| 麻豆国产精品视频| 日韩视频在线永久播放| 亚洲成精国产精品女| 欧美在线观看视频一区二区| 亚洲免费观看视频| 91免费看视频| 亚洲视频免费在线| 色综合天天综合给合国产| 国产精品久久久久久久久久久免费看 | 国内精品伊人久久久久av影院| 在线看日韩精品电影| 亚洲女同ⅹxx女同tv| 91丨九色丨国产丨porny| 欧美极品xxx| 成人激情图片网| 中文字幕一区二区三区在线观看| 国产69精品久久久久777| 国产欧美一区二区精品性| 大胆亚洲人体视频| 亚洲三级视频在线观看| 色呦呦网站一区| 午夜精品福利在线| 日韩精品中文字幕一区二区三区 | 麻豆成人免费电影| 亚洲精品一区二区三区99| 国产在线播放一区| 国产精品视频一二三区| 色婷婷av一区二区三区大白胸| 亚洲精品成人精品456| 欧美日韩中文字幕一区| 久久精品国产一区二区| 亚洲国产激情av| 欧美性生活影院| 久久精品国产精品亚洲红杏| 国产女人aaa级久久久级| 一本大道综合伊人精品热热| 亚洲a一区二区| 国产婷婷一区二区| 在线免费精品视频| 久久99精品国产麻豆婷婷洗澡| 国产午夜精品美女毛片视频| 色偷偷久久人人79超碰人人澡| 成人高清视频在线| 亚洲一区二区三区视频在线| 日韩精品一区二区三区在线| av午夜一区麻豆| 奇米精品一区二区三区在线观看一 | 日韩专区一卡二卡| 国产亚洲欧美一级| 欧美丝袜丝nylons| 成人做爰69片免费看网站| 亚洲电影欧美电影有声小说| 国产亚洲欧美一级| 在线播放91灌醉迷j高跟美女| 国产激情精品久久久第一区二区 | 色8久久人人97超碰香蕉987| 美国三级日本三级久久99 | 日本麻豆一区二区三区视频| 国产精品欧美久久久久无广告| 91精品国产欧美一区二区| hitomi一区二区三区精品| 免费在线看一区| 一区二区久久久| 中文字幕精品一区二区三区精品| 欧美色图免费看| 不卡av在线网| 国产一区二区在线观看免费| 五月天国产精品| 樱桃国产成人精品视频| 国产精品视频九色porn| 精品国产第一区二区三区观看体验| 91小视频在线免费看| 国产成人免费视频网站| 蜜桃视频免费观看一区| 亚洲成av人在线观看| 亚洲人成7777| 欧美国产精品劲爆| 久久久高清一区二区三区| 欧美一级欧美三级在线观看| 欧美午夜一区二区| 日本精品视频一区二区| www.激情成人| 99在线精品观看| 91在线无精精品入口| 欧美精品视频www在线观看 | 国产成人亚洲综合a∨猫咪| 美女性感视频久久| 日本美女一区二区三区| 视频一区国产视频| 亚洲成av人片www| 午夜精品影院在线观看| 亚洲18女电影在线观看| 亚洲成av人片在线| 亚洲18色成人| 美腿丝袜亚洲三区| 九九久久精品视频| 国产精品中文字幕日韩精品| 激情久久五月天| 国产+成+人+亚洲欧洲自线| 大尺度一区二区| 色综合天天在线| 欧美日韩在线播放三区四区| 欧美日韩精品一二三区| 337p亚洲精品色噜噜噜| 日韩欧美激情四射| 久久夜色精品一区| 中文天堂在线一区| 亚洲欧美日韩在线| 午夜影视日本亚洲欧洲精品| 日韩精品电影在线观看| 激情综合亚洲精品| 成人开心网精品视频| 97久久人人超碰| 欧美日韩国产a| 26uuu欧美日本| 亚洲视频狠狠干| 日韩激情一区二区| 国产一区二区精品久久| 99re这里只有精品6| 欧美精品高清视频| 久久人人97超碰com| 亚洲欧美另类小说| 免费观看在线色综合| 丁香婷婷深情五月亚洲| 欧美视频在线观看一区| 日韩一级完整毛片| 国产色爱av资源综合区| 亚洲九九爱视频| 久久99精品视频| 97久久精品人人爽人人爽蜜臀| 欧美精品日韩一本| 中文字幕第一页久久| 亚洲一区在线视频| 国产在线精品一区二区不卡了| 色综合久久综合中文综合网| 51精品视频一区二区三区| 国产人久久人人人人爽| 亚洲夂夂婷婷色拍ww47| 国产一区二区0| 欧美日韩成人综合天天影院| 欧美韩日一区二区三区| 日本伊人色综合网| 一本色道久久加勒比精品| 欧美精品一区二区三区在线| 一区二区三区在线观看欧美| 国产美女在线精品| 91精品国产91久久久久久最新毛片 | 亚洲欧洲国产日韩| 久久精品国产亚洲aⅴ| 在线精品观看国产| 亚洲国产精品成人综合色在线婷婷| 丝袜诱惑亚洲看片| 一本久道久久综合中文字幕| 国产日韩亚洲欧美综合| 久久av中文字幕片| 4438亚洲最大| 亚洲五码中文字幕| 91免费国产在线| 国产精品久久毛片| 国产精华液一区二区三区| 3751色影院一区二区三区| 亚洲一区二区成人在线观看| 91在线精品一区二区| 中文字幕精品在线不卡| 国产成人av电影在线播放| 一区二区三区视频在线看| a在线播放不卡| 国产精品电影院| 成人av一区二区三区| 中文字幕乱码日本亚洲一区二区| 国产一区二区三区久久久| 日韩精品中文字幕一区二区三区| 日韩国产在线观看| 日韩欧美亚洲另类制服综合在线| 日韩精品国产精品| 欧美一区二区三区四区五区|