13#ifndef ZEPHYR_INCLUDE_DRIVERS_DMA_H_
14#define ZEPHYR_INCLUDE_DRIVERS_DMA_H_
106#ifdef CONFIG_DMA_64BIT
167#define DMA_STATUS_COMPLETE 0
169#define DMA_STATUS_BLOCK 1
306#define DMA_MAGIC 0x47494749
314typedef int (*dma_api_config)(
const struct device *dev,
uint32_t channel,
317#ifdef CONFIG_DMA_64BIT
318typedef int (*dma_api_reload)(
const struct device *dev,
uint32_t channel,
321typedef int (*dma_api_reload)(
const struct device *dev,
uint32_t channel,
325typedef int (*dma_api_start)(
const struct device *dev,
uint32_t channel);
327typedef int (*dma_api_stop)(
const struct device *dev,
uint32_t channel);
329typedef int (*dma_api_suspend)(
const struct device *dev,
uint32_t channel);
331typedef int (*dma_api_resume)(
const struct device *dev,
uint32_t channel);
333typedef int (*dma_api_get_status)(
const struct device *dev,
uint32_t channel,
351typedef bool (*dma_api_chan_filter)(
const struct device *dev,
352 int channel,
void *filter_param);
365typedef void (*dma_api_chan_release)(
const struct device *dev,
368__subsystem
struct dma_driver_api {
369 dma_api_config config;
370 dma_api_reload reload;
373 dma_api_suspend suspend;
374 dma_api_resume resume;
375 dma_api_get_status get_status;
376 dma_api_get_attribute get_attribute;
377 dma_api_chan_filter chan_filter;
378 dma_api_chan_release chan_release;
398 const struct dma_driver_api *api =
399 (
const struct dma_driver_api *)dev->
api;
401 return api->config(dev, channel, config);
417#ifdef CONFIG_DMA_64BIT
425 const struct dma_driver_api *api =
426 (
const struct dma_driver_api *)dev->
api;
429 return api->reload(dev, channel, src, dst, size);
456static inline int z_impl_dma_start(
const struct device *dev,
uint32_t channel)
458 const struct dma_driver_api *api =
459 (
const struct dma_driver_api *)dev->
api;
461 return api->start(dev, channel);
484static inline int z_impl_dma_stop(
const struct device *dev,
uint32_t channel)
486 const struct dma_driver_api *api =
487 (
const struct dma_driver_api *)dev->
api;
489 return api->stop(dev, channel);
511static inline int z_impl_dma_suspend(
const struct device *dev,
uint32_t channel)
513 const struct dma_driver_api *api = (
const struct dma_driver_api *)dev->
api;
515 if (api->suspend ==
NULL) {
518 return api->suspend(dev, channel);
539static inline int z_impl_dma_resume(
const struct device *dev,
uint32_t channel)
541 const struct dma_driver_api *api = (
const struct dma_driver_api *)dev->
api;
543 if (api->resume ==
NULL) {
546 return api->resume(dev, channel);
568static inline int z_impl_dma_request_channel(
const struct device *dev,
573 const struct dma_driver_api *api =
574 (
const struct dma_driver_api *)dev->
api;
582 for (i = 0; i < dma_ctx->dma_channels; i++) {
584 if (api->chan_filter &&
585 !api->chan_filter(dev, i, filter_param)) {
613static inline void z_impl_dma_release_channel(
const struct device *dev,
616 const struct dma_driver_api *api =
617 (
const struct dma_driver_api *)dev->
api;
625 if (api->chan_release) {
626 api->chan_release(dev, channel);
647 int channel,
void *filter_param);
649static inline int z_impl_dma_chan_filter(
const struct device *dev,
650 int channel,
void *filter_param)
652 const struct dma_driver_api *api =
653 (
const struct dma_driver_api *)dev->
api;
655 if (api->chan_filter) {
656 return api->chan_filter(dev, channel, filter_param);
681 const struct dma_driver_api *api =
682 (
const struct dma_driver_api *)dev->
api;
684 if (api->get_status) {
685 return api->get_status(dev, channel,
stat);
710 const struct dma_driver_api *api = (
const struct dma_driver_api *)dev->
api;
712 if (api->get_attribute) {
713 return api->get_attribute(dev, type, value);
735 if (size < 1 || size > 32) {
764 if (burst < 1 || burst > 256) {
769 if (!(burst & (burst - 1))) {
786#define DMA_BUF_ADDR_ALIGNMENT(node) DT_PROP(node, dma_buf_addr_alignment)
797#define DMA_BUF_SIZE_ALIGNMENT(node) DT_PROP(node, dma_buf_size_alignment)
805#define DMA_COPY_ALIGNMENT(node) DT_PROP(node, dma_copy_alignment)
815#include <zephyr/syscalls/dma.h>
long atomic_t
Definition atomic_types.h:15
static ALWAYS_INLINE unsigned int find_msb_set(uint32_t op)
find most significant bit set in a 32-bit word
Definition ffs.h:32
static void atomic_clear_bit(atomic_t *target, int bit)
Atomically clear a bit.
Definition atomic.h:191
static bool atomic_test_and_set_bit(atomic_t *target, int bit)
Atomically set a bit and test it.
Definition atomic.h:170
dma_attribute_type
DMA attributes.
Definition dma.h:91
static int dma_get_status(const struct device *dev, uint32_t channel, struct dma_status *stat)
get current runtime status of DMA transfer
Definition dma.h:678
int dma_stop(const struct device *dev, uint32_t channel)
Stops the DMA transfer and disables the channel.
static int dma_reload(const struct device *dev, uint32_t channel, uint32_t src, uint32_t dst, size_t size)
Reload buffer(s) for a DMA channel.
Definition dma.h:421
static int dma_get_attribute(const struct device *dev, uint32_t type, uint32_t *value)
get attribute of a dma controller
Definition dma.h:708
int dma_suspend(const struct device *dev, uint32_t channel)
Suspend a DMA channel transfer.
int dma_chan_filter(const struct device *dev, int channel, void *filter_param)
DMA channel filter.
int dma_resume(const struct device *dev, uint32_t channel)
Resume a DMA channel transfer.
int dma_request_channel(const struct device *dev, void *filter_param)
request DMA channel.
static uint32_t dma_burst_index(uint32_t burst)
Look-up generic burst index to be used in registers.
Definition dma.h:761
void dma_release_channel(const struct device *dev, uint32_t channel)
release DMA channel.
int dma_start(const struct device *dev, uint32_t channel)
Enables DMA channel and starts the transfer, the channel must be configured beforehand.
void(* dma_callback_t)(const struct device *dev, void *user_data, uint32_t channel, int status)
Callback function for DMA transfer completion.
Definition dma.h:189
static uint32_t dma_width_index(uint32_t size)
Look-up generic width index to be used in registers.
Definition dma.h:732
dma_channel_filter
DMA channel attributes.
Definition dma.h:83
#define DMA_MAGIC
Magic code to identify context content.
Definition dma.h:306
dma_channel_direction
DMA channel direction.
Definition dma.h:35
dma_addr_adj
DMA address adjustment.
Definition dma.h:71
@ DMA_ATTR_BUFFER_ADDRESS_ALIGNMENT
Definition dma.h:92
@ DMA_ATTR_COPY_ALIGNMENT
Definition dma.h:94
@ DMA_ATTR_BUFFER_SIZE_ALIGNMENT
Definition dma.h:93
@ DMA_ATTR_MAX_BLOCK_COUNT
Definition dma.h:95
@ DMA_CHANNEL_NORMAL
Definition dma.h:84
@ DMA_CHANNEL_PERIODIC
Definition dma.h:85
@ DMA_CHANNEL_DIRECTION_PRIV_START
This and higher values are dma controller or soc specific.
Definition dma.h:58
@ MEMORY_TO_PERIPHERAL
Memory to peripheral.
Definition dma.h:39
@ MEMORY_TO_MEMORY
Memory to memory.
Definition dma.h:37
@ PERIPHERAL_TO_MEMORY
Peripheral to memory.
Definition dma.h:41
@ MEMORY_TO_HOST
Memory to host.
Definition dma.h:47
@ HOST_TO_MEMORY
Host to memory.
Definition dma.h:45
@ DMA_CHANNEL_DIRECTION_MAX
Maximum allowed value (3 bit field!)
Definition dma.h:63
@ PERIPHERAL_TO_PERIPHERAL
Peripheral to peripheral.
Definition dma.h:43
@ DMA_CHANNEL_DIRECTION_COMMON_COUNT
Number of all common channel directions.
Definition dma.h:52
@ DMA_ADDR_ADJ_DECREMENT
Decrement the address.
Definition dma.h:75
@ DMA_ADDR_ADJ_INCREMENT
Increment the address.
Definition dma.h:73
@ DMA_ADDR_ADJ_NO_CHANGE
No change the address.
Definition dma.h:77
static bool is_power_of_two(unsigned int x)
Is x a power of two?
Definition util.h:456
#define EINVAL
Invalid argument.
Definition errno.h:60
#define ENOSYS
Function not implemented.
Definition errno.h:82
#define NULL
Definition iar_missing_defs.h:20
#define bool
Definition stdbool.h:13
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__INT32_TYPE__ int32_t
Definition stdint.h:74
__UINT64_TYPE__ uint64_t
Definition stdint.h:91
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Runtime device structure (in ROM) per driver instance.
Definition device.h:510
void * data
Address of the device instance private data.
Definition device.h:520
const void * api
Address of the API structure exposed by the device instance.
Definition device.h:516
DMA block configuration structure.
Definition dma.h:105
uint32_t dest_scatter_interval
Address adjustment at scatter boundary.
Definition dma.h:120
uint32_t source_gather_interval
Address adjustment at gather boundary.
Definition dma.h:118
uint32_t block_size
Number of bytes to be transferred for this block.
Definition dma.h:126
uint16_t source_reload_en
Reload source address at the end of block transfer.
Definition dma.h:150
uint16_t dest_scatter_en
Enable destination scattering when set to 1.
Definition dma.h:132
uint16_t dest_reload_en
Reload destination address at the end of block transfer.
Definition dma.h:152
uint16_t fifo_mode_control
FIFO fill before starting transfer, HW specific meaning.
Definition dma.h:154
uint16_t source_gather_count
Continuous transfer count between gather boundaries.
Definition dma.h:124
uint16_t source_addr_adj
Source address adjustment option.
Definition dma.h:140
struct dma_block_config * next_block
Pointer to next block in a transfer list.
Definition dma.h:128
uint32_t dest_address
block starting address at destination
Definition dma.h:115
uint32_t source_address
block starting address at source
Definition dma.h:113
uint16_t source_gather_en
Enable source gathering when set to 1.
Definition dma.h:130
uint16_t dest_addr_adj
Destination address adjustment.
Definition dma.h:148
uint16_t dest_scatter_count
Continuous transfer count between scatter boundaries.
Definition dma.h:122
uint16_t flow_control_mode
Transfer flow control mode.
Definition dma.h:161
DMA configuration structure.
Definition dma.h:196
uint32_t channel_priority
Channel priority for arbitration, HW specific.
Definition dma.h:242
uint32_t source_handshake
Source handshake, HW specific.
Definition dma.h:231
uint32_t complete_callback_en
Completion callback enable.
Definition dma.h:217
uint32_t error_callback_dis
Error callback disable.
Definition dma.h:224
void * user_data
Optional attached user data for callbacks.
Definition dma.h:266
dma_callback_t dma_callback
Optional callback for completion and error events.
Definition dma.h:268
uint32_t source_chaining_en
Source chaining enable, HW specific.
Definition dma.h:244
uint32_t dest_chaining_en
Destination chaining enable, HW specific.
Definition dma.h:246
uint32_t dma_slot
Which peripheral and direction, HW specific.
Definition dma.h:198
uint32_t channel_direction
Direction the transfers are occurring.
Definition dma.h:210
uint32_t source_data_size
Width of source data (in bytes)
Definition dma.h:254
uint32_t dest_burst_length
Destination burst length in bytes.
Definition dma.h:260
struct dma_block_config * head_block
Pointer to the first block in the transfer list.
Definition dma.h:264
uint32_t linked_channel
Linked channel, HW specific.
Definition dma.h:248
uint32_t source_burst_length
Source burst length in bytes.
Definition dma.h:258
uint32_t block_count
Number of blocks in transfer list.
Definition dma.h:262
uint32_t dest_data_size
Width of destination data (in bytes)
Definition dma.h:256
uint32_t dest_handshake
Destination handshake, HW specific.
Definition dma.h:238
uint32_t cyclic
Cyclic transfer list, HW specific.
Definition dma.h:250
DMA context structure Note: the dma_context shall be the first member of DMA client driver Data,...
Definition dma.h:296
int32_t magic
magic code to identify the context
Definition dma.h:298
atomic_t * atomic
atomic holding bit flags for each channel to mark as used/unused
Definition dma.h:302
int dma_channels
number of dma channels
Definition dma.h:300
DMA runtime status structure.
Definition dma.h:274
uint32_t free
Available buffers space, HW specific.
Definition dma.h:282
uint32_t pending_length
Pending length to be transferred in bytes, HW specific.
Definition dma.h:280
bool busy
Is the current DMA transfer busy or idle.
Definition dma.h:276
uint64_t total_copied
Total copied, HW specific.
Definition dma.h:288
uint32_t write_position
Write position in circular DMA buffer, HW specific.
Definition dma.h:284
enum dma_channel_direction dir
Direction for the transfer.
Definition dma.h:278
uint32_t read_position
Read position in circular DMA buffer, HW specific.
Definition dma.h:286