Difference between revisions of "Unit DMA"

From Ultibo.org
Jump to: navigation, search
Line 131: Line 131:
 
----
 
----
  
''To be documented''
+
 
 +
'''DMA properties'''
 +
 
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
 +
<code>PDMAProperties = ^TDMAProperties;</code>
 +
 
 +
<code>TDMAProperties = record</code>
 +
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 +
{| class="wikitable" style="font-size: 14px; background: white;"
 +
|-
 +
| <code>Flags:LongWord;</code>
 +
| Host flags (eg DMA_FLAG_STRIDE)
 +
|-
 +
| <code>Alignment:LongWord;</code>
 +
| Host data buffer alignment
 +
|-
 +
| <code>Multiplier:LongWord;</code>
 +
| Host data buffer multiplier
 +
|-
 +
| <code>Channels:LongWord;</code>
 +
| Total number of host channels
 +
|-
 +
| <code>MaxSize:LongWord;</code>
 +
| Maximum transfer size
 +
|-
 +
| <code>MaxCount:LongWord;</code>
 +
| Maximum Y count for 2D stride
 +
|-
 +
| <code>MaxLength:LongWord;</code>
 +
| Maximum X length for 2D stride
 +
|-
 +
| <code>MinStride:LongWord;</code>
 +
| Minimum stride value (Increment between rows)
 +
|-
 +
| <code>MaxStride:LongWord;</code>
 +
| Maximum stride value (Increment between rows)
 +
|-
 +
|}
 +
</div></div> 
 +
 
 +
'''DMA enumeration callback'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TDMAEnumerate = function(DMA:PDMAHost; Data:Pointer):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''DMA notification callback'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TDMANotification = function(Device:PDevice; Data:Pointer; Notification:LongWord):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''DMA host start'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TDMAHostStart = function(DMA:PDMAHost):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''DMA host stop'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TDMAHostStop = function(DMA:PDMAHost):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''DMA host reset'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TDMAHostReset = function(DMA:PDMAHost):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''DMA host submit'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TDMAHostSubmit = function(DMA:PDMAHost; Request:PDMARequest):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''DMA host cancel'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TDMAHostCancel = function(DMA:PDMAHost; Request:PDMARequest):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''DMA host properties'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TDMAHostProperties = function(DMA:PDMAHost; Properties:PDMAProperties):LongWord;</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''DMA host'''
 +
 
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
 +
<code>PDMAHost = ^TDMAHost;</code>
 +
 
 +
<code>TDMAHost = 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 DMA host
 +
|-
 +
|colspan="2"|''DMA Properties''
 +
|-
 +
| <code>DMAId:LongWord;</code>
 +
| Unique Id of this DMA host in the DMA host table
 +
|-
 +
| <code>DMAId:LongWord;</code>
 +
| Unique Id of this DMA host in the DMA host table
 +
|-
 +
| <code>DMAState:LongWord;</code>
 +
| DMA state (eg DMA_STATE_ENABLED)
 +
|-
 +
| <code>HostStart:TDMAHostStart;</code>
 +
| A Host specific HostStart method implementing the standard DMA host interface (Mandatory)
 +
|-
 +
| <code>HostStop:TDMAHostStop;</code>
 +
| A Host specific HostStop method implementing the standard DMA host interface (Mandatory)
 +
|-
 +
| <code>HostReset:TDMAHostReset;</code>
 +
| A Host specific HostReset method implementing the standard DMA host interface (Or nil if the default method is suitable)
 +
|-
 +
| <code>HostSubmit:TDMAHostSubmit;</code>
 +
| A Host specific HostSubmit method implementing the standard DMA host interface (Mandatory)
 +
|-
 +
| <code>HostCancel:TDMAHostCancel;</code>
 +
| A Host specific HostCancel method implementing the standard DMA host interface (Mandatory)
 +
|-
 +
| <code>HostProperties:TDMAHostProperties;</code>
 +
| A Host specific HostProperties method implementing the standard DMA host interface (Or nil if the default method is suitable)
 +
|-
 +
|colspan="2"|''Driver Properties''
 +
|-
 +
| <code>Lock:TMutexHandle;</code>
 +
| Host lock
 +
|-
 +
| <code>Alignment:LongWord;</code>
 +
| Host data buffer alignment
 +
|-
 +
| <code>Multiplier:LongWord;</code>
 +
| Host data buffer multiplier
 +
|-
 +
| <code>Properties:TDMAProperties;</code>
 +
| Host properties
 +
|-
 +
| <code>LastError:LongWord;</code>
 +
| Last error to occur on this host
 +
|-
 +
| <code>PendingCount:LongWord;</code>
 +
| Number of DMA requests pending for this host
 +
|-
 +
| <code>WaiterThread:TThreadId;</code>
 +
| Thread waiting for pending requests to complete
 +
|-
 +
|colspan="2"|''Statistics Properties''
 +
|-
 +
| <code>RequestCount:LongWord;</code>
 +
| Number of DMA requests that have been submitted to this host
 +
|-
 +
| <code>RequestErrors:LongWord;</code>
 +
| Number of DMA requests that have failed on this host
 +
|-
 +
|colspan="2"|''Internal Properties''
 +
|-
 +
| <code>Prev:PDMAHost;</code>
 +
| Previous entry in DMA host table
 +
|-
 +
| <code>Next:PDMAHost;</code>
 +
| Next entry in DMA host table
 +
|-
 +
|}
 +
</div></div>
 +
 
 +
'''DMA request completed'''
 +
 
 +
{| class="wikitable" style="font-size: 14px; text-align: left; width: 100%; height: 50px;"
 +
|-
 +
| <code>TDMARequestCompleted = procedure(Request:PDMARequest);</code>
 +
| style="width: 40%;"|
 +
|-
 +
|}
 +
 
 +
'''DMA request'''
 +
 
 +
<div class="toccolours mw-collapsible mw-collapsed" style="border: 1; font-family: arial;">
 +
<code>PDMARequest = ^TDMARequest;</code>
 +
 
 +
<code>TDMARequest = record</code>
 +
<div class="mw-collapsible-content" style="text-align: left; padding-left: 5px;">
 +
{| class="wikitable" style="font-size: 14px; background: white;"
 +
|-
 +
|colspan="2"|Note: Forward declared to satisfy DMAHost
 +
|-
 +
|colspan="2"|''Request Properties''
 +
|-
 +
| <code>Host:PDMAHost;</code>
 +
| &nbsp;
 +
|-
 +
| <code>Data:PDMAData;</code>
 +
| List of data blocks for this request
 +
|-
 +
| <code>Flags:LongWord;</code>
 +
| Flags for the request (eg DMA_REQUEST_FLAG_RELEASE)
 +
|-
 +
| <code>Direction:LongWord;</code>
 +
| The direction of the DMA request (eg DMA_DIR_MEM_TO_MEM)
 +
|-
 +
| <code>Peripheral:LongWord;</code>
 +
| The peripheral ID for data request gating (eg DMA_DREQ_ID_NONE)
 +
|-
 +
| <code>Callback:TDMARequestCompleted;</code>
 +
| Callback function that will be called when this DMA request has been successfully completed or has failed
 +
|-
 +
| <code>DriverData:Pointer;</code>
 +
| Private data for the completion callback (Optional)
 +
|-
 +
|colspan="2"|''Result Properties''
 +
|-
 +
| <code>Status:LongWord;</code>
 +
| Status of the request (ERROR_SUCCESS if successful, or another error code if the request failed)
 +
|-
 +
|colspan="2"|''Driver Properties (Private variables for use by Host drivers)''
 +
|-
 +
| <code>ControlBlocks:Pointer;</code>
 +
| &nbsp;
 +
|-
 +
|}
 +
</div></div>
 +
<br />
  
 
=== Public variables ===
 
=== Public variables ===

Revision as of 00:09, 18 January 2017

Return to Unit Reference


Description


Ultibo DMA interface unit

The DMA interfaces are 1 tier (Host only) whereas the USB interface is 3 tier (Host, Device and Driver).

Constants



[Expand]
DMA specific constants DMA_*


[Expand]
DMA host type constants DMA_TYPE_*


[Expand]
DMA host state constants DMA_STATE_*


[Expand]
DMA host flag constants DMA_FLAG_*


[Expand]
DMA request flag constants DMA_REQUEST_FLAG_*


[Expand]
DMA logging constants DMA_LOG_*


Type definitions



DMA properties

[Expand]

PDMAProperties = ^TDMAProperties;

TDMAProperties = record

DMA enumeration callback

TDMAEnumerate = function(DMA:PDMAHost; Data:Pointer):LongWord;

DMA notification callback

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

DMA host start

TDMAHostStart = function(DMA:PDMAHost):LongWord;

DMA host stop

TDMAHostStop = function(DMA:PDMAHost):LongWord;

DMA host reset

TDMAHostReset = function(DMA:PDMAHost):LongWord;

DMA host submit

TDMAHostSubmit = function(DMA:PDMAHost; Request:PDMARequest):LongWord;

DMA host cancel

TDMAHostCancel = function(DMA:PDMAHost; Request:PDMARequest):LongWord;

DMA host properties

TDMAHostProperties = function(DMA:PDMAHost; Properties:PDMAProperties):LongWord;

DMA host

[Expand]

PDMAHost = ^TDMAHost;

TDMAHost = record

DMA request completed

TDMARequestCompleted = procedure(Request:PDMARequest);

DMA request

[Expand]

PDMARequest = ^TDMARequest;

TDMARequest = record


Public variables



DMA logging

DMA_DEFAULT_LOG_LEVEL:LongWord = DMA_LOG_LEVEL_DEBUG; Minimum level for DMA messages. Only messages with level greater than or equal to this will be printed.
DMA_LOG_ENABLED:Boolean;


Function declarations



Initialization functions

[Expand]
procedure DMAInit;
Description: To be documented


DMA host functions

[Expand]
function DMAHostStart(DMA:PDMAHost):LongWord;
Description: To be documented


[Expand]
function DMAHostStop(DMA:PDMAHost):LongWord;
Description: To be documented


[Expand]
function DMAHostReset(DMA:PDMAHost):LongWord;
Description: To be documented


[Expand]
function DMAHostProperties(DMA:PDMAHost; Properties:PDMAProperties):LongWord;
Description: To be documented


[Expand]
function DMAHostCreate:PDMAHost;
Description: Create a new DMA entry


[Expand]
function DMAHostCreateEx(Size:LongWord):PDMAHost;
Description: Create a new DMA entry


[Expand]
function DMAHostDestroy(DMA:PDMAHost):LongWord;
Description: Destroy an existing DMA entry


[Expand]
function DMAHostRegister(DMA:PDMAHost):LongWord;
Description: Register a new DMA in the DMA host table


[Expand]
function DMAHostDeregister(DMA:PDMAHost):LongWord;
Description: Deregister a DMA from the DMA host table


[Expand]
function DMAHostFind(DMAId:LongWord):PDMAHost;
Description: To be documented


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


[Expand]
function DMAHostNotification(DMA:PDMAHost; Callback:TDMANotification; Data:Pointer; Notification,Flags:LongWord):LongWord;
Description: To be documented


DMA data functions

[Expand]
function DMADataCount(Data:PDMAData):LongWord;
Description: Return the total number of data blocks in the linked list


[Expand]
function DMADataFlags(Data:PDMAData):LongWord;
Description: Return the combined flags of the data blocks in the linked list


[Expand]
function DMADataMaximum(Data:PDMAData):LongWord;
Description: Return the size of the largest data block in the linked list


DMA buffer functions

[Expand]
function DMABufferAllocate(DMA:PDMAHost; Size:LongWord):Pointer; inline;
Description: Allocate a data buffer for a DMA request


[Expand]
function DMABufferAllocateEx(DMA:PDMAHost; var Size:LongWord):Pointer;
Description: Allocate a data buffer for a DMA request


[Expand]
function DMABufferValidate(DMA:PDMAHost; Buffer:Pointer; Size:LongWord):LongWord;
Description: Validate a data buffer for a DMA request against the DMA host requirements


[Expand]
function DMABufferRelease(Buffer:Pointer):LongWord;
Description: Release a data buffer from a DMA request


DMA request functions

[Expand]
function DMARequestAllocate(DMA:PDMAHost; Data:PDMAData; Callback:TDMARequestCompleted; DriverData:Pointer; Direction,Peripheral,Flags:LongWord):PDMARequest;
Description: Allocate a new DMA request


[Expand]
function DMARequestRelease(Request:PDMARequest):LongWord;
Description: Release and destroy a DMA request


[Expand]
function DMARequestSubmit(Request:PDMARequest):LongWord;
Description: Submit a DMA request to a DMA host


[Expand]
function DMARequestCancel(Request:PDMARequest):LongWord;
Description: Cancel a DMA request previously submitted to a DMA host


[Expand]
procedure DMARequestComplete(Request:PDMARequest);
Description: Called by a DMA host when a DMA request completes


DMA transfer functions

[Expand]
function DMATransferRequest(DMA:PDMAHost; Data:PDMAData; Direction,Peripheral,Flags,Timeout:LongWord):LongWord;
Description: Perform a DMA transfer request with the supplied data blocks on the supplied host


[Expand]
function DMATransferRequestEx(DMA:PDMAHost; Data:PDMAData; Callback:TDMARequestCompleted; DriverData:Pointer; Direction,Peripheral,Flags:LongWord):LongWord;
Description: Perform a DMA transfer request with the supplied data blocks on the supplied host


[Expand]
procedure DMATransferRequestComplete(Request:PDMARequest);
Description: Called when a DMA transfer request completes


RTL DMA functions

[Expand]
function SysDMAAvailable:Boolean;
Description: Check if a DMA host is available


[Expand]
function SysDMATransfer(Data:PDMAData; Direction,Peripheral:LongWord):LongWord;
Description: Perform a DMA transfer using the list of DMA data blocks provided


[Expand]
function SysDMAFillMemory(Dest:Pointer; Size:LongWord; Value:Byte):LongWord;
Description: Fill memory at the destination address using DMA


[Expand]
function SysDMACopyMemory(Source,Dest:Pointer; Size:LongWord):LongWord;
Description: Copy memory from the source to the destination address using DMA


[Expand]
function SysDMAReadPeripheral(Address,Dest:Pointer; Size,Peripheral:LongWord):LongWord;
Description: Read from a periperal address to the destination address using DMA


[Expand]
function SysDMAWritePeripheral(Source,Address:Pointer; Size,Peripheral:LongWord):LongWord;
Description: Write to a peripheral address from the source address using DMA


[Expand]
function SysDMAAllocateBuffer(Size:LongWord):Pointer;
Description: Allocate a buffer compatible with DMA memory reads or writes


[Expand]
function SysDMAAllocateBufferEx(var Size:LongWord):Pointer;
Description: Allocate a buffer compatible with DMA memory reads or writes


[Expand]
function SysDMAReleaseBuffer(Buffer:Pointer):LongWord;
Description: Release a buffer allocated with DMAAllocateBuffer


DMA helper functions

[Expand]
function DMAGetCount:LongWord; inline;
Description: Get the current DMA host count


[Expand]
function DMAHostGetDefault:PDMAHost; inline;
Description: Get the current default DMA host


[Expand]
function DMAHostSetDefault(DMA:PDMAHost):LongWord;
Description: Set the current default DMA device


[Expand]
function DMAHostCheck(DMA:PDMAHost):PDMAHost;
Description: Check if the supplied DMA is in the DMA host table


[Expand]
procedure DMALog(Level:Integer; DMA:PDMAHost; const AText:String);
Description: To be documented


[Expand]
procedure DMALogInfo(DMA:PDMAHost; const AText:String);
Description: To be documented


[Expand]
procedure DMALogError(DMA:PDMAHost; const AText:String);
Description: To be documented


[Expand]
procedure DMALogDebug(DMA:PDMAHost;const AText:String);
Description: To be documented


Return to Unit Reference