?? fat.h
字號:
#ifndef __FAT_H__
#define __FAT_H__
#include "mytype.h" //類型重定義
#define SOC(c) (((c-pArg->FirstDirClust)*(pArg->SectorsPerClust))+pArg->FirstDirSector) // 用于計算簇的開始扇區
#define DEVS 1 //這里表明存儲設備的個數,這里只有1個存儲設備,就是SD卡
//設備表
#define SDCARD 0 //SD卡
#define UDISK 1 //U盤
#define CFCARD 2 //CF卡
#define OTHER 3 //其它
//這里的存儲設備表,可以靈活擴充,以實現對更多存儲設備的支持
//-------------------------------------------
#define MAKE_FILE_TIME(h,m,s) ((((unsigned int)h)<<11)+(((unsigned int)m)<<5)+(((unsigned int)s)>>1)) /* 生成指定時分秒的文件時間數據 */
#define MAKE_FILE_DATE(y,m,d) (((((unsigned int)y)+20)<<9)+(((unsigned int)m)<<5)+((unsigned int)d)) /* 生成指定年月日的文件日期數據 */
//DPT:分區記錄結構如下
struct PartRecord
{
UINT8 Active; //0x80表示此分區有效
UINT8 StartHead; //分區的開始磁頭
UINT8 StartCylSect[2];//開始柱面與扇區
UINT8 PartType; //分區類型
UINT8 EndHead; //分區的結束頭
UINT8 EndCylSect[2]; //結束柱面與扇區
UINT8 StartLBA[4]; //分區的第一個扇區
UINT8 Size[4]; //分區的大小
};
//MBR:分區扇區(絕對0扇區)定義如下
struct PartSector
{
UINT8 PartCode[446]; //MBR的引導程序
struct PartRecord Part[4]; //4個分區記錄
UINT8 BootSectSig0; //55
UINT8 BootSectSig1; //AA
};
//FAT32中對BPB的定義如下 一共占用90個字節
struct FAT32_BPB
{
UINT8 BS_jmpBoot[3]; //跳轉指令 offset: 0
UINT8 BS_OEMName[8]; // offset: 3
UINT8 BPB_BytesPerSec[2];//每扇區字節數 offset:11
UINT8 BPB_SecPerClus[1]; //每簇扇區數 offset:13
UINT8 BPB_RsvdSecCnt[2]; //保留扇區數目 offset:14
UINT8 BPB_NumFATs[1]; //此卷中FAT表數 offset:16
UINT8 BPB_RootEntCnt[2]; //FAT32為0 offset:17
UINT8 BPB_TotSec16[2]; //FAT32為0 offset:19
UINT8 BPB_Media[1]; //存儲介質 offset:21
UINT8 BPB_FATSz16[2]; //FAT32為0 offset:22
UINT8 BPB_SecPerTrk[2]; //磁道扇區數 offset:24
UINT8 BPB_NumHeads[2]; //磁頭數 offset:26
UINT8 BPB_HiddSec[4]; //FAT區前隱扇區數 offset:28
UINT8 BPB_TotSec32[4]; //該卷總扇區數 offset:32
UINT8 BPB_FATSz32[4]; //一個FAT表扇區數 offset:36
UINT8 BPB_ExtFlags[2]; //FAT32特有 offset:40
UINT8 BPB_FSVer[2]; //FAT32特有 offset:42
UINT8 BPB_RootClus[4]; //根目錄簇號 offset:44
UINT8 FSInfo[2]; //保留扇區FSINFO扇區數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
UINT8 BS_VolID[4]; // offset:67
UINT8 BS_FilSysType[11]; // offset:71
UINT8 BS_FilSysType1[8]; //"FAT32 " offset:82
};
struct FAT32_FAT_Item
{
UINT8 Item[4];
};
struct FAT32_FAT
{
struct FAT32_FAT_Item Items[128];
};
struct direntry
{
UINT8 deName[8]; // 文件名,不足部分以空格補充
UINT8 deExtension[3]; // 擴展名,不足部分以空格補充
UINT8 deAttributes; // 文件屬性
UINT8 deLowerCase; // 0
UINT8 deCHundredth; // 世紀
UINT8 deCTime[2]; // 創建時間
UINT8 deCDate[2]; // 創建日期
UINT8 deADate[2]; // 訪問日期
UINT8 deHighClust[2]; // 開始簇的高字
UINT8 deMTime[2]; // 最近的修改時間
UINT8 deMDate[2]; // 最近的修改日期
UINT8 deLowCluster[2]; // 開始簇的低字
UINT8 deFileSize[4]; // 文件大小
};
//FAT32初始化時初始參數裝入如下結構體中
struct FAT32_Init_Arg
{
UINT8 DEV_No;
UINT8 BPB_Sector_No; //BPB所在扇區號
UINT32 Total_Size; //磁盤的總容量
UINT32 FirstDirClust; //根目錄的開始簇
UINT32 BytesPerSector; //每個扇區的字節數
UINT32 FATsectors; //FAT表所占扇區數
UINT32 SectorsPerClust; //每簇的扇區數
UINT32 FirstFATSector; //第一個FAT表所在扇區
UINT32 FirstDirSector; //第一個目錄所在扇區
};
struct Date
{
UINT16 year;
UINT8 month;
UINT8 day;
};
struct Time
{
UINT8 hour;
UINT8 min;
UINT8 sec;
};
// Stuctures
struct FileInfoStruct
{
UINT8 FileName[12]; //文件名
UINT32 FileStartCluster; //文件的開始簇
UINT32 FileCurCluster;
UINT32 FileSize; //文件的當前簇
UINT32 FileCurSector; //文件的當前扇區
UINT16 FileCurPos; //文件在當前扇區中的位置
UINT32 FileCurOffset; //文件的當前偏移量
UINT32 Rec_Sec; //文件的文件/目錄項所在的扇區
UINT16 nRec; //文件的文件/目錄項所在扇區中的位置
UINT8 FileAttr; //文件屬性
struct Time FileCreateTime; //文件的創建時間
struct Date FileCreateDate; //文件的創建日期
struct Time FileMTime; //文件的修改時間
struct Date FileMDate; //文件的修改日期
struct Date FileADate; //文件的訪問日期
};
struct FSInfo //FAT32的文件系統信息結構
{
UINT8 Head[4];
UINT8 Resv1[480];
UINT8 Sign[4];
UINT8 Free_Cluster[4];
UINT8 Last_Cluster[4];
UINT8 Resv2[14];
UINT8 Tail[2];
};
UINT8 FAT32_ReadSector(UINT32 addr,UINT8 *buf); //znFAT的與底層存儲設備的驅動接口,讀取扇區
UINT8 FAT32_WriteSector(UINT32 addr,UINT8 *buf);//znFAT的與底層存儲設備的驅動接口,寫入扇區
UINT32 LE2BE(UINT8 *dat,UINT8 len); //小端轉大端
UINT8 FAT32_is_MBR(); //是否存在MBR
void FAT32_Analysis_DPT(); //分析DPT結構
UINT16 FAT32_Find_DBR(); //定位DBR
UINT32 FAT32_Get_Total_Size(); //獲取總容量
void FAT32_Init(); //文件系統初始化
UINT32 Search_Last_Usable_Cluster(); //從獲取FSInfo中的下一個可用空閑簇
UINT32 FAT32_Get_Remain_Cap(); //獲取剩余容量
void FAT32_Update_FSInfo_Free_Clu(UINT32 PlusOrMinus); //更新FSInfo的空閑簇的數量
void FAT32_Update_FSInfo_Last_Clu(UINT32 Last_Clu); //更新FSInfo的下一個可用空閑簇
UINT32 FAT32_GetNextCluster(UINT32 LastCluster); //獲取下一個簇
UINT32 FAT32_Enter_Dir(INT8 *path); //進入目錄
UINT8 FAT32_Open_File(struct FileInfoStruct *pfi,INT8 *filepath,UINT32 item); //打開文件,支持通配
UINT8 FAT32_Seek_File(struct FileInfoStruct *pfi,UINT32 offset); //文件定位
UINT32 FAT32_Read_File(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,UINT8 *pbuf); //讀取文件數據
UINT32 FAT32_Read_FileX(struct FileInfoStruct *pfi,UINT32 offset,UINT32 len,void (*pfun)(UINT8)); //讀取文件數據并進行數據處理
UINT32 FAT32_Find_Free_Clust(unsigned char flag); //尋找下一個可用的空閑簇
UINT8 FAT32_Create_Rec(struct FileInfoStruct *pfi,UINT32 cluster,INT8 *name,UINT8 is_dir,UINT8 *ptd); //構建文件/目錄項
UINT32 FAT32_Add_Dat(struct FileInfoStruct *pfi,UINT32 len,UINT8 *pbuf); //向文件追加數據
UINT8 FAT32_Create_Dir(struct FileInfoStruct *pfi,INT8 *dirpath,UINT8 *ptd); //創建目錄,支持創建時間
UINT8 FAT32_Create_File(struct FileInfoStruct *pfi,INT8 *filepath,UINT8 *ptd); //創建文件,支持創建時間
UINT8 FAT32_Del_File(INT8 *filepath); //刪除文件
unsigned char FAT32_XCopy_File(struct FAT32_Init_Arg *pArg1,struct FAT32_Init_Arg *pArg2,INT8 *sfilename,INT8 *tfilename,UINT8 *file_buf,UINT32 buf_size,unsigned char *pt); //文件拷貝,支持多設備中文件互拷
UINT8 FAT32_File_Close(struct FileInfoStruct *pfi); //文件關閉
UINT8 FAT32_Rename_File(INT8 *filename,INT8 *newfilename); //文件重命名
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -