⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat.h

📁 可以兼容MS-DOS的文件系统和指令的S3C2410平台的DOS部分源代码,加以修改可以使用在S3C2440 S3C44B0等ARM7、ARM9上
💻 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 + -