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

📄 fat12.h

📁 FAT12 文件系统,囊括了文件系统的各个函数,另外还包括了地址映射,适合读写NAND_FLASH
💻 H
📖 第 1 页 / 共 2 页
字号:
//#include memory.h

#ifndef FAT_H
#define FAT_H

#ifndef BYTE
typedef unsigned char BYTE;
typedef unsigned char U8;
#endif

#ifndef CHAR
typedef char CHAR;
#endif

#ifndef WORD
typedef unsigned short WORD;
#endif

#ifndef DWORD
typedef unsigned long DWORD;
#endif


// NAND flash 定义;
#define MASS_MEMORY_SIZE    	0x3000000   // 48MBytes	用户使用的FLASH的总字节容量
#define TOTAL_MASS_MEMORY_SIZE  0x4000000   // 64MBytes	FLASH的总字节容量
#define MASS_BLOCK_SIZE     	0x200		//扇区长度512字节
#define MASS_BLOCK_COUNT    	(MASS_MEMORY_SIZE / MASS_BLOCK_SIZE)  //用户使用的总扇区数,对于64M/512的FLASH,该值应为0x20000(128k)



 //以下变量暂时赋值,这些变量需要由系统的实时时钟给出
 /*
 extern WORD RTCYear ;
 extern BYTE RTCMonth ;
 extern WORD RTCDay ;
 extern BYTE RTCDate ;
 extern BYTE RTCHour ;
 extern BYTE RTCMinute ;
 extern BYTE RTCSecond ;*/

#define CLUST_FIRST     0       // first legal cluster number(for PART_TYPE_FAT16xxx)

 // Format of a boot sector.  This is the first sector on a DOS floppy disk
 // or the first sector of a partition on a hard disk.  But, it is not the
 // first sector of a partitioned hard disk.
#define NAND_FLASH_Drv   1
#define DRIVE0           NAND_FLASH_Drv

#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

// Partition Type used in the partition record
#define PART_TYPE_UNKNOWN       0x00
#define PART_TYPE_FAT12         0x01
#define PART_TYPE_XENIX         0x02
#define PART_TYPE_DOSFAT16      0x04
#define PART_TYPE_EXTDOS        0x05
#define PART_TYPE_FAT16         0x06
#define PART_TYPE_NTFS          0x07
#define PART_TYPE_FAT32         0x0B
#define PART_TYPE_FAT32LBA      0x0C
#define PART_TYPE_FAT16LBA      0x0E
#define PART_TYPE_EXTDOSLBA     0x0F
#define PART_TYPE_ONTRACK       0x33
#define PART_TYPE_NOVELL        0x40
#define PART_TYPE_PCIX          0x4B
#define PART_TYPE_PHOENIXSAVE   0xA0
#define PART_TYPE_CPM           0xDB
#define PART_TYPE_DBFS          0xE0
#define PART_TYPE_BBT           0xFF

//boot sector for dos5.0 
typedef __packed struct {
     BYTE    Bs_jmpBoot[3];                  				// jump inst E9xxxx or EBxx90
     CHAR    BO_OEMName[8];               				// OEM name and version
     CHAR    Bs_BPB[25];                  				// BIOS parameter block
     CHAR    Bs_Ext[26];                  				// Bootsector Extension
     CHAR    Bs_BootCode[448];            				// pad so structure is 512b
     BYTE    Bs_BootSectSig0;             				// boot sector signature byte 0x55 
     BYTE    Bs_BootSectSig1;             				// boot sector signature byte 0xAA
 	 #define BOOTSIG0        	0x55
	 #define BOOTSIG1       	0xaa
 }BOOTSECTOR50;
 
 
 // BPB for DOS 5.0
 typedef __packed struct {
         WORD    BPB_BytesPerSec; 						// bytes per sector
         BYTE    BPB_SecPerClust; 						// sectors per cluster
         WORD    BPB_RsvdSecCnt;  						// number of reserved sectors
         BYTE    BPB_NumFATs;      						// number of FATs
         WORD    BPB_RootEntCnt; 						// number of root directory entries
         WORD    BPB_TotSec16;     						// total number of sectors
         BYTE    BPB_Media;       						// media descriptor
         WORD    BPB_FATSz16;     						// number of sectors per FAT
         WORD    BPB_SecPerTrack; 						// sectors per track
         WORD    BPB_NumHeads;     						// number of heads
         DWORD   BPB_HiddSec;	  						// number of hidden sectors
         DWORD   BPB_TotSec32;	 						// number of sectors if bpbSectors == 0
 }BPB50;
 
typedef __packed struct {
     CHAR    BPB_DrvNum;	              				// drive number (0x80)
     CHAR    BS_Reserved1;                				// reserved
     CHAR    BS_BootSig;	            				// ext. boot signature (0x29)
 	 #define EXBOOTSIG       0x29
     DWORD   BS_VoLID;              					// volume ID number
     CHAR    BS_VoLLab[11]; 	         				// volume label
     CHAR    BS_FilSysType[8];           				// fs type (FAT12 or FAT16)
 }EXTBOOT;
 
 


/***************************************************************/
// Structure of a dos directory entry.
typedef __packed struct
{
         BYTE        	 		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 IS_DIR          		0x2e            		// this is directory
         char        	 		deExtension[3]; 		// extension, blank filled
         BYTE        	 		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
         BYTE        	 		deLowerCase;    		// NT VFAT lower case flags,for FAT32
 #define LCASE_BASE      		0x08            		// filename base in lower case
 #define LCASE_EXT       		0x10            		// filename extension in lower case
         BYTE        	 		CrtTimeTenth;   		// hundredth of seconds in CTime,for FAT32
         WORD        	 		CrtTime;     			// create time,for FAT32
         WORD        	 		CrtDate;     			// create date,for FAT32
         WORD        	 		LstAccDate;     		// access date,for FAT32
         WORD        	 		FstClusHI;    			// high bytes of cluster number,for FAT32
         WORD        	 		WrtTime;     			// last update time
         WORD        	 		WrtDate;     			// last update date
         WORD        	 		deStartCluster; 		// starting cluster of file
         DWORD       	 		deFileSize;     		// size of file in bytes
}DIRENTRY;

 
 // 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
 
 typedef __packed struct 
{
	WORD Date;
	WORD Time;
	BYTE TimeTenth;
}FatDateTime;


//FAT16 Apis
typedef __packed struct 
{
	BYTE 	Attr;
	BYTE 	CrtTimeTenth;
	WORD 	CrtTime;
	WORD 	CrtDate;
	WORD 	LstAccDate;
	WORD 	WrtTime;
	WORD 	WrtDate;
	DWORD	FileSize;
}_STAT;

typedef __packed struct 
{
	int valid; // 1 valid, 0 free.

	DWORD 	DirSectorNum;		//文件目录项所在的扇区
	int 	DirIndex;			//文件目录项的目录项偏移号

	DWORD 	StartSectorNum;
	DWORD 	CurrentSectorNum;	//文件指针offset所在的扇区,该扇区在整个flash中连续编号
	DWORD 	SectorOffset;		//文件内容在一个扇区内的偏移位置

	DIRENTRY dir;

	unsigned long offset;		//文件内容相对与文件开始的偏移位置
	
}_FILE;

typedef __packed struct 
{
	DWORD DirSectorNum;
	int DirIndex;
	int IsRootDir;
	char filename[13];
}FatGet;


#define FROM_START 0
#define FROM_CUR 1
#define FROM_END 2

⌨️ 快捷键说明

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