📄 fat16.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 + -