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

📄 f_fat.h

📁 S3C2410 USB Mass storage 源码.
💻 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 + -