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

📄 fat16.h

📁 用LPC2103(ARM7)操作SD卡代码。
💻 H
字号:
#ifndef __FAT16_H__
#define __FAT16_H__
#include "config.h"


//#include "UART.H"
#include <stdlib.h>

//声明外部器件读写函数
extern U8 MMC_SD_ReadSingleBlock(U32 sector, U8* buffer);
extern U8 MMC_SD_WriteSingleBlock(U32 sector, U8* buffer);


#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

#pragma pack(push) //保存对齐状态
#pragma pack(1)    //设定为1字节对齐
struct extboot {
	U8	exDriveNumber;				// drive number (0x80)//0x00 for floopy disk 0x80 for hard disk
	U8	exReserved1;				// reserved should always set 0
	U8	exBootSignature;			// ext. boot signature (0x29)
#define EXBOOTSIG       0x29
	U8	exVolumeID[4];				// volume ID number
	U8	exVolumeLabel[11];			// volume label "NO NAME"
	U8	exFileSysType[8];			// fs type (FAT12 or FAT16)
};

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


struct bpb50 {
        U16	bpbBytesPerSec; // bytes per sector				//512 1024 2048 or 4096
        U8	bpbSecPerClust; // sectors per cluster			// power of 2
        U16	bpbResSectors;  // number of reserved sectors	//1 is recommend
        U8	bpbFATs;        // number of FATs				// 2 is recommend
        U16	bpbRootDirEnts; // number of root directory entries
        U16	bpbSectors;     // total number of sectors
        U8	bpbMedia;       // media descriptor				//0xf8 match the fat[0]
        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
};


// Structure of a dos directory entry.
struct direntry {
		U8		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
		U8		deExtension[3]; 	// extension, blank filled
		U8		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
		U8        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
		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
		U8        deMTime[2];     	// last update time
		U8        deMDate[2];     	// last update date
		U16        deStartCluster; 	// starting cluster of file
		U32       deFileSize;  		// size of file in bytes
};


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

// Structure of a Win95 long name directory entry
struct winentry {
		U8			weCnt;			// 
#define WIN_LAST        0x40
#define WIN_CNT         0x3f
		U8		wePart1[10];
		U8		weAttributes;
#define ATTR_WIN95      0x0f
		U8		weReserved1;
		U8		weChksum;
		U8		wePart2[12];
		U16       	weReserved2;
		U8		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
{
	U16 StartCluster;			//< file starting cluster for last file accessed
	U32 Size;					//< file size for last file accessed
	U8 Attr;					//< file attr for last file accessed
	//U16 CreateTime;			//< file creation time for last file accessed
	//U16 CreateDate;			//< file creation date for last file accessed
	U16 Sector;				//<file record place
	U16 Offset;				//<file record offset
};

#pragma pack(pop)//恢复对齐状态 

//function often to use 

//U8 FAT16_Init();

//U8 FAT16_DisDir(U8 *dir);

//U16 FAT16_Open(U8 * dir);

//U8 FAT16_Read(U16 pointer, U32 size);

//U8 FAT16_Rename(U8 *dir,U8 *newname);

//U8 FAT16_Delete(U8 *dir);

//U8 FAT16_MkDir(U8 * dir);

//U8 FAT16_RmDir(U8 * dir);

//U16 FAT16_Create(U8 * dir,U32 size);

//U8 FAT16_Write(U16 cluster,U8 *data,U32 size);

//MP3后添加的函数
U8 Search(U8 *dir,struct direntry *MusicInfo,U8 *Count,U8 *type);//查找音乐文件
U8 FAT16_LoadPartCluster(U16 cluster,unsigned part,U8 * buffer);//加载文件


//FAT16原有的函数
U8 FAT16_Init();//初始化
U8 FAT16_LoadCluster(U16 cluster,U8 * buffer);//读一个扇区
U16 FAT16_NextCluster(U16 cluster);//查找下一簇号
U16 FAT16_FindFreeCluster();//查找空簇
U8 FAT16_DisDir(U8 *dir);//显示目录内容
U16 FAT16_FindItem(U16 cluster, U8 *name, struct FileInfoStruct *FileInfo);//查找文件
U16 FAT16_Open(U8 * dir);//打开文件
U16 FAT16_OpenDir(U8 * dir);//打开目录
U8 FAT16_Read(U16 pointer, U32 size);//读文件,size=0代表整个文件
U8 FAT16_Rename(U8 *dir,U8 *newname);//重命名
U8 FAT16_ModifyFAT(U16 cluster,U16 val);//修改FAT项
U8 FAT16_Delete(U8 *dir);//删除文件
U8 FAT16_DelItem(struct FileInfoStruct *FileInfo);//删除记录项
U16 FAT16_FindFreeItem(U16 cluster, struct FileInfoStruct *FileInfo);//查找空余项
U8 FAT16_MkDir(U8 * dir);//建目录
U8 FAT16_Write(U16 cluster,U8 *data,U32 size);//写文件
U16 FAT16_Create(U8 * dir,U32 size);//建文件,必须指定文件大小
U8 FAT16_RmDir(U8 * dir);//删除目录
U16 FAT16_Close(U16 * p);//关闭文件
#endif

⌨️ 快捷键说明

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