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

📄 fat16.h

📁 smp860运动控制器USB驱动,对从事数控技术开发人员非常有用
💻 H
字号:
#ifndef __FAT16_H_
#define __FAT16_H_
#include "def.h"

#define SECTOR_SIZE         NFPAGESIZE     //1page = 512+ 16 U8 
#define NFBLOCKSIZE	        16384           //1block = 32 page = (16k +512)U8 
#define BADBLOCKNUM         23
#define NFPAGESIZE          512

typedef struct tmTag {
    U16 tm_sec;     
    U16 tm_min;     
    U16 tm_hour;    
    U16 tm_mday;    
    U16 tm_mon;     
    U16 tm_year;    
    U16 tm_wday;    
    U16 tm_yday;    
    U16 tm_isdst;   
}DATETIME;

typedef  struct _FAT16_DIR_ENTRY
{
    unsigned char       name[8];        /*短目录名或文件名,这个数据结构中12字节的名字是目录名还是文件名,由成员Attr决定  */
    unsigned char       ext[3];
    unsigned char       attr;           /* 属性如果是目录Attr可设为10H;如果j文件,Attr可设为20H,也可以是几个属性的组合;如果为长文件名,Attr可设为OFH */
    
    U8                noused;          /* 向上FAT32兼容 */
    U8                ftime10ms;     
    U16               fcrttime;     
    U16                fcrtdate;     
    U16                freaddate;     
    U16                msbcluster;     
    
    unsigned short      ftime;          /* 创建时间 */
    unsigned short      fdate;          /* 创建日期 */
    unsigned short      cluster;        /* 第一簇在FAT中位置 */
    unsigned long       size;           /*  文件大小  */
}FAT16_DIR_ENTRY;

enum
{
    FAT16_FILEATTR_RDONLY = 0x01,
    FAT16_FILEATTR_HIDE = 0x02,
    FAT16_FILEATTR_SYSTEM = 0x04,
    FAT16_FILEATTR_VOLUME = 0x08,
    FAT16_FILEATTR_DIR = 0x10,
    FAT16_FILEATTR_ARCHIVE = 0x20
};

enum
{
    TS_OPEN_EXISTING = 0x01,  /*属性:存在的文件*/
    TS_SET_LENGTH = 0x02,     /*属性:设置文件长度*/
    TS_REMOVE_FILE = 0x04,    /*属性:删除文件*/
    TS_GET_FILETIME = 0x08   /*属性:得到文件的时间*/
};

enum
{
    TS_SEEK_SET = 1,            /*文件的开始位置*/
    TS_SEEK_CUR,                /*文件的当前位置*/
    TS_SEEK_END                /*文件的结束位置*/
};

/* BIOS parameter block (FAT12/FAT16)*/
typedef  __packed struct _FS__FAT_BPB
{
    U8            jmpboot[3];       /* 3: 0xE9 0x0000                    */
    U8            oemname[8];       /* 8 11:'        '                     */
    unsigned short  U8spersec;      /* 2  13:  _512_,1024,2048,4096,每个扇区所包含的字节数           */
    U8            secperclus;       /* 1  14 : sec in allocation unit每一簇所包含的扇区数         */
    unsigned short  rsvdseccnt;       /* 2  16  : 1 for FAT12 & FAT16 保留所占扇区数           */
    U8            numfats;          /* 1:  17  2         fat 数据结构 个数                     */
    unsigned short  rootentcnt;       /* 2:  19  number of root dir entrie,在fat16格式下根目录下32位目录个数     */
    unsigned short  totsec16;         /* 2:  21  RSVD + FAT + ROOT + FATA (<64k)16位表示的总扇区数  */
    unsigned char   media;            /* 1:  22  0xf0 floppy, else 0xF8 same in fat[0]  */
    unsigned short  fatsz16;          /* 2: 24  number of FAT sectors  1个FAT数据结构所占的扇区数          */
    unsigned short  secpertrk;        /* 2:26  sectors per track 每一磁道中所包含的扇区数             */
    unsigned short  numheads;         /* 2:28 number of heads   每一磁道中所包含的磁头数             */
    unsigned long   hiddsec;          /* 4:32number of hidden sec prec.     */
    unsigned long   totsec32;         /* 4: 36  RSVD + FAT + ROOT + FATA (>=64k) */
    U8            drvnum;
    U8            Reservedl;
    U8            bootsig;
    unsigned long           VOIID;  
    U8            VoILab[11];
    U8            filsystype[8];      //
    char            offset36[0x1c0];  /*1da 474*/  
    unsigned short  signature;        /*  0xAA55 Signature               */
} FS__FAT_BPB;




/* Disk parameter block (FAT12/FAT16)*/
typedef struct _UDISK_PARA
{
    char            unused[19];
    unsigned char	nBadBlockCount;		            /* 失效块块数 */
    unsigned short	nBadBlocks[BADBLOCKNUM];		/* 失效块块号 */
} UDISK_PARA;

/* 缓冲区管理数据结构*/
typedef __packed struct _CACHEBUFFER
{
    unsigned char      *pbCacheBuf;             /* 当前缓冲区地址*/
    unsigned short      nCacheBufSize;          /* 当前缓冲区长度*/
    unsigned long       nCacheAddr;             /* 当前缓冲数据地址*/
    unsigned short      nCacheSize;             /* 当前缓冲数据长度*/
}CACHEBUFFER;

typedef __packed struct _FSWORKBUF
{
    /* 磁盘参数*/
    unsigned long       nTotalSectorCount;          /* 总扇区数。*/
    unsigned short      nFirstFatSector;            /* 第一个FAT的起始扇区号。*/
    unsigned char       nSectorCountOfFat;          /* 单个FAT扇区数*/
    unsigned char       nFatCount;                  /* FAT数*/
    unsigned short      nFirstRootDirSector;        /* 根目录起始扇区号*/
    unsigned char       nSectorCountOfRootDir;      /* 根目录扇区数*/
    unsigned short      nDataSector;
    unsigned char       nSectorCountPerCluster;     /* 每簇扇区数。*/
    unsigned short      nMaxClusterNo;              /* 最大簇号*/
    unsigned short		nBadBlocks[BADBLOCKNUM];    /* 坏块号*/
    unsigned char       nBadBlockCount;
    /* 读缓冲*/
    CACHEBUFFER cache;
}FSWORKBUF;



typedef __packed struct _FILESERREADER
{
    unsigned char       nUsed;
    unsigned long       nDirSecotr;    /*文件头的扇区号*/
    unsigned char       nDirOffset;    /*文件头所在扇区的位置*/
    unsigned long       nFileSize;     /*文件的长度*/
    unsigned long       nFileOffset;   /*文件当前的位置*/
    unsigned short      nClusterNo;    /*当前的簇号*/
    unsigned short      nClusterLink[600]; /*这个空间是用于提高速度,
                                                    一次将所有的链表全部读出来,最大可以达到16M*/
    unsigned short      nClusterLinkSize;  /*链表的长度*/  
    FSWORKBUF           fsWordBuf;
}FILESERREADER, *PFILESERREADER;


typedef __packed struct _TsSearchTag
{
    unsigned char       nFlag;              /*查找属性*/
    unsigned short      nCurSector;        /*当前的扇区号*/
    unsigned char       nOffsetFile;        /*所在扇区号的偏移*/
    unsigned short      nClusterLink[600]; /*这个空间是用于提高速度,
                                     一次将所有的链表全部读出来,最大可以达到16M*/
    unsigned short       nClusterLinkSize;    /*链表的长度*/  
    FSWORKBUF   fs;
}TSSEARCH;

/********************************************************************
作用:初始化文件系统
参数:  0自动检测文件系统,  1强行格式化U盘    
返回值:1:初始化错误,0:初始化成功
********************************************************************/
extern unsigned long TsFsInit(U8 forceformat);

/********************************************************************
作用:关闭文件系统
参数:      
返回值:
********************************************************************/
extern void TsFsClose(void);

/********************************************************************
作用:格式化磁盘
参数:
          
返回值:1:格式化错误,0:格式化成功
********************************************************************/
extern unsigned long TsFormatDisk(void);

/********************************************************************
作用:文件定位
参数:pos -- 偏移位置
      startPos -- 起始位置
      fileHandle -- 文件句柄     
返回值:文件的当前位置
********************************************************************/
extern unsigned long TsSeekFile(unsigned long fileHandle, long pos, unsigned char startPos);

/********************************************************************
作用:读取文件
参数:str -- 读取的内容
      len -- 长度
      fileHandle -- 文件句柄     
返回值:实际读的长度
********************************************************************/
extern unsigned long TsReadFile(unsigned char *str, unsigned long len, unsigned long fileHandle);
/********************************************************************
作用:读取文件到指定的标志
参数:str -- 读取的内容      
      fileHandle -- 文件句柄     
      U8 ch;
返回值:实际读的长度
********************************************************************/
extern unsigned long TsReadToChar(unsigned char *str, unsigned char ch, unsigned long fileHandle);
/********************************************************************
作用:创建、打开或删除文件
参数:pnLength -- 文件长度
      pszPath -- 路径名字
      nFlags -- 创建方式      
          TS_OPEN_EXISTING:不创建目录和文件。
          TS_REMOVE_FILE:删除制定的文件,需要同TS_OPEN_EXISTING配合使用。
      
返回值:文件句柄(0 == 表示没有成功)
********************************************************************/
extern unsigned long TsOpenFile(const unsigned char *pszPath, unsigned char nFlags, unsigned long *pnLength);

/********************************************************************
作用:关闭文件
参数:
      fileHandle -- 文件句柄     
返回值:
********************************************************************/
extern void TsCloseFile(unsigned long fileHandle);

/********************************************************************
作用:得到文件的当前位置
参数:
      fileHandle -- 文件句柄     
返回值:文件的当前位置
********************************************************************/
extern unsigned long TsTellFile(unsigned long fileHandle);

/********************************************************************
作用:读取指定扇区的内容
参数:str -- 存放内容的buffer
      SectorNo -- 扇区号     
返回值:
********************************************************************/
extern void TsReadSector(unsigned char *str, unsigned short SectorNo);

/********************************************************************
作用:读取指定簇的内容
参数:str -- 存放内容的buffer
      nClusterNo -- 簇号     
返回值:
********************************************************************/
extern void TsReadCluster(unsigned char *str, unsigned short nClusterNo);

/********************************************************************
作用:写文件
参数:str -- 写的内容
      len -- 长度
      fileHandle -- 文件句柄     
返回值:实际写的长度
********************************************************************/
extern unsigned long TsWriteFile(unsigned char *str, unsigned long len, unsigned long fileHandle);

/********************************************************************
作用:写入指定扇区的内容
参数:str -- 存放内容的buffer
      SectorNo -- 扇区号     
返回值:
********************************************************************/
extern void TsWriteSector(unsigned char *str, unsigned short SectorNo);

/********************************************************************
作用:写入指定簇的内容
参数:str -- 存放内容的buffer
      nClusterNo -- 簇号     
返回值:
********************************************************************/
extern void TsWriteCluster(unsigned char *str, unsigned short nClusterNo);

/********************************************************************
作用:查找第一个文件或则目录
参数:pSearch -- 查找的信息
      catchBuf -- 缓冲
      catchSize -- 缓冲大小(为512的倍数,一般为512,或者1024即可)
      nFlag -- 指定是查找目录还是文件(查文件的话为0, 查目录的话为FAT16_FILEATTR_DIR)
      name -- 返回的结果(如果是查找文件,这个buff里面传进去的是路径)
返回值:0是没有查到,1是查到了
********************************************************************/
extern unsigned short TsSearchFirst(TSSEARCH *pSearch, unsigned char *catchBuf, unsigned short catchSize, unsigned char nFlags, unsigned char *name);

/********************************************************************
作用:查找下一个文件或则目录
参数:pSearch -- 查找的信息
      name -- 返回的结果
返回值:0是没有查到,1是查到了
********************************************************************/
extern unsigned short TsSearchNext(TSSEARCH *pSearch, unsigned char *name);

/********************************************************************
作用:查找前一个文件或则目录
参数:pSearch -- 查找的信息
      name -- 返回的结果
返回值:0是没有查到,1是查到了
********************************************************************/
extern unsigned short TsSearchPrior(TSSEARCH *pSearch, unsigned char *name);
/********************************************************************
作用:缩小文件
参数:len     
返回值:1成功,0失败
********************************************************************/
extern unsigned char  TsFileSetLen(unsigned long file, unsigned long len);

/*注意操作完全部nflash读写以后要把缓存的内容写到nflash上*/

#endif 

⌨️ 快捷键说明

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