1 /** @file
2   FAT format data structures
3 
4 Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
5 
6 This program and the accompanying materials are licensed and made available
7 under the terms and conditions of the BSD License which accompanies this
8 distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10 
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #ifndef _FAT_FMT_H_
17 #define _FAT_FMT_H_
18 
19 //
20 // Definitions
21 //
22 #define FAT_ATTR_READ_ONLY                0x01
23 #define FAT_ATTR_HIDDEN                   0x02
24 #define FAT_ATTR_SYSTEM                   0x04
25 #define FAT_ATTR_VOLUME_ID                0x08
26 #define FAT_ATTR_DIRECTORY                0x10
27 #define FAT_ATTR_ARCHIVE                  0x20
28 #define FAT_ATTR_LFN                      (FAT_ATTR_READ_ONLY | FAT_ATTR_HIDDEN | FAT_ATTR_SYSTEM | FAT_ATTR_VOLUME_ID)
29 
30 #define FAT_CLUSTER_SPECIAL               ((-1 &~0xF) | 0x7)
31 #define FAT_CLUSTER_FREE                  0
32 #define FAT_CLUSTER_RESERVED              (FAT_CLUSTER_SPECIAL)
33 #define FAT_CLUSTER_BAD                   (FAT_CLUSTER_SPECIAL)
34 #define FAT_CLUSTER_LAST                  (-1)
35 
36 #define DELETE_ENTRY_MARK                 0xE5
37 #define EMPTY_ENTRY_MARK                  0x00
38 
39 #define FAT_CLUSTER_FUNCTIONAL(Cluster)   (((Cluster) == 0) || ((Cluster) >= FAT_CLUSTER_SPECIAL))
40 #define FAT_CLUSTER_END_OF_CHAIN(Cluster) ((Cluster) > (FAT_CLUSTER_SPECIAL))
41 
42 //
43 // Directory Entry
44 //
45 #pragma pack(1)
46 
47 typedef struct {
48   UINT16  Day : 5;
49   UINT16  Month : 4;
50   UINT16  Year : 7;                 // From 1980
51 } FAT_DATE;
52 
53 typedef struct {
54   UINT16  DoubleSecond : 5;
55   UINT16  Minute : 6;
56   UINT16  Hour : 5;
57 } FAT_TIME;
58 
59 typedef struct {
60   FAT_TIME  Time;
61   FAT_DATE  Date;
62 } FAT_DATE_TIME;
63 
64 typedef struct {
65   CHAR8         FileName[11];       // 8.3 filename
66   UINT8         Attributes;
67   UINT8         CaseFlag;
68   UINT8         CreateMillisecond;  // (creation milliseconds - ignored)
69   FAT_DATE_TIME FileCreateTime;
70   FAT_DATE      FileLastAccess;
71   UINT16        FileClusterHigh;    // >= FAT32
72   FAT_DATE_TIME FileModificationTime;
73   UINT16        FileCluster;
74   UINT32        FileSize;
75 } FAT_DIRECTORY_ENTRY;
76 
77 #pragma pack()
78 //
79 // Boot Sector
80 //
81 #pragma pack(1)
82 
83 typedef struct {
84 
85   UINT8   Ia32Jump[3];
86   CHAR8   OemId[8];
87 
88   UINT16  SectorSize;
89   UINT8   SectorsPerCluster;
90   UINT16  ReservedSectors;
91   UINT8   NoFats;
92   UINT16  RootEntries;          // < FAT32, root dir is fixed size
93   UINT16  Sectors;
94   UINT8   Media;                // (ignored)
95   UINT16  SectorsPerFat;        // < FAT32
96   UINT16  SectorsPerTrack;      // (ignored)
97   UINT16  Heads;                // (ignored)
98   UINT32  HiddenSectors;        // (ignored)
99   UINT32  LargeSectors;         // => FAT32
100   UINT8   PhysicalDriveNumber;  // (ignored)
101   UINT8   CurrentHead;          // holds boot_sector_dirty bit
102   UINT8   Signature;            // (ignored)
103   CHAR8   Id[4];
104   CHAR8   FatLabel[11];
105   CHAR8   SystemId[8];
106 
107 } PEI_FAT_BOOT_SECTOR;
108 
109 typedef struct {
110 
111   UINT8   Ia32Jump[3];
112   CHAR8   OemId[8];
113 
114   UINT16  SectorSize;
115   UINT8   SectorsPerCluster;
116   UINT16  ReservedSectors;
117   UINT8   NoFats;
118   UINT16  RootEntries;          // < FAT32, root dir is fixed size
119   UINT16  Sectors;
120   UINT8   Media;                // (ignored)
121   UINT16  SectorsPerFat;        // < FAT32
122   UINT16  SectorsPerTrack;      // (ignored)
123   UINT16  Heads;                // (ignored)
124   UINT32  HiddenSectors;        // (ignored)
125   UINT32  LargeSectors;         // Used if Sectors==0
126   UINT32  LargeSectorsPerFat;   // FAT32
127   UINT16  ExtendedFlags;        // FAT32 (ignored)
128   UINT16  FsVersion;            // FAT32 (ignored)
129   UINT32  RootDirFirstCluster;  // FAT32
130   UINT16  FsInfoSector;         // FAT32
131   UINT16  BackupBootSector;     // FAT32
132   UINT8   Reserved[12];         // FAT32 (ignored)
133   UINT8   PhysicalDriveNumber;  // (ignored)
134   UINT8   CurrentHead;          // holds boot_sector_dirty bit
135   UINT8   Signature;            // (ignored)
136   CHAR8   Id[4];
137   CHAR8   FatLabel[11];
138   CHAR8   SystemId[8];
139 
140 } PEI_FAT_BOOT_SECTOR_EX;
141 
142 #pragma pack()
143 
144 #endif
145