Astra MCU SDK Peripheral Driver Library
 
Loading...
Searching...
No Matches
Command Linking Support

Command Linking Support for DMA driver.

Command Linking Support for DMA driver.

Command linking enables chaining multiple DMA operations together

Command linking allows the DMA controller to automatically execute a sequence of operations by loading descriptors from memory. This enables complex scatter-gather operations and multi-step transfers without CPU intervention.

Usage workflow:

  1. Create DMA configurations for each step in the chain
  2. Create descriptors with dma_create_descriptor()
  3. Link descriptors together with dma_link_descriptors()
  4. Start execution with dma_start_descriptor_chain()
  5. Free descriptors with dma_free_descriptor() when done

Example:

dma_channel_config_t config1, config2, config3;
// Buffers & descriptors (aligned for DMA)
__attribute__((aligned(32))) static uint32_t descbuf1
[DMA_DESCRIPTOR_BIT_COUNT] SRAM_DATA_ATTRIBUTE;
__attribute__((aligned(32))) static uint32_t descbuf2
[DMA_DESCRIPTOR_BIT_COUNT] SRAM_DATA_ATTRIBUTE;
__attribute__((aligned(32))) static uint32_t descbuf3
[DMA_DESCRIPTOR_BIT_COUNT] SRAM_DATA_ATTRIBUTE;
static dma_descriptor_handle_t desc1 = descbuf1;
static dma_descriptor_handle_t desc2 = descbuf2;
static dma_descriptor_handle_t desc3 = descbuf3;
// We assign desc buffers of size 32 bits (matching no.of bits in command linking header)
// Configure first transfer
config1.mode = DMA_TRANSFER_MODE_1D;
config1.config_1d.src_addr = 0x20000000;
config1.config_1d.dest_addr = 0x30000000;
config1.config_1d.transfer_size = 1024;
config1.config_1d.unit_size = DMA_UNIT_SIZE_4BYTES;
config1.callback = my_callback;
// Configure second transfer
config2 = config1;
config2.config_1d.src_addr = 0x20001000;
config2.config_1d.dest_addr = 0x30001000;
// Configure third transfer
config3 = config2;
config3.config_1d.src_addr = 0x20002000;
config3.config_1d.dest_addr = 0x30002000;
// Create descriptors
dma_create_descriptor(DMA_INSTANCE_0, &config1, NULL,
0x40000000, &desc1);
dma_create_descriptor(DMA_INSTANCE_0, &config2, &config1,
0x40000100, &desc2);
dma_create_descriptor(DMA_INSTANCE_0, &config3, &config2,
0x40000200, &desc3);
// Link descriptors
dma_link_descriptors(desc1, desc2);
dma_link_descriptors(desc2, desc3);
// Start execution
dma_start_descriptor_chain(DMA_INSTANCE_0, desc1);
// Clean up
@ DMA_TRANSFER_MODE_1D
Definition dma.h:202
@ DMA_UNIT_SIZE_4BYTES
Definition dma.h:258
dma_status_en dma_create_descriptor(dma_instance_en instance, uint32_t channel, const dma_channel_config_t *config, dma_descriptor_handle_t *descriptor_out)
dma_status_en dma_link_descriptors(dma_descriptor_handle_t first_desc, dma_descriptor_handle_t second_desc)
dma_status_en dma_start_descriptor_chain(dma_instance_en instance, uint32_t channel, dma_descriptor_handle_t *first_desc)
dma_status_en dma_free_descriptor(dma_descriptor_handle_t descriptor)
uint32_t * dma_descriptor_handle_t
Handle to a DMA descriptor.
Definition dma.h:180
DMA channel configuration.
Definition dma.h:638