#ifndef _VFAT_H
#define _VFAT_H
typedef struct __attribute__ ((packed)) {
unsigned char BS_jmpBoot[3];
unsigned char BS_OEMName[8];
unsigned short BPB_BytsPerSec;
unsigned char BPB_SecPerClus;
unsigned short BPB_ResvdSecCnt;
unsigned char BPB_NumFATs;
unsigned short BPB_RootEntCnt;
unsigned short BPB_TotSec16;
unsigned char BPB_Media;
unsigned short BPB_FATSz16;
unsigned short BPB_SecPerTrk;
unsigned short BPB_NumHeads;
unsigned long BPB_HiddSec;
unsigned long BPB_TotSec32;
union {
struct {
unsigned char BS_DrvNum;
unsigned char BS_Reserved1;
unsigned char BS_BootSig;
unsigned long BS_VolID;
unsigned char BS_VolLab[11];
unsigned char BS_FilSysType[8];
} fat12, fat16;
struct {
unsigned long BPB_FATSz32;
unsigned short BPB_ExtFlags;
unsigned short BPB_FSVer;
unsigned long BPB_RootClus;
unsigned short BPB_FSInfo;
unsigned short BPB_BkBootSec;
unsigned char BPB_Reserved[12];
unsigned char BS_DrvNum;
unsigned char BS_Reserved1;
unsigned char BS_BootSig;
unsigned long BS_VolID;
unsigned char BS_VolLab[11];
unsigned char BS_FilSysType[8];
} fat32;
};
} bootSector_t;
typedef struct __attribute__ ((packed)) {
unsigned long FSI_LeadSig;
unsigned char FSI_Reserved1[480];
unsigned long FSI_StrucSig;
unsigned long FSI_Free_Count;
unsigned long FSI_Nxt_Free;
unsigned char FSI_Reserved2[12];
unsigned long FSI_TrailSig;
} FSInfo_t;
#define ATTR_READ_ONLY 0x01
#define ATTR_HIDDEN 0x02
#define ATTR_SYSTEM 0x04
#define ATTR_VOLUME_ID 0x08
#define ATTR_DIRECTORY 0x10
#define ATTR_ARCHIVE 0x20
#define ATTR_LONG_NAME (ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID)
#define ATTR_LONG_NAME_MASK (ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID | ATTR_DIRECTORY | ATTR_ARCHIVE)
#define LAST_LONG_ENTRY 0x40
typedef struct __attribute__ ((packed)) {
unsigned char DIR_Name[11];
unsigned char DIR_Attr;
unsigned char DIR_NTRes;
unsigned char DIR_CrtTimeTenth;
unsigned short DIR_CrtTime;
unsigned short DIR_CrtDate;
unsigned short DIR_LstAccDate;
unsigned short DIR_FstClusHI;
unsigned short DIR_WrtTime;
unsigned short DIR_WrtDate;
unsigned short DIR_FstClusLO;
unsigned long DIR_FileSize;
} directoryEntryStructure_t;
typedef struct __attribute__ ((packed)) {
unsigned char LDIR_Ord;
unsigned short LDIR_Name1[5];
unsigned char LDIR_Attr;
unsigned char LDIR_Type;
unsigned char LDIR_Chksum;
unsigned short LDIR_Name2[6];
unsigned short LDIR_FstClusLO;
unsigned short LDIR_Name3[2];
} longDirectoryEntryStructure_t;
static inline unsigned char chkSum(const unsigned char *pFcbName)
{
short fcbNameLen;
unsigned char sum;
sum = 0;
for (fcbNameLen = 11; fcbNameLen; fcbNameLen--)
sum = ((sum & 1) ? 0x80 : 0) + (sum >> 1) + *pFcbName++;
return sum;
}
#endif