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

📄 fat16.h

📁 SD卡上的FAT32文件系统源代码,能够在任何单片机上使用
💻 H
字号:
#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     0xfff6      	// reserved cluster range
#define CLUST_BAD       0xfff7     		// a cluster with a defect
#define CLUST_EOFS      0xfff8     		// start of eof cluster range
#define CLUST_EOFE      0xffff      	// end of eof cluster range


struct extboot {
	char	exDriveNumber;				// drive number (0x80)//0x00 for floopy disk 0x80 for hard disk
	char	exReserved1;				// reserved should always set 0
	char	exBootSignature;			// ext. boot signature (0x29)
#define EXBOOTSIG       0x29
	char	exVolumeID[4];				// volume ID number
	char	exVolumeLabel[11];			// volume label "NO NAME"
	char	exFileSysType[8];			// fs type (FAT12 or FAT16)
};

struct bootsector50 {
	unsigned char	bsJump[3];					// jump inst E9xxxx or EBxx90
	char	bsOemName[8];				// OEM name and version
	char	bsBPB[25];					// BIOS parameter block
	char	bsExt[26];					// Bootsector Extension
	char	bsBootCode[448];			// pad so structure is 512b
	unsigned char	bsBootSectSig0;				// boot sector signature unsigned char 0x55 
	unsigned char	bsBootSectSig1;				// boot sector signature unsigned char 0xAA
#define BOOTSIG0        0x55
#define BOOTSIG1        0xaa
};


struct bpb50 {
        unsigned int	bpbBytesPerSec; // bytes per sector				//512 1024 2048 or 4096
        unsigned char	bpbSecPerClust; // sectors per cluster			// power of 2
        unsigned int	bpbResSectors;  // number of reserved sectors	//1 is recommend
        unsigned char	bpbFATs;        // number of FATs				// 2 is recommend
        unsigned int	bpbRootDirEnts; // number of root directory entries
        unsigned int	bpbSectors;     // total number of sectors
        unsigned char	bpbMedia;       // media descriptor				//0xf8 match the fat[0]
        unsigned int	bpbFATsecs;     // number of sectors per FAT
        unsigned int	bpbSecPerTrack; // sectors per track
        unsigned int	bpbHeads;       // number of heads
        unsigned long	bpbHiddenSecs;  // # of hidden sectors
        unsigned long	bpbHugeSectors; // # of sectors if bpbSectors == 0
};


// Structure of a dos directory entry.
struct direntry {
		unsigned char		deName[8];      	// filename, blank filled
#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 SLOT_DIR		0x2E			// a directorymmm
		unsigned char		deExtension[3]; 	// extension, blank filled
		unsigned char		deAttributes;   	// file attributes
#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
		unsigned char        deLowerCase;    	// NT VFAT lower case flags  (set to zero)
#define LCASE_BASE      0x08            // filename base in lower case
#define LCASE_EXT       0x10            // filename extension in lower case
		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 int        deHighClust; 		// high unsigned chars of cluster number
		unsigned char        deMTime[2];     	// last update time
		unsigned char        deMDate[2];     	// last update date
		unsigned int        deStartCluster; 	// starting cluster of file
		unsigned long       deFileSize;  		// size of file in unsigned chars
};


// number of directory entries in one sector
#define DIRENTRIES_PER_SECTOR	0x10	//when the bpbunsigned charsPerSec=512 

// Structure of a Win95 long name directory entry
struct winentry {
		unsigned char			weCnt;			// 
#define WIN_LAST        0x40
#define WIN_CNT         0x3f
		unsigned char		wePart1[10];
		unsigned char		weAttributes;
#define ATTR_WIN95      0x0f
		unsigned char		weReserved1;
		unsigned char		weChksum;
		unsigned char		wePart2[12];
		unsigned int       	weReserved2;
		unsigned char		wePart3[4];
};

#define WIN_ENTRY_charS	13      // Number of chars per winentry

// Maximum filename length in Win95
// Note: Must be < sizeof(dirent.d_name)
#define WIN_MAXLEN      255

// 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       0
#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



// Stuctures
struct FileInfoStruct
{
	unsigned short StartCluster;			//< file starting cluster for last file accessed
	unsigned long Size;					//< file size for last file accessed
	unsigned char Attr;					//< file attr for last file accessed
	//unsigned short CreateTime;			//< file creation time for last file accessed
	//unsigned short CreateDate;			//< file creation date for last file accessed
	unsigned int Sector;				//<file record place
	unsigned int Offset;				//<file record offset
};


//function often to use 

//unsigned char FAT16_Init();

//unsigned char FAT16_DisDir(unsigned char *dir);

//unsigned int FAT16_Open(unsigned char * dir);

//unsigned char FAT16_Read(unsigned int pointer, unsigned long size);

//unsigned char FAT16_Rename(unsigned char *dir,unsigned char *newname);

//unsigned char FAT16_Delete(unsigned char *dir);

//unsigned char FAT16_MkDir(unsigned char * dir);

//unsigned char FAT16_RmDir(unsigned char * dir);

//unsigned int FAT16_Create(unsigned char * dir,unsigned long size);

//unsigned char FAT16_Write(unsigned int cluster,unsigned char *data,unsigned long size);


unsigned char Search(unsigned char *dir,struct direntry *MusicInfo,unsigned char *Count,unsigned char *type);
unsigned char FAT16_LoadPartCluster(unsigned int cluster,unsigned long part,unsigned char * buffer);

unsigned char FAT16_Init();
unsigned char FAT16_LoadCluster(unsigned int cluster,unsigned char * buffer);
unsigned int FAT16_NextCluster(unsigned int cluster);
unsigned int FAT16_FindFreeCluster();
unsigned char FAT16_DisDir(unsigned char *dir);
unsigned int FAT16_FindItem(unsigned int cluster, unsigned char *name, struct FileInfoStruct *FileInfo);
unsigned int FAT16_Open(unsigned char * dir);
unsigned int FAT16_OpenDir(unsigned char * dir);
unsigned char FAT16_Read(unsigned int pointer, unsigned long size);
unsigned char FAT16_Rename(unsigned char *dir,unsigned char *newname);
unsigned char FAT16_ModifyFAT(unsigned int cluster,unsigned int val);
unsigned char FAT16_Delete(unsigned char *dir);
unsigned char FAT16_DelItem(struct FileInfoStruct *FileInfo);
unsigned int FAT16_FindFreeItem(unsigned int cluster, struct FileInfoStruct *FileInfo);
unsigned char FAT16_MkDir(unsigned char * dir);
unsigned char FAT16_Write(unsigned int cluster,unsigned char *data1,unsigned long size);
unsigned int FAT16_Create(unsigned char * dir,unsigned long size);
unsigned char FAT16_RmDir(unsigned char * dir);
unsigned int FAT16_Close(unsigned int * p);

⌨️ 快捷键说明

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