text: /** @file
    FAT format data structures
  
  Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
  
  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the Software
  License Agreement which accompanies this distribution.
  
  **/
  
  #ifndef _FAT_FMT_H_
  #define _FAT_FMT_H_
  
  //
  // Definitions
  //
  #define FAT_ATTR_READ_ONLY                0x01
  #define FAT_ATTR_HIDDEN                   0x02
  #define FAT_ATTR_SYSTEM                   0x04
  #define FAT_ATTR_VOLUME_ID                0x08
  #define FAT_ATTR_DIRECTORY                0x10
  #define FAT_ATTR_ARCHIVE                  0x20
  #define FAT_ATTR_LFN                      (FAT_ATTR_READ_ONLY | FAT_ATTR_HIDDEN | FAT_ATTR_SYSTEM | FAT_ATTR_VOLUME_ID)
  
  #define FAT_CLUSTER_SPECIAL               ((-1 &~0xF) | 0x7)
  #define FAT_CLUSTER_FREE                  0
  #define FAT_CLUSTER_RESERVED              (FAT_CLUSTER_SPECIAL)
  #define FAT_CLUSTER_BAD                   (FAT_CLUSTER_SPECIAL)
  #define FAT_CLUSTER_LAST                  (-1)
  
  #define DELETE_ENTRY_MARK                 0xE5
  #define EMPTY_ENTRY_MARK                  0x00
  
  #define FAT_CLUSTER_FUNCTIONAL(Cluster)   (((Cluster) == 0) || ((Cluster) >= FAT_CLUSTER_SPECIAL))
  #define FAT_CLUSTER_END_OF_CHAIN(Cluster) ((Cluster) > (FAT_CLUSTER_SPECIAL))
  
  //
  // Directory Entry
  //
  #pragma pack(1)
  
  typedef struct {
    UINT16  Day : 5;
    UINT16  Month : 4;
    UINT16  Year : 7;                 // From 1980
  } FAT_DATE;
  
  typedef struct {
    UINT16  DoubleSecond : 5;
    UINT16  Minute : 6;
    UINT16  Hour : 5;
  } FAT_TIME;
  
  typedef struct {
    FAT_TIME  Time;
    FAT_DATE  Date;
  } FAT_DATE_TIME;
  
  typedef struct {
    CHAR8         FileName[11];       // 8.3 filename
    UINT8         Attributes;
    UINT8         CaseFlag;
    UINT8         CreateMillisecond;  // (creation milliseconds - ignored)
    FAT_DATE_TIME FileCreateTime;
    FAT_DATE      FileLastAccess;
    UINT16        FileClusterHigh;    // >= FAT32
    FAT_DATE_TIME FileModificationTime;
    UINT16        FileCluster;
    UINT32        FileSize;
  } FAT_DIRECTORY_ENTRY;
  
  #pragma pack()
  //
  // Boot Sector
  //
  #pragma pack(1)
  
  typedef struct {
  
    UINT8   Ia32Jump[3];
    CHAR8   OemId[8];
  
    UINT16  SectorSize;
    UINT8   SectorsPerCluster;
    UINT16  ReservedSectors;
    UINT8   NoFats;
    UINT16  RootEntries;          // < FAT32, root dir is fixed size
    UINT16  Sectors;
    UINT8   Media;                // (ignored)
    UINT16  SectorsPerFat;        // < FAT32
    UINT16  SectorsPerTrack;      // (ignored)
    UINT16  Heads;                // (ignored)
    UINT32  HiddenSectors;        // (ignored)
    UINT32  LargeSectors;         // => FAT32
    UINT8   PhysicalDriveNumber;  // (ignored)
    UINT8   CurrentHead;          // holds boot_sector_dirty bit
    UINT8   Signature;            // (ignored)
    CHAR8   Id[4];
    CHAR8   FatLabel[11];
    CHAR8   SystemId[8];
  
  } PEI_FAT_BOOT_SECTOR;
  
  typedef struct {
  
    UINT8   Ia32Jump[3];
    CHAR8   OemId[8];
  
    UINT16  SectorSize;
    UINT8   SectorsPerCluster;
    UINT16  ReservedSectors;
    UINT8   NoFats;
    UINT16  RootEntries;          // < FAT32, root dir is fixed size
    UINT16  Sectors;
    UINT8   Media;                // (ignored)
    UINT16  SectorsPerFat;        // < FAT32
    UINT16  SectorsPerTrack;      // (ignored)
    UINT16  Heads;                // (ignored)
    UINT32  HiddenSectors;        // (ignored)
    UINT32  LargeSectors;         // Used if Sectors==0
    UINT32  LargeSectorsPerFat;   // FAT32
    UINT16  ExtendedFlags;        // FAT32 (ignored)
    UINT16  FsVersion;            // FAT32 (ignored)
    UINT32  RootDirFirstCluster;  // FAT32
    UINT16  FsInfoSector;         // FAT32
    UINT16  BackupBootSector;     // FAT32
    UINT8   Reserved[12];         // FAT32 (ignored)
    UINT8   PhysicalDriveNumber;  // (ignored)
    UINT8   CurrentHead;          // holds boot_sector_dirty bit
    UINT8   Signature;            // (ignored)
    CHAR8   Id[4];
    CHAR8   FatLabel[11];
    CHAR8   SystemId[8];
  
  } PEI_FAT_BOOT_SECTOR_EX;
  
  #pragma pack()
  
  #endif
  