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

📄 fat.h

📁 FAT16, FAT32 Support with long file names
💻 H
📖 第 1 页 / 共 2 页
字号:

//*****************************************************************
//
// File Name	: 'fat.h'
// Title			: FAT file system implementation
// Author		: Pascal Stang
// Date			: 12/10/2000
// Revised		: 12/12/2000
// Version		: 0.1
// Target MCU	: ATmega103
// Editor Tabs	: 4
//
//*****************************************************************


#include "types.h"


/*
 * Some useful cluster numbers.
 */
#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     0xfffffff6      /* reserved cluster range */
#define CLUST_BAD       0xfffffff7      /* a cluster with a defect */
#define CLUST_EOFS      0xfffffff8      /* start of eof cluster range */
#define CLUST_EOFE      0xffffffff      /* end of eof cluster range */

#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



struct partrecord /* length 16 bytes */
{			
	BYTE	prIsActive;					/* 0x80 indicates active partition */
	BYTE	prStartHead;				/* starting head for partition */
	WORD	prStartCylSect;				/* starting cylinder and sector */
	BYTE	prPartType;					/* partition type (see above) */
	BYTE  	prEndHead;					/* ending head for this partition */
	WORD	prEndCylSect;				/* ending cylinder and sector */
	DWORD	prStartLBA;					/* first LBA sector for this partition */
	DWORD	prSize;						/* size of this partition (bytes or sectors ?) */
};

        
struct partsector
{
	CHAR        psPartCode[512-64-2];   /* pad so struct is 512b */
	BYTE 		psPart[64];				/* four partition records (64 bytes) */
    BYTE        psBootSectSig0;			/* two signature bytes (2 bytes) */ 
    BYTE        psBootSectSig1;
#define BOOTSIG0        0x55
#define BOOTSIG1        0xaa
};



/*
 * 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.
 */
struct bootsector33 {
        BYTE 		bsJump[3];              /* jump inst E9xxxx or EBxx90 */
        CHAR        bsOemName[8];           /* OEM name and version */
        CHAR        bsBPB[19];              /* BIOS parameter block */
        CHAR        bsDriveNumber;          /* drive number (0x80) */
        CHAR        bsBootCode[479];        /* pad so struct is 512b */
        BYTE        bsBootSectSig0;
        BYTE        bsBootSectSig1;
#define BOOTSIG0        0x55
#define BOOTSIG1        0xaa
};

struct extboot {
        CHAR          exDriveNumber;          /* drive number (0x80) */
        CHAR          exReserved1;            /* reserved */
        CHAR          exBootSignature;        /* ext. boot signature (0x29) */
#define EXBOOTSIG       0x29
        CHAR          exVolumeID[4];          /* volume ID number */
        CHAR          exVolumeLabel[11];      /* volume label */
        CHAR          exFileSysType[8];       /* fs type (FAT12 or FAT16) */
};

struct bootsector50 {
        BYTE        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 */
        BYTE        bsBootSectSig0;
        BYTE        bsBootSectSig1;
#define BOOTSIG0        0x55
#define BOOTSIG1        0xaa
};

struct bootsector710 {
        BYTE        bsJump[3];              /* jump inst E9xxxx or EBxx90 */
        CHAR          bsOEMName[8];           /* OEM name and version */
        CHAR          bsBPB[53];              /* BIOS parameter block */
        CHAR          bsExt[26];              /* Bootsector Extension */
        CHAR          bsBootCode[418];        /* pad so structure is 512b */
        BYTE        bsBootSectSig2;         /* 2 & 3 are only defined for FAT32? */
        BYTE        bsBootSectSig3;
        BYTE        bsBootSectSig0;
        BYTE        bsBootSectSig1;
#define BOOTSIG0        0x55
#define BOOTSIG1        0xaa
#define BOOTSIG2        0
#define BOOTSIG3        0
};


/***************************************************************/
/***************************************************************/


/*
 * BIOS Parameter Block (BPB) for DOS 3.3
 */
struct bpb33 {
        WORD		bpbBytesPerSec; /* bytes per sector */
        BYTE        bpbSecPerClust; /* sectors per cluster */
        WORD       	bpbResSectors;  /* number of reserved sectors */
        BYTE        bpbFATs;        /* number of FATs */
        WORD       	bpbRootDirEnts; /* number of root directory entries */
        WORD       	bpbSectors;     /* total number of sectors */
        BYTE       	bpbMedia;       /* media descriptor */
        WORD       	bpbFATsecs;     /* number of sectors per FAT */
        WORD       	bpbSecPerTrack; /* sectors per track */
        WORD       	bpbHeads;       /* number of heads */
        WORD       	bpbHiddenSecs;  /* number of hidden sectors */
};

/*
 * BPB for DOS 5.0 The difference is bpbHiddenSecs is a short for DOS 3.3,
 * and bpbHugeSectors is not in the 3.3 bpb.
 */
struct bpb50 {
        WORD       	bpbBytesPerSec; /* bytes per sector */
        BYTE        bpbSecPerClust; /* sectors per cluster */
        WORD       	bpbResSectors;  /* number of reserved sectors */
        BYTE        bpbFATs;        /* number of FATs */
        WORD       	bpbRootDirEnts; /* number of root directory entries */
        WORD       	bpbSectors;     /* total number of sectors */
        BYTE        bpbMedia;       /* media descriptor */
        WORD       	bpbFATsecs;     /* number of sectors per FAT */
        WORD       	bpbSecPerTrack; /* sectors per track */
        WORD       	bpbHeads;       /* number of heads */
        DWORD       bpbHiddenSecs;  /* # of hidden sectors */
/* 3.3 compat ends here */
        DWORD       bpbHugeSectors; /* # of sectors if bpbSectors == 0 */
};

/*
 * BPB for DOS 7.10 (FAT32).  This one has a few extensions to bpb50.
 */
struct bpb710 {
        WORD    	bpbBytesPerSec; /* bytes per sector */
        BYTE        bpbSecPerClust; /* sectors per cluster */
        WORD       	bpbResSectors;  /* number of reserved sectors */
        BYTE        bpbFATs;        /* number of FATs */
        WORD       	bpbRootDirEnts; /* number of root directory entries */
        WORD       	bpbSectors;     /* total number of sectors */
        BYTE        bpbMedia;       /* media descriptor */
        WORD       	bpbFATsecs;     /* number of sectors per FAT */
        WORD       	bpbSecPerTrack; /* sectors per track */
        WORD       	bpbHeads;       /* number of heads */
        DWORD       bpbHiddenSecs;  /* # of hidden sectors */
/* 3.3 compat ends here */
        DWORD       bpbHugeSectors; /* # of sectors if bpbSectors == 0 */
/* 5.0 compat ends here */

        DWORD       bpbBigFATsecs;  /* like bpbFATsecs for FAT32 */
        WORD       	bpbExtFlags;    /* extended flags: */

⌨️ 快捷键说明

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