procedure Ack_IRQ (Channel : DMA_Channel_Id;
IRQ : DMA_IRQ_Id)
function Busy
(Channel : DMA_Channel_Id)
return Boolean
function Checksum
return HAL.UInt32
type Checksum_Algorithm is
(CRC_32,
CRC_32R,
CRC_16,
CRC_16R,
EVEN,
SUM);
CRC-32 (IEEE802.3 polynomial)
CRC-32 (IEEE802.3 polynomial) with bit reversed data
CRC-16-CCITT
CRC-16-CCITT with bit reversed data
XOR reduction over all data. == 1 if total 1 population count is odd
Calculate a simple 32-bit checksum (addition with 32 bit accumulator)
procedure Configure
(Channel : DMA_Channel_Id;
Config : DMA_Configuration)
procedure Disable
(Channel : DMA_Channel_Id)
procedure Disable_IRQ (Channel : DMA_Channel_Id;
IRQ : DMA_IRQ_Id)
type DMA_Channel_Id is range 0 .. 11
with Size => 4;
type DMA_Configuration is record
High_Priority : Boolean := False;
Data_Size : Transfer_Width := Transfer_8;
Increment_Read : Boolean := False;
Increment_Write : Boolean := False;
Ring_Size : HAL.UInt4 := 0;
Ring_Wrap : Ring_Wrap_Select := Wrap_Read;
Chain_To : DMA_Channel_Id := 0;
Trigger : DMA_Request_Trigger := PERMANENT;
Quiet : Boolean := False;
Byte_Swap : Boolean := False;
Sniff : Boolean := False;
end record;
Schedule this channel before others
Bits per transfer (byte, halfword, word)
Increment read address after transfer
Increment write address after transfer
Ring buffer size
Read or write buffer is a ring buffer
Trigger another channel after transfer.
Trigger a transfer on this signal
Disable interrupts
Reverse byte order
Send data to sniff checksum
subtype DMA_IRQ_Id is Natural range 0 .. 1;
type DMA_Request_Trigger is
(PIO0_TX0, PIO0_TX1, PIO0_TX2, PIO0_TX3, PIO0_RX0, PIO0_RX1, PIO0_RX2, PIO0_RX3,
PIO1_TX0, PIO1_TX1, PIO1_TX2, PIO1_TX3, PIO1_RX0, PIO1_RX1, PIO1_RX2, PIO1_RX3,
SPI0_TX, SPI0_RX,
SPI1_TX, SPI1_RX,
UART0_TX, UART0_RX,
UART1_TX, UART1_RX,
PWM_WRAP0, PWM_WRAP1, PWM_WRAP2, PWM_WRAP3, PWM_WRAP4, PWM_WRAP5, PWM_WRAP6, PWM_WRAP7,
I2C0_TX, I2C0_RX,
I2C1_TX, I2C1_RX,
ADC,
XIP_STREAM, XIP_SSITX, XIP_SSIRX,
TIMER0, TIMER1, TIMER2, TIMER3,
PERMANENT)
with Size => 6;
type DMA_Status is record
Enabled : Boolean := False;
Busy : Boolean := False;
Write_Error : Boolean := False;
Read_Error : Boolean := False;
AHB_Error : Boolean := False;
Transfers_Remaining : Natural := 0;
end record;
subtype DMA_Timer_Id is DMA_Request_Trigger range TIMER0 .. TIMER3;
procedure Enable
procedure Enable_Checksum
(Channel : DMA_Channel_Id;
Algorithm : Checksum_Algorithm;
Byte_Swap : Boolean := False;
Reversed : Boolean := False;
Inverted : Boolean := False)
procedure Enable_IRQ (Channel : DMA_Channel_Id;
IRQ : DMA_IRQ_Id)
function IRQ_Status (Channel : DMA_Channel_Id;
IRQ : DMA_IRQ_Id)
return Boolean
Return True if the IRQ is triggered
type Ring_Wrap_Select is (Wrap_Read, Wrap_Write)
with Size => 1;
procedure Set_Checksum
(Value : HAL.UInt32)
procedure Set_Pacing_Timer
(Timer : DMA_Timer_Id;
X, Y : HAL.UInt16)
The pacing timer produces TREQ assertions at a rate set by ((X/Y) * sys_clk). This equation is evaluated every sys_clk cycles and therefore can only generate TREQs at a rate of 1 per sys_clk (i.e. permanent TREQ) or less.
procedure Setup
(Channel : DMA_Channel_Id;
From, To : System.Address;
Count : HAL.UInt32)
procedure Start
(Channel : DMA_Channel_Id)
Setup must be called before Start. If you call Start more than once and Increment_Read or Increment_Write are True, these pointers are *not* reset to their initial Setup values, unless you've configured the channel with Ring_Wrap and Ring_Size.
procedure Start
(Channel : DMA_Channel_Id;
From, To : System.Address;
Count : HAL.UInt32)
This version of Start performs the Setup for you.
function Status
(Channel : DMA_Channel_Id)
return DMA_Status
type Transfer_Width is (Transfer_8, Transfer_16, Transfer_32)
with Size => 2;