Difference between revisions of "Unit FATFS"

From Ultibo.org
Jump to: navigation, search
 
(4 intermediate revisions by the same user not shown)
Line 5: Line 5:
 
----
 
----
  
'''Ultibo FAT12/16/32/exFAT interface unit'''
+
'''Ultibo FAT12/16/32/exFAT Interface unit'''
  
 
''Notes:''
 
''Notes:''
Line 304: Line 304:
 
| <code>lfnAttributeMask = (faReadOnly or faHidden or faSysFile or faVolumeID);</code>
 
| <code>lfnAttributeMask = (faReadOnly or faHidden or faSysFile or faVolumeID);</code>
 
| Not Used - See faLongName
 
| Not Used - See faLongName
 +
|-
 +
|colspan="2"|&nbsp;
 +
|-
 +
| <code>fatBootSignature = $29;</code>
 +
| &nbsp;
 
|-
 
|-
 
|colspan="2"|&nbsp;
 
|colspan="2"|&nbsp;
Line 851: Line 856:
  
  
'''FAT recognizer'''
+
'''FATFS specific classes'''
  
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
+
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
+
<code>TFATRecognizer = class(TRecognizer)</code>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
 
|-
 
|-
| <code>constructor Create(ADriver:TFileSysDriver);</code>
+
| [[TFATRecognizer|<code>TFATRecognizer = class(TRecognizer)</code>]]
| style="width: 50%;"|&nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div>
+
|-
+
| <code>FCaseFlags:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>FLongNames:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>FOemConvert:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>FNumericTail:Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function CheckLBA:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function CheckFAT32:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function CheckBootSector(ABootSector:PBootSector; const AStartSector:Int64; ASectorCount:LongWord):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''protected'''</div>
+
|-
+
| <code>function GetName:String; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
|-
+
| <code>property CaseFlags:Boolean read FCaseFlags write FCaseFlags;</code>
+
| &nbsp;
+
|-
+
| <code>property LongNames:Boolean read FLongNames write FLongNames;</code>
+
| &nbsp;
+
|-
+
| <code>property OemConvert:Boolean read FOemConvert write FOemConvert;</code>
+
| &nbsp;
+
|-
+
| <code>property NumericTail:Boolean read FNumericTail write FNumericTail;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function RecognizePartitionId(APartitionId:Byte):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function RecognizeBootSector(ABootSector:PBootSector; const AStartSector,ASectorCount:Int64):Boolean; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function RecognizePartition(APartition:TDiskPartition):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function RecognizeVolume(AVolume:TDiskVolume):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function MountVolume(AVolume:TDiskVolume; ADrive:TDiskDrive):Boolean; override;</code>
+
| &nbsp;
+
 
|-
 
|-
 
|}
 
|}
</div></div>
+
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
+
'''FAT partitioner'''
+
 
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
+
 
+
<code>TFATPartitioner = class(TDiskPartitioner)</code>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
 
|-
 
|-
| <code>constructor Create(ADriver:TFileSysDriver; ARecognizer:TRecognizer);</code>
+
| [[TFATPartitioner|<code>TFATPartitioner = class(TDiskPartitioner)</code>]]
| style="width: 50%;"|&nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''protected'''</div>
+
|-
+
| <code>function CheckLogical(ADevice:TDiskDevice; AParent:TDiskPartition; APartitionId:Byte):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function CheckExtended(ADevice:TDiskDevice; AParent:TDiskPartition; APartitionId:Byte):Boolean; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetPartitionId(ADevice:TDiskDevice; AParent:TDiskPartition; AStart,ACount:LongWord; APartitionId:Byte):Byte; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function InitPartition(ADevice:TDiskDevice; AParent:TDiskPartition; AStart,ACount:LongWord; APartitionId:Byte):Boolean; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
|-
+
| <code>function AcceptPartition(ADevice:TDiskDevice; APartition,AParent:TDiskPartition; APartitionId:Byte):Boolean; override;</code>
+
| &nbsp;
+
 
|-
 
|-
 
|}
 
|}
</div></div>
+
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
+
'''FAT formatter'''
+
 
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
+
 
+
<code>TFATFormatter = class(TDiskFormatter)</code>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
 
|-
 
|-
|colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div>
+
| [[TFATFormatter|<code>TFATFormatter = class(TDiskFormatter)</code>]]
|-
+
| <code>function CheckDevice(AVolume:TDiskVolume; ADrive:TDiskDrive; AFloppyType:TFloppyType):Boolean;</code>
+
| style="width: 50%;"|&nbsp;
+
|-
+
| <code>function CheckPartition(AVolume:TDiskVolume; ADrive:TDiskDrive; AFileSysType:TFileSysType):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetPartitionId(AVolume:TDiskVolume; ADrive:TDiskDrive; AFATType:TFATType):Byte;</code>
+
| &nbsp;
+
|-
+
| <code>function UpdatePartitionId(AVolume:TDiskVolume; ADrive:TDiskDrive; AFATType:TFATType):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetSectorsPerCluster(AVolume:TDiskVolume; ADrive:TDiskDrive; AFloppyType:TFloppyType; AFileSysType:TFileSysType; ABootSector:PBootSector; var AFATType:TFATType):LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetSectorsPerFat(AVolume:TDiskVolume; ADrive:TDiskDrive; AFATType:TFATType; ABootSector:PBootSector):LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function CreateBootSector(AVolume:TDiskVolume; ADrive:TDiskDrive; AFATType:TFATType; ABootSector:PBootSector):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function WriteBootSector(AVolume:TDiskVolume; ADrive:TDiskDrive; AFATType:TFATType; ABootSector:PBootSector):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function WriteFatTable(AVolume:TDiskVolume; ADrive:TDiskDrive; AFATType:TFATType; ABootSector:PBootSector):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function WriteRootDirectory(AVolume:TDiskVolume; ADrive:TDiskDrive; AFATType:TFATType; ABootSector:PBootSector):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function CreateInfoSector(AVolume:TDiskVolume; ADrive:TDiskDrive; AFATType:TFATType; ABootSector:PBootSector; AInfoSector:PFATInfoSector):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function WriteInfoSector(AVolume:TDiskVolume; ADrive:TDiskDrive; AFATType:TFATType; ABootSector:PBootSector; AInfoSector:PFATInfoSector):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
|-
+
| <code>function AcceptVolume(AVolume:TDiskVolume; AFloppyType:TFloppyType; AFileSysType:TFileSysType):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function FormatVolume(AVolume:TDiskVolume; AFloppyType:TFloppyType; AFileSysType:TFileSysType):Boolean; override;</code>
+
| &nbsp;
+
 
|-
 
|-
 
|}
 
|}
</div></div>
+
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
+
'''FAT defragger'''
+
 
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
+
 
+
<code>TFATDefragger = class(TDiskDefragger)</code>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
 
|-
 
|-
|colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div>
+
| [[TFATDefragger|<code>TFATDefragger = class(TDiskDefragger)</code>]]
|-
+
|colspan="2"|&nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
|-
+
|colspan="2"|&nbsp;
+
 
|-
 
|-
 
|}
 
|}
</div></div>
+
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
+
'''FAT repairer'''
+
 
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
+
 
+
<code>TFATRepairer = class(TDiskRepairer)</code>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
 
|-
 
|-
|colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div>
+
| [[TFATRepairer|<code>TFATRepairer = class(TDiskRepairer)</code>]]
|-
+
|colspan="2"|&nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
|-
+
|colspan="2"|&nbsp;
+
 
|-
 
|-
 
|}
 
|}
</div></div>
+
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
+
'''FAT file system'''
+
 
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
+
 
+
<code>TFATFileSystem = class(TFileSystem)</code>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
 
|-
 
|-
| <code>constructor Create(ADriver:TFileSysDriver; AVolume:TDiskVolume; ADrive:TDiskDrive);</code>
+
| [[TFATFileSystem|<code>TFATFileSystem = class(TFileSystem)</code>]]
| style="width: 50%;"|&nbsp;
+
|-
+
| <code>destructor Destroy; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div>
+
|-
+
| <code>FFATType:TFATType;</code>
+
| &nbsp;
+
|-
+
| <code>FCaseFlags:Boolean;</code>
+
| Allow writing entries with the Lowercase Flags set (Reading is always supported)
+
|-
+
| <code>FVolumeFlags:LongWord;</code>
+
| Volume Dirty/Error flags
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FEndOfFile:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>FEndOfCluster:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>FFreeCluster:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>FBadCluster:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>FMediaCluster:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>FStartCluster:LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FHardError:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>FCleanShutdown:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>FReservedBits:LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FNumberOfFats:Word;</code>
+
| Usually 2
+
|-
+
| <code>FSectorsPerFat:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>FSectorsPerCluster:LongWord;</code>
+
| Usually 1,2,4,8,16,32,64,128 etc
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FReservedSectors:LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FRootEntryCount:LongWord;</code>
+
| Number of Directory entries in Root Directory
+
|-
+
| <code>FRootSectorCount:LongWord;</code>
+
| Number of Sectors occupied by Root Directory
+
|-
+
| <code>FRootStartSector:LongWord;</code>
+
| First Sector of Root Directory (Relative to StartSector)
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FInfoSector:LongWord;</code>
+
| Relative to StartSector
+
|-
+
| <code>FInfoBackup:LongWord;</code>
+
| Relative to StartSector
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FRootStartCluster:LongWord;</code>
+
| First Cluster of Root Directory
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FActiveFat:Word;</code>
+
| Zero based number of active FAT (Always 0 for FAT12/16)
+
|-
+
| <code>FFatMirroring:Boolean;</code>
+
| FAT Mirroring Enabled if True (Always True for FAT12/16)
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FEntriesPerSector:LongWord;</code>
+
| Number of Directory entries in a Sector
+
|-
+
| <code>FEntriesPerCluster:LongWord;</code>
+
| Number of Directory entries in a Cluster
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FEntriesPerBlock:LongWord;</code>
+
| Number of FAT entries per Block
+
|-
+
| <code>FSectorsPerBlock:LongWord;</code>
+
| Number of Sectors per Block of FAT entries
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FBlockShiftCount:Word;</code>
+
| Shift count for Cluster <-> BlockNo
+
|-
+
| <code>FSectorShiftCount:Word;</code>
+
| Shift count for Sector <-> Cluster
+
|-
+
| <code>FClusterShiftCount:Word;</code>
+
| Shift count for Cluster <-> Bytes
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FDataStartSector:LongWord;</code>
+
| First Sector of First Data Cluster (Relative to StartSector)
+
|-
+
| <code>FDataClusterCount:LongWord;</code>
+
| Number of usable data clusters
+
|-
+
| <code>FTotalClusterCount:LongWord;</code>
+
| Total number of clusters including reserved clusters
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FLastFreeCluster:LongWord;</code>
+
| Or $FFFFFFFF if not known
+
|-
+
| <code>FFreeClusterCount:LongWord;</code>
+
| Or $FFFFFFFF if not known
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FClusterSize:LongWord;</code>
+
| Size of a Cluster in Bytes (Max 65536 > Word)
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FNameBuffer:Pointer;</code>
+
| Buffer for long name handling
+
|-
+
| <code>FNameLock:TMutexHandle;</code>
+
| Lock for name buffer
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FReadBuffer:Pointer;</code>
+
| Buffer for partial cluster entry reads (Cluster size)
+
|-
+
| <code>FReadLock:TMutexHandle;</code>
+
| Lock for read buffer
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FWriteBuffer:Pointer;</code>
+
| Buffer for partial cluster entry writes (Cluster size)
+
|-
+
| <code>FWriteLock:TMutexHandle;</code>
+
| Lock for write buffer
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>FClusterBuffer:Pointer;</code>
+
| Buffer of exactly cluster size
+
|-
+
| <code>FClusterLock:TMutexHandle;</code>
+
| Lock for cluster buffer
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function NameLock:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function NameUnlock:Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function ReadLock:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function ReadUnlock:Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function WriteLock:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function WriteUnlock:Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function ClusterLock:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function ClusterUnlock:Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetHardError:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>procedure SetHardError(AValue:Boolean);</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetCleanShutdown:Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>procedure SetCleanShutdown(AValue:Boolean);</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetVolumeFlags:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>function SetVolumeFlags(AFlags:LongWord):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function FillCluster(ACluster:LongWord; AValue:Byte):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function ReadCluster(ACluster:LongWord; var ABuffer):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function WriteCluster(ACluster:LongWord; const ABuffer):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetNextFreeCluster:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>function GetFreeClusterCount:LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function SetNextFreeCluster(ACluster:LongWord):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function SetFreeClusterCount(ACount:LongWord):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetStartCluster(AEntry:TDiskEntry):LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>function GetParentCluster(AParent:TDiskEntry):LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>function CheckClusterBlock(ACluster,ANext:LongWord):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetNextChainCluster(AParent:LongWord):LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>function GetLastChainCluster(AParent:LongWord):LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>function GetChainClusterCount(AParent:LongWord):LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetCluster(ACluster:LongWord):LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>function SetCluster(ACluster,AValue:LongWord;ACommit:Boolean):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function AllocCluster(AParent:LongWord; var ACluster:LongWord; ACount:LongWord):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function ReleaseCluster(AParent,ACluster:LongWord):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function CheckDirectoryRoot(AParent:TDiskEntry):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function CheckDirectoryStart(AParent:TDiskEntry):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetFirstDirectorySector(AParent:TDiskEntry; var ASector:LongWord):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function GetNextDirectorySector(AParent:TDiskEntry; var ASector:LongWord; AWrite:Boolean):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function GetDirectorySectorCount(AParent:TDiskEntry; AWrite:Boolean):LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>function GetDirectorySectorOffset(AParent:TDiskEntry):LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function AllocDirectory(AParent:TDiskEntry; ACount:Byte; var AOffset,ASector:LongWord):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function ReleaseDirectory(AParent:TDiskEntry; ACount:Byte; AOffset,ASector:LongWord):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetBlockShiftCount(ASize:Word;AType:TFATType):Word;</code>
+
| &nbsp;
+
|-
+
| <code>function GetSectorShiftCount(ASectorsPerCluster:LongWord):Word;</code>
+
| &nbsp;
+
|-
+
| <code>function GetClusterShiftCount(AClusterSize:LongWord):Word;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetEntriesPerBlock(ASize:Word; AType:TFATType):LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>function GetSectorsPerBlock(ASize:Word; AType:TFATType):LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>procedure ReadConvert(ADirectory:PFATDirectory);</code>
+
| &nbsp;
+
|-
+
| <code>procedure WriteConvert(ADirectory:PFATDirectory);</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function NameToEntry(AName:Pointer; AEntry:TFATDiskEntry; AShort:Boolean):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function EntryToName(AEntry:TFATDiskEntry; AName:Pointer; AShort:Boolean):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function BufferToName(ABuffer:Pointer ;var AName:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function NameToBuffer(const AName:String; ABuffer:Pointer):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function DirectoryToBuffer(ADirectory,ABuffer:Pointer; ACount,AChecksum:Byte; ALast:Boolean):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function BufferToDirectory(ABuffer,ADirectory:Pointer; ACount,AChecksum:Byte; ALast:Boolean):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function DirectoryToEntry(ADirectory:Pointer; AEntry:TFATDiskEntry; AShort:Boolean):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function EntryToDirectory(AEntry:TFATDiskEntry; ADirectory:Pointer; AShort:Boolean):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function FATTypeToFileSysType(AFATType:TFATType):TFileSysType;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''protected'''</div>
+
|-
+
| <code>function LoadMaxFile:Integer; override;</code>
+
| &nbsp;
+
|-
+
| <code>function LoadMaxPath:Integer; override;</code>
+
| &nbsp;
+
|-
+
| <code>function LoadAttributes:LongWord; override;</code>
+
| &nbsp;
+
|-
+
| <code>function LoadMaxAttributes:LongWord; override;</code>
+
| &nbsp;
+
|-
+
| <code>function LoadSystemName:String; override;</code>
+
| &nbsp;
+
|-
+
| <code>function LoadVolumeName:String; override;</code>
+
| &nbsp;
+
|-
+
| <code>function LoadVolumeSerial:LongWord; override;</code>
+
| &nbsp;
+
|-
+
| <code>function LoadFileSysType:TFileSysType; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function SetVolumeName(const AName:String):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function SetVolumeSerial(ASerial:LongWord):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function ReadEntry(AParent,AEntry:TDiskEntry; var ABuffer; const AStart:Int64; ACount:LongWord; var AOffset,AValue:LongWord):Integer; override;</code>
+
| &nbsp;
+
|-
+
| <code>function WriteEntry(AParent,AEntry:TDiskEntry; const ABuffer; const AStart:Int64; ACount:LongWord; var AOffset,AValue:LongWord):Integer; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function LoadTables:Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function LoadBlocks:Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function LoadEntries(AParent:TDiskEntry):Boolean; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function LoadTable(ATableNo:LongWord):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function LoadBlock(ABlockNo:LongWord):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function LoadEntry(AParent:TDiskEntry; ABuffer:Pointer; var ABlockOffset,AEntryOffset,ABlockSector,AEntrySector:LongWord):Boolean;</code>
+
| Not override
+
|-
+
| <code>function LoadLong(AParent:TDiskEntry; ABuffer:Pointer; var ABlockOffset,AEntryOffset,ABlockSector,AEntrySector:LongWord):Boolean;</code>
+
| Not override
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function AddEntry(AParent:TDiskEntry; const AName:String; AAttributes:LongWord; AReference:Boolean):TDiskEntry; override;</code>
+
| &nbsp;
+
|-
+
| <code>function AddEntryEx(AParent:TDiskEntry; const AName,AAltName:String; AAttributes:LongWord; AReference:Boolean):TDiskEntry; override;</code>
+
| &nbsp;
+
|-
+
| <code>function RemoveEntry(AParent,AEntry:TDiskEntry):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function RenameEntry(AParent,AEntry:TDiskEntry; const AName:String):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function RenameEntryEx(AParent,AEntry:TDiskEntry; const AAltName:String):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function MoveEntry(ASource,ADest,AEntry:TDiskEntry):Boolean; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function SetBlock(ABlock:TDiskBlock):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function SetEntry(AParent,AEntry:TDiskEntry):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function SetLong(AParent,AEntry:TDiskEntry):Boolean; {Not override}</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function SizeEntry(AParent,AEntry:TDiskEntry; const ASize:Int64):Boolean; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetBlock(ABlockNo:LongWord):TDiskBlock; override;</code>
+
| &nbsp;
+
|-
+
| <code>function GetBlockEx(ABlockNo:LongWord; AWrite:Boolean):TDiskBlock; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function CheckName(const AName:String):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function CountName(const AName:String):Byte;</code>
+
| &nbsp;
+
|-
+
| <code>function CompareName(const AName,AMatch:String; AWildcard:Boolean):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function ChecksumName(AEntry:TDiskEntry):Byte;</code>
+
| &nbsp;
+
|-
+
| <code>function GenerateName(AParent,AEntry:TDiskEntry; const AName:String):String;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetNameFlags(const AName:String):LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>function CheckFlagName(const AName:String):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function ValidateName(AName:Pointer):Boolean;</code>
+
| &nbsp;
+
|-
+
| <code>function ValidateDirectory(ADirectory:Pointer):Boolean;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
|-
+
| <code>property CaseFlags:Boolean read FCaseFlags write FCaseFlags;</code>
+
| &nbsp;
+
|-
+
| <code>property OemConvert:Boolean read FOemConvert write FOemConvert;</code>
+
| &nbsp;
+
|-
+
| <code>property NumericTail:Boolean read FNumericTail write FNumericTail;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>property ReadOnly:Boolean read FReadOnly write FReadOnly;</code>
+
| &nbsp;
+
|-
+
| <code>property LongNames:Boolean read FLongNames write FLongNames;</code>
+
| &nbsp;
+
|-
+
| <code>property CasePreserved:Boolean read FCasePreserved write FCasePreserved;</code>
+
| &nbsp;
+
|-
+
| <code>property UnicodeNames:Boolean read FUnicodeNames write FUnicodeNames;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>property HardError:Boolean read GetHardError write SetHardError;</code>
+
| &nbsp;
+
|-
+
| <code>property CleanShutdown:Boolean read GetCleanShutdown write SetCleanShutdown;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function FileSystemInit:Boolean; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function MountFileSystem:Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function DismountFileSystem:Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function InitializeFileSystem(ASectorsPerCluster:LongWord; AFileSysType:TFileSysType):Boolean; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetDriveLabel:String; override;</code>
+
| &nbsp;
+
|-
+
| <code>function SetDriveLabel(const ALabel:String):Boolean; override;</code>
+
| &nbsp;
+
|-
+
| <code>function SetDriveSerial(ASerial:LongWord):Boolean; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>function GetDriveFreeSpaceEx:Int64; override;</code>
+
| &nbsp;
+
|-
+
| <code>function GetDriveTotalSpaceEx:Int64; override;</code>
+
| &nbsp;
+
 
|-
 
|-
 
|}
 
|}
</div></div>
+
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
+
'''FAT disk table'''
+
 
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
+
 
+
<code>TFATDiskTable = class(TDiskTable)</code>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
 
|-
 
|-
|colspan="2"|Note: Represents a FAT table.
+
| [[TFATDiskTable|<code>TFATDiskTable = class(TDiskTable)</code>]]
|-
+
|colspan="2"|&nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div>
+
|-
+
| <code>FStartSector:LongWord;</code>
+
| style="width: 50%;"|&nbsp;
+
|-
+
| <code>FSectorCount:LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
|-
+
| <code>property StartSector:LongWord read FStartSector write FStartSector;</code>
+
| &nbsp;
+
|-
+
| <code>property SectorCount:LongWord read FSectorCount write FSectorCount;</code>
+
| &nbsp;
+
 
|-
 
|-
 
|}
 
|}
</div></div>
+
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
+
'''FAT disk block'''
+
 
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
+
 
+
<code>TFATDiskBlock = class(TDiskBlock)</code>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
 
|-
 
|-
|colspan="2"|Note: Represents a block of FAT entries.
+
| [[TFATDiskBlock|<code>TFATDiskBlock = class(TDiskBlock)</code>]]
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>constructor Create(ALocalLock:TMutexHandle);</code>
+
| style="width: 50%;"|&nbsp;
+
|-
+
| <code>destructor Destroy; override;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div>
+
|-
+
| <code>FBlockBuffer:Pointer;</code>
+
| &nbsp;
+
|-
+
| <code>FBlockSector:LongWord;</code>
+
| Relative to the StartSector in Table
+
|-
+
| <code>FSectorCount:LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
|-
+
| <code>property BlockBuffer:Pointer read FBlockBuffer write FBlockBuffer;</code>
+
| &nbsp;
+
|-
+
| <code>property BlockSector:LongWord read FBlockSector write FBlockSector;</code>
+
| &nbsp;
+
|-
+
| <code>property SectorCount:LongWord read FSectorCount write FSectorCount;</code>
+
| &nbsp;
+
 
|-
 
|-
 
|}
 
|}
</div></div>
+
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 
+
'''FAT disk entry'''
+
 
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
+
 
+
<code>TFATDiskEntry = class(TDiskEntry)</code>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
 
|-
 
|-
|colspan="2"|Note: Represents a FAT directory entry.
+
| [[TFATDiskEntry|<code>TFATDiskEntry = class(TDiskEntry)</code>]]
|-
+
|colspan="2"|&nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''private'''</div>
+
|-
+
| <code>FEntryCount:Byte;</code>
+
| Always 1 if short name only
+
|-
+
| <code>FNameOffset:LongWord;</code>
+
| Same as EntryOffset if short name only
+
|-
+
| <code>FNameSector:LongWord;</code>
+
| Same as EntrySector if short name only
+
|-
+
| <code>FEntryOffset:LongWord;</code>
+
| style="width: 50%;"|&nbsp;
+
|-
+
| <code>FEntrySector:LongWord;</code>
+
| &nbsp;
+
|-
+
| <code>FStartCluster:LongWord;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|<div style="font-family: monospace,courier;">'''public'''</div>
+
|-
+
| <code>property EntryCount:Byte read FEntryCount write FEntryCount;</code>
+
| &nbsp;
+
|-
+
| <code>property NameOffset:LongWord read FNameOffset write FNameOffset;</code>
+
| &nbsp;
+
|-
+
| <code>property NameSector:LongWord read FNameSector write FNameSector;</code>
+
| &nbsp;
+
|-
+
| <code>property EntryOffset:LongWord read FEntryOffset write FEntryOffset;</code>
+
| &nbsp;
+
|-
+
| <code>property EntrySector:LongWord read FEntrySector write FEntrySector;</code>
+
| &nbsp;
+
|-
+
| <code>property StartCluster:LongWord read FStartCluster write FStartCluster;</code>
+
| &nbsp;
+
|-
+
|colspan="2"|&nbsp;
+
|-
+
| <code>property StartSector:LongWord read FStartCluster write FStartCluster;</code>
+
| &nbsp;
+
 
|-
 
|-
 
|}
 
|}
</div></div> 
 
 
<br />
 
<br />
  
Line 1,841: Line 922:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 1,853: Line 934:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-
Line 1,868: Line 949:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
 
| None documented
 
| None documented
 
|-
 
|-

Latest revision as of 05:36, 31 August 2021

Return to Unit Reference


Description


Ultibo FAT12/16/32/exFAT Interface unit

Notes:

Based on information from numerous sources, primarily the document fatgen103.pdf from Microsoft. FAT Disk Blocks are based on reading a group of sectors into a block at once. The BlockNo of each block is therefore the FAT entry no of the first FAT in the block.

The use of IsEightDotThree and GenerateShortName(Ex) from the UltiboUtils unit should be replaced by internal routines optimised for maximum performance. All Block and Entry Offsets have been expanded to 32bit to avoid 16bit overflow on 64K clusters.

Constants



[Expand]
FATFS specific constants fat*


[Expand]
FATFS params table fatParams*


[Expand]
FATFS geometry tables fat12Geometry*


[Expand]
FATFS cluster size tables fat_ClusterSize*


[Expand]
FATFS partition types fatPartitionType*


Type definitions



FATFS specific types

TFATType = (ftNONE,ftFAT12,ftFAT16,ftFAT32);

FATFS params

[Expand]

TFATParams = record

FATFS geometry

[Expand]

TFATGeometry = record

FATFS cluster size

[Expand]

TFATClusterSize = record

FATFS partition type

[Expand]

TFATPartitionType = record

FATFS name

[Expand]

PFATName = ^TFATName;

TFATName = packed record

FATSFS directory

[Expand]

PFATDirectory = ^TFATDirectory;

TFATDirectory = packed record

LFN directory

[Expand]

PLFNDirectory = ^TLFNDirectory;

TLFNDirectory = packed record

FATFS info sector

[Expand]

PFATInfoSector = ^TFATInfoSector;

TFATInfoSector = packed record


Class definitions



FATFS specific classes

TFATRecognizer = class(TRecognizer)
TFATPartitioner = class(TDiskPartitioner)
TFATFormatter = class(TDiskFormatter)
TFATDefragger = class(TDiskDefragger)
TFATRepairer = class(TDiskRepairer)
TFATFileSystem = class(TFileSystem)
TFATDiskTable = class(TDiskTable)
TFATDiskBlock = class(TDiskBlock)
TFATDiskEntry = class(TDiskEntry)


Public variables


None defined

Function declarations



Initialization functions

[Expand]
procedure FATFSInit;
Description: To be documented


[Expand]
procedure FATFSQuit;
Description: To be documented


FATFS helper functions

[Expand]
function FATTypeToString(AType:TFATType):String;
Description: To be documented


Return to Unit Reference