Direct Memory Access#
Introduction#
Direct Memory Access (DMA) is a process of transferring data from one memory location to another without the direct involvement of the processor (CPU). The main benefit of using DMA is more efficient data movement in the embedded system.
Here are some common applications of DMA in micro-controller systems:
Data Transfer: One of the primary uses of DMA is to facilitate data transfer between peripherals and memory
Memory-to-Memory Transfer: DMA can also be utilized for moving data between different memory locations, providing fast and efficient memory operations without CPU intervention. This is particularly useful for tasks like memory copying, memory clearing, or memory initialization.
Peripheral Initialization: DMA can assist in initializing peripheral registers or buffers by transferring predefined data patterns or configurations directly from memory to the peripheral registers, speeding up the initialization process.
Data Processing: DMA can be employed for offloading data processing tasks from the CPU to dedicated hardware peripherals.
Real-Time Systems: DMA is essential in real-time systems where predictable and deterministic data transfer is crucial. By minimizing CPU involvement in data transfer operations, DMA helps meet strict timing requirements and reduces the likelihood of missed deadlines in time-critical applications.
Power Management: DMA can contribute to power efficiency by reducing CPU wake-up times and allowing the CPU to enter low-power modes more frequently. By handling data transfer tasks autonomously, DMA can help optimize power consumption in battery-operated or energy-constrained systems.
Configuration#
Configuring DMA has three parameters that can be configured in such, if DAM instance configuration to configured through and call th API sl_si91x_dma_init(), DAM Channel can be configured in the range of 1-32 by passing the instance and channel in the API sl_si91x_dma_allocate_channel(), and transfer size also can be configured in the range of (1-10000).
For more information on configuring available parameters refer to the respective peripheral example readme document.
Usage#
The common DMA functions can be used after the DMA Structures are specified, passing an instance of sl_dma_init_t. These functions will initiate and configure the DMA below, which is the flow for implementation.
Modules#
Enumerations#
Enumeration holds transfer types of DMA.
Enumeration holds transfer modes of DMA.
Enumeration holds peripheral ACK signals to DMA.
Enumeration holds DMA transfer sizes.
Enumeration holds DMA transfer address increment for source and destination.
Enumeration holds 8-bit codes which are used by callback_type in sl_si91x_dma_unregister_callbacks function.
Typedefs#
Typedef for user-supplied callback function which is called when a DMA transfer completes.
Typedef for user-supplied callback function which is called when a DMA error occurs.
Functions#
This API initializes the DMA peripheral.
This function de-initializes the DMA peripheral.
This API allocates DMA channel for the transfer.
This API deallocates the DMA channel.
This API registers the DMA callbacks (transfer complete & error).
This API unregisters the DMA callbacks (transfer complete & error).
This API starts the DMA transfer.
This API starts a simple memory to memory DMA transfer.
This API stops DMA transfer.
This API returns the DMA channel status.
This API enables the DMA channel.
This API disables the DMA channel.
This API enables DMA peripheral.
Macros#
Enumeration Documentation#
sl_dma_transfer_type_t#
sl_dma_transfer_type_t
Enumeration holds transfer types of DMA.
Enumerator | |
---|---|
SL_DMA_MEMORY_TO_MEMORY | Memory to memory transfer. |
SL_DMA_MEMORY_TO_PERIPHERAL | Memory to peripheral transfer. |
SL_DMA_PERIPHERAL_TO_MEMORY | Peripheral to memory transfer. |
101
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_dma_transfer_mode_t#
sl_dma_transfer_mode_t
Enumeration holds transfer modes of DMA.
Enumerator | |
---|---|
SL_DMA_BASIC_MODE | Basic DMA mode. |
SL_DMA_PINGPONG_MODE | Ping pong mode. |
108
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_dma_peripheral_ack_t#
sl_dma_peripheral_ack_t
Enumeration holds peripheral ACK signals to DMA.
Enumerator | |
---|---|
SL_USART0_ACK | ACK code for USART0. |
SL_UART1_ACK | ACK code for UART1. |
SL_UART3_ACK | ACK code for UART3. |
SL_SSI_SLAVE_ACK | ACK code for SSI slave. |
SL_SSI_MASTER_ACK | ACK code for SSI master. |
SL_SSI1_SLAVE_ACK | ACK code for SSI1. |
SL_I2C_ACK | ACK code for I2C. |
114
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_dma_transfer_size_t#
sl_dma_transfer_size_t
Enumeration holds DMA transfer sizes.
Enumerator | |
---|---|
SL_TRANSFER_SIZE_32 | 4 bytes transfer size |
SL_TRANSFER_SIZE_16 | 2 bytes transfer size |
SL_TRANSFER_SIZE_8 | 1 bytes transfer size |
125
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_dma_transfer_inc_t#
sl_dma_transfer_inc_t
Enumeration holds DMA transfer address increment for source and destination.
Enumerator | |
---|---|
SL_TRANSFER_SRC_INC_32 | 4 bytes source address increment |
SL_TRANSFER_SRC_INC_16 | 2 bytes source address increment |
SL_TRANSFER_SRC_INC_8 | 1 byte source address increment |
SL_TRANSFER_SRC_INC_NONE | No source address increment. |
SL_TRANSFER_DST_INC_32 | 4 bytes destination address increment |
SL_TRANSFER_DST_INC_16 | 2 bytes destination address increment |
SL_TRANSFER_DST_INC_8 | 1 byte destination address increment |
SL_TRANSFER_DST_INC_NONE | No destination address increment. |
132
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_dma_callback_code_t#
sl_dma_callback_code_t
Enumeration holds 8-bit codes which are used by callback_type in sl_si91x_dma_unregister_callbacks function.
Enumerator | |
---|---|
SL_DMA_TRANSFER_DONE_CB | 8-bit code for transfer complete callback |
SL_DMA_ERROR_CB | 8-bit code for error callback |
145
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
Typedef Documentation#
sl_dma_transfer_complete#
typedef void(* sl_dma_transfer_complete) (uint32_t channel, void *data) )(uint32_t channel, void *data)
Typedef for user-supplied callback function which is called when a DMA transfer completes.
[in] | channel_no | DMA channel number |
[in] | *data | An extra parameter for user application |
89
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_dma_error#
typedef void(* sl_dma_error) (uint32_t channel, void *data) )(uint32_t channel, void *data)
Typedef for user-supplied callback function which is called when a DMA error occurs.
[in] | channel_no | DMA channel number |
[in] | *data | An extra parameter for user application |
98
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
Variable Documentation#
sl_dma0_channel_allocation_data_t#
sl_channel_data_t sl_dma0_channel_allocation_data_t[SL_DMA0_CHANNEL_COUNT]
DMA0 channel allocator.
183
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_ulp_dma_channel_allocation_data_t#
sl_channel_data_t sl_ulp_dma_channel_allocation_data_t[SL_ULP_DMA_CHANNEL_COUNT]
ULP_DMA channel allocator.
184
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
Function Documentation#
sl_si91x_dma_init#
sl_status_t sl_si91x_dma_init (sl_dma_init_t * dma_init)
This API initializes the DMA peripheral.
[in] | dma_init | DMA initialization structure, dma_init->dma_number - 0->UDMA0, 1->ULP_DMA |
This API enables DMA clock and clears DMA interrupts. Configure dma_init->dma_number to 0 for initializing UDMA0 and 1 for initializing ULP_DMA
Pre-condition:
none
Returns
Initialization status
SL_STATUS_OK - Initialization success
SL_STATUS_NOT_INITIALIZED - Initialization fail
206
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_si91x_dma_deinit#
sl_status_t sl_si91x_dma_deinit (uint32_t dma_number)
This function de-initializes the DMA peripheral.
[in] | dma_number | 0->UDMA0, 1->ULP_DMA |
This API disables the DMA peripheral clock and interrupts. DMA will be deinitialized only if there is no ongoing transfer.
Pre-condition:
Returns
deinitialization status
SL_STATUS_OK - Deinit success
SL_STATUS_BUSY - Cannot deinit the peripheral due to an ongoing transfer
SL_STATUS_NOT_INITIALIZED - DMA peripheral not initialized
221
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_si91x_dma_allocate_channel#
sl_status_t sl_si91x_dma_allocate_channel (uint32_t dma_number, uint32_t * channel_no, uint32_t priority)
This API allocates DMA channel for the transfer.
[in] | dma_number | dma_number 0->UDMA0, 1->ULP_DMA |
[in] | channel_no | 0 -> Automatically allocates available channel for DMA transfer (1-32) -> Allocates given channel for UDMA0 transfer (1-12) -> Allocates given channel for ULP_DMA transfer |
[in] | priority | 0 -> low priority 1 -> high priority |
This API checks the available DMA channel and allocates the channel. This function also sets the priority of the allocated channel and assigns the channel number to the *channel_no variable. If no channel is available, it will return SL_DMA_NO_CHANNEL_AVAILABLE. Note: Users can also initialize the desired channel number and this API checks whether the desired channel is available and allocates the channel if available. If users want the driver to allocate the available channel, channel_no should be initialized to 0.
Pre-condition:
Returns
channel allocation status:
SL_STATUS_OK - Channel allocated
SL_STATUS_DMA_NO_CHANNEL_AVAILABLE - All DMA channels are allocated
SL_STATUS_DMA_CHANNEL_ALLOCATED - The desired channel is already allocated
SL_STATUS_NOT_INITIALIZED - DMA peripheral not initialized
SL_STATUS_INVALID_PARAMETER - Channel no is invalid
245
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_si91x_dma_deallocate_channel#
sl_status_t sl_si91x_dma_deallocate_channel (uint32_t dma_number, uint32_t channel_no)
This API deallocates the DMA channel.
[in] | dma_number | dma_number 0->UDMA0, 1->ULP_DMA |
[in] | channel_no | (1-32) -> UDMA0 (1-12) -> ULP_DMA |
This API deallocates the DMA channel if there is no ongoing transfer on the channel. Deallocating the channel will also unregister the callbacks for transfer complete and error.
Pre-conditions:
Returns
channel deallocation status:
SL_STATUS_OK - Channel deallocated
SL_STATUS_BUSY - Cannot deallocate channel due to an ongoing transfer
SL_STATUS_NOT_INITIALIZED - DMA peripheral not initialized
SL_STATUS_INVALID_PARAMETER - Channel no is invalid
266
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_si91x_dma_register_callbacks#
sl_status_t sl_si91x_dma_register_callbacks (uint32_t dma_number, uint32_t channel_no, sl_dma_callback_t * callback_t)
This API registers the DMA callbacks (transfer complete & error).
[in] | dma_number | dma_number 0->UDMA0, 1->ULP_DMA |
[in] | channel_no | (1-32) -> UDMA0 (1-12) -> ULP_DMA |
[in] | callback_t | structure containing callback functions |
User must update the sl_dma_callback_t structure and pass its address to this function. A separate callback can be present for transfer complete and error for each channel.
Pre-conditions:
Returns
channel deallocation status:
SL_STATUS_OK - Callback registered successfully
SL_STATUS_INVALID_PARAMETER - Invalid channel number
SL_STATUS_NOT_INITIALIZED - DMA peripheral not initialized
287
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_si91x_dma_unregister_callbacks#
sl_status_t sl_si91x_dma_unregister_callbacks (uint32_t dma_number, uint32_t channel_no, uint8_t callback_type)
This API unregisters the DMA callbacks (transfer complete & error).
[in] | dma_number | dma_number 0->UDMA0, 1->ULP_DMA |
[in] | channel_no | (1-32) -> UDMA0 (1-12) -> ULP_DMA |
[in] | callback_type | Unregister the DMA callbacks based on the callback type (bit-mapped to callbacks), (SL_DMA_TRANSFER_DONE_CB) -> unregister transfer complete callback (SL_DMA_ERROR_CB) -> unregister error callback (SL_DMA_TRANSFER_DONE_CB | SL_DMA_ERROR_CB) -> unregister both transfer complete and error callback |
Users need to update the 8-bit variable callback_type and pass to the function Each bit is mapped to a specific callback.
Returns
channel de-allocation status:
SL_STATUS_OK - Callback unregistered successfully
SL_STATUS_INVALID_PARAMETER - Invalid channel number
SL_STATUS_NOT_INITIALIZED - DMA peripheral not initialized
311
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_si91x_dma_transfer#
sl_status_t sl_si91x_dma_transfer (uint32_t dma_number, uint32_t channel_no, sl_dma_xfer_t * dma_transfer_t)
This API starts the DMA transfer.
[in] | dma_number | dma_number 0->UDMA0, 1->ULP_DMA |
[in] | channel_no | (1-32) -> UDMA0 (1-12) -> ULP_DMA |
[in] | dma_transfer_t | channel transfer data structure containing channel descriptor and other basic DMA parameters. |
This API configures the DMA channel descriptor and initiates the DMA transfer DMA primary descriptor is updated in this function and based on transfer mode alternate descriptor is updated (only for ping pong mode). Also other DMA parameters like peripheral ACK signal (for peripheral memory transfers), DMA priority, etc. are updated in this function.
Returns
DMA transfer status:
SL_STATUS_OK - Transfer started successfully
SL_STATUS_SUSPENDED - Transfer initialization fails
SL_STATUS_NOT_INITIALIZED - DMA peripheral not initialized
SL_STATUS_INVALID_PARAMETER - Channel no is invalid
336
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_si91x_dma_simple_transfer#
sl_status_t sl_si91x_dma_simple_transfer (uint32_t dma_number, uint32_t channel_no, void * src_addr, void * dst_addr, uint32_t data_size)
This API starts a simple memory to memory DMA transfer.
[in] | dma_number | dma_number 0->UDMA0, 1->ULP_DMA |
[in] | channel_no | (1-32) -> UDMA0 (1-12) -> ULP_DMA |
[in] | src_addr | source address. |
[in] | dst_addr | destination address. |
[in] | data_size | transfer size in bytes |
This API configures the DMA channel descriptor and initiates simple memory-to-memory DMA transfer. Users need to pass the source address and destination address of the transfer along with transfer length in bytes.
Returns
DMA transfer status:
SL_STATUS_OK - Transfer success
SL_STATUS_SUSPENDED - Transfer initialization fails
SL_STATUS_NOT_INITIALIZED - DMA peripheral not initialized
SL_STATUS_INVALID_PARAMETER - Channel no is invalid
361
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_si91x_dma_stop_transfer#
sl_status_t sl_si91x_dma_stop_transfer (uint32_t dma_number, uint32_t channel_no)
This API stops DMA transfer.
[in] | dma_number | dma_number 0->UDMA0, 1->ULP_DMA |
[in] | channel_no | (1-32) -> UDMA0 (1-12) -> ULP_DMA |
This API stops any active transfer on the channel by disabling the DMA channel. If there is no active transfer on the channel, this function returns SL_DMA_CHANNEL_IDLE
Pre-conditions:
sl_si91x_dma_simple_transfer/sl_si91x_dma_transfer
Returns
DMA transfer status:
SL_STATUS_OK - Transfer stopped successfully
SL_STATUS_IDLE - There is no active transfer on the channel
SL_STATUS_INVALID_PARAMETER - Invalid channel number
SL_STATUS_NOT_INITIALIZED - DMA peripheral not initialized
386
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_si91x_dma_channel_status_get#
sl_status_t sl_si91x_dma_channel_status_get (uint32_t dma_number, uint32_t channel_no)
This API returns the DMA channel status.
[in] | dma_number | dma_number 0->UDMA0, 1->ULP_DMA |
[in] | channel_no | (1-32) -> UDMA0 (1-12) -> ULP_DMA |
This API returns the following channel status, SL_STATUS_DMA_CHANNEL_ALREADY_ALLOCATED - DMA channel allocated but no active transfer in progress SL_STATUS_BUSY - Channel is allocated and active transfer is in progress SL_STATUS_IDLE - Channel is not allocated.
Pre-conditions:
Returns
channel status
SL_STATUS_IDLE - Channel is not allocated
SL_STATUS_DMA_CHANNEL_ALREADY_ALLOCATED - Channel is already allocated and idle
SL_STATUS_BUSY - Channel is allocated and busy
SL_STATUS_NOT_INITIALIZED - DMA peripheral not initialized
SL_STATUS_INVALID_PARAMETER - Channel no is invalid
408
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_si91x_dma_channel_enable#
sl_status_t sl_si91x_dma_channel_enable (uint32_t dma_number, uint32_t channel_no)
This API enables the DMA channel.
[in] | dma_number | dma_number 0->UDMA0, 1->ULP_DMA |
[in] | channel_no | (1-32) -> UDMA0 (1-12) -> ULP_DMA |
Enabling channel will trigger DMA transfer if DMA is already enabled. Also, the channel should be allocated and transfer parameters should be configured before enabling the channel.
Pre-conditions:
Returns
channel status
SL_STATUS_OK - Channel enables success
SL_STATUS_NOT_INITIALIZED - DMA peripheral not initialized
SL_STATUS_INVALID_PARAMETER - Channel no is invalid
426
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_si91x_dma_channel_disable#
sl_status_t sl_si91x_dma_channel_disable (uint32_t dma_number, uint32_t channel_no)
This API disables the DMA channel.
[in] | dma_number | dma_number 0->UDMA0, 1->ULP_DMA |
[in] | channel_no | (1-32) -> UDMA0 (1-12) -> ULP_DMA |
Disabling the DMA channel will abort any ongoing active transfers on the channel. Enabling the channel back will not resume the previous transfer.
Pre-condition:
Returns
channel status
SL_STATUS_OK - Channel disable success
SL_STATUS_NOT_INITIALIZED - DMA peripheral not initialized
SL_STATUS_INVALID_PARAMETER - Channel no is invalid
443
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
sl_si91x_dma_enable#
sl_status_t sl_si91x_dma_enable (uint32_t dma_number)
This API enables DMA peripheral.
[in] | dma_number | dma_number 0->UDMA0, 1->ULP_DMA |
Enabling the DMA will trigger transfer if the channel is already enabled. Also, the channel should be allocated and transfer parameters should be configured before enabling the DMA.
Pre-condition:
Returns
SL_STATUS_OK - Channel enable success SL_STATUS_NOT_INITIALIZED - DMA peripheral not initialized
457
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
Macro Definition Documentation#
SL_STATUS_DMA_CHANNEL_ALLOCATED#
#define SL_STATUS_DMA_CHANNEL_ALLOCATEDValue:
(sl_status_t)0x45
49
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
SL_STATUS_DMA_NO_CHANNEL_AVAILABLE#
#define SL_STATUS_DMA_NO_CHANNEL_AVAILABLEValue:
(sl_status_t)0x46
51
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
SL_STATUS_DMA_CHANNEL_ALREADY_UNALLOCATED#
#define SL_STATUS_DMA_CHANNEL_ALREADY_UNALLOCATEDValue:
(sl_status_t)0X47
53
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
SL_STATUS_DMA_CHANNEL_UNALLOCATED#
#define SL_STATUS_DMA_CHANNEL_UNALLOCATEDValue:
(sl_status_t)0X48
55
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
SL_CHANNEL_COUNT#
#define SL_CHANNEL_COUNTValue:
32
57
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
ALTERNATE_DESCRIPTOR_DISABLE#
#define ALTERNATE_DESCRIPTOR_DISABLEValue:
0
59
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
ALTERNATE_DESCRIPTOR_ENABLE#
#define ALTERNATE_DESCRIPTOR_ENABLEValue:
1
60
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
BURST_REQUEST_ENABLE#
#define BURST_REQUEST_ENABLEValue:
1
61
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
BURST_REQUEST_DISABLE#
#define BURST_REQUEST_DISABLEValue:
0
62
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
CHANNEL_PRIO_DISABLE#
#define CHANNEL_PRIO_DISABLEValue:
0
63
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
CHANNEL_PRIO_ENABLE#
#define CHANNEL_PRIO_ENABLEValue:
1
64
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
PERIPHERAL_ACK_DISABLE#
#define PERIPHERAL_ACK_DISABLEValue:
0
65
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
PERIPHERAL_REQUEST_DISABLE#
#define PERIPHERAL_REQUEST_DISABLEValue:
0
66
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
PERIPHERAL_REQUEST_ENABLE#
#define PERIPHERAL_REQUEST_ENABLEValue:
1
67
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
REQUEST_MASK_DISABLE#
#define REQUEST_MASK_DISABLEValue:
0
68
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
NEXT_BURST_ENABLE#
#define NEXT_BURST_ENABLEValue:
70
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
NEXT_BURST_DISABLE#
#define NEXT_BURST_DISABLEValue:
0
72
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
SOURCE_PROTECT_CONTROL_DISABLE#
#define SOURCE_PROTECT_CONTROL_DISABLEValue:
0x000
73
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h
DESTINATION_PROTECT_CONTROL_DISABLE#
#define DESTINATION_PROTECT_CONTROL_DISABLEValue:
0x000
74
of file components/device/silabs/si91x/mcu/drivers/unified_api/inc/sl_si91x_dma.h