DMAEMLIB

Detailed Description

Direct Memory Access (DMA) Peripheral API.

These DMA access functions provide basic support for the following types of DMA cycles:

  • Basic, used for transferring data between memory and peripherals.
  • Auto-request, used for transferring data between memory locations.
  • Ping-pong, used for for continuous transfer of data between memory and peripherals, automatically toggling between primary and alternate descriptors.
  • Memory scatter-gather, used for transferring a number of buffers between memory locations.
  • Peripheral scatter-gather, used for transferring a number of buffers between memory and peripherals.

A basic understanding of the DMA controller is assumed. Please refer to the reference manual for further details.

The term 'descriptor' is used as a synonym to the 'channel control data structure' term.

In order to use the DMA controller, the initialization function must have been executed once (normally during system init):

* DMA_Init();
* 

Then, normally a user of a DMA channel configures the channel:

* DMA_CfgChannel();
* 

The channel configuration only has to be done once, if reusing the channel for the same purpose later.

In order to set up a DMA cycle, the primary and/or alternate descriptor has to be set up as indicated below.

For basic or auto-request cycles, use once on either primary or alternate descriptor:

* DMA_CfgDescr();
* 

For ping-pong cycles, configure both primary or alternate descriptors:

* DMA_CfgDescr(); // Primary descriptor config
* DMA_CfgDescr(); // Alternate descriptor config
* 

For scatter-gather cycles, the alternate descriptor array must be programmed:

* // 'n' is the number of scattered buffers
* // 'descr' points to the start of the alternate descriptor array
*
* // Fill in 'cfg'
* DMA_CfgDescrScatterGather(descr, 0, cfg);
* // Fill in 'cfg'
* DMA_CfgDescrScatterGather(descr, 1, cfg);
* :
* // Fill in 'cfg'
* DMA_CfgDescrScatterGather(descr, n - 1, cfg);
* 

In many cases, the descriptor configuration only has to be done once, if re-using the channel for the same type of DMA cycles later.

In order to activate the DMA cycle, use the respective DMA_Activate...() function.

For ping-pong DMA cycles, use DMA_RefreshPingPong() from the callback to prepare the completed descriptor for reuse. Notice that the refresh must be done prior to the other active descriptor completes, otherwise the ping-pong DMA cycle will halt.

Data Structures

struct  DMA_CB_TypeDef
 Callback structure that can be used to define DMA complete actions.
 
struct  DMA_CfgChannel_TypeDef
 
struct  DMA_CfgDescr_TypeDef
 
struct  DMA_CfgDescrSGAlt_TypeDef
 
struct  DMA_CfgLoop_TypeDef
 
struct  DMA_CfgRect_TypeDef
 
struct  DMA_Init_TypeDef
 

Typedefs

typedef void(* DMA_FuncPtr_TypeDef) (unsigned int channel, bool primary, void *user)
 DMA interrupt callback function pointer.
 

Enumerations

enum  DMA_ArbiterConfig_TypeDef {
  dmaArbitrate1 = _DMA_CTRL_R_POWER_1,
  dmaArbitrate2 = _DMA_CTRL_R_POWER_2,
  dmaArbitrate4 = _DMA_CTRL_R_POWER_4,
  dmaArbitrate8 = _DMA_CTRL_R_POWER_8,
  dmaArbitrate16 = _DMA_CTRL_R_POWER_16,
  dmaArbitrate32 = _DMA_CTRL_R_POWER_32,
  dmaArbitrate64 = _DMA_CTRL_R_POWER_64,
  dmaArbitrate128 = _DMA_CTRL_R_POWER_128,
  dmaArbitrate256 = _DMA_CTRL_R_POWER_256,
  dmaArbitrate512 = _DMA_CTRL_R_POWER_512,
  dmaArbitrate1024 = _DMA_CTRL_R_POWER_1024
}
 
enum  DMA_CycleCtrl_TypeDef {
  dmaCycleCtrlBasic = _DMA_CTRL_CYCLE_CTRL_BASIC,
  dmaCycleCtrlAuto = _DMA_CTRL_CYCLE_CTRL_AUTO,
  dmaCycleCtrlPingPong = _DMA_CTRL_CYCLE_CTRL_PINGPONG,
  dmaCycleCtrlMemScatterGather = _DMA_CTRL_CYCLE_CTRL_MEM_SCATTER_GATHER,
  dmaCycleCtrlPerScatterGather = _DMA_CTRL_CYCLE_CTRL_PER_SCATTER_GATHER
}
 
enum  DMA_DataInc_TypeDef {
  dmaDataInc1 = _DMA_CTRL_SRC_INC_BYTE,
  dmaDataInc2 = _DMA_CTRL_SRC_INC_HALFWORD,
  dmaDataInc4 = _DMA_CTRL_SRC_INC_WORD,
  dmaDataIncNone = _DMA_CTRL_SRC_INC_NONE
}
 
enum  DMA_DataSize_TypeDef {
  dmaDataSize1 = _DMA_CTRL_SRC_SIZE_BYTE,
  dmaDataSize2 = _DMA_CTRL_SRC_SIZE_HALFWORD,
  dmaDataSize4 = _DMA_CTRL_SRC_SIZE_WORD
}
 

Functions

void DMA_ActivateAuto (unsigned int channel, bool primary, void *dst, const void *src, unsigned int nMinus1)
 Activate DMA auto-request cycle (used for memory-memory transfers).
 
void DMA_ActivateBasic (unsigned int channel, bool primary, bool useBurst, void *dst, const void *src, unsigned int nMinus1)
 Activate DMA basic cycle (used for memory-peripheral transfers).
 
void DMA_ActivatePingPong (unsigned int channel, bool useBurst, void *primDst, const void *primSrc, unsigned int primNMinus1, void *altDst, const void *altSrc, unsigned int altNMinus1)
 Activate DMA ping-pong cycle (used for memory-peripheral transfers).
 
void DMA_ActivateScatterGather (unsigned int channel, bool useBurst, DMA_DESCRIPTOR_TypeDef *altDescr, unsigned int count)
 Activate DMA scatter-gather cycle (used for either memory-peripheral or memory-memory transfers).
 
void DMA_CfgChannel (unsigned int channel, DMA_CfgChannel_TypeDef *cfg)
 Configure a DMA channel.
 
void DMA_CfgDescr (unsigned int channel, bool primary, DMA_CfgDescr_TypeDef *cfg)
 Configure DMA descriptor for auto-request, basic or ping-pong DMA cycles.
 
void DMA_CfgDescrScatterGather (DMA_DESCRIPTOR_TypeDef *descr, unsigned int indx, DMA_CfgDescrSGAlt_TypeDef *cfg)
 Configure an alternate DMA descriptor for use with scatter-gather DMA cycles.
 
void DMA_CfgLoop (unsigned int channel, DMA_CfgLoop_TypeDef *cfg)
 Configure DMA channel for Loop mode or 2D transfer.
 
void DMA_CfgRect (unsigned int channel, DMA_CfgRect_TypeDef *cfg)
 Configure DMA channel 2D transfer properties.
 
void DMA_ChannelEnable (unsigned int channel, bool enable)
 Enable or disable a DMA channel.
 
bool DMA_ChannelEnabled (unsigned int channel)
 Check if DMA channel is enabled.
 
void DMA_ChannelRequestEnable (unsigned int channel, bool enable)
 Enable or disable a DMA channel request.
 
void DMA_Init (DMA_Init_TypeDef *init)
 Initializes DMA controller.
 
__STATIC_INLINE void DMA_IntClear (uint32_t flags)
 Clear one or more pending DMA interrupts.
 
__STATIC_INLINE void DMA_IntDisable (uint32_t flags)
 Disable one or more DMA interrupts.
 
__STATIC_INLINE void DMA_IntEnable (uint32_t flags)
 Enable one or more DMA interrupts.
 
__STATIC_INLINE uint32_t DMA_IntGet (void)
 Get pending DMA interrupt flags.
 
__STATIC_INLINE uint32_t DMA_IntGetEnabled (void)
 Get enabled and pending DMA interrupt flags. Useful for handling more interrupt sources in the same interrupt handler.
 
__STATIC_INLINE void DMA_IntSet (uint32_t flags)
 Set one or more pending DMA interrupts.
 
void DMA_IRQHandler (void)
 Interrupt handler for DMA cycle completion handling.
 
void DMA_RefreshPingPong (unsigned int channel, bool primary, bool useBurst, void *dst, const void *src, unsigned int nMinus1, bool stop)
 Refresh a descriptor used in a DMA ping-pong cycle.
 
void DMA_Reset (void)
 Reset the DMA controller.
 
__STATIC_INLINE void DMA_ResetLoop (unsigned int channel)
 Clear Loop configuration for channel.
 
__STATIC_INLINE void DMA_ResetRect (unsigned int channel)
 Clear Rect/2D DMA configuration for channel.
 

Typedef Documentation

typedef void(* DMA_FuncPtr_TypeDef) (unsigned int channel, bool primary, void *user)

DMA interrupt callback function pointer.

Parameters:

  • channel - The DMA channel the callback function is invoked for.
  • primary - Indicates if callback is invoked for completion of primary (true) or alternate (false) descriptor. This is mainly useful for ping-pong DMA cycles, in order to know which descriptor to refresh.
  • user - User definable reference that may be used to pass information to be used by the callback handler. If used, the referenced data must be valid at the point when the interrupt handler invokes the callback. If callback changes any data in the provided user structure, remember that those changes are done in interrupt context, and proper protection of data may be required.

Definition at line 127 of file em_dma.h.

Enumeration Type Documentation

Number of transfers before controller does new arbitration.

Enumerator
dmaArbitrate1 

Arbitrate after 1 DMA transfer.

dmaArbitrate2 

Arbitrate after 2 DMA transfers.

dmaArbitrate4 

Arbitrate after 4 DMA transfers.

dmaArbitrate8 

Arbitrate after 8 DMA transfers.

dmaArbitrate16 

Arbitrate after 16 DMA transfers.

dmaArbitrate32 

Arbitrate after 32 DMA transfers.

dmaArbitrate64 

Arbitrate after 64 DMA transfers.

dmaArbitrate128 

Arbitrate after 128 DMA transfers.

dmaArbitrate256 

Arbitrate after 256 DMA transfers.

dmaArbitrate512 

Arbitrate after 512 DMA transfers.

dmaArbitrate1024 

Arbitrate after 1024 DMA transfers.

Definition at line 93 of file em_dma.h.

Type of DMA transfer.

Enumerator
dmaCycleCtrlBasic 

Basic DMA cycle.

dmaCycleCtrlAuto 

Auto-request DMA cycle.

dmaCycleCtrlPingPong 

Ping-pong DMA cycle.

dmaCycleCtrlMemScatterGather 

Memory scatter-gather DMA cycle.

dmaCycleCtrlPerScatterGather 

Peripheral scatter-gather DMA cycle.

Definition at line 79 of file em_dma.h.

Amount source/destination address should be incremented for each data transfer.

Enumerator
dmaDataInc1 

Increment address 1 byte.

dmaDataInc2 

Increment address 2 bytes.

dmaDataInc4 

Increment address 4 bytes.

dmaDataIncNone 

Do not increment address.

Definition at line 64 of file em_dma.h.

Data sizes (in number of bytes) to be read/written by DMA transfer.

Enumerator
dmaDataSize1 

1 byte DMA transfer size.

dmaDataSize2 

2 byte DMA transfer size.

dmaDataSize4 

4 byte DMA transfer size.

Definition at line 72 of file em_dma.h.

Function Documentation

void DMA_ActivateAuto ( unsigned int  channel,
bool  primary,
void *  dst,
const void *  src,
unsigned int  nMinus1 
)

Activate DMA auto-request cycle (used for memory-memory transfers).

Prior to activating the DMA cycle, the channel and descriptor to be used must have been properly configured.

Note
If using this function on a channel already activated and in use by the DMA controller, the behaviour is undefined.
Parameters
[in]channelDMA channel to activate DMA cycle for.
[in]primary
  • true - activate using primary descriptor
  • false - activate using alternate descriptor
[in]dstAddress to start location to transfer data to. If NULL, leave setting in descriptor as is from a previous activation.
[in]srcAddress to start location to transfer data from. If NULL, leave setting in descriptor as is from a previous activation.
[in]nMinus1Number of DMA transfer elements (minus 1) to transfer (<= 1023). The size of the DMA transfer element (1, 2 or 4 bytes) is configured with DMA_CfgDescr().

Definition at line 362 of file em_dma.c.

References _DMA_CTRL_N_MINUS_1_MASK, _DMA_CTRL_N_MINUS_1_SHIFT, DMA, DMA_CHAN_COUNT, and dmaCycleCtrlAuto.

void DMA_ActivateBasic ( unsigned int  channel,
bool  primary,
bool  useBurst,
void *  dst,
const void *  src,
unsigned int  nMinus1 
)

Activate DMA basic cycle (used for memory-peripheral transfers).

Prior to activating the DMA cycle, the channel and descriptor to be used must have been properly configured.

Note
If using this function on a channel already activated and in use by the DMA controller, the behaviour is undefined.
Parameters
[in]channelDMA channel to activate DMA cycle for.
[in]primary
  • true - activate using primary descriptor
  • false - activate using alternate descriptor
[in]useBurstThe burst feature is only used on peripherals supporting DMA bursts. Bursts must not be used if the total length (as given by nMinus1) is less than the arbitration rate configured for the descriptor. Please refer to the reference manual for further details on burst usage.
[in]dstAddress to start location to transfer data to. If NULL, leave setting in descriptor as is from a previous activation.
[in]srcAddress to start location to transfer data from. If NULL, leave setting in descriptor as is from a previous activation.
[in]nMinus1Number of DMA transfer elements (minus 1) to transfer (<= 1023). The size of the DMA transfer element (1, 2 or 4 bytes) is configured with DMA_CfgDescr().

Definition at line 424 of file em_dma.c.

References _DMA_CTRL_N_MINUS_1_MASK, _DMA_CTRL_N_MINUS_1_SHIFT, DMA, DMA_CHAN_COUNT, and dmaCycleCtrlBasic.

Referenced by CDC_StateChangeEvent().

void DMA_ActivatePingPong ( unsigned int  channel,
bool  useBurst,
void *  primDst,
const void *  primSrc,
unsigned int  primNMinus1,
void *  altDst,
const void *  altSrc,
unsigned int  altNMinus1 
)

Activate DMA ping-pong cycle (used for memory-peripheral transfers).

Prior to activating the DMA cycle, the channel and both descriptors must have been properly configured. The primary descriptor is always the first descriptor to be used by the DMA controller.

Note
If using this function on a channel already activated and in use by the DMA controller, the behaviour is undefined.
Parameters
[in]channelDMA channel to activate DMA cycle for.
[in]useBurstThe burst feature is only used on peripherals supporting DMA bursts. Bursts must not be used if the total length (as given by nMinus1) is less than the arbitration rate configured for the descriptors. Please refer to the reference manual for further details on burst usage. Notice that this setting is used for both the primary and alternate descriptors.
[in]primDstAddress to start location to transfer data to, for primary descriptor. If NULL, leave setting in descriptor as is from a previous activation.
[in]primSrcAddress to start location to transfer data from, for primary descriptor. If NULL, leave setting in descriptor as is from a previous activation.
[in]primNMinus1Number of DMA transfer elements (minus 1) to transfer (<= 1023), for primary descriptor. The size of the DMA transfer element (1, 2 or 4 bytes) is configured with DMA_CfgDescr().
[in]altDstAddress to start location to transfer data to, for alternate descriptor. If NULL, leave setting in descriptor as is from a previous activation.
[in]altSrcAddress to start location to transfer data from, for alternate descriptor. If NULL, leave setting in descriptor as is from a previous activation.
[in]altNMinus1Number of DMA transfer elements (minus 1) to transfer (<= 1023), for alternate descriptor. The size of the DMA transfer element (1, 2 or 4 bytes) is configured with DMA_CfgDescr().

Definition at line 495 of file em_dma.c.

References _DMA_CTRL_N_MINUS_1_MASK, _DMA_CTRL_N_MINUS_1_SHIFT, DMA, DMA_CHAN_COUNT, and dmaCycleCtrlPingPong.

void DMA_ActivateScatterGather ( unsigned int  channel,
bool  useBurst,
DMA_DESCRIPTOR_TypeDef altDescr,
unsigned int  count 
)

Activate DMA scatter-gather cycle (used for either memory-peripheral or memory-memory transfers).

Prior to activating the DMA cycle, the array with alternate descriptors must have been properly configured. This function can be reused without reconfiguring the alternate descriptors, as long as count is the same.

Note
If using this function on a channel already activated and in use by the DMA controller, the behaviour is undefined.
Parameters
[in]channelDMA channel to activate DMA cycle for.
[in]useBurstThe burst feature is only used on peripherals supporting DMA bursts (and thus this parameter is ignored for memory scatter-gather cycles). This parameter determines if bursts should be enabled during DMA transfers using the alternate descriptors. Bursts must not be used if the total length (as given by nMinus1 for the alternate descriptor) is less than the arbitration rate configured for the descriptor. Please refer to the reference manual for further details on burst usage.
[in,out]altDescrPointer to start of array with prepared alternate descriptors. The last descriptor will have its cycle control type reprogrammed to basic type.
[in]countNumber of alternate descriptors in altDescr array. Maximum number of alternate descriptors is 256.

Definition at line 564 of file em_dma.c.

References _DMA_CTRL_CYCLE_CTRL_MASK, _DMA_CTRL_CYCLE_CTRL_SHIFT, _DMA_CTRL_DST_INC_SHIFT, _DMA_CTRL_DST_SIZE_SHIFT, _DMA_CTRL_N_MINUS_1_SHIFT, _DMA_CTRL_NEXT_USEBURST_SHIFT, _DMA_CTRL_R_POWER_SHIFT, _DMA_CTRL_SRC_INC_SHIFT, _DMA_CTRL_SRC_PROT_CTRL_MASK, _DMA_CTRL_SRC_SIZE_SHIFT, DMA_DESCRIPTOR_TypeDef::CTRL, DMA, DMA_CHAN_COUNT, dmaArbitrate4, dmaCycleCtrlAuto, dmaCycleCtrlBasic, dmaCycleCtrlMemScatterGather, dmaCycleCtrlPerScatterGather, dmaDataInc4, dmaDataSize4, DMA_DESCRIPTOR_TypeDef::DSTEND, DMA_CB_TypeDef::primary, DMA_DESCRIPTOR_TypeDef::SRCEND, and DMA_DESCRIPTOR_TypeDef::USER.

void DMA_CfgChannel ( unsigned int  channel,
DMA_CfgChannel_TypeDef cfg 
)

Configure a DMA channel.

Configure miscellaneous issues for a DMA channel. This function is typically used once to setup a channel for a certain type of use.

Note
If using this function on a channel already in use by the DMA controller, the behaviour is undefined.
Parameters
[in]channelDMA channel to configure.
[in]cfgConfiguration to use.

Definition at line 668 of file em_dma.c.

References BUS_RegBitWrite(), DMA_CfgChannel_TypeDef::cb, DMA, DMA_CHAN_COUNT, DMA_CfgChannel_TypeDef::enableInt, DMA_CfgChannel_TypeDef::highPri, DMA_CfgChannel_TypeDef::select, and DMA_DESCRIPTOR_TypeDef::USER.

Referenced by NANDFLASH_Init().

void DMA_CfgDescr ( unsigned int  channel,
bool  primary,
DMA_CfgDescr_TypeDef cfg 
)

Configure DMA descriptor for auto-request, basic or ping-pong DMA cycles.

This function is used for configuration of a descriptor for the following DMA cycle types:

  • auto-request - used for memory/memory transfer
  • basic - used for a peripheral/memory transfer
  • ping-pong - used for a ping-pong based peripheral/memory transfer style providing time to refresh one descriptor while the other is in use.

The DMA cycle is not activated, please see DMA_ActivateAuto(), DMA_ActivateBasic() or DMA_ActivatePingPong() to activate the DMA cycle. In many cases, the configuration only has to be done once, and all subsequent cycles may be activated with the activate function.

For ping-pong DMA cycles, this function must be used both on the primary and the alternate descriptor prior to activating the DMA cycle.

Notice that the DMA channel must also be configured, see DMA_CfgChannel().

Note
If using this function on a descriptor already activated and in use by the DMA controller, the behaviour is undefined.
Parameters
[in]channelDMA channel to configure for.
[in]primary
  • true - configure primary descriptor
  • false - configure alternate descriptor
[in]cfgConfiguration to use.

Definition at line 736 of file em_dma.c.

References _DMA_CTRL_DST_INC_SHIFT, _DMA_CTRL_DST_SIZE_SHIFT, _DMA_CTRL_N_MINUS_1_SHIFT, _DMA_CTRL_NEXT_USEBURST_SHIFT, _DMA_CTRL_R_POWER_SHIFT, _DMA_CTRL_SRC_INC_SHIFT, _DMA_CTRL_SRC_PROT_CTRL_SHIFT, _DMA_CTRL_SRC_SIZE_SHIFT, DMA_CfgDescr_TypeDef::arbRate, DMA_DESCRIPTOR_TypeDef::CTRL, DMA, DMA_CHAN_COUNT, DMA_CTRL_CYCLE_CTRL_INVALID, DMA_CfgDescr_TypeDef::dstInc, DMA_CfgDescr_TypeDef::hprot, DMA_CfgDescr_TypeDef::size, and DMA_CfgDescr_TypeDef::srcInc.

void DMA_CfgDescrScatterGather ( DMA_DESCRIPTOR_TypeDef descr,
unsigned int  indx,
DMA_CfgDescrSGAlt_TypeDef cfg 
)

Configure an alternate DMA descriptor for use with scatter-gather DMA cycles.

In scatter-gather mode, the alternate descriptors are located in one contiguous memory area. Each of the alternate descriptor must be fully configured prior to starting the scatter-gather DMA cycle.

The DMA cycle is not activated by this function, please see DMA_ActivateScatterGather() to activate the DMA cycle. In some cases, the alternate configuration only has to be done once, and all subsequent transfers may be activated with the activate function.

Notice that the DMA channel must also be configured, see DMA_CfgChannel().

Parameters
[in]descrPoints to start of memory area holding the alternate descriptors.
[in]indxAlternate descriptor index number to configure (numbered from 0).
[in]cfgConfiguration to use.

Definition at line 851 of file em_dma.c.

References _DMA_CTRL_CYCLE_CTRL_SHIFT, _DMA_CTRL_DST_INC_SHIFT, _DMA_CTRL_DST_SIZE_SHIFT, _DMA_CTRL_N_MINUS_1_SHIFT, _DMA_CTRL_NEXT_USEBURST_SHIFT, _DMA_CTRL_R_POWER_SHIFT, _DMA_CTRL_SRC_INC_SHIFT, _DMA_CTRL_SRC_PROT_CTRL_SHIFT, _DMA_CTRL_SRC_SIZE_SHIFT, DMA_CfgDescrSGAlt_TypeDef::arbRate, DMA_DESCRIPTOR_TypeDef::CTRL, dmaCycleCtrlMemScatterGather, dmaCycleCtrlPerScatterGather, dmaDataIncNone, DMA_CfgDescrSGAlt_TypeDef::dst, DMA_DESCRIPTOR_TypeDef::DSTEND, DMA_CfgDescrSGAlt_TypeDef::dstInc, DMA_CfgDescrSGAlt_TypeDef::hprot, DMA_CfgDescrSGAlt_TypeDef::nMinus1, DMA_CfgDescrSGAlt_TypeDef::peripheral, DMA_CfgDescrSGAlt_TypeDef::size, DMA_CfgDescrSGAlt_TypeDef::src, DMA_DESCRIPTOR_TypeDef::SRCEND, DMA_CfgDescrSGAlt_TypeDef::srcInc, and DMA_DESCRIPTOR_TypeDef::USER.

void DMA_CfgLoop ( unsigned int  channel,
DMA_CfgLoop_TypeDef cfg 
)

Configure DMA channel for Loop mode or 2D transfer.

For 2D transfer, set cfg->enable to "false", and only configure nMinus1 to same width as channel descriptor.

Parameters
[in]channelDMA channel to configure for.
[in]cfgConfiguration to use.

Definition at line 780 of file em_dma.c.

References _DMA_LOOP0_EN_SHIFT, _DMA_LOOP0_WIDTH_SHIFT, _DMA_LOOP1_EN_SHIFT, _DMA_LOOP1_WIDTH_SHIFT, DMA, DMA_CfgLoop_TypeDef::enable, and DMA_CfgLoop_TypeDef::nMinus1.

void DMA_CfgRect ( unsigned int  channel,
DMA_CfgRect_TypeDef cfg 
)

Configure DMA channel 2D transfer properties.

Parameters
[in]channelDMA channel to configure for.
[in]cfgConfiguration to use.

Definition at line 809 of file em_dma.c.

References _DMA_RECT0_DSTSTRIDE_SHIFT, _DMA_RECT0_HEIGHT_SHIFT, _DMA_RECT0_SRCSTRIDE_SHIFT, DMA, DMA_CfgRect_TypeDef::dstStride, DMA_CfgRect_TypeDef::height, and DMA_CfgRect_TypeDef::srcStride.

void DMA_ChannelEnable ( unsigned int  channel,
bool  enable 
)

Enable or disable a DMA channel.

Use this function to explicitly enable or disable a DMA channel. A DMA channel is automatically disabled when the DMA controller has finished a transaction.

Parameters
[in]channelDMA channel to enable or disable.
[in]enableIf 'true' the channel will be enabled. If 'false' the channel will be disabled.

Definition at line 917 of file em_dma.c.

References DMA, and DMA_CHAN_COUNT.

Referenced by DMADRV_StopTransfer().

bool DMA_ChannelEnabled ( unsigned int  channel)

Check if DMA channel is enabled.

The DMA channel is disabled when the DMA controller has finished a DMA cycle.

Parameters
[in]channelDMA channel to check.
Returns
true if channel is enabled, false if not.

Definition at line 942 of file em_dma.c.

References DMA, and DMA_CHAN_COUNT.

Referenced by DMADRV_TransferActive().

void DMA_ChannelRequestEnable ( unsigned int  channel,
bool  enable 
)

Enable or disable a DMA channel request.

Use this function to enable or disable a DMA channel request. This will prevent the DMA from proceeding after its current transaction if disabled.

Parameters
[in]channelDMA channel to enable or disable request on.
[in]enableIf 'true' request will be enabled. If 'false' request will be disabled.

Definition at line 963 of file em_dma.c.

References BUS_RegBitWrite(), DMA, and DMA_CHAN_COUNT.

Referenced by DMADRV_PauseTransfer(), and DMADRV_ResumeTransfer().

void DMA_Init ( DMA_Init_TypeDef init)

Initializes DMA controller.

This function will reset and prepare the DMA controller for use. Although it may be used several times, it is normally only used during system init. If reused during normal operation, notice that any ongoing DMA transfers will be aborted. When completed, the DMA controller is in an enabled state.

Note
Must be invoked before using the DMA controller.
Parameters
[in]initPointer to a structure containing DMA init information.

Definition at line 991 of file em_dma.c.

References _DMA_CONFIG_CHPROT_SHIFT, CMU_ClockEnable(), cmuClock_DMA, DMA_Init_TypeDef::controlBlock, DMA, DMA_CONFIG_EN, DMA_IEN_ERR, DMA_IRQn, DMA_Reset(), and DMA_Init_TypeDef::hprot.

Referenced by DMADRV_Init(), and NANDFLASH_Init().

__STATIC_INLINE void DMA_IntClear ( uint32_t  flags)

Clear one or more pending DMA interrupts.

Parameters
[in]flagsPending DMA interrupt sources to clear. Use one or more valid interrupt flags for the DMA module (DMA_IFC_nnn).

Definition at line 437 of file em_dma.h.

References DMA.

__STATIC_INLINE void DMA_IntDisable ( uint32_t  flags)

Disable one or more DMA interrupts.

Parameters
[in]flagsDMA interrupt sources to disable. Use one or more valid interrupt flags for the DMA module (DMA_IEN_nnn).

Definition at line 450 of file em_dma.h.

References DMA.

__STATIC_INLINE void DMA_IntEnable ( uint32_t  flags)

Enable one or more DMA interrupts.

Note
Depending on the use, a pending interrupt may already be set prior to enabling the interrupt. Consider using DMA_IntClear() prior to enabling if such a pending interrupt should be ignored.
Parameters
[in]flagsDMA interrupt sources to enable. Use one or more valid interrupt flags for the DMA module (DMA_IEN_nnn).

Definition at line 468 of file em_dma.h.

References DMA.

__STATIC_INLINE uint32_t DMA_IntGet ( void  )

Get pending DMA interrupt flags.

Note
The event bits are not cleared by the use of this function.
Returns
DMA interrupt sources pending. Returns one or more valid interrupt flags for the DMA module (DMA_IF_nnn).

Definition at line 484 of file em_dma.h.

References DMA.

__STATIC_INLINE uint32_t DMA_IntGetEnabled ( void  )

Get enabled and pending DMA interrupt flags. Useful for handling more interrupt sources in the same interrupt handler.

Note
Interrupt flags are not cleared by the use of this function.
Returns
Pending and enabled DMA interrupt sources The return value is the bitwise AND of
  • the enabled interrupt sources in DMA_IEN and
  • the pending interrupt flags DMA_IF

Definition at line 503 of file em_dma.h.

References DMA.

__STATIC_INLINE void DMA_IntSet ( uint32_t  flags)

Set one or more pending DMA interrupts.

Parameters
[in]flagsDMA interrupt sources to set to pending. Use one or more valid interrupt flags for the DMA module (DMA_IFS_nnn).

Definition at line 519 of file em_dma.h.

References DMA.

void DMA_IRQHandler ( void  )

Interrupt handler for DMA cycle completion handling.

Clears any pending flags and calls registered callback (if any).

If using the default interrupt vector table setup provided, this function is automatically placed in the IRQ table due to weak linking. If taking control over the interrupt vector table in some other way, this interrupt handler must be installed in order to be able to support callback actions.

In order for the user to implement a custom IRQ handler or run without a DMA IRQ handler, the user can define EXCLUDE_DEFAULT_DMA_IRQ_HANDLER with a #define statement or with the compiler option -D.

Definition at line 266 of file em_dma.c.

References DMA_CB_TypeDef::cbFunc, DMA, DMA_IF_ERR, DMA_CB_TypeDef::primary, and DMA_CB_TypeDef::userPtr.

void DMA_RefreshPingPong ( unsigned int  channel,
bool  primary,
bool  useBurst,
void *  dst,
const void *  src,
unsigned int  nMinus1,
bool  stop 
)

Refresh a descriptor used in a DMA ping-pong cycle.

During a ping-pong DMA cycle, the DMA controller automatically alternates between primary and alternate descriptors, when completing use of a descriptor. While the other descriptor is in use by the DMA controller, the SW should refresh the completed descriptor. This is typically done from the callback defined for the ping-pong cycle.

Parameters
[in]channelDMA channel to refresh ping-pong descriptor for.
[in]primary
  • true - refresh primary descriptor
  • false - refresh alternate descriptor
[in]useBurstThe burst feature is only used on peripherals supporting DMA bursts. Bursts must not be used if the total length (as given by nMinus1) is less than the arbitration rate configured for the descriptor. Please refer to the reference manual for further details on burst usage.
[in]dstAddress to start location to transfer data to. If NULL, leave setting in descriptor as is.
[in]srcAddress to start location to transfer data from. If NULL, leave setting in descriptor as is.
[in]nMinus1Number of DMA transfer elements (minus 1) to transfer (<= 1023). The size of the DMA transfer element (1, 2 or 4 bytes) is configured with DMA_CfgDescr().
[in]stopIndicate that the DMA ping-pong cycle shall stop after completing use of this descriptor.

Definition at line 1068 of file em_dma.c.

References _DMA_CTRL_CYCLE_CTRL_MASK, _DMA_CTRL_CYCLE_CTRL_SHIFT, _DMA_CTRL_DST_INC_MASK, _DMA_CTRL_DST_INC_NONE, _DMA_CTRL_DST_INC_SHIFT, _DMA_CTRL_N_MINUS_1_MASK, _DMA_CTRL_N_MINUS_1_SHIFT, _DMA_CTRL_SRC_INC_MASK, _DMA_CTRL_SRC_INC_NONE, _DMA_CTRL_SRC_INC_SHIFT, DMA_DESCRIPTOR_TypeDef::CTRL, DMA, DMA_CHAN_COUNT, dmaCycleCtrlBasic, dmaCycleCtrlPingPong, DMA_DESCRIPTOR_TypeDef::DSTEND, and DMA_DESCRIPTOR_TypeDef::SRCEND.

void DMA_Reset ( void  )

Reset the DMA controller.

This functions will disable the DMA controller and set it to a reset state.

Note
Notice that any ongoing transfers will be aborted.

Definition at line 1142 of file em_dma.c.

References _DMA_CH_CTRL_RESETVALUE, _DMA_CHALTC_MASK, _DMA_CHENC_MASK, _DMA_CHPRIC_MASK, _DMA_CHREQMASKC_MASK, _DMA_CHUSEBURSTC_MASK, _DMA_CONFIG_RESETVALUE, _DMA_IEN_RESETVALUE, _DMA_IFC_MASK, DMA, DMA_CHAN_COUNT, DMA_ERRORC_ERRORC, and DMA_IRQn.

Referenced by DMA_Init().

__STATIC_INLINE void DMA_ResetLoop ( unsigned int  channel)

Clear Loop configuration for channel.

Parameters
[in]channelChannel to reset loop configuration for

Definition at line 380 of file em_dma.h.

References _DMA_LOOP0_RESETVALUE, _DMA_LOOP1_RESETVALUE, and DMA.

__STATIC_INLINE void DMA_ResetRect ( unsigned int  channel)

Clear Rect/2D DMA configuration for channel.

Parameters
[in]channelChannel to reset loop configuration for

Definition at line 404 of file em_dma.h.

References _DMA_RECT0_RESETVALUE, and DMA.