📄 f_fat.h
字号:
#ifndef _F_FAT_
#define _F_FAT_
#ifdef _READ_SD_
#define MAX_LAYER 5
#define MAX_DIR_LEN 20
#define MAX_SHOW_NUM 12
#define MAX_LFN_BUF 100
#define DIRENTRY_SIZE 32
#define F_SectorSize 512
#define FAT_BUF_SIZE F_SectorSize
#define PART_TYPE_FAT12 0x01
#define PART_TYPE_FAT16 0x02
#define PART_TYPE_FAT32 0x03
#define MSDOSFSROOT 0 // cluster 0 means the root dir
#define CLUST_FREE 0 // cluster 0 also means a free cluster
#define MSDOSFSFREE CLUST_FREE
#define CLUST_FIRST 2 // first legal cluster number
#define CLUST_RSRVD 0xfffffff6 // reserved cluster range
#define CLUST_BAD 0xfffffff7 // a cluster with a defect
#define CLUST_EOFS 0xfffffff8 // start of eof cluster range( 0xfffffff8 ~ 0xffffffff )
#define CLUST_EOFE 0xffffffff // end of eof cluster range( 0xfffffff8 ~ 0xffffffff )
#define FAT12_MASK 0x00000fff // mask for 12 bit cluster numbers
#define FAT16_MASK 0x0000ffff // mask for 16 bit cluster numbers
#define FAT32_MASK 0x0fffffff // mask for FAT32 cluster numbers
// This is the format of the contents of the deTime field in the direntry
// structure.
// We don't use bitfields because we don't know how compilers for
// arbitrary machines will lay them out.
#define DT_2SECONDS_MASK 0x1F // seconds divided by 2
#define DT_2SECONDS_SHIFT 1 // SHIFT to right, ALL the others are to left
#define DT_MINUTES_MASK 0x7E0 // minutes
#define DT_MINUTES_SHIFT 5
#define DT_HOURS_MASK 0xF800 // hours
#define DT_HOURS_SHIFT 11
// This is the format of the contents of the deDate field in the direntry
// structure.
#define DD_DAY_MASK 0x1F // day of month
#define DD_DAY_SHIFT 0
#define DD_MONTH_MASK 0x1E0 // month
#define DD_MONTH_SHIFT 5
#define DD_YEAR_MASK 0xFE00 // year - 1980
#define DD_YEAR_SHIFT 9
typedef struct // length 16 bytes
{
u8 prIsActive; // 0x80 indicates active partition
u8 prStartHead; // starting head for partition
u16 prStartCylSect; // starting cylinder and sector
u8 prPartType; // partition type (see above)
u8 prEndHead; // ending head for this partition
u16 prEndCylSect; // ending cylinder and sector
u32 prStartLBA; // first LBA sector for this partition
u32 prSize; // size of this partition (sectors)
}F_partrecord;
typedef struct {
u8 bsJump[3]; // jump inst E9xxxx or EBxx90
c8 bsOEMName[8]; // OEM name and version
c8 bsBPB[53]; // BIOS parameter block
c8 bsExt[26]; // Bootsector Extension
c8 bsBootCode[418]; // pad so structure is 512b
u8 bsBootSectSig2; // 2 & 3 are only defined for FAT32?
u8 bsBootSectSig3;
u8 bsBootSectSig0; // boot sector signature byte 0x55
u8 bsBootSectSig1; // boot sector signature byte 0xAA
}F_bootsector710 ;
#define BOOTSIG0 0x55
#define BOOTSIG1 0xaa
#define BOOTSIG2 0
#define BOOTSIG3 0
typedef struct{
u16 bpbBytesPerSec; // bytes per sector
u8 bpbSecPerClust; // sectors per cluster
u16 bpbResSectors; // number of reserved sectors
u8 bpbFATs; // number of FATs
u16 bpbRootDirEnts; // number of root directory entries
u16 bpbSectors; // total number of sectors
u8 bpbMedia; // media descriptor
u16 bpbFATsecs; // number of sectors per FAT
u16 bpbSecPerTrack; // sectors per track
u16 bpbHeads; // number of heads
u32 bpbHiddenSecs; // # of hidden sectors
u32 bpbHugeSectors; // # of sectors if bpbSectors == 0
u32 bpbBigFATsecs; // like bpbFATsecs for FAT32
u16 bpbExtFlags; // extended flags:
u16 bpbFSVers; // filesystem version
u32 bpbRootClust; // start cluster for root directory
u16 bpbFSInfo; // filesystem info structure sector
u16 bpbBackup; // backup boot sector
u8 bpbReserved[12];
// u8 bpbDriveNum;
// u8 bpbReserved1;
// u8 bpbBootSig;
// u8 bpbVolID[4];
// u8 bpbVolLabel[11];
// u8 bpbFileSystemType[8];
}F_bpb710 ;
#define FATNUM 0xf // mask for numbering active FAT
#define FATMIRROR 0x80 // FAT is mirrored (like it always was)
#define FSVERS 0 // currently only 0 is understood
typedef struct {
u8 deName[8]; // filename, blank filled
u8 deExtension[3]; // extension, blank filled
u8 deAttributes; // file attributes
u8 deLowerCase; // NT VFAT lower case flags
u8 deCHundredth; // hundredth of seconds in CTime
u8 deCTime[2]; // create time
u8 deCDate[2]; // create date
u8 deADate[2]; // access date
u16 deHighClust; // high bytes of cluster number(always 0 for a FAT12 or FAT16 volume)
u8 deMTime[2]; // last update time
u8 deMDate[2]; // last update date
u16 deStartCluster; // starting cluster of file
u32 deFileSize;
}F_direntry;
#define SLOT_EMPTY 0x00 // slot has never been used
#define SLOT_E5 0x05 // the real value is 0xe5
#define SLOT_DELETED 0xe5 // file in this slot deleted
#define ATTR_NORMAL 0x00 // normal file
#define ATTR_READONLY 0x01 // file is readonly
#define ATTR_HIDDEN 0x02 // file is hidden
#define ATTR_SYSTEM 0x04 // file is a system file
#define ATTR_VOLUME 0x08 // entry is a volume label
#define ATTR_LONG_FILENAME 0x0f // this is a long filename entry
#define ATTR_DIRECTORY 0x10 // entry is a directory name
#define ATTR_ARCHIVE 0x20 // file is new or modified
#define LCASE_BASE 0x08 // filename base in lower case
#define LCASE_EXT 0x10 // filename extension in lower case
typedef struct{
void *FatHdl; // Record FAT_HANDLE address , you should cast it to (FAT_HANDLE*) .
F_direntry de; // Information about the file opened
u32 currentSector; // Actual sector address in memory
u8 *buffer; // buffer pointer to memory (cache sector)
u32 bytePointer; // byte pointer to the actual byte (divide by BYTES_PER_SECTOR to find the current buffer position)
u8 sectorHasChanged; // TRUE if the sector in memory has changed and needs to be write before a close file or change in sector
u8 mode; // read : 0 , write: 1
}F_TFILE;
typedef struct{
u8 DiskIndex;
u8 PartType; // Indicates if is FAT32 or FAT16 or FAT12
u16 BytesPerSector; // Number of bytes Per Sector
u32 FirstDataSector; // First Data Sector Address , the first sector of cluster 2 .
u16 SectorsPerCluster; // Number of Sectors per Cluster
u32 FirstFATSector; // First FAT Sector Address
u32 FirstFAT2Sector; // First FAT2 Sector Address
u32 FirstDirCluster; // Root Directory Cluster Address
u32 RootDirSectors; // The count of sectors occupied by the root directory for FAT16
u32 FatSectors; // Number of FAT Sectors
u32 currentDirCluster; // Actual Dir Cluster Number
u32 NumClusters; // NANDFlash Cluster Numbers
}FAT_HANDLE;
typedef struct {
u32 CurrentSectorAddr; // For recording Browsing Dir enrties ( CurrentSectorAddr )
u16 CurrentEntryIndex; // For recording Browsing Dir enrties ( which index in sector )
u32 SectorOffset; // For recording Browsing Dir enrties ( which sector in Dir )
u16 DirEntryIndex; // For recording Browsing Dir enrties ( which index in sector )
}F_BrowsingCursor;
typedef struct{
u8 Order; /* Sequence number for slot */
u16 Name0_4[5]; /* First 5 Unicode characters */
u8 Attr; /* Attributes, always 0x0F */
u8 Reserved; /* Reserved, always 0x00 */
u8 Checksum; /* Checksum of 8.3 name */
u16 Name5_10[6]; /* 6 more Unicode characters */
u16 FstClus; /* First cluster number, must be 0 */
u16 Name11_12[2]; /* Last 2 Unicode characters */
}LfnEntry;
#define MX_FAT_FILE_SHOW_SIZE
typedef struct{
c8 fileINF_Name[MAX_LFN_BUF+1];
u32 fileINF_size;
u32 fileINF_start_cluster;
}F_FileInfo;
typedef struct{
c8 folderINF_Name[MAX_LFN_BUF+1];
u32 folderINF_start_cluster;
}F_FolderInfo;
enum{
r,
w,
wr
};
enum{
FAT_FILE,
FAT_FOLDER
};
typedef struct{
F_FolderInfo folderInfo;
F_FileInfo fileInfo;
u8 ftype;
}F_FindFileInfo;
typedef struct{
F_FileInfo fileInfo;
FAT_HANDLE *FatHdl; // Record FAT_HANDLE address , you should cast it to (FAT_HANDLE*) .
F_direntry de; // Information about the file opened
u32 currentSector; // Actual sector address in memory
u8 *buffer; // buffer pointer to memory (cache sector)
u32 bytePointer; // byte pointer to the actual byte (divide by BYTES_PER_SECTOR to find the current buffer position)
u32 offsetsector;
u8 sectorHasChanged; // TRUE if the sector in memory has changed and needs to be write before a close file or change in sector
u8 mode; // read : 0 , write: 1
}TFILE;
extern u8 g_lfnflag;
extern u8 *prSectorBuf;
extern u8 FATBuffer[FAT_BUF_SIZE];
extern c8 g_CurrentDir[20];
extern u16 g_longfilename[MAX_LFN_BUF];
extern u8 *prFATBuffer;
extern F_FindFileInfo g_FileInfo[MAX_SHOW_NUM];
extern c8 g_direntry[MAX_LAYER][MAX_DIR_LEN] ;
extern FAT_HANDLE CurrentHandle;
u32 BufferDataGet(u8 num, u8 *buffer);
void F_FAT_GetBPB(F_bpb710 *bpb, u8 *buffer);
u8 F_FAT_Init(u8 Index);
u8 F_FAT_FolderChange(FAT_HANDLE *pHandle, c8 *FolderName);
void F_FAT_DirSet(c8 *dirname);
FAT_HANDLE * F_FAT_GetCurrentFolder(void);
u32 F_FAT_ClusterToSector(FAT_HANDLE *phandle,u32 Cluster);
u32 F_FAT_SectorToCluster(FAT_HANDLE *pHandle,u32 Sector);
u8 F_FAT_GetNextDirEntry(FAT_HANDLE *pHandle, F_direntry *pde, F_BrowsingCursor *Cursor, u16 LFNlen, u16 *LFNBuf);
u32 F_FAT_GetNextCluster(FAT_HANDLE *pHandle, u32 Cluster);
u32 F_FAT_GetNewFreeCluster(FAT_HANDLE *pHandle, u32 Cluster);
u32 F_FAT_GetNextFreeCluster(FAT_HANDLE *pHandle, u32 Cluster);
void F_FAT_BrowsingReset(FAT_HANDLE *pHandle, F_BrowsingCursor *Cursor);
void F_FAT_GetLFN(u8 *debuf, u16 *LFN);
u8 F_FAT_DirEntryToSFN(F_direntry *pde, c8 *SFNBuf, u8 SFNlen);
u8 F_FAT_GetFileInfo(F_direntry *pde, F_FileInfo *fileInfo);
u8 F_FAT_GetFreeFDBEntry(FAT_HANDLE *pHandle, u8 num, F_BrowsingCursor *Cursor);
u8 F_FAT_CheckIfLFN(c8 *filename, u8 *fdbnum);
u8 F_FAT_CreateShortName(FAT_HANDLE *pHandle, c8 *filename, c8 *shortname, u8 ftype);
u8 F_FAT_GetExtName(c8 * filename, c8 * ExtName);
u8 F_FAT_LfnCheckSum(c8 *shortname);
u8 F_FAT_CreateSFNFDB(F_direntry *pde, c8 *shortname, u8 ftype);
u8 F_FAT_CreateLFNFDB(c8 *filename,c8 *shortname, u8 *buffer, u8 fdbnum);
u8 F_FAT_CreateFDB(FAT_HANDLE *pHandle, u8 *buffer, F_BrowsingCursor *Cursor, u8 fdbnum);
u8 F_FAT_ModifyFDB(FAT_HANDLE *pHandle, F_direntry *de, c8 *shortname);
u8 F_FAT_CreateSubFolderFDB(FAT_HANDLE *pHandle, F_direntry *de, u32 curClust, u32 LastClust);
void F_FAT_NormalizeName(c8 *oriname, c8 *tarname);
u8 F_FAT_FAT2Refresh(u32 sector, u8 sectornum, u8 *buffer);
void F_FAT_DirInit(FAT_HANDLE *pHandle);
u8 F_FAT_GetDirLayer(c8 *Direntry, u8 *Layer);
#endif /* _READ_SD_ */
#endif//_F_FAT_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -