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

📄 fat32.h

📁 在51下的外挂硬盘和FLASH的MP3方案程序以及原理图
💻 H
字号:
/********************************************************/
/*                                                      */
/*  库   名   称:FAT32文件系统函数库                   */

/*  功 能  描 述:提供对FAT32文件系统按文件名存取       */
/*                                                      */
/********************************************************/

#ifndef _TYPE_DEFINE
 #define _TYPE_DEFINE
 typedef bit BOOL;
 typedef unsigned char BYTE;
 typedef unsigned char CHAR;
 typedef unsigned int WORD;
 typedef unsigned long DWORD;
#endif

#ifndef _FAT32_DEFINE
 #define _FAT32_DEFINE

#define FAT32_MAX_FCB				2

//文件属性
#define	FAT32_ATTR_READ_ONLY			0x01			//文件属性:只读
#define	FAT32_ATTR_HIDDEN			0x02			//文件属性:隐含
#define	FAT32_ATTR_SYSTEM			0x04			//文件属性:系统
#define	FAT32_ATTR_VOLUME_ID			0x08			//文件属性:卷ID
#define	FAT32_ATTR_DIRECTORY			0x10			//文件属性:目录
#define	FAT32_ATTR_ARCHIVE			0x20			//文件属性:归档
#define FAT32_ATTR_LONG_NAME			FAT32_ATTR_READ_ONLY+FAT32_ATTR_HIDDEN+FAT32_ATTR_SYSTEM+FAT32_ATTR_VOLUME_ID	//文件属性:长文件名
#define FAT32_ATTR_LONG_NAME_MASK		FAT32_ATTR_READ_ONLY+FAT32_ATTR_HIDDEN+FAT32_ATTR_SYSTEM+FAT32_ATTR_VOLUME_ID+FAT32_ATTR_DIRECTORY+FAT32_ATTR_ARCHIVE	//文件属性:长文件名
#define FAT32_LAST_LONG_ENTRY			0x40			//长文件名入口标记

#define FAT32_ERR_MBR_FLAG			0x01			//MBR扇区标志错误	FAT32MountPartition
#define FAT32_ERR_PARTITION_NOT_FOUND		0x02			//指定分区没找到	FAT32MountVolumeID
#define FAT32_ERR_FILE_OPEN_ERROR		FAT32_MAX_FCB		//文件打开错误
#define FAT32_ERR_DIR_NOT_FOUND			0x01			//指定的目录入口没有找到F	FAT32ChangeDirectory
#define FAT32_ERR_NOT_DIR			0x02			//不是一个目录入口		FAT32ChangeDirectory

//#define IO_ERROR			0x00				//遇到io错误
//#define NO_IO_ERROR			0x01				//没有遇到io错误

//计算指定簇的开始扇区号
#define ClusterToSector(X)			FAT32.ClusSec + (X - 2) * FAT32.SecPerClus

struct BootSecFAT16Str					//引导扇区   FAT16  扩展结构
{
	BYTE	BS_DrvNum;
	BYTE	BS_Reserved1;
	BYTE	BS_BootSig;
	DWORD	BS_VolID;
	char	BS_VolLab[11];
	char	BS_FilSysType[8];
};

struct BootSecFAT32Str					//引导扇区   FAT32  扩展结构
{
	DWORD	BPB_FATSz32;			//FAT32扇区总数
	WORD	BPB_ExtFlags;
	WORD	BPB_FSVer;
	DWORD	BPB_RootClus;			//根目录开始的簇
	WORD	BPB_FSInfo;
	WORD	BPB_BkBootSec;
	char	BPB_Reserved[12];
	BYTE	BS_DrvNum;
	BYTE	BS_Reserved1;
	BYTE	BS_BootSig;
	DWORD	BS_VolID;
	char	BS_VolLab[11];
	char	BS_FilSysType[8];
};

struct BootSecStr						//引导扇区结构
{
	BYTE	BS_jmpBoot[3];
	BYTE	BS_OEMName[8];
	WORD	BPB_BytesPerSec;		//每扇区字节数  512
	BYTE	BPB_SecPerClus;			//每簇扇区数	1 2 4 8 16 32 64 128
	WORD	BPB_RsvdSecCnt;			//保留扇区数	0x20
	BYTE	BPB_NumFATs;			//FAT表个数		2
	WORD	BPB_RootEntCnt;		
	WORD	BPB_TotSec16;
	BYTE	BPB_Media;
	WORD	BPB_FATSz16;
	WORD	BPB_SecPerTrk;
	WORD	BPB_NumHeads;
	DWORD	BPB_HiddSec;
	DWORD	BPB_TotSec32;
	union	FATUni
	{
		struct BootSecFAT32Str	F32;
		struct BootSecFAT16Str	F16;
	}FAT;

};

struct DPTStr				//分区表结构
{
	BYTE	BootFlag;
	BYTE	CHSBegin[3];
	BYTE	TypeCode;
	BYTE	CHSEnd[3];
	DWORD	LBABegin;
	DWORD	CntSec;
};

struct sDPTStr				//简化的分区表
{
	BYTE	TypeCode;
	DWORD	LBABegin;
	DWORD	CntSec;
};

struct FAT32FSInfoStr		//FAT32扩展信息结构
{
	DWORD	LeadSig;
	BYTE	Reserved1[480];
	DWORD	StrucSig;
	DWORD	FreeCount;
	DWORD	NxtFree;
	BYTE	Reserved2[12];
	DWORD	TrailSig;
};

struct FAT32SDirStr			//FAT目录结构 短文件名
{
	CHAR	Name[11];
	BYTE	Attr;
	BYTE	NTRes;
	BYTE	CrtTimeTenth;
	WORD	CrtTime;
	WORD	CrtDate;
	WORD	LstAccDate;
	WORD	FstClusHI;
	WORD	WrtTime;
	WORD	WrtDate;
	WORD	FstClusLO;
	DWORD	FileSize;
};

struct FAT32LDirStr			//FAT目录结构 长文件名
{
	BYTE	Ord;
	BYTE	Name1[10];
	BYTE	Attr;
	BYTE	Type;
	BYTE	Chksum;
	BYTE	Name2[12];
	WORD	FstClusLO;
	BYTE	Name3[4];
};

struct FAT32Str					//FAT32参数表
{
	BYTE	ClusSecCnt;			//当前簇扇区计数
	DWORD	CurrentDirectory;	//当前目录入口(簇号)
	BYTE	SecPerClus;			//每簇扇区数	1 2 4 8 16 32 64 128
	WORD	RsvdSecCnt;			//保留扇区数	0x20
	BYTE	NumFATs;			//FAT表个数		2
	DWORD	RootClus;			//根目录开始的簇
	DWORD	ClusSec;			//簇开始的扇区
	DWORD	FATSz;				//FAT表大小(扇区)
	DWORD	FATSec;				//FAT表开始扇区
	DWORD	FSISec;				//FSI所在扇区
	DWORD	FSIFreeCount;		//空闲簇数
	DWORD	FSINxtFree;			//空闲簇搜索指针
};

struct FCBStr
{
	CHAR	FileName[12];		//文件名
	DWORD	Size;				//文件大小
	DWORD	FirstCluster;		//第一个簇
	DWORD	LastCluster;		//最近一次读到的簇号
	DWORD	ClusSecCnt;			//当前簇扇区计数
	DWORD	ByteCnt;			//当前字节计数
};

struct FATStr
{
	DWORD	Sector;
	DWORD	FAT[128];
};

#ifndef _LIBRARY_DEFINE
 xdata BYTE DiskBuffer[512];

 xdata struct sDPTStr sDPT[4];
 xdata struct FAT32Str FAT32;
 xdata struct FCBStr FCB[FAT32_MAX_FCB];
 xdata CHAR LongFileName[256]; 
 xdata struct FATStr FAT;
 xdata struct DPTStr *DPT;			//分区表结构指针
 xdata struct BootSecStr *BOOTSEC;		//引导扇区结构指针
 xdata struct FAT32FSInfoStr *FSI;		//FAT32扩展信息
 xdata struct FAT32SDirStr *sDIR;		//FAT目录结构指针
 xdata struct FAT32LDirStr *lDIR;		//FAT目录结构指针
#endif
#endif

extern xdata BYTE DiskBuffer[512];

extern xdata struct sDPTStr sDPT[4];
extern xdata struct FAT32Str FAT32;
extern xdata struct FCBStr FCB[FAT32_MAX_FCB];
extern xdata CHAR LongFileName[256]; 
extern xdata struct FATStr FAT;
extern xdata struct DPTStr *DPT;		//分区表结构指针
extern xdata struct BootSecStr *BOOTSEC;	//引导扇区结构指针
extern xdata struct FAT32FSInfoStr *FSI;	//FAT32扩展信息
extern xdata struct FAT32SDirStr *sDIR;		//FAT目录结构指针
extern xdata struct FAT32LDirStr *lDIR;		//FAT目录结构指针

extern void FAT32Init(void);
extern BYTE FAT32MountPartition(void);
extern BYTE FAT32MountVolumeID(BYTE Partition);
extern BYTE FAT32GetDirName(WORD SecNum);
extern void FAT32GetPartLongName(struct FAT32LDirStr *ldp,CHAR *name);
extern DWORD FAT32DiskSize(void);
extern DWORD FAT32DiskFreeSize(void);
extern BYTE FAT32FindDIREntry(CHAR *DirName);
extern void FAT32ReadCluster(DWORD *Cluster);
extern BYTE FAT32ChangeDirectory(CHAR *DirName);
extern BYTE FAT32ListDirectory(void);
extern DWORD FAT32NextCluster(DWORD CurrentCluster);
extern BYTE FAT32OpenFile(CHAR *filename);
extern void FAT32CloseFile(BYTE fp);
extern WORD FAT32ReadFile(BYTE fp);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -