📄 fat.h
字号:
/****************************************Copyright (c)**************************************************
** CH374做主机操作U盘读写程序
** FAT16文件系统层
** 头文件
**
** VBeat 0.5
**
**--------------文件信息--------------------------------------------------------------------------------
**文 件 名: FAT.H
**创 建 人: 徐亦朱
**最后修改日期: 2007年9月26日
**描 述: FAT文件系统总头文件
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 徐亦朱
** 版 本: VBeat 0.4
** 日 期: 2007年9月24日
** 描 述: 改善头文件格式
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 徐亦朱
** 日 期: 2007年9月27日
** 描 述: 优化数据结构及算法
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
/* 调试宏定义 */
/*
#define DEBUG_NAME //8 + 3文件名处理 ProcessName
#define DEBUG_PATH //路径处理函数 ProcessPath
#define DEBUG_Init //初始化函数 Init_FAT
#define DEBUG_LIST //FAT表信息读取计算函数x16List
#define DEBUG_CF //查找文件地址信息函数 CheckFile
#define DEBUG_XCF //查找文件地址信息函数 CheckFirst16/x16CheckFile
#define DEBUG_YCF //FAT16根目录项处理函数x16RootDirectory
#define DEBUG_READ //读取文件函数 x16ReadFile
#define DEBUG_WRITE //写入文件函数 x16WriteFile
#define DEBUG_CLOSE //关闭文件函数 FATClose
#define DEBUG_CREAT //新建文件函数 x16Creat
#define DEBUG_OPEN //打开文件函数 FATOPEN
*/
/* 错误码 */
// 路径处理函数 ProcessPath
#define NextContinue 0x90 //路径未处理结束
#define EndPath 0x91 //路径处理结束
// 初始化函数 Init_FAT
#define ERR_Init 0x92 //文件系统初始化错误
#define InitSuccess 0x93 //文件系统成功初始化
// FAT表信息读取计算函数 x16List
#define ERR_List 0x94 //FAT表信息读取计算错误
#define ListSuccess 0x95 //FAT表信息成功读取计算
// 目录项处理函数 xProcessDirectory/x16RootDirectory
#define ERR_Directory 0x96 //目录项操作异常传输错误
#define DirectorySuccess 0x97 //目录项操作成功
// FAT16根目录项处理函数x16RootDirectory
#define ERR_FullRoot 0x98 //根目录写满,无法创建新文件/目录
// 查可写簇函数 x16CheckClus
#define ERR_CheckClus 0x0001 //查找空簇异常传输错误
// 查找文件地址信息函数 x16CheckFile/CheckFirst16/x16CheckFile
#define ERR_Check 0x02 //查找文件异常传输错误
// 读取文件函数 x16ReadFile
#define ERR_Read 0x72 //读取文件操作异常传输错误
#define ReadSuccess 0x73 //读取文件操作成功完成
#define Clu_End 0x66 //读取一簇完成
#define File_End 0x88 //文件读取完成
// 写入文件函数 x16WriteFile
#define ERR_Write 0x74 //写入文件操作异常传输错误
#define WriteSuccess 0x75 //写入文件操作成功完成
#define ERR_FullDisk 0x76 //磁盘满,无法写入数据
// 新建文件函数 x16Creat
#define ERR_Creat 0x77 //Creat操作异常错误
#define CreatSuccess 0x78 //Creat操作成功完成
// 打开文件函数 FATOpen
#define ERR_OPEN 0x99 //Open函数没有发现可用的文件结构,返回错误
#define ERR_NOFile 0x51 //Open函数没有发现要求操作的文件,返回错误
#define OpenSuccess 0x50 //Open操作成功完成
// 关闭文件函数 FATClose
#define CloseSuccess 0x52 //Close操作成功完成
#define ERR_Close 0x53 //Close操作异常错误
// 复制文件函数 CopyFile
#define ERR_Copy 0x41 //复制操作有误
#define CopySuccess 0x40 //复制操作成功完成
/* 操作码 */
// x16List操作码
#define ModeZ1 0x00 //更新FAT表
#define ModeZ2 0x01 //查找FAT表中下个簇的值
// FATOpen操作码
#define ModeA1 0x00 //打开文件,以便读,若文件不存在则退出
#define ModeA2 0x80 //打开文件,以便写,若文件不存在则退出
#define ModeA3 0x01 //打开文件,以便读,先将文件长度截为0,如果文件不存在则退出
#define ModeA4 0x81 //打开文件,以便写,先将文件长度截为0,如果文件不存在则退出
#define ModeA5 0x82 //打开文件,以便写,向已有文件的尾部追加内容,如果文件不存在则退出
#define ModeB1 0x10 //打开文件,以便读,若文件不存在则创建之
#define ModeB2 0x90 //打开文件,以便写,若文件不存在则创建之
#define ModeB3 0x11 //打开文件,以便读,先将文件长度截为0,若文件不存在则创建之
#define ModeB4 0x91 //打开文件,以便写,先将文件长度截为0,若文件不存在则创建之
#define ModeB5 0x92 //打开文件,以便写,向已有文件的尾部追加内容,若文件不存在则创建之
#define ModeC1 0xF1 //创建目录
#define ModeC2 0xF2 //删除文件/目录
// xProcessDirectory操作码
#define ModeX1 0x00 //创建新文件
#define ModeX2 0x01 //创建新目录
#define ModeX3 0x02 //对打开的文件截0
#define ModeX4 0x03 //删除文件/目录
#define ModeX5 0x04 //更新写入日期/时间
/* FAT文件系统层数据结构及外部变量 */
// FAT类型码
#define FAT12 0x00
#define FAT16 0x01
#define FAT32 0x02
//FAT文件系统层函数牵涉到的其他变量
// 文件缓冲区FILE_BUF的字节数
#define FILEBUF_BYTES 2560
// 磁盘缓冲区DISK_BUF的字节总数
#define DISKBUF_BYTES 2048
// ADT抽象数据结构
// BPB结构
typedef struct _BPB
{
struct _BASE
{
UINT8 jmpBoot[ 3 ] ; //Offset:0
UINT8 OEMName[ 8 ] ; //Offset:3
UINT8 BytesPerSec[ 2 ] ; //Offset:11
UINT8 SecPerClus ; //Offset:13
UINT8 RsvdSecCnt[ 2 ] ; //Offset:14
UINT8 NumFATs ; //Offset:16
UINT8 RootEntCnt[ 2 ] ; //Offset:17
UINT8 TotSec16[ 2 ] ; //Offset:19
UINT8 Media ; //Offset:21
UINT8 FATSz16[ 2 ] ; //Offset:22
UINT8 SecPerTrk[ 2 ] ; //Offset:24
UINT8 NumHeads[ 2 ] ; //Offset:26
UINT8 HiddSec[ 4 ] ; //Offset:28
UINT8 TotSec32[ 4 ] ; //Offset:32
} base ;
union _EXT
{
struct _FAT16
{
UINT8 drvNum ; //Offset:36
UINT8 Reserved1 ; //Offset:37
UINT8 BootSig ; //Offset:38
UINT8 VolID[ 4 ] ; //Offset:39
UINT8 VolLab[ 11 ] ; //Offset:43
UINT8 FileSysType[ 8 ] ; //Offset:54
} fat16 ;
struct _FAT32
{
UINT8 FATSz32[ 4 ] ; //Offset:36
UINT8 ExtFlags[ 2 ] ; //Offset:40
UINT8 FSVer[ 2 ] ; //Offset:42
UINT8 RootClus[ 4 ] ; //Offset:44
UINT8 FSInfo[ 2 ] ; //Offset:48
UINT8 BkBootSec[ 2 ] ; //Offset:50
UINT8 Reserved[ 12 ] ; //Offset:52
UINT8 drvNum ; //Offset:64
UINT8 Reservedl ; //Offset:65
UINT8 BootSig ; //Offset:66
UINT8 VolID[ 4 ] ; //Offset:67
UINT8 VolLab[ 11 ] ; //Offset:71
UINT8 FileSysType[ 8 ] ; //Offset:82
} fat32 ;
} ext ;
} BPB, *PUSB_BPB ;
// FDT结构
typedef struct _FDT
{
UINT8 FileName[ 11 ] ; //Offset:0 文件名
UINT8 Attribute ; //Offset:11 文件属性
UINT8 Reserved_NT ; //Offset:12 WIN NT保留字节
UINT8 CtrlTimeTeenth ; //Offset:13 文件创建时间的ms级时间戳
UINT8 CrtTime[ 2 ] ; //Offset:14 文件创建时间
UINT8 CrtDate[ 2 ] ; //Offset:16 文件创建日期
UINT8 LastAccDate[ 2 ] ; //Offset:18 最后访问日期
UINT8 Reserved[ 2 ] ; //Offset:20 该目录簇号的高位字,FAT12/16该字节为0
UINT8 WrtTime[ 2 ] ; //Offset:22 最后写的时间,文件创建被认作写
UINT8 WrtDate[ 2 ] ; //Offset:24 最后写的日期,文件创建被认做写
UINT8 StartClus[ 2 ] ; //Offset:26 该目录开始簇号
UINT8 FileSize[ 4 ] ; //Offset:28 文件长度
} FDT, *PUSB_FDT ;
// FAT文件系统参数结构
typedef struct _FS
{
UINT8 Type ; //FAT类型标识
UINT8 SecPerClus ; //DISK每簇扇区数
UINT8 shift ;
UINT8 filenum ;
UINT16 BytesPerSec ; //DISK每扇区字节数
UINT16 RsvdSecCnt ; //DISK保留扇区数
UINT16 RootDirSectors ; //DISK根目录所占的扇区数
UINT32 FirstDataSector ; //DISK簇2的第一个扇区的扇区号
UINT32 FirstSectofClu ; //DISK簇N的第一个扇区的扇区号
UINT32 FirstRootSector ; //DISK根目录第一个扇区的扇区号
} FS ;
// 文件信息结构
typedef struct _FILE
{
UINT8 Name[ 11 ] ; //文件名
UINT8 Flags ; //一些标志位
UINT16 ShortLength ; //文件末尾不足一个扇区的字节数
UINT32 Sectors ; //文件占据的整数个扇区数
UINT32 FileSize ; //文件长度
UINT32 StartSector ; //文件起始扇区号
UINT32 EndSector ; //文件结束扇区号
UINT32 UsedSectors ;
union
{
struct
{
UINT16 StartClus ; //起始簇号( FAT16 )
UINT16 EndClus ; //结束簇号( FAT16 )
UINT16 LastClus; //上级目录簇号( FAT16 )
UINT16 NextClus ;
} fat16 ;
struct
{
UINT32 StartClus ; //起始簇号( FAT32 )
UINT32 EndClus ; //结束簇号( FAT32 )
UINT32 LastClus; //上级目录簇号( FAT32 )
UINT32 NextClus ;
} fat32 ;
} clus ;
struct
{
UINT8 *Offset ;
UINT8 TransNum ;
UINT32 Sector ;
} find ;
union
{
struct
{
UINT8 LastClu ;
UINT8 RemainSectors ;
UINT8 ReadSectors ;
} read ;
struct
{
UINT8 WritedSectors ;
UINT16 extra ;
} write ;
} wr ;
} FILE ;
// 系统时间结构
typedef struct _CLOCK
{
struct
{
UINT8 day ;
UINT8 month ;
UINT16 year ;
} date ;
struct
{
UINT8 sec ;
UINT8 min ;
UINT8 hour ;
} time ;
} clock ;
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -