Difference between revisions of "Unit DMA"
From Ultibo.org
Line 131: | Line 131: | ||
---- | ---- | ||
− | '' | + | |
+ | '''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> | ||
+ | | | ||
+ | |- | ||
+ | | <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> | ||
+ | | | ||
+ | |- | ||
+ | |} | ||
+ | </div></div> | ||
+ | <br /> | ||
=== Public variables === | === Public variables === |
Revision as of 00:09, 18 January 2017
Return to Unit Reference
Contents
[hide]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
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
DMA request completed
TDMARequestCompleted = procedure(Request:PDMARequest);
|
DMA request
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
DMA host functions
[Expand]
function DMAHostProperties(DMA:PDMAHost; Properties:PDMAProperties):LongWord;
Description: To be documented
[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 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 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 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
Return to Unit Reference