fat.h

来自「Atmega64单片机程序(完整工程)」· C头文件 代码 · 共 919 行 · 第 1/3 页

H
919
字号

/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        ARM开发组
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: fat.h
**创   建   人: 陈明计
**最后修改日期: 2003年9月3日
**描        述: FAT文件系统总头文件
**
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: V1.0
** 日 期: 2003年9月3日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年4月10日
** 描 述: 修改注释
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "SYS_Config.h" 
#include "FS_Config.h" 

//可以同时打开的文件数目
#ifndef MAX_OPEN_FILES 
#define MAX_OPEN_FILES  3 
#endif 

//文件系统Cache大小(字节),应当是最大的扇区所占字节数
#ifndef DISK_CACHE_SIZE 
#define DISK_CACHE_SIZE 512 
#endif 

//文件系统Cache数目
#ifndef MAX_DISK_CACHES 
#define MAX_DISK_CACHES 1 
#endif 

//可以同时加载的逻辑驱动器数目
#ifndef MAX_DRIVES 
#define MAX_DRIVES 1 
#endif 

#if MAX_OPEN_FILES<0x80 
    typedef INT8S  HANDLE ;
#else 
#if MAX_OPEN_FILES<0x8000 
    typedef INT16S HANDLE ;
#else 
    typedef INT32S HANDLE ;
#endif 
#endif 

#define Not_Open_FILE       -1 


/* 底层驱动命令 */
#define DISK_INIT           0 
#define DISK_CLOSE          1 
#define DISK_READ_SECTOR    2 
#define DISK_WRITE_SECTOR   3 

/* 底层驱动返回值 */
#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 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 NOT_RUN             0xfd 
/* 命令未执行       */
#define BAD_COMMAND         0xfe 
/* 错误命令       */
#define PARAMETER_ERR       0xff 
/* 非法参数        */

/* 未使用的逻辑盘  */
#define EMPTY_DRIVE         0xff 

/* 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 
{
    INT8U  Drive ;      // 驱动器号
    INT32U SectorIndex ;// 操作的扇区
    INT32U RsvdForLow ; // 保留给底层驱动程序,由_Disk_Info中拷贝过来
    INT8U  *Buf ;       // 数据存储位置
}
Disk_RW_Parameter ;

/* 文件系统cache数据结构 */
typedef struct _Disk_Cache 
{
    INT8U  Drive ;              // 驱动器号,EMPTY_DRIVE为空闲
    INT8U  Flag ;               // 状态
    INT16U RW_ID ;              // 读写ID,用于释放Cache
    //    INT8U       Lock;     // 是否锁定扇区
    INT32U SecIndex ;           // 缓冲的扇区索引
    INT8U  buf[DISK_CACHE_SIZE];// 缓冲区
}
Disk_cache ;

/* 逻辑盘信息的数据结构 */
typedef struct _Disk_Info 
{
    INT8U  Drive ;        // 逻辑驱动器号,EMPTY_DRIVE为还未分配
    INT8U  FATType ;      // 类型:FAT12、FAT16和FAT32
    INT8U  SecPerClus ;   // 每簇扇区数
    INT8U  NumFATs ;      // FAT表数目
    INT32U FATStartSec ;  // FAT表开始扇区号
    INT32U FATSecCnt ;    // 每个FAT占用扇区数
    INT32U SecPerDisk ;   // 逻辑驱动器包含扇区数
    INT32U BytsPerSec ;   // 每扇区字节数
    INT32U RootDirTable ; // 根目录开始扇区号(FAT32为开始簇号)
    INT32U RootSecCnt ;   // 根目录占用扇区数
    INT32U DataStartSec ; // 数据区开始扇区号
    INT32U ClusPerData ;  // 数据区包含簇数
    INT32U PathClusIndex ;// 当前路径的FDT表开始簇号, 0为根目录
    INT32U RsvdForLow ;   // 保留给底层驱动程序
    
    INT16U(*DiskCommand)(INT8U Command,void *Parameter);// 对应的驱动程序
}
Disk_Info ;

/* 目录表数据结构 */
typedef struct _FDT 
{
    char   Name[11];     //短文件名主文件名
    INT8U  Attr ;        //文件属性
    INT8U  NTRes ;       //保留给NT
    INT8U  CrtTimeTenth ;//建立时间(fat16保留)
    INT16U CrtTime ;     //建立时间(fat16保留)
    INT16U CrtDate ;     //建立日期(fat16保留)
    INT16U LstAccDate ;  //最后访问日期(fat16保留)
    INT16U FstClusHI ;   //起始簇号高两个字节(fat16保留)
    INT16U WrtTime ;     //最后写时间
    INT16U WrtDate ;     //最后写日期
    INT16U FstClusLO ;   //起始簇(cluster)号低两个字节
    INT32U FileSize ;    //文件大小
}
FDT ;

/* 文件信息结构体 */
typedef struct _FILE 
{
    INT8U  Flags ;   // 一些标志
    char   Name[11]; // 文件名
    INT8U  Drive ;   // 文件所在磁盘
    INT32U DirClus ; // 所在目录开始簇号
    INT32U FileSize ;// 文件大小
    INT32U FstClus ; // 起始簇号
    INT32U Clus ;    // 当前簇号
    INT32U Offset ;  // 文件指针偏移量
}
MY_FILE ;


/*******************************************************************************************************/
#ifndef IN_FILE 

extern void FileInit(void);
/*********************************************************************************************************
** 函数名称: FileInit
** 功能描述: 初始化文件指针系统
** 输   入: 无
** 输   出: 无
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/

extern INT8U 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 INT8U FileClose(HANDLE Handle);
/*********************************************************************************************************
** 函数名称: FileClose
** 功能描述: 关闭指定文件
** 输   入: Handle:文件句柄
** 输   出: RETURN_OK:成功
**           其它参考fat.h中关于返回值的说明
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/

extern INT8U FileGetCh(INT8U *Ch,HANDLE Handle);
/*********************************************************************************************************
** 函数名称: FileGetCh
** 功能描述: 从文件读一个字节
** 输   入: Ch:返回读到的数据
**           Handle:文件句柄
** 输   出: RETURN_OK:成功
**           其它参考fat.h中关于返回值的说明
** 全局变量: 无

⌨️ 快捷键说明

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