Zephyr API Documentation  3.0.0
A Scalable Open Source RTOS
3.0.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
dma.h
Go to the documentation of this file.
1
7/*
8 * Copyright (c) 2016 Intel Corporation
9 *
10 * SPDX-License-Identifier: Apache-2.0
11 */
12
13#ifndef ZEPHYR_INCLUDE_DRIVERS_DMA_H_
14#define ZEPHYR_INCLUDE_DRIVERS_DMA_H_
15
16#include <kernel.h>
17#include <device.h>
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
23
38
43
49
54};
55
61};
62
63/* channel attributes */
65 DMA_CHANNEL_NORMAL, /* normal DMA channel */
66 DMA_CHANNEL_PERIODIC, /* can be triggerred by periodic sources */
67};
68
107#ifdef CONFIG_DMA_64BIT
110#else
113#endif
129};
130
143typedef void (*dma_callback_t)(const struct device *dev, void *user_data,
144 uint32_t channel, int status);
145
205};
206
217 bool busy;
220};
221
236};
237
238/* magic code to identify context content */
239#define DMA_MAGIC 0x47494749
240
247typedef int (*dma_api_config)(const struct device *dev, uint32_t channel,
248 struct dma_config *config);
249
250#ifdef CONFIG_DMA_64BIT
251typedef int (*dma_api_reload)(const struct device *dev, uint32_t channel,
252 uint64_t src, uint64_t dst, size_t size);
253#else
254typedef int (*dma_api_reload)(const struct device *dev, uint32_t channel,
255 uint32_t src, uint32_t dst, size_t size);
256#endif
257
258typedef int (*dma_api_start)(const struct device *dev, uint32_t channel);
259
260typedef int (*dma_api_stop)(const struct device *dev, uint32_t channel);
261
262typedef int (*dma_api_suspend)(const struct device *dev, uint32_t channel);
263
264typedef int (*dma_api_resume)(const struct device *dev, uint32_t channel);
265
266typedef int (*dma_api_get_status)(const struct device *dev, uint32_t channel,
267 struct dma_status *status);
268
282typedef bool (*dma_api_chan_filter)(const struct device *dev,
283 int channel, void *filter_param);
284
285__subsystem struct dma_driver_api {
286 dma_api_config config;
287 dma_api_reload reload;
288 dma_api_start start;
289 dma_api_stop stop;
290 dma_api_suspend suspend;
291 dma_api_resume resume;
292 dma_api_get_status get_status;
293 dma_api_chan_filter chan_filter;
294};
310static inline int dma_config(const struct device *dev, uint32_t channel,
311 struct dma_config *config)
312{
313 const struct dma_driver_api *api =
314 (const struct dma_driver_api *)dev->api;
315
316 return api->config(dev, channel, config);
317}
318
332#ifdef CONFIG_DMA_64BIT
333static inline int dma_reload(const struct device *dev, uint32_t channel,
334 uint64_t src, uint64_t dst, size_t size)
335#else
336static inline int dma_reload(const struct device *dev, uint32_t channel,
337 uint32_t src, uint32_t dst, size_t size)
338#endif
339{
340 const struct dma_driver_api *api =
341 (const struct dma_driver_api *)dev->api;
342
343 if (api->reload) {
344 return api->reload(dev, channel, src, dst, size);
345 }
346
347 return -ENOSYS;
348}
349
364__syscall int dma_start(const struct device *dev, uint32_t channel);
365
366static inline int z_impl_dma_start(const struct device *dev, uint32_t channel)
367{
368 const struct dma_driver_api *api =
369 (const struct dma_driver_api *)dev->api;
370
371 return api->start(dev, channel);
372}
373
387__syscall int dma_stop(const struct device *dev, uint32_t channel);
388
389static inline int z_impl_dma_stop(const struct device *dev, uint32_t channel)
390{
391 const struct dma_driver_api *api =
392 (const struct dma_driver_api *)dev->api;
393
394 return api->stop(dev, channel);
395}
396
397
412__syscall int dma_suspend(const struct device *dev, uint32_t channel);
413
414static inline int z_impl_dma_suspend(const struct device *dev, uint32_t channel)
415{
416 const struct dma_driver_api *api = (const struct dma_driver_api *)dev->api;
417
418 if (api->suspend == NULL) {
419 return -ENOSYS;
420 }
421 return api->suspend(dev, channel);
422}
423
438__syscall int dma_resume(const struct device *dev, uint32_t channel);
439
440static inline int z_impl_dma_resume(const struct device *dev, uint32_t channel)
441{
442 const struct dma_driver_api *api = (const struct dma_driver_api *)dev->api;
443
444 if (api->resume == NULL) {
445 return -ENOSYS;
446 }
447 return api->resume(dev, channel);
448}
449
462__syscall int dma_request_channel(const struct device *dev,
463 void *filter_param);
464
465static inline int z_impl_dma_request_channel(const struct device *dev,
466 void *filter_param)
467{
468 int i = 0;
469 int channel = -EINVAL;
470 const struct dma_driver_api *api =
471 (const struct dma_driver_api *)dev->api;
472 /* dma_context shall be the first one in dev data */
473 struct dma_context *dma_ctx = dev->data;
474
475 if (dma_ctx->magic != DMA_MAGIC) {
476 return channel;
477 }
478
479 for (i = 0; i < dma_ctx->dma_channels; i++) {
480 if (!atomic_test_and_set_bit(dma_ctx->atomic, i)) {
481 channel = i;
482 if (api->chan_filter &&
483 !api->chan_filter(dev, channel, filter_param)) {
484 atomic_clear_bit(dma_ctx->atomic, channel);
485 continue;
486 }
487 break;
488 }
489 }
490
491 return channel;
492}
493
503__syscall void dma_release_channel(const struct device *dev,
504 uint32_t channel);
505
506static inline void z_impl_dma_release_channel(const struct device *dev,
507 uint32_t channel)
508{
509 struct dma_context *dma_ctx = dev->data;
510
511 if (dma_ctx->magic != DMA_MAGIC) {
512 return;
513 }
514
515 if (channel < dma_ctx->dma_channels) {
516 atomic_clear_bit(dma_ctx->atomic, channel);
517 }
518
519}
520
533__syscall int dma_chan_filter(const struct device *dev,
534 int channel, void *filter_param);
535
536static inline int z_impl_dma_chan_filter(const struct device *dev,
537 int channel, void *filter_param)
538{
539 const struct dma_driver_api *api =
540 (const struct dma_driver_api *)dev->api;
541
542 if (api->chan_filter) {
543 return api->chan_filter(dev, channel, filter_param);
544 }
545
546 return -ENOSYS;
547}
548
563static inline int dma_get_status(const struct device *dev, uint32_t channel,
564 struct dma_status *stat)
565{
566 const struct dma_driver_api *api =
567 (const struct dma_driver_api *)dev->api;
568
569 if (api->get_status) {
570 return api->get_status(dev, channel, stat);
571 }
572
573 return -ENOSYS;
574}
575
590{
591 /* Check boundaries (max supported width is 32 Bytes) */
592 if (size < 1 || size > 32) {
593 return 0; /* Zero is the default (8 Bytes) */
594 }
595
596 /* Ensure size is a power of 2 */
597 if (!is_power_of_two(size)) {
598 return 0; /* Zero is the default (8 Bytes) */
599 }
600
601 /* Convert to bit pattern for writing to a register */
602 return find_msb_set(size);
603}
604
619{
620 /* Check boundaries (max supported burst length is 256) */
621 if (burst < 1 || burst > 256) {
622 return 0; /* Zero is the default (1 burst length) */
623 }
624
625 /* Ensure burst is a power of 2 */
626 if (!(burst & (burst - 1))) {
627 return 0; /* Zero is the default (1 burst length) */
628 }
629
630 /* Convert to bit pattern for writing to a register */
631 return find_msb_set(burst);
632}
633
638#ifdef __cplusplus
639}
640#endif
641
642#include <syscalls/dma.h>
643
644#endif /* ZEPHYR_INCLUDE_DRIVERS_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:186
static bool atomic_test_and_set_bit(atomic_t *target, int bit)
Atomically set a bit.
Definition: atomic.h:167
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:563
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:336
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:310
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:618
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:143
static uint32_t dma_width_index(uint32_t size)
Look-up generic width index to be used in registers.
Definition: dma.h:589
dma_channel_filter
Definition: dma.h:64
#define DMA_MAGIC
Definition: dma.h:239
dma_channel_direction
Definition: dma.h:31
dma_addr_adj
Definition: dma.h:57
@ 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:212
#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:60
__INT32_TYPE__ int32_t
Definition: stdint.h:44
__UINT64_TYPE__ uint64_t
Definition: stdint.h:61
__UINT16_TYPE__ uint16_t
Definition: stdint.h:59
Runtime device structure (in ROM) per driver instance.
Definition: device.h:450
const void * api
Definition: device.h:456
void *const data
Definition: device.h:460
DMA block configuration structure.
Definition: dma.h:106
uint32_t dest_scatter_interval
Definition: dma.h:115
uint16_t reserved
Definition: dma.h:128
uint32_t source_gather_interval
Definition: dma.h:114
uint32_t block_size
Definition: dma.h:118
uint16_t source_reload_en
Definition: dma.h:124
uint16_t dest_scatter_en
Definition: dma.h:121
uint16_t dest_reload_en
Definition: dma.h:125
uint16_t fifo_mode_control
Definition: dma.h:126
uint16_t source_gather_count
Definition: dma.h:117
uint16_t source_addr_adj
Definition: dma.h:122
struct dma_block_config * next_block
Definition: dma.h:119
uint32_t dest_address
Definition: dma.h:112
uint32_t source_address
Definition: dma.h:111
uint16_t source_gather_en
Definition: dma.h:120
uint16_t dest_addr_adj
Definition: dma.h:123
uint16_t dest_scatter_count
Definition: dma.h:116
uint16_t flow_control_mode
Definition: dma.h:127
DMA configuration structure.
Definition: dma.h:185
uint32_t channel_priority
Definition: dma.h:192
uint32_t source_handshake
Definition: dma.h:190
uint32_t complete_callback_en
Definition: dma.h:188
void * user_data
Definition: dma.h:203
uint32_t error_callback_en
Definition: dma.h:189
dma_callback_t dma_callback
Definition: dma.h:204
uint32_t source_chaining_en
Definition: dma.h:193
uint32_t dest_chaining_en
Definition: dma.h:194
uint32_t dma_slot
Definition: dma.h:186
uint32_t channel_direction
Definition: dma.h:187
uint32_t source_data_size
Definition: dma.h:197
uint32_t dest_burst_length
Definition: dma.h:200
struct dma_block_config * head_block
Definition: dma.h:202
uint32_t linked_channel
Definition: dma.h:195
uint32_t source_burst_length
Definition: dma.h:199
uint32_t block_count
Definition: dma.h:201
uint32_t dest_data_size
Definition: dma.h:198
uint32_t reserved
Definition: dma.h:196
uint32_t dest_handshake
Definition: dma.h:191
Definition: dma.h:232
int32_t magic
Definition: dma.h:233
atomic_t * atomic
Definition: dma.h:235
int dma_channels
Definition: dma.h:234
Definition: dma.h:216
uint32_t pending_length
Definition: dma.h:219
bool busy
Definition: dma.h:217
enum dma_channel_direction dir
Definition: dma.h:218
Definition: stat.h:39
static const intptr_t user_data[5]
Definition: main.c:590