13#ifndef ZEPHYR_INCLUDE_DRIVERS_DMA_H_ 
   14#define ZEPHYR_INCLUDE_DRIVERS_DMA_H_ 
  115#ifdef CONFIG_DMA_64BIT 
  139#define DMA_STATUS_COMPLETE     0 
  140#define DMA_STATUS_BLOCK        1 
  265#define DMA_MAGIC 0x47494749 
  273typedef int (*dma_api_config)(
const struct device *dev, 
uint32_t channel,
 
  276#ifdef CONFIG_DMA_64BIT 
  277typedef int (*dma_api_reload)(
const struct device *dev, 
uint32_t channel,
 
  280typedef int (*dma_api_reload)(
const struct device *dev, 
uint32_t channel,
 
  284typedef int (*dma_api_start)(
const struct device *dev, 
uint32_t channel);
 
  286typedef int (*dma_api_stop)(
const struct device *dev, 
uint32_t channel);
 
  288typedef int (*dma_api_suspend)(
const struct device *dev, 
uint32_t channel);
 
  290typedef int (*dma_api_resume)(
const struct device *dev, 
uint32_t channel);
 
  292typedef int (*dma_api_get_status)(
const struct device *dev, 
uint32_t channel,
 
  310typedef bool (*dma_api_chan_filter)(
const struct device *dev,
 
  311                                int channel, 
void *filter_param);
 
  313__subsystem 
struct dma_driver_api {
 
  314        dma_api_config config;
 
  315        dma_api_reload reload;
 
  318        dma_api_suspend suspend;
 
  319        dma_api_resume resume;
 
  320        dma_api_get_status get_status;
 
  321        dma_api_get_attribute get_attribute;
 
  322        dma_api_chan_filter chan_filter;
 
  342        const struct dma_driver_api *api =
 
  343                (
const struct dma_driver_api *)dev->
api;
 
  345        return api->config(dev, channel, config);
 
  361#ifdef CONFIG_DMA_64BIT 
  369        const struct dma_driver_api *api =
 
  370                (
const struct dma_driver_api *)dev->
api;
 
  373                return api->reload(dev, channel, src, dst, size);
 
  398static inline int z_impl_dma_start(
const struct device *dev, 
uint32_t channel)
 
  400        const struct dma_driver_api *api =
 
  401                (
const struct dma_driver_api *)dev->
api;
 
  403        return api->start(dev, channel);
 
  424static inline int z_impl_dma_stop(
const struct device *dev, 
uint32_t channel)
 
  426        const struct dma_driver_api *api =
 
  427                (
const struct dma_driver_api *)dev->
api;
 
  429        return api->stop(dev, channel);
 
  449static inline int z_impl_dma_suspend(
const struct device *dev, 
uint32_t channel)
 
  451        const struct dma_driver_api *api = (
const struct dma_driver_api *)dev->
api;
 
  453        if (api->suspend == NULL) {
 
  456        return api->suspend(dev, channel);
 
  475static inline int z_impl_dma_resume(
const struct device *dev, 
uint32_t channel)
 
  477        const struct dma_driver_api *api = (
const struct dma_driver_api *)dev->
api;
 
  479        if (api->resume == NULL) {
 
  482        return api->resume(dev, channel);
 
  500static inline int z_impl_dma_request_channel(
const struct device *dev,
 
  505        const struct dma_driver_api *api =
 
  506                (
const struct dma_driver_api *)dev->
api;
 
  514        for (i = 0; i < dma_ctx->dma_channels; i++) {
 
  516                        if (api->chan_filter &&
 
  517                            !api->chan_filter(dev, i, filter_param)) {
 
  541static inline void z_impl_dma_release_channel(
const struct device *dev,
 
  569                                   int channel, 
void *filter_param);
 
  571static inline int z_impl_dma_chan_filter(
const struct device *dev,
 
  572                                              int channel, 
void *filter_param)
 
  574        const struct dma_driver_api *api =
 
  575                (
const struct dma_driver_api *)dev->
api;
 
  577        if (api->chan_filter) {
 
  578                return api->chan_filter(dev, channel, filter_param);
 
  601        const struct dma_driver_api *api =
 
  602                (
const struct dma_driver_api *)dev->
api;
 
  604        if (api->get_status) {
 
  605                return api->get_status(dev, channel, 
stat);
 
  628        const struct dma_driver_api *api = (
const struct dma_driver_api *)dev->
api;
 
  630        if (api->get_attribute) {
 
  631                return api->get_attribute(dev, type, value);
 
  653        if (size < 1 || size > 32) {
 
  682        if (burst < 1 || burst > 256) {
 
  687        if (!(burst & (burst - 1))) {
 
  704#define DMA_BUF_ADDR_ALIGNMENT(node) DT_PROP(node, dma_buf_addr_alignment) 
  715#define DMA_BUF_SIZE_ALIGNMENT(node) DT_PROP(node, dma_buf_size_alignment) 
  723#define DMA_COPY_ALIGNMENT(node) DT_PROP(node, dma_copy_alignment) 
  733#include <syscalls/dma.h> 
long atomic_t
Definition: atomic.h:22
 
static ALWAYS_INLINE unsigned int find_msb_set(uint32_t op)
find most significant bit set in a 32-bit word
Definition: ffs.h:31
 
static void atomic_clear_bit(atomic_t *target, int bit)
Atomically clear a bit.
Definition: atomic.h:198
 
static bool atomic_test_and_set_bit(atomic_t *target, int bit)
Atomically set a bit.
Definition: atomic.h:176
 
dma_attribute_type
Definition: dma.h:70
 
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:598
 
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:365
 
static int dma_get_attribute(const struct device *dev, uint32_t type, uint32_t *value)
get attribute of a dma controller
Definition: dma.h:626
 
int dma_suspend(const struct device *dev, uint32_t channel)
Suspend a DMA channel transfer.
 
static int dma_config(const struct device *dev, uint32_t channel, struct dma_config *config)
Configure individual channel for DMA transfer.
Definition: dma.h:339
 
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:679
 
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:159
 
static uint32_t dma_width_index(uint32_t size)
Look-up generic width index to be used in registers.
Definition: dma.h:650
 
dma_channel_filter
Definition: dma.h:64
 
#define DMA_MAGIC
Definition: dma.h:265
 
dma_channel_direction
Definition: dma.h:31
 
dma_addr_adj
Definition: dma.h:57
 
@ DMA_ATTR_BUFFER_ADDRESS_ALIGNMENT
Definition: dma.h:71
 
@ DMA_ATTR_COPY_ALIGNMENT
Definition: dma.h:73
 
@ DMA_ATTR_BUFFER_SIZE_ALIGNMENT
Definition: dma.h:72
 
@ DMA_ATTR_MAX_BLOCK_COUNT
Definition: dma.h:74
 
@ DMA_CHANNEL_NORMAL
Definition: dma.h:65
 
@ DMA_CHANNEL_PERIODIC
Definition: dma.h:66
 
@ DMA_CHANNEL_DIRECTION_PRIV_START
Definition: dma.h:48
 
@ MEMORY_TO_PERIPHERAL
Definition: dma.h:33
 
@ MEMORY_TO_MEMORY
Definition: dma.h:32
 
@ PERIPHERAL_TO_MEMORY
Definition: dma.h:34
 
@ MEMORY_TO_HOST
Definition: dma.h:37
 
@ HOST_TO_MEMORY
Definition: dma.h:36
 
@ DMA_CHANNEL_DIRECTION_MAX
Definition: dma.h:53
 
@ PERIPHERAL_TO_PERIPHERAL
Definition: dma.h:35
 
@ DMA_CHANNEL_DIRECTION_COMMON_COUNT
Definition: dma.h:42
 
@ DMA_ADDR_ADJ_DECREMENT
Definition: dma.h:59
 
@ DMA_ADDR_ADJ_INCREMENT
Definition: dma.h:58
 
@ DMA_ADDR_ADJ_NO_CHANGE
Definition: dma.h:60
 
static bool is_power_of_two(unsigned int x)
Is x a power of two?
Definition: util.h:336
 
#define EINVAL
Definition: errno.h:61
 
#define ENOSYS
Definition: errno.h:83
 
#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:380
 
void * data
Definition: device.h:390
 
const void * api
Definition: device.h:386
 
DMA block configuration structure.
Definition: dma.h:114
 
uint32_t dest_scatter_interval
Definition: dma.h:123
 
uint16_t reserved
Definition: dma.h:136
 
uint32_t source_gather_interval
Definition: dma.h:122
 
uint32_t block_size
Definition: dma.h:126
 
uint16_t source_reload_en
Definition: dma.h:132
 
uint16_t dest_scatter_en
Definition: dma.h:129
 
uint16_t dest_reload_en
Definition: dma.h:133
 
uint16_t fifo_mode_control
Definition: dma.h:134
 
uint16_t source_gather_count
Definition: dma.h:125
 
uint16_t source_addr_adj
Definition: dma.h:130
 
struct dma_block_config * next_block
Definition: dma.h:127
 
uint32_t dest_address
Definition: dma.h:120
 
uint32_t source_address
Definition: dma.h:119
 
uint16_t source_gather_en
Definition: dma.h:128
 
uint16_t dest_addr_adj
Definition: dma.h:131
 
uint16_t dest_scatter_count
Definition: dma.h:124
 
uint16_t flow_control_mode
Definition: dma.h:135
 
DMA configuration structure.
Definition: dma.h:203
 
uint32_t channel_priority
Definition: dma.h:210
 
uint32_t source_handshake
Definition: dma.h:208
 
uint32_t complete_callback_en
Definition: dma.h:206
 
void * user_data
Definition: dma.h:222
 
uint32_t error_callback_en
Definition: dma.h:207
 
dma_callback_t dma_callback
Definition: dma.h:223
 
uint32_t source_chaining_en
Definition: dma.h:211
 
uint32_t dest_chaining_en
Definition: dma.h:212
 
uint32_t dma_slot
Definition: dma.h:204
 
uint32_t channel_direction
Definition: dma.h:205
 
uint32_t source_data_size
Definition: dma.h:216
 
uint32_t dest_burst_length
Definition: dma.h:219
 
struct dma_block_config * head_block
Definition: dma.h:221
 
uint32_t linked_channel
Definition: dma.h:213
 
uint32_t source_burst_length
Definition: dma.h:218
 
uint32_t block_count
Definition: dma.h:220
 
uint32_t dest_data_size
Definition: dma.h:217
 
uint32_t reserved
Definition: dma.h:215
 
uint32_t dest_handshake
Definition: dma.h:209
 
uint32_t cyclic
Definition: dma.h:214
 
int32_t magic
Definition: dma.h:259
 
atomic_t * atomic
Definition: dma.h:261
 
int dma_channels
Definition: dma.h:260
 
uint32_t free
Definition: dma.h:242
 
uint32_t pending_length
Definition: dma.h:241
 
bool busy
Definition: dma.h:239
 
uint64_t total_copied
Definition: dma.h:245
 
uint32_t write_position
Definition: dma.h:243
 
enum dma_channel_direction dir
Definition: dma.h:240
 
uint32_t read_position
Definition: dma.h:244
 
static const intptr_t user_data[5]
Definition: main.c:588