基于51單片機FAT32文件系統(tǒng)程序
《基于51單片機FAT32文件系統(tǒng)程序》由會員分享,可在線閱讀,更多相關《基于51單片機FAT32文件系統(tǒng)程序(39頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、 基于51單片機FAT32文件系統(tǒng)程序 #ifndef __ZNFAT_H__ #define __ZNFAT_H__ #include "mytype.h" //類型重定義 /*******************************************************/ //znFAT的裁減宏--------------------------------------------------------- //#define ZNFAT_ENTER_DIR //有此宏,函數(shù) znFAT_Enter_Dir() 參與編譯 #define
2、ZNFAT_OPEN_FILE //有此宏,函數(shù) znFAT_Open_File() 參與編譯 //#define ZNFAT_SEEK_FILE //有此宏,函數(shù) znFAT_Seek_File() 參與編譯 //#define ZNFAT_READ_FILE //有此宏,函數(shù) znFAT_Read_File() 參與編譯 //#define ZNFAT_READ_FILEX //有此宏,函數(shù) znFAT_Read_FileX() 參與編譯 //#define ZNFAT_ADD_DAT //有此宏,函數(shù) znFAT_Add_Dat() 參與編譯 //#d
3、efine ZNFAT_CREATE_DIR //有此宏,函數(shù) znFAT_Create_Dir() 參與編譯 //#define ZNFAT_CREATE_FILE //有此宏,函數(shù) znFAT_Create_File() 參與編譯 //#define ZNFAT_DEL_FILE //有此宏,函數(shù) znFAT_Del_File() 參與編譯 //#define ZNFAT_XCOPY_FILE //有此宏,函數(shù) znFAT_XCopy_File() 參與編譯 //#define ZNFAT_RENAME_FILE //有此宏,函數(shù) znFAT_Renam
4、e_File() 參與編譯 //#define ZNFAT_GET_TOTAL_SIZE //有此宏,函數(shù) znFAT_Get_Total_Size() 參與編譯 //#define znFAT_GET_REMAIN_CAP //有此宏,函數(shù) znFAT_Get_Remain_Cap() 參與編譯 #include "cj.h" #include "cj.h" //---------------------------------------------------------------------- #define SOC(c) (((c-pArg->FirstDirC
5、lust)*(pArg->SectorsPerClust))+pArg->FirstDirSector) // 用于計算簇的開始扇區(qū) #define CONST const //設備表 #define SDCARD 0 //SD卡 #define UDISK 1 //U盤 #define CFCARD 2 //CF卡 #define OTHER 3 //其它 //這里的存儲設備表,可以靈活擴充,以實現(xiàn)對更多存儲設備的支持 //------------------------------------------- #define MAKE_FILE_TIME(h,m,s)
6、 ((((unsigned int)h)<<11)+(((unsigned int)m)<<5)+(((unsigned int)s)>>1)) /* 生成指定時分秒的文件時間數(shù)據(jù) */ #define MAKE_FILE_DATE(y,m,d) (((((unsigned int)y)+20)<<9)+(((unsigned int)m)<<5)+((unsigned int)d)) /* 生成指定年月日的文件日期數(shù)據(jù) */ //DPT:分區(qū)記錄結構如下 struct PartRecord { UINT8 Active; //0x80表示此分區(qū)有效 U
7、INT8 StartHead; //分區(qū)的開始磁頭 UINT8 StartCylSect[2];//開始柱面與扇區(qū) UINT8 PartType; //分區(qū)類型 UINT8 EndHead; //分區(qū)的結束頭 UINT8 EndCylSect[2]; //結束柱面與扇區(qū) UINT8 StartLBA[4]; //分區(qū)的第一個扇區(qū) UINT8 Size[4]; //分區(qū)的大小 }; //MBR:分區(qū)扇區(qū)(絕對0扇區(qū))定義如下 struct PartSector { UINT8 PartCode[446
8、]; //MBR的引導程序 struct PartRecord Part[4]; //4個分區(qū)記錄 UINT8 BootSectSig0; //55 UINT8 BootSectSig1; //AA }; //znFAT中對BPB的定義如下 一共占用90個字節(jié) struct znFAT_BPB { UINT8 BS_jmpBoot[3]; //跳轉指令 offset: 0 UINT8 BS_OEMName[8]; // offset: 3 UINT8 BPB_BytesPerS
9、ec[2];//每扇區(qū)字節(jié)數(shù) offset:11 UINT8 BPB_SecPerClus[1]; //每簇扇區(qū)數(shù) offset:13 UINT8 BPB_RsvdSecCnt[2]; //保留扇區(qū)數(shù)目 offset:14 UINT8 BPB_NumFATs[1]; //此卷中FAT表數(shù) offset:16 UINT8 BPB_RootEntCnt[2]; //znFAT為0 offset:17 UINT8 BPB_TotSec16[2]; //znFAT為0 o
10、ffset:19 UINT8 BPB_Media[1]; //存儲介質 offset:21 UINT8 BPB_FATSz16[2]; //znFAT為0 offset:22 UINT8 BPB_SecPerTrk[2]; //磁道扇區(qū)數(shù) offset:24 UINT8 BPB_NumHeads[2]; //磁頭數(shù) offset:26 UINT8 BPB_HiddSec[4]; //FAT區(qū)前隱扇區(qū)數(shù) offset:28 UINT8 BPB_Tot
11、Sec32[4]; //該卷總扇區(qū)數(shù) offset:32 UINT8 BPB_FATSz32[4]; //一個FAT表扇區(qū)數(shù) offset:36 UINT8 BPB_ExtFlags[2]; //znFAT特有 offset:40 UINT8 BPB_FSVer[2]; //znFAT特有 offset:42 UINT8 BPB_RootClus[4]; //根目錄簇號 offset:44 UINT8 FSInfo[2]; //保留扇區(qū)FSINFO扇區(qū)
12、數(shù)offset:48 UINT8 BPB_BkBootSec[2]; //通常為6 offset:50 UINT8 BPB_Reserved[12]; //擴展用 offset:52 UINT8 BS_DrvNum[1]; // offset:64 UINT8 BS_Reserved1[1]; // offset:65 UINT8 BS_BootSig[1]; // offset:66
13、 UINT8 BS_VolID[4]; // offset:67 UINT8 BS_FilSysType[11]; // offset:71 UINT8 BS_FilSysType1[8]; //"znFAT " offset:82 }; struct znFAT_FAT_Item { UINT8 Item[4]; }; struct znFAT_FAT { struct znFAT_FAT_Item Items[128]; }; struct dirent
14、ry { UINT8 deName[8]; // 文件名,不足部分以空格補充 UINT8 deExtension[3]; // 擴展名,不足部分以空格補充 UINT8 deAttributes; // 文件屬性 UINT8 deLowerCase; // 0 UINT8 deCHundredth; // 世紀 UINT8 deCTime[2]; // 創(chuàng)建時間 UINT8 deCDate[2]; // 創(chuàng)建日期 UINT8 deADate[2]; // 訪問日期 UINT8 deHighCl
15、ust[2]; // 開始簇的高字 UINT8 deMTime[2]; // 最近的修改時間 UINT8 deMDate[2]; // 最近的修改日期 UINT8 deLowCluster[2]; // 開始簇的低字 UINT8 deFileSize[4]; // 文件大小 }; //znFAT初始化時初始參數(shù)裝入如下結構體中 struct znFAT_Init_Arg { UINT8 DEV_No; UINT8 BPB_Sector_No; //BPB所在扇區(qū)號 UINT32 Total_Size; //磁
16、盤的總容量 UINT32 FirstDirClust; //根目錄的開始簇 UINT32 BytesPerSector; //每個扇區(qū)的字節(jié)數(shù) UINT32 FATsectors; //FAT表所占扇區(qū)數(shù) UINT32 SectorsPerClust; //每簇的扇區(qū)數(shù) UINT32 FirstFATSector; //第一個FAT表所在扇區(qū) UINT32 FirstDirSector; //第一個目錄所在扇區(qū) }; struct Date { UINT16 year; UINT8 month; UINT8 day; };
17、 struct Time { UINT8 hour; UINT8 min; UINT8 sec; }; struct FileInfoStruct { UINT8 FileName[15]; //文件名 UINT32 FileStartCluster; //文件的開始簇 UINT32 FileCurCluster; //文件的當前簇 UINT32 FileSize; //文件大小 UINT32 FileCurSector; //文件的當前扇區(qū) UINT16 FileCurPos; //
18、文件在當前扇區(qū)中的位置 UINT32 FileCurOffset; //文件的當前偏移量 UINT32 Rec_Sec; //文件的文件/目錄項所在的扇區(qū) UINT16 nRec; //文件的文件/目錄項所在扇區(qū)中的位置 UINT8 FileAttr; //文件屬性 struct Time FileCreateTime; //文件的創(chuàng)建時間 struct Date FileCreateDate; //文件的創(chuàng)建日期 struct Time FileM
19、Time; //文件的修改時間 struct Date FileMDate; //文件的修改日期 struct Date FileADate; //文件的訪問日期 }; struct FSInfo //znFAT的文件系統(tǒng)信息結構 { UINT8 Head[4]; UINT8 Resv1[480]; UINT8 Sign[4]; UINT8 Free_Cluster[4]; UINT8 Last_Cluster[4]; UINT8 Resv2[14]; UINT8 Tail[2]; };
20、 extern struct znFAT_Init_Arg *pArg; //初始化參數(shù)結構體指針,用以指向某一存儲設備的初始化參數(shù)結構體,由外部提供 extern UINT8 Dev_No;//設備號,外部變量 //函數(shù)聲明 void znFAT_Device_Init(); UINT32 znFAT_Get_Total_Size(void); //獲取總容量 UINT32 znFAT_Get_Remain_Cap(void); //獲取剩余容量 void znFAT_Init(void); //文件系統(tǒng)初始化 UINT32 znFAT_Enter_Dir(CONST INT
21、8 *path); //進入目錄 UINT8 znFAT_Open_File(struct FileInfoStruct *pfi,CONST INT8 *filepath,UINT32 item,UINT8 is_file); //打開文件,支持通配 UINT8 znFAT_Seek_File(struct FileInfoStruct *pfi,UINT32 offset); //文件定位 UINT32 znFAT_Read_File(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,UINT8 *pbuf); //讀取文件數(shù)據(jù)
22、 UINT32 znFAT_Read_FileX(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,void (*pfun)(UINT8)); //讀取文件數(shù)據(jù)并進行數(shù)據(jù)處理 UINT32 znFAT_Add_Dat(struct FileInfoStruct *pfi,UINT32 len,UINT8 *pbuf); //向文件追加數(shù)據(jù) UINT8 znFAT_Create_Dir(CONST INT8 *dirpath,UINT8 *ptd); //創(chuàng)建目錄,支持創(chuàng)建時間 UINT8 znFAT_Create_File(stru
23、ct FileInfoStruct *pfi,CONST INT8 *filepath,UINT8 *ptd); //創(chuàng)建文件,支持創(chuàng)建時間 UINT8 znFAT_Del_File(CONST INT8 *filepath); //刪除文件 unsigned char znFAT_XCopy_File(struct znFAT_Init_Arg *pArg1,struct znFAT_Init_Arg *pArg2,CONST INT8 *sfilename,CONST INT8 *tfilename,UINT8 *file_buf,UINT32 buf_size,unsigned ch
24、ar *pt); //文件拷貝,支持多設備中文件互拷 UINT8 znFAT_File_Close(struct FileInfoStruct *pfi); //文件關閉 UINT8 znFAT_Rename_File(CONST INT8 *filename,CONST INT8 *newfilename); //文件重命名 #endif #include "znfat.h" #include "sd.h" //存儲設備的扇區(qū)讀寫驅動,這里是SD卡 //#include "ch375.h" //存儲設備的扇區(qū)讀寫驅動,這里是U盤 //#include
25、 "cf.h" //存儲設備的扇區(qū)讀寫驅動,這里是CF盤 #include "string.h" //全局變量定義 struct direntry temp_rec; INT8 temp_dir_name[13]; UINT32 temp_dir_cluster; UINT32 temp_last_cluster; UINT8 znFAT_Buffer[512]; //扇區(qū)數(shù)據(jù)讀寫緩沖區(qū),由外部提供 /****************************************************************** - 功能描述:znFAT的存儲設
26、備初始化函數(shù) - 隸屬模塊:znFAT文件系統(tǒng)模塊 - 函數(shù)屬性:外部(用于對存儲設備進行初始化) - 參數(shù)說明:無 - 返回說明:無 - 注:在調znFAT其它函數(shù)之前,必須先對存儲設備進行成功的初始化。 ******************************************************************/ void znFAT_Device_Init() { SD_Reset(); SD_Init(); } /******************************************************
27、************ - 功能描述:znFAT的存儲設備底層驅動接口,讀取存儲設備的addr扇區(qū)的 512個字節(jié)的數(shù)據(jù)放入buf數(shù)據(jù)緩沖區(qū)中 - 隸屬模塊:znFAT文件系統(tǒng)模塊 - 函數(shù)屬性:內部(用于與存儲設備的底層驅動對接) - 參數(shù)說明:addr:扇區(qū)地址 buf:指向數(shù)據(jù)緩沖區(qū)的指針 - 返回說明:0表示讀取扇區(qū)成功,否則失敗 - 注:這里加入了天狼星精華板上的三種存儲設備,即SD卡(有效)、U盤、 CF卡通過在程序中動態(tài)的切換不同的設備驅動,從而實現(xiàn)多設備(即同 時對多種存
28、儲設備進行操作,比如從SD卡拷貝文件到U盤等等),不同 驅動的切換,只需要在程序中改變Dev_No這個全局變量的值即可 ******************************************************************/ UINT8 znFAT_ReadSector(UINT32 addr,UINT8 *buf) { switch(Dev_No) //由Dev_No來決定所使用的存儲設備驅動 { case SDCARD: return SD_Read_Sector(addr,buf);
29、break; case UDISK: //return CH375_Read_Sector(addr,buf); break; case CFCARD: //return CF_Read_Sector(addr,buf); break; case OTHER: //return XXX_Read_Sector(addr,buf); break; } } /************************************************
30、****************** - 功能描述:znFAT的存儲設備底層驅動接口,將buf數(shù)據(jù)緩沖區(qū)中的512個 字節(jié)的數(shù)據(jù)寫入到存儲設備的addr扇區(qū)中 - 隸屬模塊:znFAT文件系統(tǒng)模塊 - 函數(shù)屬性:內部(用于與存儲設備的底層驅動對接) - 參數(shù)說明:addr:扇區(qū)地址 buf:指向數(shù)據(jù)緩沖區(qū) - 返回說明:0表示讀取扇區(qū)成功,否則失敗 - 注:略 ******************************************************************/ UINT8 z
31、nFAT_WriteSector(UINT32 addr,UINT8 *buf) { switch(Dev_No) //由Dev_No來決定所使用的存儲設備驅動 { case SDCARD: return SD_Write_Sector(addr,buf); break; case UDISK: //return CH375_Write_Sector(addr,buf); break; case CFCARD: //return CF_WriteSector(addr
32、,buf); break; case OTHER: //return XXX_Write_Sector(addr,buf); break; } } /****************************************************************** - 功能描述:小端轉大端,即LittleEndian車BigEndian - 隸屬模塊:znFAT文件系統(tǒng)模塊 - 函數(shù)屬性:內部 - 參數(shù)說明:dat:指向要轉為大端的字節(jié)序列 len:要轉為大端
33、的字節(jié)序列長度 - 返回說明:轉為大端模式后,字節(jié)序列所表達的數(shù)據(jù) - 注:比如:小端模式的 0x33 0x22 0x11 0x00 (低字節(jié)在前) 轉為大端模式后為 0x00 0x11 0x22 0x33 (高字節(jié)在前) 所表達的數(shù)值為 0x00112233 (CISC的CPU通常是小端的,所以znFAT也設計為小端,而單片機 這種RISC的CPU,通常來說都是大端的,所以需要這個函數(shù)將字 節(jié)的存放次序進行調整,才能得到正
34、確的數(shù)值)
******************************************************************/
UINT32 LE2BE(UINT8 *dat,UINT8 len)
{
UINT32 temp=0;
UINT32 fact=1;
UINT8 i=0;
for(i=0;i 35、***********************************************
- 功能描述:清空某個簇的所有扇區(qū),填充0
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內部
- 參數(shù)說明:cluster:要清空的簇的簇號
- 返回說明:無
**************************************************************************/
#ifdef ZNFAT_EMPTY_CLUSTER
void znFAT_Empty_Cluster(UINT32 Cluster)
{
UINT3 36、2 iSec;
UINT16 i;
for(i=0;i 37、描述:獲取剩余容量
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:無
- 返回說明:剩余容量,單位字節(jié)
- 注:從FSInfo中讀取空閑簇數(shù),而從計算得到剩余的容量,單位字節(jié)
***********************************************************************/
#ifdef znFAT_GET_REMAIN_CAP
UINT32 znFAT_Get_Remain_Cap(void)
{
znFAT_ReadSector(1+pArg->BPB_Sector 38、_No,znFAT_Buffer);
if(((struct FSInfo *)znFAT_Buffer)->Free_Cluster[0]==0xff
&& ((struct FSInfo *)znFAT_Buffer)->Free_Cluster[1]==0xff
&& ((struct FSInfo *)znFAT_Buffer)->Free_Cluster[2]==0xff
&& ((struct FSInfo *)znFAT_Buffer)->Free_Cluster[3]==0xff)
return pArg->Total_Size;
else
r 39、eturn LE2BE(((struct FSInfo *)znFAT_Buffer)->Free_Cluster,4)*pArg->SectorsPerClust*pArg->BytesPerSector;
}
#endif
/******************************************************************
- 功能描述:將小字字符轉為大寫
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內部
- 參數(shù)說明:c:要轉換為大寫的字符
- 返回說明:要轉換的字節(jié)的相應的大寫字符
- 40、 注:只對小寫字符有效,如果不是a~z的小寫字符,將直接返回
******************************************************************/
INT8 L2U(INT8 c)
{
if(c>=a && c<=z) return c+A-a;
else return c;
}
/***********************************************************************
- 功能描述:得到DBR所在的扇區(qū)號(如果沒有MBR,則DBR就在0扇區(qū))
- 隸屬模塊: 41、znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內部
- 參數(shù)說明:無
- 返回說明:DBR的扇區(qū)地址
- 注:DBR中包含了很多有用的參數(shù)信息,因此正確定位DBR扇區(qū)的位置,是極為
重要的,后面將有專門的函數(shù)對DBR進行解析,正確解析DBR是實現(xiàn)znFAT的
基礎
***********************************************************************/
UINT16 znFAT_Find_DBR(void)
{
UINT16 sec_dbr;
znFAT_ReadSecto 42、r(0,znFAT_Buffer);
if(znFAT_Buffer[0]!=0xeb)
{
sec_dbr=LE2BE(((((struct PartSector *)(znFAT_Buffer))->Part[0]).StartLBA),4);
}
else
{
sec_dbr=0;
}
return sec_dbr;
}
/***********************************************************************
- 功能描述:獲取分區(qū)的總容量
- 隸屬模塊:znFAT文件系統(tǒng)模塊
43、
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:無
- 返回說明:分區(qū)容量值,單位為字節(jié)
- 注:這里得到的總容量是znFAT分區(qū)的容量,一定小于實際的物理容量
***********************************************************************/
#ifdef ZNFAT_GET_TOTAL_SIZE
UINT32 znFAT_Get_Total_Size(void)
{
return pArg->Total_Size;
}
#endif
/********************** 44、*************************************************
- 功能描述:讀取FSInfo獲取最近的一個可用空閑簇
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內部
- 參數(shù)說明:無
- 返回說明:最近的一個可用空閑簇
- 注:znFAT中的FSInfo扇區(qū)(絕對1扇區(qū))中記錄了最近的一個可用空閑簇
***********************************************************************/
UINT32 Search_Last_Usable_Clus 45、ter(void)
{
znFAT_ReadSector(1+pArg->BPB_Sector_No,znFAT_Buffer);
return LE2BE(((struct FSInfo *)znFAT_Buffer)->Last_Cluster,4);
}
/***********************************************************************
- 功能描述:znFAT文件系統(tǒng)初始化
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:外部,使用戶使用
- 參數(shù)說明:znFAT_Init_Arg類型的結構 46、體指針,用于裝載一些重要的參數(shù)信息,
以備后面使用
- 返回說明:無
- 注:在使用znFAT前,這個函數(shù)是必須先被調用的,將很多參數(shù)信息裝入到
arg指向的結構體中,比如扇區(qū)大小、根目錄的位置、FAT表大小等等。
這些參數(shù)絕大部分是來自于DBR的BPB中,因此此函數(shù)主要在作對DBR的參數(shù)解析
***********************************************************************/
void znFAT_Init(void)
{
struct znF 47、AT_BPB *bpb;
bpb=(struct znFAT_BPB *)(znFAT_Buffer); //將數(shù)據(jù)緩沖區(qū)指針轉為struct znFAT_BPB 型指針
pArg->DEV_No=Dev_No; //裝入設備號
pArg->BPB_Sector_No =znFAT_Find_DBR(); //znFAT_FindBPB()可以返回BPB所在的扇區(qū)號
znFAT_ReadSector(pArg->BPB_Sector_No,znFAT_Buffer);
pArg->FATsector 48、s =LE2BE((bpb->BPB_FATSz32) ,4);//裝入FAT表占用的扇區(qū)數(shù)到FATsectors中
pArg->FirstDirClust =LE2BE((bpb->BPB_RootClus) ,4);//裝入根目錄簇號到FirstDirClust中
pArg->BytesPerSector =LE2BE((bpb->BPB_BytesPerSec),2);//裝入每扇區(qū)字節(jié)數(shù)到BytesPerSector中
pArg->SectorsPerClust =LE2BE((bpb->BPB_SecPerClus) ,1);//裝入每簇扇區(qū)數(shù)到 49、SectorsPerClust 中
pArg->FirstFATSector =LE2BE((bpb->BPB_RsvdSecCnt) ,2)+pArg->BPB_Sector_No;//裝入第一個FAT表扇區(qū)號到FirstFATSector 中
pArg->FirstDirSector =(pArg->FirstFATSector)+(bpb->BPB_NumFATs[0])*(pArg->FATsectors); //裝入第一個目錄扇區(qū)到FirstDirSector中
pArg->Total_Size =LE2BE((bpb->BPB_TotSec32),4) 50、*pArg->BytesPerSector; //磁盤的總容量,單位是字節(jié)
temp_last_cluster=Search_Last_Usable_Cluster();
}
/***********************************************************************
- 功能描述:更新FSInfo中的可用空閑簇的數(shù)量
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內部
- 參數(shù)說明:PlusOrMinus:可用空閑簇數(shù)加1或減1
- 返回說明:無
- 注:創(chuàng)建文件、追加數(shù) 51、據(jù)、刪除文件等操作都可能會使可用的空閑簇數(shù)變化
要及時更新
***********************************************************************/
#ifdef ZNFAT_UPDATE_FSINFO_FREE_CLU
void znFAT_Update_FSInfo_Free_Clu(UINT32 PlusOrMinus)
{
UINT32 Free_Clu=0;
znFAT_ReadSector(1+pArg->BPB_Sector_No,znFAT_Buffer);
Free_Clu= 52、(znFAT_Get_Remain_Cap())/(pArg->SectorsPerClust*pArg->BytesPerSector);
if(PlusOrMinus) Free_Clu++;
else Free_Clu--;
((struct FSInfo *)znFAT_Buffer)->Free_Cluster[0]=Free_Clu&0x000000ff;//((UINT8 *)&Free_Clu)[0];
((struct FSInfo *)znFAT_Buffer)->Free_Cluster[1]=(Free_Clu&0x0000ff00)>>8;/ 53、/((UINT8 *)&Free_Clu)[1];
((struct FSInfo *)znFAT_Buffer)->Free_Cluster[2]=(Free_Clu&0x00ff0000)>>16;//((UINT8 *)&Free_Clu)[2];
((struct FSInfo *)znFAT_Buffer)->Free_Cluster[3]=(Free_Clu&0xff000000)>>24;//((UINT8 *)&Free_Clu)[3];
znFAT_WriteSector(1+pArg->BPB_Sector_No,znFAT_Buffer);
}
54、#endif
/***********************************************************************
- 功能描述:更新FSInfo中的下一個可用空閑簇的簇號
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內部
- 參數(shù)說明:Last_Clu:將要更新到FSInfo中的下一個可用空閑簇的簇號
- 返回說明:無
- 注:FSInfo中的下一個可用空閑簇號可以給文件系統(tǒng)一個參考,直接告訴文件系統(tǒng)
下一個可用的空閑簇在什么地方
**************************** 55、*******************************************/
#ifdef ZNFAT_UPDATE_FSINFO_LAST_CLU
void znFAT_Update_FSInfo_Last_Clu(UINT32 Last_Clu)
{
znFAT_ReadSector(1+pArg->BPB_Sector_No,znFAT_Buffer);
((struct FSInfo *)znFAT_Buffer)->Last_Cluster[0]=Last_Clu&0x000000ff;//((UINT8 *)&Last_Clu)[0];
(( 56、struct FSInfo *)znFAT_Buffer)->Last_Cluster[1]=(Last_Clu&0x0000ff00)>>8;//((UINT8 *)&Last_Clu)[1];
((struct FSInfo *)znFAT_Buffer)->Last_Cluster[2]=(Last_Clu&0x00ff0000)>>16;//((UINT8 *)&Last_Clu)[2];
((struct FSInfo *)znFAT_Buffer)->Last_Cluster[3]=(Last_Clu&0xff000000)>>24;//((UINT8 *)&Last_Cl 57、u)[3];
znFAT_WriteSector(1+pArg->BPB_Sector_No,znFAT_Buffer);
}
#endif
/***********************************************************************
- 功能描述:獲得下一個簇的簇號
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內部
- 參數(shù)說明:LastCluster:基準簇號
- 返回說明:LastClutster的下一簇的簇號
- 注:獲得下一簇的簇號,就是憑借FAT表中所記錄的簇鏈關系來實現(xiàn)的
* 58、**********************************************************************/
#ifdef ZNFAT_GETNEXTCLUSTER
UINT32 znFAT_GetNextCluster(UINT32 LastCluster)
{
UINT32 temp;
struct znFAT_FAT *pFAT;
struct znFAT_FAT_Item *pFAT_Item;
temp=((LastCluster/128)+pArg->FirstFATSector);
znFAT_ReadSector( 59、temp,znFAT_Buffer);
pFAT=(struct znFAT_FAT *)znFAT_Buffer;
pFAT_Item=&((pFAT->Items)[LastCluster%128]);
return LE2BE((UINT8 *)pFAT_Item,4);
}
#endif
/***********************************************************************
- 功能描述:比較目錄名
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內部
- 參數(shù)說明:a:指向目錄名1的指 60、針
b:指向目錄名2的指針
- 返回說明:如果兩個目錄名相同就返回1,否則為0
***********************************************************************/
#ifdef COMPARE_DIR_NAME
UINT8 Compare_Dir_Name(CONST INT8 *a,CONST INT8 *b)
{
UINT8 i;
for(i=0;i<8;i++)
{
if(a[i]!=b[i]) return 0;
}
return 1;
}
#endif 61、
/***********************************************************************
- 功能描述:文件名匹配(支持帶*?通配符的文件名的匹配)
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內部
- 參數(shù)說明:pat:源文件名,可以含*或?通配符 如 *.txt 或 A?.mp3等等
name:目標文件名
- 返回說明:如果兩個文件名匹配就返回1,否則為0
- 注:關于通配文件名匹配,有這樣的例子,比如 A*.txt 與 ABC.txt是匹配的
同時與 ABCDE 62、.txt也是匹配的。此功能在文件枚舉中將會用到,用來匹配
文件名符合一定條件的文件
***********************************************************************/
#ifdef FILENAMEMATCH
UINT8 FilenameMatch(INT8 *pat,INT8 *name)
{
UINT8 match,ndone;
INT8 *cpp,*cpn;
cpp=pat;
cpn=name;
match=1;
ndone=1;
while(ndone)
{
switc 63、h (*cpp)
{
case *:
cpp++;
cpn=strchr(cpn,*cpp);
if(cpn==NULL)
{
cpn=name;
while(*cpn) cpn++;
}
break;
case ?:
cpp++;
cpn++;
break;
case 0:
64、 if(*cpn!=0)
match=0;
ndone=0;
break;
default:
if((*cpp)==(*cpn))
{
cpp++;
cpn++;
}
else
{
match=0;
ndone=0;
}
65、 break;
}
}
return(match);
}
#endif
/***********************************************************************
- 功能描述:znFAT的文件目錄項的文件名字段(8個字節(jié)),轉為普通的文件名
如:ABC MP3 將轉為 ABC.MP3
- 隸屬模塊:znFAT文件系統(tǒng)模塊
- 函數(shù)屬性:內部
- 參數(shù)說明:dName:指向文件目錄項的文件名字段的指針
pName:指向轉 66、換完成后的文件名
- 返回說明:無
- 注:此函數(shù)配合上面的FilenameMatch函數(shù),就可以實現(xiàn)對文件名通配匹配
***********************************************************************/
#ifdef ZNFAT_TOFILENAME
void znFAT_toFileName(CONST INT8 *dName,INT8 *pName)
{
UINT8 i=0;
for(i=0;i<8;i++) pName[i]=dName[i];
pName[8]=.;
for(i=9;i<12;i++) pName[i]=dName[i-1];
i--;
while(pName[i]==0x20) pName[i--]=0;
pName[i+1]=0;i=7;
while(pName[i--]==0x20);i+=2;
strcpy(pName+i,pName+8);
}
#endif
/*********************
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。