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

📄 fat.h

📁 瑞芯微RK2608固件源代码
💻 H
字号:
//#include	"include.h"

#ifndef _FAT_H
#define _FAT_H
//1常量定义

#ifndef 	FAT12
#define	FAT12	0
#endif
#ifndef 	FAT16
#define	FAT16	1
#endif
#ifndef 	FAT32
#define	FAT32	2
#endif


//1结构定义
		/***********************************************************
		Offset		Length		Name		Contents
		0			8B			Name		File name
		8			3B			Extension		File extension
		B			1B			Attributes		file attributes
		C			10B			Reserved		RESERVED
		16			word		Time		Time stamp
		18			word		Date			Date stamp
		1A			word		StartCluster	Starting cluster number
		1C			dWord		FileSize		File size
		************************************************************/
/***************************************************************************
目录项(32字节)
***************************************************************************/
typedef struct
{
	uint8	fileName[8];		/*文件名*/
	uint8	extName[3];		/*扩展名*/
	uint8	rdOnly:1;		/*只读属性 */
	uint8	hide:1;			/*隐含属性 */
	uint8	sys:1;			/*系统属性*/
	uint8	label:1;			/*卷标标志*/
	uint8	dir:1;			/*目录标志*/
	uint8	arc:1;			/*存档属性*/
	uint8	res:2;			/*保留位*/
	uint8	reserve[5];		/*保留*/
	uint16	modTime;		/*文件修改时间*/
	uint16	modDate;		/*文件修改日期*/
	uint16	createTime;		/*文件创建时间*/
	uint16	createDate;		/*文件创建日期*/
	uint16	startClu;		/*起始簇号*/
	uint32	fileSize;			/*文件大小*/
}FDT_REC;

/***************************************************************************
目录项(32字节)
***************************************************************************/
typedef struct 
{
        uint8 	name[8];		/*文件名*/
        uint8 	ext[3];			/*扩展名*/
        uint8 	attrib;			/*属性*/
        uint8 	reserved;		/*保留*/
        uint8 	ctime_ms;		/*文件创建时间ms*/
        uint16 	ctime;			/*文件创建时间*/
        uint16 	cdate;			/*文件修改日期*/
        uint16 	adate;			/*访问日期*/
        uint16 	st_clust_msw;	/*起始簇号(FAT32高16位)*/
        uint16 	mtime;			/*文件修改时间*/
        uint16 	mdate;			/*文件修改日期*/
        uint16 	st_clust;		/*起始簇号*/
        uint32 	file_size;		/*文件大小(低16位)*/
}_fat_dirent;

/***************************************************************************
长目录项(32字节)
***************************************************************************/
typedef struct 
{
        uint8 	LDIR_Ord;
        uint8 	LDIR_Name1[10];
        uint8 	LDIR_Attr;
        uint8 	LDIR_Type;
        uint8 	LDIR_Chksum;
        uint8 	LDIR_Name2[12];
        uint16 	LDIR_FstClusLO;
        uint8 	LDIR_Name3[4];
}_fat_ldirent, *pfat_ldirent;


/***************************************************************************
磁盘格式化参数
***************************************************************************/
typedef struct 
{
        uint32 	DiskSize;		/*磁盘大小(扇区)*/
        uint8 	SecPerClus;		/*每簇扇区数*/
}_DskSizeToSecPerClus;

/***************************************************************************
引导扇区(512字节)
***************************************************************************/
typedef struct
{
	//uint8	jump[3];				// 16-bit JMP to boot code, or 8-bit JMP + NOP
	//uint8	oem_id[8];			// e.g. 'MSWIN4.0' 
	uint16	BPB_BytsPerSec;		//bytes_per_sector;	// usu. =512 
	uint8	BPB_SecPerClus;		//sectors_per_cluster;
	uint16	BPB_ResvdSecCnt;	//num_boot_sectors;	// usu. =1
	uint8	BPB_NumFATs;		//num_fats;		// usu. =2 
	uint16	BPB_RootEntCnt;		//num_root_dir_ents;
	//uint16	BPB_TotSec16;		//total_sectors;	// 16-bit; 0 if num sectors > 65535
	//uint8	media_ID_byte;    	// usu. =0F0h
	//uint16	BPB_FATSz16;		//sectors_per_fat;
	//uint16	sectors_per_track;
	//uint16	heads;
	//uint32	hidden_sectors;		// =LBA partition start
	//uint32	BPB_TotSec32;		//total_sectors_large;// 32-bit; 0 if num sectors < 65536 
	//uint8	boot_code[474];

	//uint32	BPB_FATSz32;
	//uint8	boot_code1[4];
	uint32	BPB_RootClus;
	uint16	BPB_FSInfo;
	//uint8	boot_code2[460];
	//uint8	magic[2];			// 55h, 0AAh 

//////////////////////////////////////////////////////////////
// modify and addition variable
//////////////////////////////////////////////////////////////
	uint32 FATSz;
	uint32 RootDirSectors;
	uint32 CountofClusters;
	uint32 FirstDataSector;
	uint32 PBRSector;
	uint32 TotSec;				//add by lxs @2005.4.19
}_fat_bootsector;                              /* 512 bytes total */




//1全局变量
#undef	EXT
#ifdef	IN_FAT
		#define	EXT
#else
		#define	EXT		extern
#endif		
EXT		uint8 			FATType			DRAM_FAT;
EXT		uint8 			LogSecPerClus	DRAM_FAT;
EXT		uint8 			LogBytePerSec	DRAM_FAT;
EXT		_fat_bootsector 	BootSector		DRAM_FAT;

//1函数原型声明
extern	void 	LowFormat(void);
extern	void 	Format(uint8 media, uint8 type);
extern	void 	WriteDBRSector(uint8 type);
extern	void 	WriteRootDir(uint8 type);
extern	void 	WriteFAT2(uint8 type);
extern	uint8	CheckFileSystem(void);
extern	uint8	GetBootInfo(uint32 PBRSector, uint8 *DbrBuf);
extern	int 		lg2(uint16 arg);
extern	bool 	CheckFatBootSector(uint8 *DbrBuf);
extern	uint32 	CheckMbr(uint8 *DbrBuf);
extern	void 	CopyFat(uint8 FatNum);
extern	void 	GetFATPosition(uint32 cluster, uint32 *FATSecNum, uint16 *FATEntOffset);
extern	bool 	CheckBadCluster(uint32 checkCluster);
extern	bool 	CheckBadBlock(uint32 pageNum);
extern	void 	SetBadBlock(uint32 pageNum);
extern	uint32 	GetFirstSectorofCluster(uint32 cluster);


//1表格定义

#ifdef IN_FAT
_DskSizeToSecPerClus DskTableFAT16[] DRAM_FAT_TABLE=
{
	{8400, 0},			//磁盘容量最大为4.1MB, SecPerClus=0表示这是个错误
	{32680, 2},			//磁盘容量最大为16MB, 1KB clus
	{262144, 4},			//磁盘容量最大为128MB, 2KB clus
	{524288, 8},			//磁盘容量最大为256MB, 4KB clus
	{1048576, 16},		//磁盘容量最大为512MB, 8KB clus
	{2097152, 32},		//磁盘容量最大为1GB, 16KB clus
	{4194304, 64},		//磁盘容量最大为2GB, 32KB clus
	{-1, 0}				//磁盘容量超过2GB, SecPerClus=0表示这是个错误
};

#if 0
uint8 defaultBootSector[512] =
{
	//2 0x00-0x02:跳转指令,跳到操作系统引导程序代码
	0xEB,0x3E,0x90,

	//2 0x03-0x0a:OEM ID,操作系统名称和版本
	'M','S','W','I','N','4','.','1',

	//2 0x0b-0x23:BPB
	0x00,0x02,					//3 0x0b:每扇区的字节数
	0x01,						//3 0x0d:每簇扇区数
	0x01,0x00,					//3 0x0e:保留扇区数
	0x02,						//3 0x10:FAT备份数
	0x00,0x02,					//3 0x11:根目录项数
	0x00,0x00,					//3 0x13:该分区上的扇区数
	0xF8,						//3 0x15:媒体描述符(0xf8=硬盘)
	0x3F,0x00,					//3 0x16:每FAT占用的扇区数
	0x3F,0x00,					//3 0x18:每磁道扇区数
	0xFF,0x00,					//3 0x1a:磁头数
	0x00,0x00,0x00,0x00,			//3 0x1c:隐藏扇区数
	0x00,0x00,0x00,0x00,			//3 0x20:总扇区数

	//2 0x24-0x3d:扩展BPB
	0x00,						//3 0x24:物理软盘
	0x00,						//3 0x25:保留
	0x29,						//3 0x26:扩展引导标签,必须是0x28或0x29
	0x77,0xE2,0xCB,0x94,			//3 0x27:卷序号(格式化时产生随机数)
	'N','O','N','A','M','E',' ',' ',' ',' ',' ',	//3 0x2b:卷标名(11B)
	'F','A','T','1','6',' ',' ',' ',			//3 0x36:文件系统类型(8B)

	//2 0x3e-0x01fd:引导程序代码
	0xf1,0x7d,0xfa,0x33,0xc9,0x8e,0xd1,0xbc,
	0xfc,0x7b,0x16,0x07,0xbd,0x78,0x00,0xc5,
	0x76,0x00,0x1e,0x56,0x16,0x55,0xbf,0x22,
	0x05,0x89,0x7E,0x00,0x89,0x4e,0x02,0xb1,
	0x0b,0xfc,0x1F,0xBD,0x00,0x7C,0xC6,0x45,
	0xFE,0x0F,0x38,0x4E,0x24,0x7D,0x20,0x8B,
	0xC1,0x99,0xE8,0x7E,0x01,0x83,0xEB,0x3A,
	0x66,0xA1,0x1C,0x7C,0x66,0x3B,0x07,0x8A,
	0x57,0xFC,0x75,0x06,0x80,0xCA,0x02,0x88,
	0x56,0x02,0x80,0xC3,0x10,0x73,0xED,0x33,
	0xC9,0xFE,0x06,0xD8,0x7D,0x8A,0x46,0x10,
	0x98,0xF7,0x66,0x16,0x03,0x46,0x1C,0x13,
	0x56,0x1E,0x03,0x46,0x0E,0x13,0xD1,0x8B,
	0x76,0x11,0x60,0x89,0x46,0xFC,0x89,0x56,
	0xFE,0xB8,0x20,0x00,0xF7,0xE6,0x8B,0x5E,
	0x0B,0x03,0xC3,0x48,0xF7,0xF3,0x01,0x46,
	0xFC,0x11,0x4E,0xFE,0x61,0xBF,0x00,0x07,
	0xE8,0x28,0x01,0x72,0x3E,0x38,0x2D,0x74,
	0x17,0x60,0xB1,0x0B,0xBE,0xD8,0x7D,0xF3,
	0xA6,0x61,0x74,0x3D,0x4E,0x74,0x09,0x83,
	0xC7,0x20,0x3B,0xFB,0x72,0xE7,0xEB,0xDD,
	0xFE,0x0E,0xD8,0x7D,0x7B,0xA7,0xBE,0x7F,
	0x7D,0xAC,0x98,0x03,0xF0,0xAC,0x98,0x40,
	0x74,0x0C,0x48,0x74,0x13,0xB4,0x0E,0xBB,
	0x07,0x00,0xCD,0x10,0xEB,0xEF,0xBE,0x82,
	0x7D,0xEB,0xE6,0xBE,0x80,0x7D,0xEB,0xE1,
	0xCD,0x16,0x5E,0x1F,0x66,0x8F,0x04,0xCD,
	0x19,0xBE,0x81,0x7D,0x8B,0x7D,0x1A,0x8D,
	0x45,0xFE,0x8A,0x4E,0x0D,0xF7,0xE1,0x03,
	0x46,0xFC,0x13,0x56,0xFE,0xB1,0x04,0xE8,
	0xC2,0x00,0x72,0xD7,0xEA,0x00,0x02,0x70,
	0x00,0x52,0x50,0x06,0x53,0x6A,0x01,0x6A,
	0x10,0x91,0x8B,0x46,0x18,0xA2,0x26,0x05,
	0x96,0x92,0x33,0xD2,0xF7,0xF6,0x91,0xF7,
	0xF6,0x42,0x87,0xCA,0xF7,0x76,0x1A,0x8A,
	0xF2,0x8A,0xE8,0xC0,0xCC,0x02,0x0A,0xCC,
	0xB8,0x01,0x02,0x80,0x7E,0x02,0x0E,0x75,
	0x04,0xB4,0x42,0x8B,0xF4,0x8A,0x56,0x24,
	0xCD,0x13,0x61,0x61,0x72,0x0A,0x40,0x75,
	0x01,0x42,0x03,0x5E,0x0B,0x49,0x75,0x77,
	0xC3,0x03,0x18,0x01,0x27,0x0D,0x0A,0x49,
	0x6E,0x76,0x61,0x6C,0x69,0x64,0x20,0x73,
	0x79,0x73,0x74,0x65,0x6D,0x20,0x64,0x69,
	0x73,0x6B,0xFF,0x0D,0x0A,0x44,0x69,0x73,
	0x6B,0x20,0x49,0x2F,0x4F,0x20,0x65,0x72,
	0x72,0x6F,0x72,0xFF,0x0D,0x0A,0x52,0x65,
	0x70,0x6C,0x61,0x63,0x65,0x20,0x74,0x68,
	0x65,0x20,0x64,0x69,0x73,0x6B,0x2C,0x20,
	0x61,0x6E,0x64,0x20,0x74,0x68,0x65,0x6E,
	0x20,0x70,0x72,0x65,0x73,0x73,0x20,0x61,
	0x6E,0x79,0x20,0x6B,0x65,0x79,0x0D,0x0A,
	0x00,0x00,0x49,0x4F,0x20,0x20,0x20,0x20,
	0x20,0x20,0x53,0x59,0x53,0x4D,0x53,0x44,
	0x4F,0x53,0x20,0x20,0x20,0x53,0x59,0x53,
	0x7F,0x01,0x00,0x41,0xBB,0x00,0x07,0x60,
	0x66,0x6A,0x00,0xE9,0x3B,0xFF,0x00,0x00,

	//2 0x01fe-0x01ff:有效结束标志
	0x55,0xAA
};
#endif
#else
	extern	uint8 defaultBootSector[512];
	extern	_DskSizeToSecPerClus DskTableFAT16[];
#endif
#endif

⌨️ 快捷键说明

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