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

📄 fat.h

📁 FAT32文件系统源码
💻 H
字号:
#ifndef __FAT_H__
#define __FAT_H__
#include "sd.h"
#include "uart.h"
#include "tft.h"
#include <ctype.h>
/*
 分区记录结构如下
*/
struct PartRecord
{
 unsigned char Active;         //0x80表示此分区有效
 unsigned char StartHead;      //分区的开始头
 unsigned char StartCylSect[2];//开始柱面与扇区
 unsigned char PartType;       //分区类型
 unsigned char EndHead;        //分区的结束头
 unsigned char EndCylSect[2];  //结束柱面与扇区
 unsigned char StartLBA[4];    //分区的第一个扇区
 unsigned char Size[4];        //分区的大小 
};

/*
 分区扇区(绝对0扇区)定义如下
*/
struct PartSector
{
 unsigned char PartCode[446]; //MBR的引导程序
 struct PartRecord Part[4];      //4个分区记录
 unsigned char BootSectSig0;
 unsigned char BootSectSig1;
};

struct FAT32_FAT_Item
{
 unsigned char Item[4];
};

struct FAT32_FAT
{
 struct FAT32_FAT_Item Items[128];
};

/*
 FAT32中对BPB的定义如下  一共占用90个字节
*/
struct FAT32_BPB
{
 unsigned char BS_jmpBoot[3];     //跳转指令            offset: 0
 unsigned char BS_OEMName[8];     //                    offset: 3
 unsigned char BPB_BytesPerSec[2];//每扇区字节数        offset:11
 unsigned char BPB_SecPerClus[1]; //每簇扇区数          offset:13
 unsigned char BPB_RsvdSecCnt[2]; //保留扇区数目        offset:14
 unsigned char BPB_NumFATs[1];    //此卷中FAT表数       offset:16
 unsigned char BPB_RootEntCnt[2]; //FAT32为0            offset:17
 unsigned char BPB_TotSec16[2];   //FAT32为0            offset:19
 unsigned char BPB_Media[1];      //存储介质            offset:21
 unsigned char BPB_FATSz16[2];    //FAT32为0            offset:22
 unsigned char BPB_SecPerTrk[2];  //磁道扇区数          offset:24
 unsigned char BPB_NumHeads[2];   //磁头数              offset:26
 unsigned char BPB_HiddSec[4];    //FAT区前隐扇区数     offset:28
 unsigned char BPB_TotSec32[4];   //该卷总扇区数        offset:32

 unsigned char BPB_FATSz32[4];    //一个FAT表扇区数     offset:36
 unsigned char BPB_ExtFlags[2];   //FAT32特有           offset:40
 unsigned char BPB_FSVer[2];      //FAT32特有           offset:42
 unsigned char BPB_RootClus[4];   //根目录簇号          offset:44
 unsigned char FSInfo[2];         //保留扇区FSINFO扇区数offset:48
 unsigned char BPB_BkBootSec[2];  //通常为6             offset:50
 unsigned char BPB_Reserved[12];  //扩展用              offset:52
 unsigned char BS_DrvNum[1];      //                    offset:64
 unsigned char BS_Reserved1[1];   //                    offset:65
 unsigned char BS_BootSig[1];     //                    offset:66
 unsigned char BS_VolID[4];       //                    offset:67
 unsigned char BS_FilSysType[11]; //	                offset:71
 unsigned char BS_FilSysType1[8]; //"FAT32    "         offset:82
};

// Structure of a dos directory entry.
struct direntry 
{
 unsigned char deName[8];       // filename, blank filled
 unsigned char deExtension[3]; 	// extension, blank filled
 unsigned char deAttributes;   	// file attributes
 unsigned char deLowerCase;    	// NT VFAT lower case flags  (set to zero)
 unsigned char deCHundredth;   	// hundredth of seconds in CTime
 unsigned char deCTime[2];     	// create time
 unsigned char deCDate[2];     	// create date
 unsigned char deADate[2];     	// access date
 unsigned char deHighClust[2];     // high unsigned chars of cluster number
 unsigned char deMTime[2];     	// last update time
 unsigned char deMDate[2];     	// last update date
 unsigned char deLowCluster[2]; 	// starting cluster of file
 unsigned char deFileSize[4];      // size of file in unsigned chars
};

// Stuctures
struct FileInfoStruct
{
 unsigned char  FileName[12];
 unsigned long  FileStartCluster;			//< file starting cluster for last file accessed
 unsigned long  FileCurCluster;
 unsigned long  FileNextCluster;
 unsigned long  FileSize;					//< file size for last file accessed
 unsigned char  FileAttr;					//< file attr for last file accessed
 unsigned short FileCreateTime;			//< file creation time for last file accessed
 unsigned short FileCreateDate;			//< file creation date for last file accessed
 unsigned short FileMTime;
 unsigned short FileMDate;
 unsigned long  FileSector;				    //<file record place
 unsigned int   FileOffset;				    //<file record offset
};

/*
  FAT32初始化时初始参数装入如下结构体中
*/
struct FAT32_Init_Arg
{
 unsigned char BPB_Sector_No;
 unsigned long Total_Size;
 unsigned long FirstDirClust;    //first directory cluster
 unsigned long FirstDataSector;	// The first sector number of data
 unsigned int  BytesPerSector;	// unsigned chars per sector
 unsigned int  FATsectors;		// The amount sector a FAT occupied
 unsigned int  SectorsPerClust;	// Sector per cluster
 unsigned long FirstFATSector;	// The first FAT sector
 unsigned long FirstDirSector;	// The first Dir sector
 unsigned long RootDirSectors;	// The sector number a Root dir occupied 
 unsigned long RootDirCount;		// The count of directory in root dir
};

//#define FIND_BPB_UP_RANGE 2000  //BPB不一定在0扇区,对0~FINE_BPB_UP_RANGE扇区进行扫描


extern unsigned char xdata FAT32_Buffer[512]; //扇区数据读写缓冲区 xdata
extern struct FAT32_Init_Arg Init_Arg;	       //初始化参数结构体实体
extern struct FileInfoStruct FileInfo;        //文件信息结构体实体

unsigned char * FAT32_ReadSector(unsigned long LBA,unsigned char *buf);
unsigned char FAT32_WriteSector(unsigned long LBA,unsigned char *buf);
unsigned long lb2bb(unsigned char *dat,unsigned char len);
unsigned long  FAT32_FindBPB();
unsigned long FAT32_Get_Total_Size();
void FAT32_Init(struct FAT32_Init_Arg *arg);
void FAT32_EnterRootDir();
void FAT32_CopyName(unsigned char *Dname,unsigned char *filename);
unsigned long FAT32_EnterDir(char *path);
unsigned char FAT32_CompareName(unsigned char *sname,unsigned char *dname);
unsigned long FAT32_GetNextCluster(unsigned long LastCluster);
struct FileInfoStruct * FAT32_OpenFile(char *filepath);
//void FAT32_ReadFileToBMP(struct FileInfoStruct *pstru);
void FAT32_ReadFileToBMP(struct FileInfoStruct *pstru,unsigned int x0,unsigned int xlong,unsigned int y0,unsigned int ylong);
void FAT32_ReadFile(struct FileInfoStruct *pstru);
#endif 











⌨️ 快捷键说明

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