📄 fat12.h
字号:
//#include memory.h
#ifndef FAT_H
#define FAT_H
#ifndef BYTE
typedef unsigned char BYTE;
typedef unsigned char U8;
#endif
#ifndef CHAR
typedef char CHAR;
#endif
#ifndef WORD
typedef unsigned short WORD;
#endif
#ifndef DWORD
typedef unsigned long DWORD;
#endif
// NAND flash 定义;
#define MASS_MEMORY_SIZE 0x3000000 // 48MBytes 用户使用的FLASH的总字节容量
#define TOTAL_MASS_MEMORY_SIZE 0x4000000 // 64MBytes FLASH的总字节容量
#define MASS_BLOCK_SIZE 0x200 //扇区长度512字节
#define MASS_BLOCK_COUNT (MASS_MEMORY_SIZE / MASS_BLOCK_SIZE) //用户使用的总扇区数,对于64M/512的FLASH,该值应为0x20000(128k)
//以下变量暂时赋值,这些变量需要由系统的实时时钟给出
/*
extern WORD RTCYear ;
extern BYTE RTCMonth ;
extern WORD RTCDay ;
extern BYTE RTCDate ;
extern BYTE RTCHour ;
extern BYTE RTCMinute ;
extern BYTE RTCSecond ;*/
#define CLUST_FIRST 0 // first legal cluster number(for PART_TYPE_FAT16xxx)
// 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.
#define NAND_FLASH_Drv 1
#define DRIVE0 NAND_FLASH_Drv
#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
//boot sector for dos5.0
typedef __packed struct {
BYTE Bs_jmpBoot[3]; // jump inst E9xxxx or EBxx90
CHAR BO_OEMName[8]; // OEM name and version
CHAR Bs_BPB[25]; // BIOS parameter block
CHAR Bs_Ext[26]; // Bootsector Extension
CHAR Bs_BootCode[448]; // pad so structure is 512b
BYTE Bs_BootSectSig0; // boot sector signature byte 0x55
BYTE Bs_BootSectSig1; // boot sector signature byte 0xAA
#define BOOTSIG0 0x55
#define BOOTSIG1 0xaa
}BOOTSECTOR50;
// BPB for DOS 5.0
typedef __packed struct {
WORD BPB_BytesPerSec; // bytes per sector
BYTE BPB_SecPerClust; // sectors per cluster
WORD BPB_RsvdSecCnt; // number of reserved sectors
BYTE BPB_NumFATs; // number of FATs
WORD BPB_RootEntCnt; // number of root directory entries
WORD BPB_TotSec16; // total number of sectors
BYTE BPB_Media; // media descriptor
WORD BPB_FATSz16; // number of sectors per FAT
WORD BPB_SecPerTrack; // sectors per track
WORD BPB_NumHeads; // number of heads
DWORD BPB_HiddSec; // number of hidden sectors
DWORD BPB_TotSec32; // number of sectors if bpbSectors == 0
}BPB50;
typedef __packed struct {
CHAR BPB_DrvNum; // drive number (0x80)
CHAR BS_Reserved1; // reserved
CHAR BS_BootSig; // ext. boot signature (0x29)
#define EXBOOTSIG 0x29
DWORD BS_VoLID; // volume ID number
CHAR BS_VoLLab[11]; // volume label
CHAR BS_FilSysType[8]; // fs type (FAT12 or FAT16)
}EXTBOOT;
/***************************************************************/
// Structure of a dos directory entry.
typedef __packed struct
{
BYTE deName[8]; // filename, blank filled
#define SLOT_EMPTY 0x00 // slot has never been used
#define SLOT_E5 0x05 // the real value is 0xe5
#define SLOT_DELETED 0xe5 // file in this slot deleted
#define IS_DIR 0x2e // this is directory
char deExtension[3]; // extension, blank filled
BYTE deAttributes; // file attributes
#define ATTR_NORMAL 0x00 // normal file
#define ATTR_READONLY 0x01 // file is readonly
#define ATTR_HIDDEN 0x02 // file is hidden
#define ATTR_SYSTEM 0x04 // file is a system file
#define ATTR_VOLUME 0x08 // entry is a volume label
#define ATTR_LONG_FILENAME 0x0f // this is a long filename entry
#define ATTR_DIRECTORY 0x10 // entry is a directory name
#define ATTR_ARCHIVE 0x20 // file is new or modified
BYTE deLowerCase; // NT VFAT lower case flags,for FAT32
#define LCASE_BASE 0x08 // filename base in lower case
#define LCASE_EXT 0x10 // filename extension in lower case
BYTE CrtTimeTenth; // hundredth of seconds in CTime,for FAT32
WORD CrtTime; // create time,for FAT32
WORD CrtDate; // create date,for FAT32
WORD LstAccDate; // access date,for FAT32
WORD FstClusHI; // high bytes of cluster number,for FAT32
WORD WrtTime; // last update time
WORD WrtDate; // last update date
WORD deStartCluster; // starting cluster of file
DWORD deFileSize; // size of file in bytes
}DIRENTRY;
// This is the format of the contents of the deTime field in the direntry
// structure.
// We don't use bitfields because we don't know how compilers for
// arbitrary machines will lay them out.
#define DT_2SECONDS_MASK 0x1F // seconds divided by 2
#define DT_2SECONDS_SHIFT 0
#define DT_MINUTES_MASK 0x7E0 // minutes
#define DT_MINUTES_SHIFT 5
#define DT_HOURS_MASK 0xF800 // hours
#define DT_HOURS_SHIFT 11
// This is the format of the contents of the deDate field in the direntry
// structure.
#define DD_DAY_MASK 0x1F // day of month
#define DD_DAY_SHIFT 0
#define DD_MONTH_MASK 0x1E0 // month
#define DD_MONTH_SHIFT 5
#define DD_YEAR_MASK 0xFE00 // year - 1980
#define DD_YEAR_SHIFT 9
typedef __packed struct
{
WORD Date;
WORD Time;
BYTE TimeTenth;
}FatDateTime;
//FAT16 Apis
typedef __packed struct
{
BYTE Attr;
BYTE CrtTimeTenth;
WORD CrtTime;
WORD CrtDate;
WORD LstAccDate;
WORD WrtTime;
WORD WrtDate;
DWORD FileSize;
}_STAT;
typedef __packed struct
{
int valid; // 1 valid, 0 free.
DWORD DirSectorNum; //文件目录项所在的扇区
int DirIndex; //文件目录项的目录项偏移号
DWORD StartSectorNum;
DWORD CurrentSectorNum; //文件指针offset所在的扇区,该扇区在整个flash中连续编号
DWORD SectorOffset; //文件内容在一个扇区内的偏移位置
DIRENTRY dir;
unsigned long offset; //文件内容相对与文件开始的偏移位置
}_FILE;
typedef __packed struct
{
DWORD DirSectorNum;
int DirIndex;
int IsRootDir;
char filename[13];
}FatGet;
#define FROM_START 0
#define FROM_CUR 1
#define FROM_END 2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -