VSF Documented
vsf_template_dma.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18#ifndef __VSF_TEMPLATE_DMA_H__
19#define __VSF_TEMPLATE_DMA_H__
20
21/*============================ INCLUDES ======================================*/
22
24#include "hal/arch/vsf_arch.h"
25
26#ifdef __cplusplus
27extern "C" {
28#endif
29
30/*============================ MACROS ========================================*/
31
32// multi-class support enabled by default for maximum availability.
33#ifndef VSF_DMA_CFG_MULTI_CLASS
34# define VSF_DMA_CFG_MULTI_CLASS ENABLED
35#endif
36
37// application code can redefine it
38#ifndef VSF_DMA_CFG_PREFIX
39# if VSF_DMA_CFG_MULTI_CLASS == ENABLED
40# define VSF_DMA_CFG_PREFIX vsf
41# elif defined(VSF_HW_DMA_COUNT) && (VSF_HW_DMA_COUNT != 0)
42# define VSF_DMA_CFG_PREFIX vsf_hw
43# else
44# define VSF_DMA_CFG_PREFIX vsf
45# endif
46#endif
47
48#ifndef VSF_DMA_CFG_FUNCTION_RENAME
49# define VSF_DMA_CFG_FUNCTION_RENAME ENABLED
50#endif
51
52#ifndef VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_MODE
53# define VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_MODE DISABLED
54#endif
55
56#ifndef VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_MODE
57# define VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_MODE DISABLED
58#endif
59
60#ifndef VSF_DMA_CFG_REIMPLEMENT_TYPE_IRQ_MASK
61# define VSF_DMA_CFG_REIMPLEMENT_TYPE_IRQ_MASK DISABLED
62#endif
63
67#if VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_CFG == DISABLED
68# define VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_CFG DISABLED
69#endif
70
74#if VSF_DMA_CFG_REIMPLEMENT_TYPE_CFG == DISABLED
75# define VSF_DMA_CFG_REIMPLEMENT_TYPE_CFG DISABLED
76#endif
77
81#if VSF_DMA_CFG_REIMPLEMENT_TYPE_CAPABILITY == DISABLED
82# define VSF_DMA_CFG_REIMPLEMENT_TYPE_CAPABILITY DISABLED
83#endif
84
85#ifndef VSF_DMA_CFG_INHERT_HAL_CAPABILITY
86# define VSF_DMA_CFG_INHERT_HAL_CAPABILITY ENABLED
87#endif
88
89/*============================ MACROFIED FUNCTIONS ===========================*/
90
91#define VSF_DMA_APIS(__prefix_name) \
92 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, dma, init, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr) \
93 __VSF_HAL_TEMPLATE_API(__prefix_name, void, dma, fini, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr) \
94 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_dma_capability_t, dma, capability, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr) \
95 __VSF_HAL_TEMPLATE_API(__prefix_name, int8_t, dma, channel_request, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr) \
96 __VSF_HAL_TEMPLATE_API(__prefix_name, void, dma, channel_release, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr, int8_t) \
97 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, dma, channel_config, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr, int8_t channel, vsf_dma_channel_cfg_t * cfg_ptr) \
98 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, dma, channel_start, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr, int8_t channel, uint32_t src_address, uint32_t dst_address, uint32_t count) \
99 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, dma, channel_cancel, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr, int8_t channel) \
100 __VSF_HAL_TEMPLATE_API(__prefix_name, uint32_t, dma, channel_get_transferred_count, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr, int8_t channel) \
101 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_dma_channel_status_t, dma, channel_status, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr, int8_t channel)
102
103/*============================ TYPES =========================================*/
104
105#if VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_MODE == DISABLED
111
115
119
126
133
142
151
152 //prio
153 VSF_DMA_PRIOPIRY_LOW = (0x00 << 22),
155 VSF_DMA_PRIOPIRY_HIGH = (0x02 << 22),
157
158 // request line
160#endif
161
162enum {
168
173
178
186
194
204
214
220
230
231};
232
233#if VSF_DMA_CFG_REIMPLEMENT_TYPE_IRQ_MASK == DISABLED
234typedef enum vsf_dma_irq_mask_t {
235 VSF_DMA_IRQ_MASK_CPL = (0x1ul << 0),
239#endif
240
241enum {
246};
247
248#if VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_CFG == DISABLED
249typedef struct vsf_dma_t vsf_dma_t;
250
251typedef void vsf_dma_isr_handler_t(void *target_ptr, vsf_dma_t *dma_ptr, int8_t channel, vsf_dma_irq_mask_t irq_mask);
252
253typedef struct vsf_dma_isr_t {
257
259typedef struct vsf_dma_channel_cfg_t {
267#endif
268
269#if VSF_DMA_CFG_REIMPLEMENT_TYPE_STATUS == DISABLED
271 union {
273 struct {
274 uint32_t is_busy : 1;
275 };
276 };
278#endif
279
280#if VSF_DMA_CFG_REIMPLEMENT_TYPE_CAPABILITY == DISABLED
281typedef struct vsf_dma_capability_t {
282#if VSF_DMA_CFG_INHERT_HAL_CAPABILITY == ENABLED
284#endif
286
290#endif
291
292typedef struct vsf_dma_op_t {
293#undef __VSF_HAL_TEMPLATE_API
294#define __VSF_HAL_TEMPLATE_API VSF_HAL_TEMPLATE_API_FP
295
296 VSF_DMA_APIS(vsf)
298
299#if VSF_DMA_CFG_MULTI_CLASS == ENABLED
300struct vsf_dma_t {
302};
303#endif
304
305/*============================ PROTOTYPES ====================================*/
306
324extern vsf_err_t vsf_dma_init(vsf_dma_t *dma_ptr);
325
338extern void vsf_dma_fini(vsf_dma_t *dma_ptr);
339
352
365
377extern void vsf_dma_channel_release(vsf_dma_t *dma_ptr, int8_t channel);
378
392extern vsf_err_t vsf_dma_channel_config(vsf_dma_t *dma_ptr, int8_t channel, vsf_dma_channel_cfg_t *cfg_ptr);
393
413extern vsf_err_t vsf_dma_channel_start(vsf_dma_t *dma_ptr, int8_t channel, uint32_t src_address, uint32_t dst_address, uint32_t count);
414
428extern vsf_err_t vsf_dma_channel_cancel(vsf_dma_t *dma_ptr, int8_t channel);
429
430
449
464
465/*============================ MACROFIED FUNCTIONS ===========================*/
466
467#if VSF_DMA_CFG_FUNCTION_RENAME == ENABLED
468# define __vsf_dma_t VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_t)
469# define vsf_dma_init(__DMA, ...) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_init) ((__vsf_dma_t *)(__DMA), ##__VA_ARGS__)
470# define vsf_dma_fini(__DMA) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_fini) ((__vsf_dma_t *)(__DMA))
471# define vsf_dma_capability(__DMA) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_capability) ((__vsf_dma_t *)(__DMA))
472# define vsf_dma_channel_request(__DMA, ...) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_channel_request) ((__vsf_dma_t *)(__DMA), ##__VA_ARGS__)
473# define vsf_dma_channel_release(__DMA, ...) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_channel_release) ((__vsf_dma_t *)(__DMA), ##__VA_ARGS__)
474# define vsf_dma_channel_config(__DMA, ...) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_channel_config) ((__vsf_dma_t *)(__DMA), ##__VA_ARGS__)
475# define vsf_dma_channel_start(__DMA, ...) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_channel_start) ((__vsf_dma_t *)(__DMA), ##__VA_ARGS__)
476# define vsf_dma_channel_cancel(__DMA, ...) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_channel_cancel) ((__vsf_dma_t *)(__DMA), ##__VA_ARGS__)
477# define vsf_dma_channel_get_transferred_count(__DMA, ...) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_channel_get_transferred_count) ((__vsf_dma_t *)(__DMA), ##__VA_ARGS__)
478# define vsf_dma_channel_status(__DMA, ...) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_channel_status) ((__vsf_dma_t *)(__DMA), ##__VA_ARGS__)
479#endif
480
481#ifdef __cplusplus
482}
483#endif
484
485#endif /*__VSF_TEMPLATE_DMA_H__*/
vsf_err_t
Definition __type.h:42
const i_spi_t vsf_spi_irq_mask_t irq_mask
Definition spi_interface.h:38
unsigned uint32_t
Definition stdint.h:9
unsigned char uint8_t
Definition stdint.h:5
signed char int8_t
Definition stdint.h:4
Definition vsf_template_dma.h:281
uint8_t channel_count
Definition vsf_template_dma.h:288
uint32_t max_request_count
Definition vsf_template_dma.h:287
inherit(vsf_peripheral_capability_t) vsf_dma_irq_mask_t irq_mask
dma configuration
Definition vsf_template_dma.h:259
uint8_t src_idx
Index of the peripheral or memory corresponding to the source address of the DMA.
Definition vsf_template_dma.h:263
vsf_dma_channel_mode_t mode
Definition vsf_template_dma.h:260
uint8_t dst_idx
Index of the peripheral or memory corresponding to the destination address of the DMA.
Definition vsf_template_dma.h:265
vsf_dma_isr_t isr
Definition vsf_template_dma.h:261
Definition vsf_template_dma.h:270
Definition vsf_template_dma.h:253
vsf_dma_isr_handler_t * handler_fn
Definition vsf_template_dma.h:254
void * target_ptr
Definition vsf_template_dma.h:255
Definition vsf_template_dma.h:292
Definition vsf_template_dma.h:300
const vsf_dma_op_t * op
Definition vsf_template_dma.h:301
Definition vsf_template_hal_driver.h:203
Definition vsf_template_hal_driver.h:196
vsf_dma_channel_mode_t
Definition vsf_template_dma.h:106
@ VSF_DMA_DST_WIDTH_BYTES_32
Definition vsf_template_dma.h:132
@ VSF_DMA_SRC_BURST_LENGTH_64
Definition vsf_template_dma.h:140
@ VSF_DMA_DST_BURST_LENGTH_64
Definition vsf_template_dma.h:149
@ VSF_DMA_SRC_WIDTH_BYTES_8
Definition vsf_template_dma.h:123
@ VSF_DMA_SRC_WIDTH_BYTES_2
Definition vsf_template_dma.h:121
@ VSF_DMA_DST_WIDTH_BYTES_16
Definition vsf_template_dma.h:131
@ VSF_DMA_SRC_BURST_LENGTH_16
Definition vsf_template_dma.h:138
@ VSF_DMA_DST_BURST_LENGTH_128
Definition vsf_template_dma.h:150
@ VSF_DMA_DST_WIDTH_BYTE_1
Definition vsf_template_dma.h:127
@ VSF_DMA_SRC_WIDTH_BYTES_16
Definition vsf_template_dma.h:124
@ VSF_DMA_DST_ADDR_NO_CHANGE
Definition vsf_template_dma.h:118
@ VSF_DMA_PRIOPIRY_MIDIUM
Definition vsf_template_dma.h:154
@ VSF_DMA_DST_BURST_LENGTH_4
Definition vsf_template_dma.h:145
@ VSF_DMA_DST_BURST_LENGTH_1
Definition vsf_template_dma.h:143
@ VSF_DMA_SRC_ADDR_INCREMENT
Definition vsf_template_dma.h:112
@ VSF_DMA_MEMORY_TO_PERIPHERAL
Definition vsf_template_dma.h:108
@ VSF_DMA_DST_BURST_LENGTH_32
Definition vsf_template_dma.h:148
@ VSF_DMA_SRC_BURST_LENGTH_4
Definition vsf_template_dma.h:136
@ VSF_DMA_SRC_BURST_LENGTH_128
Definition vsf_template_dma.h:141
@ VSF_DMA_PRIOPIRY_VERY_HIGH
Definition vsf_template_dma.h:156
@ VSF_DMA_SRC_WIDTH_BYTE_1
Definition vsf_template_dma.h:120
@ VSF_DMA_MEMORY_TO_MEMORY
Definition vsf_template_dma.h:107
@ VSF_DMA_SRC_WIDTH_BYTES_4
Definition vsf_template_dma.h:122
@ VSF_DMA_DST_WIDTH_BYTES_8
Definition vsf_template_dma.h:130
@ VSF_DMA_SRC_BURST_LENGTH_1
Definition vsf_template_dma.h:134
@ VSF_DMA_PERIPHERA_TO_MEMORY
Definition vsf_template_dma.h:109
@ VSF_DMA_DST_WIDTH_BYTES_2
Definition vsf_template_dma.h:128
@ VSF_DMA_DST_WIDTH_BYTES_4
Definition vsf_template_dma.h:129
@ VSF_DMA_PRIOPIRY_LOW
Definition vsf_template_dma.h:153
@ VSF_DMA_SRC_BURST_LENGTH_2
Definition vsf_template_dma.h:135
@ VSF_DMA_SRC_ADDR_DECREMENT
Definition vsf_template_dma.h:113
@ VSF_DMA_DST_BURST_LENGTH_8
Definition vsf_template_dma.h:146
@ VSF_DMA_PERIPHERA_TO_PERIPHERAL
Definition vsf_template_dma.h:110
@ VSF_DMA_SRC_ADDR_NO_CHANGE
Definition vsf_template_dma.h:114
@ VSF_DMA_DST_BURST_LENGTH_16
Definition vsf_template_dma.h:147
@ VSF_DMA_SRC_BURST_LENGTH_8
Definition vsf_template_dma.h:137
@ VSF_DMA_DST_BURST_LENGTH_2
Definition vsf_template_dma.h:144
@ VSF_DMA_SRC_WIDTH_BYTES_32
Definition vsf_template_dma.h:125
@ VSF_DMA_SRC_BURST_LENGTH_32
Definition vsf_template_dma.h:139
@ VSF_DMA_PRIOPIRY_HIGH
Definition vsf_template_dma.h:155
@ VSF_DMA_DST_ADDR_DECREMENT
Definition vsf_template_dma.h:117
@ VSF_DMA_DST_ADDR_INCREMENT
Definition vsf_template_dma.h:116
#define vsf_dma_channel_start(__DMA,...)
Definition vsf_template_dma.h:475
#define vsf_dma_channel_release(__DMA,...)
Definition vsf_template_dma.h:473
void vsf_dma_isr_handler_t(void *target_ptr, vsf_dma_t *dma_ptr, int8_t channel, vsf_dma_irq_mask_t irq_mask)
Definition vsf_template_dma.h:251
#define vsf_dma_channel_config(__DMA,...)
Definition vsf_template_dma.h:474
@ VSF_DMA_IRQ_COUNT
Definition vsf_template_dma.h:242
@ VSF_DMA_IRQ_ALL_BITS_MASK
Definition vsf_template_dma.h:243
@ VSF_DMA_PRIOPIRY_COUNT
Definition vsf_template_dma.h:215
@ VSF_DMA_DST_WIDTH_MASK
Definition vsf_template_dma.h:188
@ VSF_DMA_SRC_WIDTH_MASK
Definition vsf_template_dma.h:180
@ VSF_DMA_MODE_ALL_BITS_MASK
Definition vsf_template_dma.h:222
@ VSF_DMA_DST_ADDR_MASK
Definition vsf_template_dma.h:175
@ VSF_DMA_SRC_BURST_MASK
Definition vsf_template_dma.h:196
@ VSF_DMA_DST_ADDR_COUNT
Definition vsf_template_dma.h:174
@ VSF_DMA_DIRECTION_COUNT
Definition vsf_template_dma.h:163
@ VSF_DMA_DST_BURST_COUNT
Definition vsf_template_dma.h:205
@ VSF_DMA_SRC_BURST_COUNT
Definition vsf_template_dma.h:195
@ VSF_DMA_SRC_ADDR_COUNT
Definition vsf_template_dma.h:169
@ VSF_DMA_SRC_ADDR_MASK
Definition vsf_template_dma.h:170
@ VSF_DMA_DST_WIDTH_COUNT
Definition vsf_template_dma.h:187
@ VSF_DMA_DIRECTION_MASK
Definition vsf_template_dma.h:164
@ VSF_DMA_SRC_WIDTH_COUNT
Definition vsf_template_dma.h:179
@ VSF_DMA_PRIOPIRY_MASK
Definition vsf_template_dma.h:216
@ VSF_DMA_MODE_MASK_COUNT
Definition vsf_template_dma.h:221
@ VSF_DMA_DST_BURST_MASK
Definition vsf_template_dma.h:206
#define vsf_dma_fini(__DMA)
Definition vsf_template_dma.h:470
#define vsf_dma_init(__DMA,...)
Definition vsf_template_dma.h:469
#define vsf_dma_channel_get_transferred_count(__DMA,...)
Definition vsf_template_dma.h:477
#define vsf_dma_channel_request(__DMA,...)
Definition vsf_template_dma.h:472
#define vsf_dma_channel_status(__DMA,...)
Definition vsf_template_dma.h:478
vsf_dma_irq_mask_t
Definition vsf_template_dma.h:234
@ VSF_DMA_IRQ_MASK_HALF_CPL
Definition vsf_template_dma.h:236
@ VSF_DMA_IRQ_MASK_CPL
Definition vsf_template_dma.h:235
@ VSF_DMA_IRQ_MASK_ERROR
Definition vsf_template_dma.h:237
#define vsf_dma_capability(__DMA)
Definition vsf_template_dma.h:471
#define vsf_dma_channel_cancel(__DMA,...)
Definition vsf_template_dma.h:476
#define VSF_DMA_APIS(__prefix_name)
Definition vsf_template_dma.h:91