📄 fat.h
字号:
//*****************************************************************
//
// 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 + -