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

📄 fat.h

📁 atmel de booloader 内有源代码 用blb编译
💻 H
📖 第 1 页 / 共 3 页
字号:
/****************************************Copyright (c)**************************************************
**                               广州周立功单片机发展有限公司
**                                     研    究    所
**                                        ARM开发组
**
**                                 http://www.zlgmcu.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: fat.h
**创   建   人: 陈明计
**最后修改日期: 2003年9月3日
**描        述: FAT文件系统总头文件
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 陈明计
** 版  本: V1.0
** 日 期: 2003年9月3日
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2004年4月10日
** 描 述: 修改注释
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef MAX_OPEN_FILES
#define MAX_OPEN_FILES              10          /* 可以同时打开的文件数目 */
#endif

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

#ifndef MAX_DISK_CACHES
#define MAX_DISK_CACHES             256         /* 文件系统Cache数目,必须为16的整数倍 */
#endif

#define BASE_CACHE_NUM              4

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

#ifndef MAX_PATHFILE_LENGTHS
#define MAX_PATHFILE_LENGTHS        512         /* 字符串的长度 */
#endif

#ifndef RW_ID_BASE
#define RW_ID_BASE                  0x20        /* 用于cache分配策略,越大cache越不易写回磁盘 */
#endif

#if MAX_OPEN_FILES < 0x100
typedef uint8 HANDLE;
#define Not_Open_FILE               0xff
#else
#if MAX_OPEN_FILES < 0x10000
typedef uint16 HANDLE;
#define Not_Open_FILE               0xffff
#else
typedef uint32 HANDLE;
#define Not_Open_FILE               0xffffffff
#endif
#endif

#define ZLG_FS_VER                  110

/* 底层驱动命令 */
#define DISK_INIT                   0       /* 初始化,必须实现             */
#define DISK_CLOSE                  1       /* 关闭,必须实现               */
#define DISK_READ_SECTOR            2       /* 读扇区,必须实现             */
#define DISK_WRITE_SECTOR           3       /* 写扇区,必须实现             */
#define DISK_DRIVER_VER             4       /* 查看驱动程序版本号,必须实现 */
#define DISK_CHECK_CMD              5       /* 查看命令是否实现,必须实现   */
#define DISK_LOW_FORMAT             6       /* 低级格式化,可选命令         */
#define DISK_FREE_SECTOR            7       /* 释放扇区,可选命令           */
#define DISK_GET_SECTOR_NUMBER      8       /* 获得设备总扇区数,可选命令   */
#define DISK_GET_BYTES_PER_SECTOR   9       /* 获得每扇区字节数,可选命令   */
#define DISK_CHECK_CHANGE           10      /* 查看介质是否改变,可选命令   */
#define DISK_GET_SECTORS_PER_BLOCK  11      /* 获取每块扇区数,可选命令     */
#define DISK_READ_BLOCK             12      /* 读数据块,可选命令           */
#define DISK_WRITE_BLOCK            13      /* 写数据块,可选命令           */

/* 底层驱动返回值 */
#define DISK_RETURN_OK              0x00
#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 DISK_TRUE                   0x04
#define DISK_FALSE                  0x84
#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 GET_TIME_ERR                0x15    /* 获取时间错误 */
#define DISK_NO_FORMAT              0x16    /* 逻辑盘没有格式化 */
#define NOT_RUN                     0xfd    /* 命令未执行       */
#define BAD_COMMAND                 0xfe    /* 错误命令       */
#define PARAMETER_ERR               0xff    /* 非法参数        */

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

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

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

/* 逻辑盘信息的数据结构 */
typedef struct _Disk_Info
{
    uint8       Drive;          /* 逻辑驱动器号,EMPTY_DRIVE为还未分配 */
    uint8       FATType;        /* 类型:FAT12、FAT16和FAT32 */
    uint8       SecPerClus;     /* 每簇扇区数 */
    uint8       NumFATs;        /* FAT表数目 */

    uint16      BytsPerSec;     /* 每扇区字节数 */
    uint32      SecPerDisk;     /* 逻辑驱动器包含扇区数 */
    uint32      RootDirTable;   /* 根目录开始扇区号(FAT32为开始簇号)*/
    uint32      RootSecCnt;     /* 根目录占用扇区数 */
    uint32      FATStartSec;    /* FAT表开始扇区号 */
    uint32      FATSecCnt;      /* 每个FAT占用扇区数 */
    uint32      DataStartSec;   /* 数据区开始扇区号 */
    uint32      ClusPerData;    /* 数据区包含簇数 */
    uint32      PathClusIndex;  /* 当前路径的FDT表开始簇号, 0为根目录 */

    uint32      SecOffset;      /* 分区起始位置 */

    void        *RsvdForLow;    /* 保留给底层驱动程序 */
    
    uint16      (* DiakCommand)(uint8 Cammand, void *Parameter);
                                /* 对应的驱动程序 */
}Disk_Info;

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

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



/* 用户设置的时间格式 */
typedef struct _DATE_TIME
{
    uint16  da_year;	        /* 公元年 */
    uint8   da_mon;	            /* 月 */ 
    uint8   da_day;	            /* 月中日期 */
    uint8   da_dow;	            /* 星期中日期 */
   
    uint8   ti_hour;	        /* 时 */
    uint8   ti_min;  	        /* 分 */
    uint8   ti_sec;	            /* 秒 */
    uint8   ti_hund;	        /* 百分之一秒 */
}DATE_TIME;


/* 与FS接口的时间格式,与FDT项匹配 */
typedef  struct _SYS_TIME
{
/* 日期:位0~4:日,有效值1~31;位5~8:月,有效值1~12;*/
/*       位9~15:年,从1980年开始的年数,有效值0~127 */
    uint16  date;

/* 时间:位0~4:2秒的数量;位5~10:分,有效值0~59;位11~15:时,有效值0~23 */
    uint16  time;

/* 十分之一秒值,有效值0~199 */
    uint8   msec;	
}SYS_TIME;


/*******************************************************************************************************/


#ifndef IN_FILE

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

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

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

extern uint32 FileRead(void *Buf, uint32 Size, HANDLE Handle);
/*********************************************************************************************************
** 函数名称: FileRead
** 功能描述: 读取文件
**
** 输 入: Buf:保存读回的数据
**        Size:要读的字节数
**        Handle:文件句柄
** 输 出: 实际读到的字节数
**         
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/

⌨️ 快捷键说明

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