www.pudn.com > arm_uDisk.rar > F_FAT.h


#ifndef _F_FAT_ 
#define _F_FAT_ 
 
 
#define MAX_LAYER	10 
#define MAX_DIR_LEN		20 
#define MAX_SHOW_NUM	50 
#define MAX_LFN_BUF 255 
#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); 
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_CheckIfLFN(c8 *filename, u8 *fdbnum); 
u8 F_FAT_GetExtName(c8 * filename, c8 * ExtName); 
u8 F_FAT_LfnCheckSum(c8 *shortname); 
void F_FAT_NormalizeName(c8 *oriname, c8 *tarname); 
void F_FAT_DirInit(FAT_HANDLE *pHandle); 
u8 F_FAT_GetDirLayer(c8 *Direntry, u8 *Layer); 
 
 
#endif//_F_FAT_