?? fat.h
字號:
/*************************************Seekfor FAT System v1.3**************************************************************************
********************* ********************************* ********************* v1.3
******* ********** ******* ******** ******* ***********
******* ******* ******* ******* ******** *******
******* ******* ******* ********
******* ******* ******* ********
******* ******* ******* ********
*********** ************************* ***********
*********** ******* ******* ***********
******* ******* ******* *******
******* ******* *******
******* ******* ******* ******** *******
******* ******* ******* ******** *******
******* ******* ******* ******** *******
********** ******* ******* *********** *******
********************* *************** **********************
Seekfor FAT system v1.3是移植性非常強的一個嵌入式FAT16/FAT32文件系統軟件包,支持多個物理驅動器,完全兼容DOS下的文件系統,支持多任務下的文件操作.
<1>和SFS 前期版本比較,SFS v1.3增加以下特性:
1.增強了錯誤處理功能
2.增加了FAT_format()功能
3.開始支持擴展分區
4.開始支持長文件的顯示(暫不支持用長文件名訪問文件),Windows下建立的長文件名可以正常顯示
5.取消v1.0中的物理驅動器概念,所有驅動器都看做邏輯驅動器
6.修正v1.0中扇區計算不對不兼容Windows的bug
7.修正FAT32根目錄起始位置固定的bug
8.內部直接支持malloc()+free()機制,用戶只需提供2K以上的RAM空間即可使用SFS v1.3
<2>更新軟件請聯系:
QQ:82054357
MSN:sfrad32@hotmail.com
Mail:Seek_for@163.com
<3>本文件說明
a.文件名:fat.h
b.功能:系統頭文件,自定義選項,全局函數原型,常量定義等
**************************************************************************************************************************************/
#ifndef __FAT_H__
#define __FAT_H__
#include "types.h"
/*是否被DOS使用*/
#define USED_BY_DOS 1
#if(USED_BY_DOS==1)
typedef void*(*DEVICE_OPEN)(char*,char*);
typedef int (*DEVICE_CLOSE)(void*);
typedef int (*DEVICE_READ)(void*,int);
typedef int(*DEVICE_WRITE)(void*,int);
typedef int(*DEVICE_ESCAPE)(int,void*);
#endif
/*是否支持擴展分區,1=支持,0=不支持*/
#define SUPPORT_EXT_PARTITION 0
/*是否支持長文件名(當前版本不支持,必須為0)*/
#define SUPPORT_LONG_NAME 0
/*是否支持格式化功能,1=支持,0=不支持*/
#define SUPPORT_FORMAT 1
/*建立文件夾的時候是否建立"."和".."目錄,1=建立,0=不建立*/
#define CREATE_DOT_ENTRY 0
/*默認的format參數*/
#define DEFAULT_BYTES_PER_SECTOR 512/*每扇區字節數,一般為512*/
#define DEFAULT_RESERVED_SECTORS 2/*保留的扇區數,一般為2,必須>=1*/
#define DEFAULT_ROOT_ENTRY 512/*FAT16保留的根目錄數,一般為512即可*/
/*驅動器開始盤符*/
#define START_DRIVER_LABLE 'C'
/*最多支持的驅動器數目*/
#define MAX_DRIVERS_NUMBER 24
#define DEFAULT_SECTOR_SIZE 16384
/*是否使用內部的malloc()+free()庫*/
#define USING_INTERNAL_MALLOC 1
/*文件訪問模式*/
#define O_READ 0x0001
#define O_WRITE 0x0002
#define O_APPEND 0x0006
#define O_BINARY 0x0008
#define O_TEXT 0x0010
/*文件屬性*/
#define ATTR_READONLY 0x01
#define ATTR_HIDDEN 0x02
#define ATTR_SYSTEM 0x04
#define ATTR_VOLUME_ID 0x08
#define ATTR_DIRECTORY 0x10
#define ATTR_ARCHIVE 0x20
#define ATTR_LONG_NAME (0x01|0x02|0x04|0x08)
/*seek功能*/
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
/*扇區擦除函數指針*/
typedef BOOL (*SECTOR_ERASE)(DWORD dwSectors,DWORD dwSectorSize,void*user_data);
/*扇區讀函數指針*/
typedef BOOL (*SECTOR_READ)(DWORD dwSectors,BYTE*buff,DWORD dwSectorSize,void*user_data);
/*扇區寫函數指針*/
typedef BOOL (*SECTOR_WRITE)(DWORD dwSectors,BYTE*buff,DWORD dwSectorSize,void*user_data);
typedef struct
{
void*prev;
void*next;
DWORD dwSectors;
BYTE name[12];
}LINK,*PLINK;
typedef struct
{
DWORD bFAT32;/*是否FAT32,0=FAT16,1=FAT32*/
DWORD BPB_Total;/*扇區總數*/
DWORD dwHideSectorStart;/*隱藏扇區開始號*/
DWORD dwReservedSectorStart;/*保留扇區開始號*/
DWORD dwFATSectorStart[2];/*FAT1開始扇區號*/
DWORD dwRootSectorStart;/*根目錄開始扇區號*/
DWORD dwDataSectorStart;/*數據開始扇區號*/
DWORD dwNumFATs;/*FAT表總數*/
DWORD dwFATsZ;/*FAT表扇區總數*/
DWORD dwVOLID;/*卷標ID*/
#if(SUPPORT_LONG_NAME==1)
BYTE VolLable[255];/*卷標*/
#else
BYTE VolLable[15];/*卷標*/
#endif
BYTE DriverName;/*驅動器名稱*/
DWORD dwTotalClusters;/*簇總數*/
DWORD dwFreeClusters;/*空閑簇總數*/
PLINK lpLinks;/*路徑雙向連表*/
PLINK lpCurrentDir;/*當前目錄連表指針,指向lpLinks的最后一個節點*/
DWORD dwBytesPerSector;/*每扇區字節數目*/
DWORD dwSectorsPerCluster;/*每簇扇區數目*/
void* user_data;/*用戶數據指針*/
SECTOR_READ lpfnRead;/*扇區讀指針*/
SECTOR_WRITE lpfnWrite;/*扇區寫指針*/
SECTOR_ERASE lpfnErase;/*扇區擦除指針*/
}DRIVER_INFO;
typedef struct
{
DWORD bNotFAT;/*是否FAT文件*/
#if(USED_BY_DOS==1)
BYTE lpszShortName[32];
#else
BYTE lpszShortName[12];
#endif
#if(SUPPORT_LONG_NAME==1)
BYTE lpszLongName[256];
#endif
DWORD dwFileLength;/*文件長度*/
WORD dwAttr;/*文件屬性*/
WORD dwMode;/*文件打開模式*/
#if(USED_BY_DOS==1)
DEVICE_OPEN lpfnOpen;
DEVICE_CLOSE lpfnClose;
DEVICE_READ lpfnRead;
DEVICE_WRITE lpfnWrite;
DEVICE_ESCAPE lpfnEscape;
#endif
DWORD dwCurrentPosition;/*文件當前位置*/
DWORD dwFirstCluster;/*第一個簇號*/
DWORD dwCurrentCluster;/*當前正在讀寫的簇號*/
DWORD dwDirectoryEntrySector;/*文件名入口扇區號*/
DWORD dwDirectoryEntryOffset;/*文件名入口偏移*/
BYTE lpszDir[32];/*32個字節的文件入口信息*/
BYTE*lpszBuffers;/*簇內容緩沖區*/
DWORD dwIndexs;/*緩沖區指針*/
DRIVER_INFO*driver;/*文件所在的驅動器指針*/
}FILE;
typedef struct
{
BYTE year;
BYTE month;
BYTE day;
BYTE week;
}FAT_DATE;
typedef struct
{
BYTE hour;
BYTE minute;
BYTE second;
BYTE millsecond;
}FAT_TIME;
typedef struct
{
/*********內部使用數據***************************/
BYTE ff_name1[8];/*主文件名*/
BYTE ff_name2[3];/*擴展名*/
BYTE attr; /*要查找的屬性*/
DWORD prev_cluster;/*上次的簇*/
DWORD orig_sector;/*原始扇區*/
DWORD prev_sector;/*上次查找過的扇區號*/
DWORD prev_index;/*上次查找過的入口偏移*/
DRIVER_INFO* driver;/*當前驅動器指針*/
/***********************************************/
WORD ff_time;/*查找到的文件修改時間*/
WORD ff_date;/*查找到的文件修改日期*/
DWORD ff_size;/*查找到的文件大小*/
char ff_name[15];/*8.3文件名稱,ANSI C的ff_name是ff_name[13],這里改成[15]是為了適應ARM的字對齊*/
BYTE ff_attrib;/*查找到的文件屬性*/
#if(SUPPORT_LONG_NAME==1)
BYTE ff_longname[256];
#endif
}ffblk;
typedef struct
{
DWORD df_avail;
DWORD df_total;
DWORD df_bsec;
DWORD df_sclus;
}dfree;
typedef struct
{
BOOL bFAT32;
DWORD dwBytesPerSector;
DWORD dwStart;
DWORD dwLength;
SECTOR_ERASE lpfnErase;
SECTOR_READ lpfnRead;
SECTOR_WRITE lpfnWrite;
void *user_data;
}FORMAT_PARAMS;
#ifdef __cplusplus
extern "C"
{
#endif
/*portable.c API*/
void*malloc(DWORD size);
void free(void*);
FAT_DATE SYS_getdate();
FAT_TIME SYS_gettime();
#if(SUPPORT_LONG_NAME==1)
BOOL Unicode2Ascii(BYTE*unicode,BYTE*ascii);
#endif
/*fat.c API*/
DWORD FAT_install(DWORD,SECTOR_ERASE,SECTOR_READ,SECTOR_WRITE,void*);
BOOL FAT_format(DRIVER_INFO*,FORMAT_PARAMS*);
/*stdio.h兼容API*/
FILE* fopen(BYTE*,BYTE*);
int fclose(FILE*);
int fgetc(FILE*);
int fputc(int c,FILE*p);
BYTE*fgets(BYTE*s,int n,FILE*p);
int fputs(BYTE*s,FILE*p);
int fread(void*,unsigned int,unsigned int,FILE*);
int fwrite(void*,unsigned int,unsigned int,FILE*);
long ftell(FILE*p);
int feof(FILE*);
int chdir(BYTE*);
int rmdir(BYTE*);
int mkdir(BYTE*);
int getcurdir(int,BYTE*);
int findfirst(BYTE*,ffblk*,BYTE);
int findnext(ffblk*);
void getdfree(BYTE driver,dfree*table);
int rename(BYTE*,BYTE*);
int remove(BYTE*);
int fseek(FILE*,long,int);
/*額外功能支持API*/
int attrib(BYTE*,BYTE);
int label(BYTE,BYTE*);
int getfilelength(FILE*p);
#ifdef __cplusplus
}
#endif
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -