Difference between revisions of "Unit Storage"

From Ultibo.org
Jump to: navigation, search
 
(23 intermediate revisions by the same user not shown)
Line 5: Line 5:
 
----
 
----
  
'''Storage Devices'''
+
'''Ultibo Storage Interface unit'''
  
This unit provides both the Storage device interface and the generic USB mass storage driver.
+
This unit provides the generic Storage device interface used by all storage drivers.
 
+
'''USB Mass Storage Devices'''
+
 
+
The USB Mass Storage Class Control/Bulk/Interrupt (CBI) Transport specification is approved for use only with full-speed floppy disk drives. CBI shall not be used in high-speed capable devices, or in devices other than floppy disk drives. CBI shall not be used in devices that implement LSDFS. Usage of CBI for any new design is discouraged.
+
 
+
Therefore the majority of USB Mass Storage devices use the Bulk only interface.
+
 
+
USB mass storage class devices normally use the SCSI command set and therefore the USB storage driver consumes the SCSI unit for the protocol and command definitions. USB mass storage devices are registered directly as Storage devices not as SCSI devices.
+
  
 
=== Constants ===
 
=== Constants ===
 
----
 
----
  
''To be documented''
+
 
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
 +
<div style="font-size: 14px; padding-left: 12px;">'''Storage specific constants''' <code> STORAGE_* </code></div>
 +
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 +
{| class="wikitable" style="font-size: 14px; background: white;"
 +
|-
 +
| <code>STORAGE_NAME_PREFIX = 'Storage';</code>
 +
| Name prefix for Storage Devices
 +
|-
 +
|colspan="2"|&nbsp;
 +
|-
 +
| <code>STORAGE_STATUS_TIMER_INTERVAL = 1000;</code>
 +
| &nbsp;
 +
|-
 +
|}
 +
</div></div>
 +
<br />
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
 +
<div style="font-size: 14px; padding-left: 12px;">'''Storage device type''' <code> STORAGE_TYPE_* </code></div>
 +
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 +
{| class="wikitable" style="font-size: 14px; background: white;"
 +
|-
 +
| <code>STORAGE_TYPE_NONE = 0;</code>
 +
| style="width: 50%;"|&nbsp;
 +
|-
 +
| <code>STORAGE_TYPE_HDD = 1;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_TYPE_FDD = 2;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_TYPE_CDROM = 3;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_TYPE_OPTICAL = 4;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_TYPE_TAPE = 5;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_TYPE_REMOVABLE = 6;</code>
 +
| &nbsp;
 +
|-
 +
|colspan="2"|&nbsp;
 +
|-
 +
| <code>STORAGE_TYPE_MAX = 6;</code>
 +
| &nbsp;
 +
|-
 +
|}
 +
</div></div>
 +
<br />
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
 +
<div style="font-size: 14px; padding-left: 12px;">'''Storage device state''' <code> STORAGE_STATE_* </code></div>
 +
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 +
{| class="wikitable" style="font-size: 14px; background: white;"
 +
|-
 +
| <code>STORAGE_STATE_EJECTED = 0;</code>
 +
| style="width: 50%;"|&nbsp;
 +
|-
 +
| <code>STORAGE_STATE_EJECTING = 1;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_STATE_INSERTING = 2;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_STATE_INSERTED = 3;</code>
 +
| &nbsp;
 +
|-
 +
|colspan="2"|&nbsp;
 +
|-
 +
| <code>STORAGE_STATE_MAX = 3;</code>
 +
| &nbsp;
 +
|-
 +
|}
 +
</div></div>
 +
<br />
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
 +
<div style="font-size: 14px; padding-left: 12px;">'''Storage device flag''' <code> STORAGE_FLAG_* </code></div>
 +
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 +
{| class="wikitable" style="font-size: 14px; background: white;"
 +
|-
 +
| <code>STORAGE_FLAG_NONE = $00000000;</code>
 +
| style="width: 50%;"|&nbsp;
 +
|-
 +
| <code>STORAGE_FLAG_REMOVABLE = $00000001;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_FLAG_LBA48 = $00000002;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_FLAG_NOT_READY = $00000004;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_FLAG_NO_MEDIA = $00000008;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_FLAG_READ_ONLY = $00000010;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_FLAG_WRITE_ONLY = $00000020;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_FLAG_ERASEABLE = $00000040;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_FLAG_LOCKABLE = $00000080;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_FLAG_LOCKED = $00000100;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_FLAG_EJECTABLE = $00000200;</code>
 +
| &nbsp;
 +
|-
 +
| <code>STORAGE_FLAG_CHANGABLE = $00000400;</code>
 +
| &nbsp;
 +
|-
 +
|}
 +
</div></div>
 +
<br />
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
 +
<div style="font-size: 14px; padding-left: 12px;">'''Storage device control code''' <code> STORAGE_CONTROL_* </code></div>
 +
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 +
{| class="wikitable" style="font-size: 14px; background: white;"
 +
|-
 +
| <code>STORAGE_CONTROL_TEST_READY = 1;</code>
 +
| Test Unit Ready
 +
|-
 +
| <code>STORAGE_CONTROL_RESET = 2;</code>
 +
| Reset Device
 +
|-
 +
| <code>STORAGE_CONTROL_TEST_MEDIA = 3;</code>
 +
| Test No Media
 +
|-
 +
| <code>STORAGE_CONTROL_LOCK = 4;</code>
 +
| Lock Media
 +
|-
 +
| <code>STORAGE_CONTROL_UNLOCK = 5;</code>
 +
| Unlock Media
 +
|-
 +
| <code>STORAGE_CONTROL_EJECT = 6;</code>
 +
| Eject Media
 +
|-
 +
| <code>STORAGE_CONTROL_TEST_LOCKED = 7;</code>
 +
| Test Media Locked
 +
|-
 +
| <code>STORAGE_CONTROL_TEST_CHANGED = 8;</code>
 +
| Test Media Changed
 +
|-
 +
| <code>STORAGE_CONTROL_GET_VENDORID = 9;</code>
 +
| Get Vendor Id
 +
|-
 +
| <code>STORAGE_CONTROL_GET_PRODUCTID = 10;</code>
 +
| Get Product Id
 +
|-
 +
| <code>STORAGE_CONTROL_GET_SERIAL = 11;</code>
 +
| Get Serial No
 +
|-
 +
| <code>STORAGE_CONTROL_GET_REVISION = 12;</code>
 +
| Get Revision No
 +
|-
 +
| <code>STORAGE_CONTROL_GET_PRODUCT = 13;</code>
 +
| Get Product Name
 +
|-
 +
| <code>STORAGE_CONTROL_GET_MANUFACTURER = 14;</code>
 +
| Get Manufacturer Name
 +
|-
 +
|}
 +
</div></div>
 +
<br />
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 20px; padding-bottom: 15px;">
 +
<div style="font-size: 14px; padding-left: 12px;">'''Storage logging''' <code> STORAGE_LOG_* </code></div>
 +
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 +
{| class="wikitable" style="font-size: 14px; background: white;"
 +
|-
 +
| <code>STORAGE_LOG_LEVEL_DEBUG = LOG_LEVEL_DEBUG;</code>
 +
| Storage debugging messages
 +
|-
 +
| <code>STORAGE_LOG_LEVEL_INFO = LOG_LEVEL_INFO;</code>
 +
| Storage informational messages, such as a device being attached or detached
 +
|-
 +
| <code>STORAGE_LOG_LEVEL_WARN = LOG_LEVEL_WARN;</code>
 +
| Storage warning messages
 +
|-
 +
| <code>STORAGE_LOG_LEVEL_ERROR = LOG_LEVEL_ERROR;</code>
 +
| Storage error messages
 +
|-
 +
| <code>STORAGE_LOG_LEVEL_NONE = LOG_LEVEL_NONE;</code>
 +
| No Storage messages
 +
|-
 +
|}
 +
</div></div>
 +
<br />
  
 
=== Type definitions ===
 
=== Type definitions ===
 
----
 
----
  
''To be documented''
+
 
 +
'''Storage enumeration callback'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TStorageEnumerate = function(Storage:PStorageDevice; Data:Pointer):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''Storage notification callback'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TStorageNotification = function(Device:PDevice; Data:Pointer; Notification:LongWord):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''Storage device read'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TStorageDeviceRead = function(Storage:PStorageDevice; const Start,Count:Int64; Buffer:Pointer):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''Storage device write'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TStorageDeviceWrite = function(Storage:PStorageDevice; const Start,Count:Int64; Buffer:Pointer):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''Storage device erase'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TStorageDeviceErase = function(Storage:PStorageDevice; const Start,Count:Int64):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''Storage device control'''
 +
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TStorageDeviceControl = function(Storage:PStorageDevice; Request:Integer; Argument1:PtrUInt; var Argument2:PtrUInt):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 +
'''Storage device'''
 +
 
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
 +
<code>PStorageDevice = ^TStorageDevice;</code>
 +
 
 +
<code>TStorageDevice = record</code>
 +
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 +
{| class="wikitable" style="font-size: 14px; background: white;"
 +
|-
 +
|colspan="2"|''Device Properties''
 +
|-
 +
| <code>Device:TDevice;</code>
 +
| The Device entry for this Storage
 +
|-
 +
|colspan="2"|''Storage Properties''
 +
|-
 +
| <code>StorageId:LongWord;</code>
 +
| Unique Id of this Storage in the Storage table
 +
|-
 +
| <code>StorageState:LongWord;</code>
 +
| Storage state (eg STORAGE_STATE_INSERTED)
 +
|-
 +
| <code>DeviceRead:TStorageDeviceRead;</code>
 +
| A Device specific DeviceRead method implementing a standard Storage device interface
 +
|-
 +
| <code>DeviceWrite:TStorageDeviceWrite;</code>
 +
| A Device specific DeviceWrite method implementing a standard Storage device interface
 +
|-
 +
| <code>DeviceErase:TStorageDeviceErase;</code>
 +
| A Device specific DeviceErase method implementing a standard Storage device interface
 +
|-
 +
| <code>DeviceControl:TStorageDeviceControl;</code>
 +
| A Device specific DeviceControl method implementing a standard Storage device interface
 +
|-
 +
|colspan="2"|''Driver Properties''
 +
|-
 +
| <code>Lock:TMutexHandle;</code>
 +
| Storage lock
 +
|-
 +
| <code>TargetID:LongWord;</code>
 +
| SCSI Id
 +
|-
 +
| <code>TargetLUN:LongWord;</code>
 +
| LUN
 +
|-
 +
| <code>BlockSize:LongWord;</code>
 +
| Block Size
 +
|-
 +
| <code>BlockCount:Int64;</code>
 +
| Number of Blocks
 +
|-
 +
| <code>BlockShift:LongWord;</code>
 +
| Shift Count for Blocks to Bytes conversion (eg 9 for 512 byte blocks)
 +
|-
 +
| <code>Vendor:PChar;</code>
 +
| ATA Model, SCSI Vendor
 +
|-
 +
| <code>Product:PChar;</code>
 +
| ATA Serial No, SCSI Product
 +
|-
 +
| <code>Revision:PChar;</code>
 +
| Firmware Revision
 +
|-
 +
| <code>StatusTimer:TTimerHandle;</code>
 +
| Timer for status change detection
 +
|-
 +
|colspan="2"|''Statistics Properties''
 +
|-
 +
| <code>ReadCount:LongWord;</code>
 +
| &nbsp;
 +
|-
 +
| <code>ReadErrors:LongWord;</code>
 +
| &nbsp;
 +
|-
 +
| <code>WriteCount:LongWord;</code>
 +
| &nbsp;
 +
|-
 +
| <code>WriteErrors:LongWord;</code>
 +
| &nbsp;
 +
|-
 +
| <code>EraseCount:LongWord;</code>
 +
| &nbsp;
 +
|-
 +
| <code>EraseErrors:LongWord;</code>
 +
| &nbsp;
 +
|-
 +
|colspan="2"|''Internal Properties''
 +
|-
 +
| <code>Prev:PStorageDevice;</code>
 +
| Previous entry in Storage table
 +
|-
 +
| <code>Next:PStorageDevice;</code>
 +
| Next entry in Storage table
 +
|-
 +
|}
 +
</div></div> 
 +
<br />
  
 
=== Public variables ===
 
=== Public variables ===
 
----
 
----
  
''To be documented''
+
 
 +
'''Storage logging'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>STORAGE_DEFAULT_LOG_LEVEL:LongWord = STORAGE_LOG_LEVEL_DEBUG;</code>
 +
| style="width: 40%;"|Minimum level for Storage messages. Only messages with level greater than or equal to this will be printed.
 +
|-
 +
|}
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>STORAGE_LOG_ENABLED:Boolean;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
<br />
  
 
=== Function declarations ===
 
=== Function declarations ===
Line 44: Line 394:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 59: Line 409:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 71: Line 421:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 83: Line 433:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 90: Line 440:
 
<br />
 
<br />
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
<pre style="border: 0; padding-bottom:0px;">function StorageDeviceControl(Storage:PStorageDevice; Request:Integer; Argument1:LongWord; var Argument2:LongWord):LongWord;</pre>
+
<pre style="border: 0; padding-bottom:0px;">function StorageDeviceControl(Storage:PStorageDevice; Request:Integer; Argument1:PtrUInt; var Argument2:PtrUInt):LongWord;</pre>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 107: Line 457:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Storage'''
+
! Storage
 
| The storage to set the state for
 
| The storage to set the state for
 
|-
 
|-
! '''State'''
+
! State
 
| The new state to set and notify
 
| The new state to set and notify
 
|-
 
|-
!'''Return'''
+
! Return
 
| ERROR_SUCCESS if completed or another error code on failure
 
| ERROR_SUCCESS if completed or another error code on failure
 
|-
 
|-
Line 125: Line 475:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Storage'''
+
! Storage
 
| The storage to start status monitoring for
 
| The storage to start status monitoring for
 
|-
 
|-
! '''Interval'''
+
! Interval
 
| The status monitoring interval in milliseconds
 
| The status monitoring interval in milliseconds
 
|-
 
|-
!'''Return'''
+
! Return
 
| ERROR_SUCCESS if completed or another error code on failure
 
| ERROR_SUCCESS if completed or another error code on failure
 
|-
 
|-
Line 143: Line 493:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Storage'''
+
! Storage
 
| The storage to stop status monitoring for
 
| The storage to stop status monitoring for
 
|-
 
|-
!'''Return'''
+
! Return
 
| ERROR_SUCCESS if completed or another error code on failure
 
| ERROR_SUCCESS if completed or another error code on failure
 
|-
 
|-
Line 158: Line 508:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Return'''
+
! Return
 
| Pointer to new Storage entry or nil if storage could not be created
 
| Pointer to new Storage entry or nil if storage could not be created
 
|-
 
|-
Line 170: Line 520:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Size'''
+
! Size
 
| Size in bytes to allocate for new storage (Including the storage entry)
 
| Size in bytes to allocate for new storage (Including the storage entry)
 
|-
 
|-
!'''Return'''
+
! Return
 
| Pointer to new Storage entry or nil if storage could not be created
 
| Pointer to new Storage entry or nil if storage could not be created
 
|-
 
|-
Line 185: Line 535:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 197: Line 547:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 209: Line 559:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 221: Line 571:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 228: Line 578:
 
<br />
 
<br />
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
<pre style="border: 0; padding-bottom:0px;">function StorageDeviceFindByName(const Name:String):PStorageDevice; inline;</pre>
+
<pre style="border: 0; padding-bottom:0px;">function StorageDeviceFindByDevice(Device:PDevice):PStorageDevice;</pre>
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
+
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Find a Storage device by the matching DeviceData property</div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Device
| To be documented
+
| The device entry to match with the DeviceData value
 
|-
 
|-
|}
+
! Return
</div></div>
+
| The Storage device matched or nil if none found
<br />
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
+
<pre style="border: 0; padding-bottom:0px;">function StorageDeviceFindByDescription(const Description:String):PStorageDevice; inline;</pre>
+
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
|-
+
! '''Note'''
+
| To be documented
+
 
|-
 
|-
 
|}
 
|}
Line 252: Line 593:
 
<br />
 
<br />
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
<pre style="border: 0; padding-bottom:0px;">function StorageDeviceEnumerate(Callback:TStorageEnumerate; Data:Pointer):LongWord;</pre>
+
<pre style="border: 0; padding-bottom:0px;">function StorageDeviceFindByName(const Name:String):PStorageDevice; inline;</pre>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 264: Line 605:
 
<br />
 
<br />
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
<pre style="border: 0; padding-bottom:0px;">function StorageDeviceNotification(Storage:PStorageDevice; Callback:TStorageNotification; Data:Pointer; Notification,Flags:LongWord):LongWord;</pre>
+
<pre style="border: 0; padding-bottom:0px;">function StorageDeviceFindByDescription(const Description:String):PStorageDevice; inline;</pre>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
 
</div></div>
 
</div></div>
 
<br />
 
<br />
 
'''USB storage functions'''
 
 
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
<pre style="border: 0; padding-bottom:0px;">function USBStorageDeviceRead(Storage:PStorageDevice; const Start,Count:Int64; Buffer:Pointer):LongWord;</pre>
+
<pre style="border: 0; padding-bottom:0px;">function StorageDeviceEnumerate(Callback:TStorageEnumerate; Data:Pointer):LongWord;</pre>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| According to 3.4 of USB Mass Storage Bulk Only 1.0, requests must be queued one at a time to a device
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 291: Line 629:
 
<br />
 
<br />
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
<pre style="border: 0; padding-bottom:0px;">function USBStorageDeviceWrite(Storage:PStorageDevice; const Start,Count:Int64; Buffer:Pointer):LongWord;</pre>
+
<pre style="border: 0; padding-bottom:0px;">function StorageDeviceNotification(Storage:PStorageDevice; Callback:TStorageNotification; Data:Pointer; Notification,Flags:LongWord):LongWord;</pre>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| According to 3.4 of USB Mass Storage Bulk Only 1.0, requests must be queued one at a time to a device
+
| None documented
|-
+
|}
+
</div></div>
+
<br />
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
+
<pre style="border: 0; padding-bottom:0px;">function USBStorageDeviceControl(Storage:PStorageDevice; Request:Integer; Argument1:LongWord; var Argument2:LongWord):LongWord;</pre>
+
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
|-
+
! '''Note'''
+
| According to 3.4 of USB Mass Storage Bulk Only 1.0, requests must be queued one at a time to a device
+
|-
+
|}
+
</div></div>
+
<br />
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
+
<pre style="border: 0; padding-bottom:0px;">function USBStorageDriverBind(Device:PUSBDevice; Interrface:PUSBInterface):LongWord;</pre>
+
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Bind the Storage driver to a USB device if it is suitable</div>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
|-
+
! '''Device'''
+
| The USB device to attempt to bind to
+
|-
+
! '''Interrface'''
+
| The USB interface to attempt to bind to (or nil for whole device)
+
|-
+
!'''Return'''
+
| USB_STATUS_SUCCESS if completed, USB_STATUS_DEVICE_UNSUPPORTED if unsupported or another error code on failure
+
|-
+
|}
+
</div></div>
+
<br />
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
+
<pre style="border: 0; padding-bottom:0px;">function USBStorageDriverUnbind(Device:PUSBDevice; Interrface:PUSBInterface):LongWord;</pre>
+
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Unbind the Storage driver from a USB device</div>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
|-
+
! '''Device'''
+
| The USB device to unbind from
+
|-
+
! '''Interrface'''
+
| The USB interface to unbind from (or nil for whole device)
+
|-
+
!'''Return'''
+
| USB_STATUS_SUCCESS if completed or another error code on failure
+
|-
+
|}
+
</div></div>
+
<br />
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
+
<pre style="border: 0; padding-bottom:0px;">procedure USBStorageReadComplete(Request:PUSBRequest);</pre>
+
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Called when a USB request from a USB storage bulk IN endpoint completes</div>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
|-
+
! '''Request'''
+
| The USB request which has completed
+
|-
+
!'''Note'''
+
| The thread that submitted the read request will hold the storage lock
+
|-
+
|}
+
</div></div>
+
<br />
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
+
<pre style="border: 0; padding-bottom:0px;">procedure USBStorageWriteComplete(Request:PUSBRequest);</pre>
+
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Called when a USB request from a USB storage bulk OUT endpoint completes</div>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
|-
+
! '''Request'''
+
| The USB request which has completed
+
|-
+
!'''Note'''
+
| The thread that submitted the write request will hold the storage lock
+
|-
+
|}
+
</div></div>
+
<br />
+
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
+
<pre style="border: 0; padding-bottom:0px;">procedure USBStorageInterruptComplete(Request:PUSBRequest);</pre>
+
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Called when a USB request from a USB storage IN interrupt endpoint completes</div>
+
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
+
{| class="wikitable" style="font-size: 14px; background: white;"
+
|-
+
! '''Request'''
+
| The USB request which has completed
+
|-
+
!'''Note'''
+
| The thread that submitted the interrupt request will hold the storage lock
+
 
|-
 
|-
 
|}
 
|}
Line 399: Line 644:
  
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
<pre style="border: 0; padding-bottom:0px;">function StorageGetCount:LongWord; inline;</pre>
+
<pre style="border: 0; padding-bottom:0px;">function StorageGetCount:LongWord;</pre>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Get the current storage count</div>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' Get the current storage count</div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 416: Line 661:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 428: Line 673:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 440: Line 685:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 452: Line 697:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 464: Line 709:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 +
|-
 +
|}
 +
</div></div>
 +
<br />
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 +
<pre style="border: 0; padding-bottom:0px;">procedure StorageLogInfo(Storage:PStorageDevice; const AText:String); inline;</pre>
 +
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 +
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 +
{| class="wikitable" style="font-size: 14px; background: white;"
 +
|-
 +
! Note
 +
| None documented
 
|-
 
|-
 
|}
 
|}
Line 471: Line 728:
 
<br />
 
<br />
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
<pre style="border: 0; padding-bottom:0px;">procedure StorageLogInfo(Storage:PStorageDevice; const AText:String);</pre>
+
<pre style="border: 0; padding-bottom:0px;">procedure StorageLogWarn(Storage:PStorageDevice; const AText:String); inline;</pre>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 483: Line 740:
 
<br />
 
<br />
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
<pre style="border: 0; padding-bottom:0px;">procedure StorageLogError(Storage:PStorageDevice; const AText:String);</pre>
+
<pre style="border: 0; padding-bottom:0px;">procedure StorageLogError(Storage:PStorageDevice; const AText:String); inline;</pre>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 495: Line 752:
 
<br />
 
<br />
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
 
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial; padding-top: 0px; padding-bottom: 15px;">
<pre style="border: 0; padding-bottom:0px;">procedure StorageLogDebug(Storage:PStorageDevice; const AText:String);</pre>
+
<pre style="border: 0; padding-bottom:0px;">procedure StorageLogDebug(Storage:PStorageDevice; const AText:String); inline;</pre>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div style="font-size: 14px; padding-left: 12px;">'''Description:''' To be documented</div>
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}
Line 512: Line 769:
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
{| class="wikitable" style="font-size: 14px; background: white;"
 
|-
 
|-
! '''Note'''
+
! Note
| To be documented
+
| None documented
 
|-
 
|-
 
|}
 
|}

Latest revision as of 03:24, 29 March 2024

Return to Unit Reference


Description


Ultibo Storage Interface unit

This unit provides the generic Storage device interface used by all storage drivers.

Constants



[Expand]
Storage specific constants STORAGE_*


[Expand]
Storage device type STORAGE_TYPE_*


[Expand]
Storage device state STORAGE_STATE_*


[Expand]
Storage device flag STORAGE_FLAG_*


[Expand]
Storage device control code STORAGE_CONTROL_*


[Expand]
Storage logging STORAGE_LOG_*


Type definitions



Storage enumeration callback

TStorageEnumerate = function(Storage:PStorageDevice; Data:Pointer):LongWord;

Storage notification callback

TStorageNotification = function(Device:PDevice; Data:Pointer; Notification:LongWord):LongWord;

Storage device read

TStorageDeviceRead = function(Storage:PStorageDevice; const Start,Count:Int64; Buffer:Pointer):LongWord;

Storage device write

TStorageDeviceWrite = function(Storage:PStorageDevice; const Start,Count:Int64; Buffer:Pointer):LongWord;

Storage device erase

TStorageDeviceErase = function(Storage:PStorageDevice; const Start,Count:Int64):LongWord;

Storage device control

TStorageDeviceControl = function(Storage:PStorageDevice; Request:Integer; Argument1:PtrUInt; var Argument2:PtrUInt):LongWord;

Storage device

[Expand]

PStorageDevice = ^TStorageDevice;

TStorageDevice = record


Public variables



Storage logging

STORAGE_DEFAULT_LOG_LEVEL:LongWord = STORAGE_LOG_LEVEL_DEBUG; Minimum level for Storage messages. Only messages with level greater than or equal to this will be printed.
STORAGE_LOG_ENABLED:Boolean;


Function declarations



Initialization functions

[Expand]
procedure StorageInit;
Description: To be documented


Storage functions

[Expand]
function StorageDeviceRead(Storage:PStorageDevice; const Start,Count:Int64; Buffer:Pointer):LongWord;
Description: To be documented


[Expand]
function StorageDeviceWrite(Storage:PStorageDevice; const Start,Count:Int64; Buffer:Pointer):LongWord;
Description: To be documented


[Expand]
function StorageDeviceErase(Storage:PStorageDevice; const Start,Count:Int64):LongWord;
Description: To be documented


[Expand]
function StorageDeviceControl(Storage:PStorageDevice; Request:Integer; Argument1:PtrUInt; var Argument2:PtrUInt):LongWord;
Description: To be documented


[Expand]
function StorageDeviceSetState(Storage:PStorageDevice; State:LongWord):LongWord;
Description: Set the state of the specified storage and send a notification


[Expand]
function StorageDeviceStartStatus(Storage:PStorageDevice; Interval:LongWord):LongWord;
Description: Start status monitoring on the specified storage for insert/eject notifications


[Expand]
function StorageDeviceStopStatus(Storage:PStorageDevice):LongWord;
Description: Stop status monitoring on the specified storage for insert/eject notifications


[Expand]
function StorageDeviceCreate:PStorageDevice;
Description: Create a new Storage entry


[Expand]
function StorageDeviceCreateEx(Size:LongWord):PStorageDevice;
Description: Create a new Storage entry


[Expand]
function StorageDeviceDestroy(Storage:PStorageDevice):LongWord;
Description: Destroy an existing Storage entry


[Expand]
function StorageDeviceRegister(Storage:PStorageDevice):LongWord;
Description: Register a new Storage in the Storage table


[Expand]
function StorageDeviceDeregister(Storage:PStorageDevice):LongWord;
Description: Deregister a Storage from the Storage table


[Expand]
function StorageDeviceFind(StorageId:LongWord):PStorageDevice;
Description: To be documented


[Expand]
function StorageDeviceFindByDevice(Device:PDevice):PStorageDevice;
Description: Find a Storage device by the matching DeviceData property


[Expand]
function StorageDeviceFindByName(const Name:String):PStorageDevice; inline;
Description: To be documented


[Expand]
function StorageDeviceFindByDescription(const Description:String):PStorageDevice; inline;
Description: To be documented


[Expand]
function StorageDeviceEnumerate(Callback:TStorageEnumerate; Data:Pointer):LongWord;
Description: To be documented


[Expand]
function StorageDeviceNotification(Storage:PStorageDevice; Callback:TStorageNotification; Data:Pointer; Notification,Flags:LongWord):LongWord;
Description: To be documented


Storage helper functions

[Expand]
function StorageGetCount:LongWord;
Description: Get the current storage count


[Expand]
function StorageDeviceCheck(Storage:PStorageDevice):PStorageDevice;
Description: Check if the supplied Storage is in the storage table


[Expand]
function StorageDeviceTypeToString(StorageType:LongWord):String;
Description: To be documented


[Expand]
function StorageDeviceStateToString(StorageState:LongWord):String;
Description: To be documented


[Expand]
function StorageDeviceStateToNotification(State:LongWord):LongWord;
Description: Convert a Storage state value into the notification code for device notifications


[Expand]
procedure StorageLog(Level:LongWord; Storage:PStorageDevice; const AText:String);
Description: To be documented


[Expand]
procedure StorageLogInfo(Storage:PStorageDevice; const AText:String); inline;
Description: To be documented


[Expand]
procedure StorageLogWarn(Storage:PStorageDevice; const AText:String); inline;
Description: To be documented


[Expand]
procedure StorageLogError(Storage:PStorageDevice; const AText:String); inline;
Description: To be documented


[Expand]
procedure StorageLogDebug(Storage:PStorageDevice; const AText:String); inline;
Description: To be documented


[Expand]
procedure StorageStatusTimer(Storage:PStorageDevice);
Description: To be documented


Return to Unit Reference