📄 fat.h
字号:
/************************************************************/
/* FAT Code for AT91SAM7S64 */
/* By pasyong */
/* 2006-5 */
/* Base IAR 4.30A */
/************************************************************/
#ifndef FAT_H
#define FAT_H
#define CHAR unsigned char
#define BYTE unsigned char
#define WORD unsigned int
#define DWORD unsigned long
//簇定义
#define MSDOSFSROOT 0
#define CLUST_FREE 0
#define MSDOSFSFREE CLUST_FREE
#define CLUST_FIRST 2 // 第一个数据簇
#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掩码
// 分区类型
#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 // 16 字节
{
BYTE prIsActive; // 0x80代表该分区为缺省分区
BYTE prStartHead; // 该分区入口的磁头地址
WORD prStartCylSect; // 该分区入口的扇区地址和柱面地址
BYTE prPartType; // 该分区类型
BYTE prEndHead; // 该分区结束的扇区地址
WORD prEndCylSect; // 该分区结束的柱面地址
DWORD prStartLBA; // 该分区内第一个扇区地址
DWORD prSize; // 该分区所包含的扇区总数
};
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
};
//系统引导扇区(DOS BOOT RECORD)DBR结构
struct bootsector710 {
BYTE bsJump[3]; // 跳转指令
CHAR bsOEMName[8]; // 厂商标志和OS版本号
CHAR bsBPB[53]; // BIOS 参数块
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
};
// BIOS 参数块
struct bpb710 {
WORD bpbBytesPerSec; // 每扇区字节数
BYTE bpbSecPerClust; // 每簇扇区数
WORD bpbResSectors; // 保留区域中的保留扇区数
BYTE bpbFATs; // FAT表的份数
WORD bpbRootDirEnts; // 根目录项数
WORD bpbSectors; // 此域为存储卷上的扇区总数
BYTE bpbMedia; // 固定存储介质描述
WORD bpbFATsecs; // FAT表所占的扇区数
WORD bpbSecPerTrack; // 每道扇区数
WORD bpbHeads; // 磁头数
DWORD bpbHiddenSecs; // 隐藏扇区数
DWORD bpbHugeSectors; // 总扇区数
DWORD bpbBigFATsecs;// 每个FAT区所占扇区数
WORD bpbExtFlags; // 扩展标志
#define FATNUM 0xf
#define FATMIRROR 0x80
WORD bpbFSVers; // 文件系统版本
#define FSVERS 0
DWORD bpbRootClust; // 根目录簇号
WORD bpbFSInfo; // 文件系统信息扇区号
WORD bpbBackup; // 备份引导扇区
};
// 目录或文件入口地址结构
struct direntry {
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 // 归档文件
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; // 文件长度
};
// 一个扇区中的目录项数
#define DIRENTRIES_PER_SECTOR 0x10
// 长文件名入口地址结构
struct winentry {
BYTE weCnt;
#define WIN_LAST 0x40
#define WIN_CNT 0x3f
BYTE wePart1[10];
BYTE weAttributes;
#define ATTR_WIN95 0x0f
BYTE weReserved1;
BYTE weChksum;
BYTE wePart2[12];
WORD weReserved2;
BYTE wePart3[4];
};
#define WIN_CHARS 13 //长文件名入口地址结构可包含13个字符
//在FAT32中,文件名最长可到255个字符
#define WIN_MAXLEN 255
// 目录或文件入口地址结构中的时间结构
#define DT_2SECONDS_MASK 0x1F // 秒
#define DT_2SECONDS_SHIFT 0
#define DT_MINUTES_MASK 0x7E0 // 分
#define DT_MINUTES_SHIFT 5
#define DT_HOURS_MASK 0xF800 // 时
#define DT_HOURS_SHIFT 11
// 目录或文件入口地址结构中的日期结构
#define DD_DAY_MASK 0x1F // 日
#define DD_DAY_SHIFT 0
#define DD_MONTH_MASK 0x1E0 // 月
#define DD_MONTH_SHIFT 5
#define DD_YEAR_MASK 0xFE00 // 年 - 1980
#define DD_YEAR_SHIFT 9
// 调可函数
void ReadBlock(unsigned long LBA);
unsigned long fatClustToSect(unsigned long clust);
unsigned char fatInit( void);
unsigned int fatClusterSize(void);
unsigned long fatGetDirEntry(unsigned char entry);
unsigned long fatGetFilesize(void);
char* fatGetFilename(void);
char* fatGetDirname(void);
void fatLoadCluster(unsigned long cluster, unsigned char *buffer);
unsigned long fatNextCluster(unsigned long cluster);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -