?? fat.h
字號:
/****************************************Copyright (c)**************************************************
** 廣州周立功單片機發展有限公司
** 研 究 所
** ARM開發組
**
** http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: fat.h
**創 建 人: 陳明計
**最后修改日期: 2003年9月3日
**描 述: FAT文件系統總頭文件
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 陳明計
** 版 本: V1.0
** 日 期: 2003年9月3日
** 描 述: 原始版本
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人: 陳明計
** 日 期: 2004年4月10日
** 描 述: 修改注釋
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef MAX_OPEN_FILES
#define MAX_OPEN_FILES 10 /* 可以同時打開的文件數目 */
#endif
#ifndef DISK_CACHE_SIZE
#define DISK_CACHE_SIZE 512 /* 文件系統Cache大小(字節),應當是最大的扇區所占字節數 */
#endif
#ifndef MAX_DISK_CACHES
#define MAX_DISK_CACHES 256 /* 文件系統Cache數目,必須為16的整數倍 */
#endif
#define BASE_CACHE_NUM 4
#ifndef MAX_DRIVES
#define MAX_DRIVES 1 /* 可以同時加載的邏輯驅動器數目 */
#endif
#ifndef MAX_PATHFILE_LENGTHS
#define MAX_PATHFILE_LENGTHS 512 /* 字符串的長度 */
#endif
#ifndef RW_ID_BASE
#define RW_ID_BASE 0x20 /* 用于cache分配策略,越大cache越不易寫回磁盤 */
#endif
#if MAX_OPEN_FILES < 0x100
typedef uint8 HANDLE;
#define Not_Open_FILE 0xff
#else
#if MAX_OPEN_FILES < 0x10000
typedef uint16 HANDLE;
#define Not_Open_FILE 0xffff
#else
typedef uint32 HANDLE;
#define Not_Open_FILE 0xffffffff
#endif
#endif
#define ZLG_FS_VER 110
/* 底層驅動命令 */
#define DISK_INIT 0 /* 初始化,必須實現 */
#define DISK_CLOSE 1 /* 關閉,必須實現 */
#define DISK_READ_SECTOR 2 /* 讀扇區,必須實現 */
#define DISK_WRITE_SECTOR 3 /* 寫扇區,必須實現 */
#define DISK_DRIVER_VER 4 /* 查看驅動程序版本號,必須實現 */
#define DISK_CHECK_CMD 5 /* 查看命令是否實現,必須實現 */
#define DISK_LOW_FORMAT 6 /* 低級格式化,可選命令 */
#define DISK_FREE_SECTOR 7 /* 釋放扇區,可選命令 */
#define DISK_GET_SECTOR_NUMBER 8 /* 獲得設備總扇區數,可選命令 */
#define DISK_GET_BYTES_PER_SECTOR 9 /* 獲得每扇區字節數,可選命令 */
#define DISK_CHECK_CHANGE 10 /* 查看介質是否改變,可選命令 */
#define DISK_GET_SECTORS_PER_BLOCK 11 /* 獲取每塊扇區數,可選命令 */
#define DISK_READ_BLOCK 12 /* 讀數據塊,可選命令 */
#define DISK_WRITE_BLOCK 13 /* 寫數據塊,可選命令 */
/* 底層驅動返回值 */
#define DISK_RETURN_OK 0x00
#define DISK_READ_OK 0x01
#define DISK_READ_NOT_OK 0x80
#define DISK_WRITE_OK 0x02
#define DISK_WRITE_NOT_OK 0x82
#define DISK_INIT_OK 0x03
#define DISK_INIT_NOT_OK 0x83
#define DISK_TRUE 0x04
#define DISK_FALSE 0x84
#define BAD_DISK_COMMAND 0xffff
/* 函數返回值 */
#define RETURN_OK 0x00 /* 操作成功 */
#define NOT_FIND_DISK 0x01 /* 邏輯盤不存在 */
#define DISK_FULL 0x02 /* 邏輯盤滿 */
#define SECTOR_NOT_IN_CACHE 0x03 /* 扇區沒有被cache */
#define NOT_EMPTY_CACHE 0x04 /* 沒有空閑cache */
#define SECTOR_READ_ERR 0x05 /* 讀扇區錯誤 */
#define CLUSTER_NOT_IN_DISK 0x06 /* 邏輯盤中沒有此簇 */
#define NOT_FIND_FDT 0x07 /* 沒有發現文件(目錄)*/
#define NOT_FAT_DISK 0x08 /* 非FAT文件系統 */
#define FDT_OVER 0x09 /* FDT索引超出范圍 */
#define FDT_EXISTS 0x0a /* 文件(目錄)已經存在*/
#define ROOT_FDT_FULL 0x0b /* 根目錄滿 */
#define DIR_EMPTY 0x0C /* 目錄空 */
#define DIR_NOT_EMPTY 0x0d /* 目錄不空 */
#define PATH_NOT_FIND 0x0e /* 路徑未找到 */
#define FAT_ERR 0x0f /* FAT表錯誤 */
#define FILE_NAME_ERR 0x10 /* 文件(目錄)名錯誤 */
#define FILE_EOF 0x11 /* 文件結束 */
#define FILE_LOCK 0x12 /* 文件被鎖定 */
#define NOT_FIND_FILE 0x13 /* 沒有發現指定文件 */
#define NOT_FIND_DIR 0x14 /* 沒有發現指定目錄 */
#define GET_TIME_ERR 0x15 /* 獲取時間錯誤 */
#define DISK_NO_FORMAT 0x16 /* 邏輯盤沒有格式化 */
#define NOT_RUN 0xfd /* 命令未執行 */
#define BAD_COMMAND 0xfe /* 錯誤命令 */
#define PARAMETER_ERR 0xff /* 非法參數 */
/* 未使用的邏輯盤 */
#define EMPTY_DRIVE 0xff
#define UN_MOUNT_DRIVE 0xfe
/* FAT類型 */
#define FAT12 0
#define FAT16 1
#define FAT32 2
/* FDT文件屬性 */
#define ATTR_READ_ONLY 0x01
#define ATTR_HIDDEN 0x02
#define ATTR_SYSTEM 0x04
#define ATTR_VOLUME_ID 0x08
#define ATTR_DIRECTORY 0x10
#define ATTR_ARCHIVE 0x20
/* 簇類型 */
#define EMPTY_CLUS 0
#define EMPTY_CLUS_1 1
#define BAD_CLUS 0x0ffffff7L
#define EOF_CLUS_1 0x0ffffff8L
#define EOF_CLUS_END 0x0fffffffL
/* FDT類型 */
#define EMPTY_FDT 0
#define DEL_FDT ((char)(0xe5))
#define ESC_FDT 0x05
/* Cache狀態 */
#define CACHE_READED 0x02
#define CACHE_WRITED 0x01
/* 文件指針狀態 */
#define FILE_FLAGS_READ 1 << 0 /* 可讀 */
#define FILE_FLAGS_WRITE 1 << 1 /* 可寫 */
/* 文件指針調整方式 */
#define SEEK_SET 0 /* 從文件開始處移動文件指針 */
#define SEEK_CUR 1 /* 從文件當前位置移動文件指針 */
#define SEEK_END 2 /* 從文件尾移動文件指針 */
/* 給底層驅動讀寫命令的參數結構體 */
typedef struct _Disk_RW_Parameter
{
uint32 SectorIndex; /* 操作的扇區 */
void *RsvdForLow; /* 保留給底層驅動程序,由_Disk_Info中拷貝過來 */
uint8 *Buf; /* 數據存儲位置 */
}Disk_RW_Parameter;
/* 文件系統cache數據結構 */
typedef struct _Disk_Cache
{
uint8 Drive; /* 驅動器號,EMPTY_DRIVE為空閑 */
uint8 Flag; /* 狀態 */
uint16 RW_ID; /* 讀寫ID,用于釋放Cache */
uint32 SecIndex; /* 緩沖的扇區索引 */
uint8 buf[DISK_CACHE_SIZE];
/* 緩沖區 */
}Disk_cache;
/* 邏輯盤信息的數據結構 */
typedef struct _Disk_Info
{
uint8 Drive; /* 邏輯驅動器號,EMPTY_DRIVE為還未分配 */
uint8 FATType; /* 類型:FAT12、FAT16和FAT32 */
uint8 SecPerClus; /* 每簇扇區數 */
uint8 NumFATs; /* FAT表數目 */
uint16 BytsPerSec; /* 每扇區字節數 */
uint32 SecPerDisk; /* 邏輯驅動器包含扇區數 */
uint32 RootDirTable; /* 根目錄開始扇區號(FAT32為開始簇號)*/
uint32 RootSecCnt; /* 根目錄占用扇區數 */
uint32 FATStartSec; /* FAT表開始扇區號 */
uint32 FATSecCnt; /* 每個FAT占用扇區數 */
uint32 DataStartSec; /* 數據區開始扇區號 */
uint32 ClusPerData; /* 數據區包含簇數 */
uint32 PathClusIndex; /* 當前路徑的FDT表開始簇號, 0為根目錄 */
uint32 SecOffset; /* 分區起始位置 */
void *RsvdForLow; /* 保留給底層驅動程序 */
uint16 (* DiakCommand)(uint8 Cammand, void *Parameter);
/* 對應的驅動程序 */
}Disk_Info;
/* 目錄表數據結構 */
typedef struct _FDT
{
char Name[11]; /* 短文件名主文件名 */
uint8 Attr; /* 文件屬性 */
uint8 NTRes; /* 保留給NT */
uint8 CrtTimeTenth; /* 建立時間(fat16保留)*/
uint16 CrtTime; /* 建立時間(fat16保留)*/
uint16 CrtDate; /* 建立日期(fat16保留)*/
uint16 LstAccDate; /* 最后訪問日期(fat16保留)*/
uint16 FstClusHI; /* 起始簇號高兩個字節(fat16保留)*/
uint16 WrtTime; /* 最后寫時間 */
uint16 WrtDate; /* 最后寫日期 */
uint16 FstClusLO; /* 起始簇(cluster)號低兩個字節 */
uint32 FileSize; /* 文件大小 */
} FDT;
/* 文件信息結構體 */
typedef struct _FILE
{
uint8 Flags; /* 一些標志 */
char Name[11]; /* 文件名 */
uint8 Drive; /* 文件所在磁盤 */
uint32 DirClus; /* 所在目錄開始簇號 */
uint32 FileSize; /* 文件大小 */
uint32 FstClus; /* 起始簇號 */
uint32 Clus; /* 當前簇號 */
uint32 Offset; /* 文件指針偏移量 */
} MY_FILE;
/* 用戶設置的時間格式 */
typedef struct _DATE_TIME
{
uint16 da_year; /* 公元年 */
uint8 da_mon; /* 月 */
uint8 da_day; /* 月中日期 */
uint8 da_dow; /* 星期中日期 */
uint8 ti_hour; /* 時 */
uint8 ti_min; /* 分 */
uint8 ti_sec; /* 秒 */
uint8 ti_hund; /* 百分之一秒 */
}DATE_TIME;
/* 與FS接口的時間格式,與FDT項匹配 */
typedef struct _SYS_TIME
{
/* 日期:位0~4:日,有效值1~31;位5~8:月,有效值1~12;*/
/* 位9~15:年,從1980年開始的年數,有效值0~127 */
uint16 date;
/* 時間:位0~4:2秒的數量;位5~10:分,有效值0~59;位11~15:時,有效值0~23 */
uint16 time;
/* 十分之一秒值,有效值0~199 */
uint8 msec;
}SYS_TIME;
/*******************************************************************************************************/
#ifndef IN_FILE
extern void FileInit(void);
/*********************************************************************************************************
** 函數名稱: FileInit
** 功能描述: 初始化文件指針系統
**
** 輸 入: 無
**
** 輸 出: 無
**
** 全局變量: 無
** 調用模塊: 無
********************************************************************************************************/
extern uint8 RemoveFile(char *DirFileName);
/*********************************************************************************************************
** 函數名稱: RemoveFile
** 功能描述: 刪除文件
**
** 輸 入: DirFileName:用戶使用的文件名
**
** 輸 出: RETURN_OK:成功
** 其它參考fat.h中關于返回值的說明
** 全局變量: 無
** 調用模塊: strupr,_GetFileInfo,GetDrive,FindFDTInfo,FATDelClusChain,DelFDT
********************************************************************************************************/
extern HANDLE FileOpen(char *DirFileName, char *Type);
/*********************************************************************************************************
** 函數名稱: FileOpen
** 功能描述: 以指定方式打開文件
**
** 輸 入: DirFileName:用戶使用的文件名
** Type:打開方式
** 輸 出: 文件句柄,Not_Open_FILE為不能打開
**
** 全局變量: 無
** 調用模塊: _FileOpenR,_FileOpenW,_FileOpenRW
********************************************************************************************************/
extern uint8 FileClose(HANDLE Handle);
/*********************************************************************************************************
** 函數名稱: FileClose
** 功能描述: 關閉指定文件
**
** 輸 入: Handle:文件句柄
**
** 輸 出: RETURN_OK:成功
** 其它參考fat.h中關于返回值的說明
** 全局變量: 無
** 調用模塊: 無
********************************************************************************************************/
extern uint8 FileGetCh(uint8 *Ch, HANDLE Handle);
/*********************************************************************************************************
** 函數名稱: FileGetCh
** 功能描述: 從文件讀一個字節
**
** 輸 入: Ch:返回讀到的數據
** Handle:文件句柄
** 輸 出: RETURN_OK:成功
** 其它參考fat.h中關于返回值的說明
** 全局變量: 無
** 調用模塊: 無
********************************************************************************************************/
extern uint32 FileRead(void *Buf, uint32 Size, HANDLE Handle);
/*********************************************************************************************************
** 函數名稱: FileRead
** 功能描述: 讀取文件
**
** 輸 入: Buf:保存讀回的數據
** Size:要讀的字節數
** Handle:文件句柄
** 輸 出: 實際讀到的字節數
**
** 全局變量: 無
** 調用模塊: 無
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -