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

📄 fat.h

📁 基于s3c2410、2440的从SD卡引导Linux内核程序
💻 H
字号:
#ifndef __FAT__H
#define __FAT__H
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define CHAR unsigned char		//8b
#define BYTE unsigned char		//8b
#define WORD unsigned short		//16b
#define DWORD unsigned int		//32b
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
extern int Fat_Init(void);
int Fat_Init(void);								//初始化磁盘分区
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#define CLUST_RSRVD     0xfffffff6      // 系统保留簇
#define CLUST_BAD       0xfffffff7      // 坏簇
#define CLUST_EOFS      0xfffffff8      // 第一个结束簇
#define CLUST_EOFE      0xffffffff      // 最后一个结束簇
#define FAT12_MASK      0x00000fff      // FAT12掩码
#define FAT16_MASK      0x0000ffff      // FAT16掩码
#define FAT32_MASK      0x0fffffff      // FAT32掩码
unsigned int FatNextCluster(unsigned int cluster);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
extern void List_DirFile(void);
void List_DirFile(void);							//列出指定分区的活动目录的内容
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
extern int Find_DirFile(unsigned char * DFName,unsigned char * DFExt);
#define Null_Ext	0x00	//无后缀名
int Find_DirFile(unsigned char * DFName,unsigned char * DFExt);	//查找文件或子目录
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//命令表
extern int CD(unsigned char * DFName);
int CD(unsigned char * DFName);
extern void DIR(void);
void DIR(void);
extern int LoadFile(unsigned int * DesAddr,unsigned char * DFName,unsigned char * DFExt);
int LoadFile(unsigned int * DesAddr,unsigned char * DFName,unsigned char * DFExt);
extern char *ReadCmd(unsigned char * DFName,unsigned char * DFExt);
char *ReadCmd(unsigned char * DFName,unsigned char * DFExt);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////


// 分区类型
#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

//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////

//FAT表结构
__packed typedef struct
{
	BYTE	Item[512];
}FAT;

/*在总共512byte的主引导记录中,MBR的引导程序占了其中的前446个字节(偏移0H~偏移1BDH),
  随后的64个字节(偏移1BEH~偏移1FDH)为DPT(Disk PartitionTable,硬盘分区表),最后的两
  个字节“55 AA”(偏移1FEH~偏移1FFH)是分区有效结束标志。*/
//主引导记录(512字节)  
__packed typedef struct //PartSector
{
	CHAR	psPartCode[512-64-2];		// 启动代码 (446 bytes)
	BYTE	psPart[64];					// 四个分区表(64 bytes)
	BYTE	psBootSectSig0;				// 两个签名(2 bytes)
	BYTE	psBootSectSig1;
#define BOOTSIG0        0x55
#define BOOTSIG1        0xaa
}MBR;

/*第一个分区表项描述一个分区的属性,一般为基本分区。第二个分区表项描述除基本分区外
的其余空间,一般而言,就是我们所说的扩展分区。*/
//MBR之DPT部分(partsector->psPart[64]的前16个字节)
__packed typedef struct //PartRecord //  16字节
{			
	BYTE	prIsActive;					// 0x80代表该分区为缺省分区
	BYTE	prStartHead;				// 该分区入口的磁头地址
	WORD	prStartCylSect;				// 该分区入口的扇区地址和柱面地址
	BYTE	prPartType;					// 该分区类型,系统ID(System ID) 
	BYTE	prEndHead;					// 该分区结束的磁头地址
	WORD	prEndCylSect;				// 该分区结束的扇区地址和柱面地址
	DWORD	prStartLBA;					// 该分区的第一个扇区地址,相对与磁盘的开始(物理0扇区)
	DWORD	prSize;						// 该分区所包含的扇区总数
}DPT;

//系统引导扇区(DOS BOOT RECORD)DBR结构
__packed typedef struct //BootSector
{
	BYTE	bsJump[3];					// 跳转指令
	CHAR	bsOEMName[8];				// 厂商标志和OS版本号
	CHAR	bsBPB[53];					// BPB 参数块
	CHAR	bsExt[26];					// 扩展BPB
	CHAR	bsBootCode[418];			// 引导扇区代码
	BYTE	bsBootSectSig2;				
	BYTE	bsBootSectSig3;
	BYTE	bsBootSectSig0;				// 引导扇区签名0x55
	BYTE	bsBootSectSig1;				// 引导扇区签名0xAA
#define BOOTSIG0        0x55
#define BOOTSIG1        0xaa
#define BOOTSIG2        0
#define BOOTSIG3        0
}DBR;

// BPB(BIOS Parameter Block) 参数块
// (BootSector->bsBPB[53]的前41字节)
__packed typedef struct 
{
		WORD	bpbBytesPerSec;			// 每扇区字节数,通常为512
		BYTE	bpbSecPerClust;			// 每簇扇区数
		WORD	bpbResSectors;			// 保留区域中的保留扇区数
		BYTE	bpbFATs;				// FAT表的份数
		WORD	bpbRootDirEnts;			// 根目录项数,只有Fat12/Fat16用到,Fat32的为0
		WORD	bpbSmallSectors;		// 小扇区数,只有Fat12/Fat16用到,Fat32的为0
		BYTE	bpbMedia;				// 固定存储介质描述
		WORD	bpbFATsecs;				// FAT表所占的扇区数,只有Fat12/Fat16用到,Fat32的为0
		WORD	bpbSecPerTrack;			// 每道扇区数
		WORD	bpbHeads;				// 磁头数
		DWORD	bpbHiddenSecs;			// 隐藏扇区数
		DWORD	bpbHugeSectors;			// 大扇区数,只供Fat32使用
		//上面的25字节兼容Fat16
		DWORD     bpbBigFATsecs;		// 每个FAT区所占扇区数,只供Fat32使用
		WORD      bpbExtFlags;			// 扩展标志
#define FATNUM    0xf			
#define FATMIRROR 0x80			
		WORD      bpbFSVers;			// 文件系统版本,只供Fat32使用
#define FSVERS    0				
		DWORD     bpbRootClust;			// 根目录簇号
		WORD      bpbFSInfo;			// 文件系统信息扇区号,只供Fat32使用
		WORD      bpbBackup;			// 备份引导扇区,扇区号,一般为6,只供Fat32使用
		//这里还有12个字节的保留空间,全为0x00,只供Fat32使用
}BPB;

//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////

// 目录或文件入口地址结构
__packed typedef struct
{
		BYTE		deName[8];          // 文件名
#define SLOT_EMPTY      0x00            // 目录项为空
#define SLOT_E5         0x05            
#define SLOT_DELETED    0xe5            // 文件已被删除
		BYTE		deExtension[3];     // 扩展名
		BYTE		deAttributes;       // 文件属性
#define ATTR_NORMAL     0x00            // 读写
#define ATTR_READONLY   0x01            // 只读
#define ATTR_HIDDEN     0x02            // 隐藏
#define ATTR_SYSTEM     0x04            // 系统文件
#define ATTR_VOLUME     0x08            // 卷标文件
#define ATTR_LONG_FILENAME	0x0f		// 长文件名文件			    
#define ATTR_DIRECTORY  0x10            // 子目录文件
#define ATTR_ARCHIVE    0x20            // 归档文件
////////Fat16时,下面部分为系统保留空间,共10字节////////////////////
		BYTE        deLowerCase;        // 系统保留
#define LCASE_BASE      0x08            
#define LCASE_EXT       0x10            
		BYTE        deCHundredth;       // 文件创建时间的10MS
		BYTE        deCTime[2];         // 文件创建时间
		BYTE        deCDate[2];         // 文件创建日期
		BYTE        deADate[2];         // 文件最近访问日期
		WORD        deHighClust; 	    // 文件起始簇号的高16位
/////////////////////////////////////////////////////////////////////
		BYTE        deMTime[2];         // 文件最近修改时间
		BYTE        deMDate[2];         // 文件最近修改日期
		WORD        deStartCluster;     // 文件起始簇号的低16位
		DWORD       deFileSize;  	    // 文件长度
}DirFile;
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////

/*
// Stuctures
struct FileInfoStruct
{
    unsigned char  Name[256];            // 100 first char on the longfilename
	unsigned char  Extension[3];	     // extension
	unsigned long  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 char  CreateDate[10];       //< file creation date for last file accessed
    unsigned char  CreateTime[8];        //< file creation time for last file accessed
};
*/

#endif

⌨️ 快捷键说明

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