📄 fat.h
字号:
#ifndef _FAT_H
#define _FAT_H
#define FAT12 0x01
#define FAT16 0x01
#define FAT32 0x02
#define EMPTY_DRIVE 0x00
#define ReadSec 0x01
#define ReadBlock 0x02
#define WriteSec 0x03
#define MP3CMD_Play 0x12
#define MP3CMD_Pause 0x13
#define MP3CMD_Stop 0x14
#define MP3CMD_Next 0x15
/***********************错误代码*********************************/
#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 /* 非法参数 */
/*****************BPB中各参数的偏移量*****************/
#define OFBPB_BytsPerSec 0x0B
#define OFBPB_SecPerClus 0x0D
#define OFBPB_RsvdSecCnt 0x0E
#define OFBPB_NumFATs 0x10
#define OFBPB_RootEntCnt 0x11
#define OFBPB_TotSec16 0x13
#define OFBPB_FATSz16 0x16
#define OFBPB_HiddSec 0x1C
#define OFBPB_TotSec32 0x20
#define OFBPB_FilSysType 0x2A
#define OFBPB_FATSz32 0x24
#define OFBPB_RootClus 0x2C
/***********短文件目录项中各参数的偏移量**************/
#define OFSDIR_SName 0x00
#define OFSDIR_Attr 0x0B
#define OFSDIR_FstCluH 0x14
#define OFSDIR_FstCluL 0x1A
#define OFSDIR_FileSize 0x1C
#define LEN_SDIR_SName 0x0B
/************长文件目录项中各参数的偏移量*************/
#define OFLDIR_LName1 0x01
#define OFLDIR_LName2 0x0E
#define OFLDIR_LName3 0x1C
#define OFLDIR_Ord 0x00
#define OFLDIR_Attr 0x0B
#define OFLDIR_Chksum 0x0D
#define LEN_LDIR_LName1 0x0A
#define LEN_LDIR_LName2 0x0C
#define LEN_LDIR_LName3 0x04
/**********************文件属性**********************/
#define ATTR_READ_ONLY 0x01 //只读
#define ATTR_HIDDEN 0x02 //隐藏
#define ATTR_SYSTEM 0x04 //系统
#define ATTR_VOLUME 0x08 //卷标
#define ATTR_DIRECTORY 0x10 //子目录
#define ATTR_ARCHIVE 0x20 //存档
#define ATTR_LONG_NAME 0x0F //长目录项
#define ATTR_LONG_NAME_MASK 0x3F //长目录子项
/*******************BPB数据结构***********************/
typedef struct
{
INT8U DriveID; //逻辑驱动器ID号
INT16U BytsPerSec; //每扇区字节数
INT8U SecPerClus; //每簇扇区数
INT16U RsvdSecCnt; //保留扇区数
INT8U NumFATs; //FAT表份数
INT16U RootEntCnt; //根目录中的目录项数
INT16U TotSec16; //小扇区数
INT16U FATSz16; //一个FAT表所占扇区数
INT32U HiddSec; //隐藏扇区数
INT32U TotSec32; //大扇区数
INT8U FilSysType; //文件系统类型
/************下面为FAT32的内容*******************/
INT32U FATSz32; //一个FAT表所占扇区数(FAT32)
INT32U RootClus; //根目录所在第一个簇的簇号
/************************************************/
INT32U RelaStaSect; //该卷逻辑0扇区实际物理扇区
INT16U RootDirSectors; //根目录所占扇区数
INT32U FirstDataSector; //数据区的第一个扇区号
/**************磁盘底层驱动函数******************/
INT8U (* DiskDrive)(INT8U Cammand, void *Parameter);
} Disk_Info;
/*****************磁盘驱动函数参数结构*******************/
typedef struct
{
INT8U Drive; // 驱动器号
INT16U Len; //长度
INT32U SectorIndex; // 操作的扇区
INT8U *Buf; // 数据存储位置
} Disk_RW_Parameter;
/*****************文件数据位置指针********************/
typedef struct
{
INT32U Len; //长度
INT32U OfClu; //簇号
INT8U OfSec; //该簇中扇区偏移量
INT16U OfByte; //该扇区中字节偏移量
} FileDataPoint;
/*****************短目录项数据结构********************/
typedef struct
{
INT8U SName[11]; //短文件名
INT8U Attr; //文件属性
INT32U FstClu; //该目录或文件存储的第一个簇号
INT32U FileSize; //文件大小
FileDataPoint FDP;
} ShortFileDirTab;
/*****************长目录项数据结构********************/
typedef struct
{
INT8U LName[26]; //长文件名的unicode码
INT8U Ord; //该长目录项在本组中的序号
INT8U Attr; //长文件名目录标志
INT8U Type; //为0表示是长文件名的子项
INT8U Chksum; //短文件名的校验和
FileDataPoint FDP;
} LongDirTab;
typedef struct
{
INT8U Read_Flag;
INT8U OffsetCluSce;
INT16U NextCluOfFAT16; //文件簇链中下一个簇号
INT32U FirstSectorOfCluster; //该簇号第一个扇区号
INT32U FileLen; //已读取的文件长度
} FDI;
/************************Extern functions****************************/
extern void UartPutchar(const INT8U ch);
extern void UartPrint(const INT8U *ch);
/************************FAT fs functions****************************/
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -