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
39#ifndef VSF_DMA_CFG_MULTI_CLASS
40# define VSF_DMA_CFG_MULTI_CLASS ENABLED
41#endif
42
52#ifndef VSF_DMA_CFG_PREFIX
53# if VSF_DMA_CFG_MULTI_CLASS == ENABLED
54# define VSF_DMA_CFG_PREFIX vsf
55# elif defined(VSF_HW_DMA_COUNT) && (VSF_HW_DMA_COUNT != 0)
56# define VSF_DMA_CFG_PREFIX vsf_hw
57# else
58# define VSF_DMA_CFG_PREFIX vsf
59# endif
60#endif
61
71#ifndef VSF_DMA_CFG_FUNCTION_RENAME
72# define VSF_DMA_CFG_FUNCTION_RENAME ENABLED
73#endif
74
82#ifndef VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_MODE
83# define VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_MODE DISABLED
84#endif
85
93#ifndef VSF_DMA_CFG_REIMPLEMENT_TYPE_IRQ_MASK
94# define VSF_DMA_CFG_REIMPLEMENT_TYPE_IRQ_MASK DISABLED
95#endif
96
106#if VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_CFG == DISABLED
107# define VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_CFG DISABLED
108#endif
109
121#if VSF_DMA_CFG_REIMPLEMENT_TYPE_CFG == DISABLED
122# define VSF_DMA_CFG_REIMPLEMENT_TYPE_CFG DISABLED
123#endif
124
134#if VSF_DMA_CFG_REIMPLEMENT_TYPE_CAPABILITY == DISABLED
135# define VSF_DMA_CFG_REIMPLEMENT_TYPE_CAPABILITY DISABLED
136#endif
137
145#ifndef VSF_DMA_CFG_INHERIT_HAL_CAPABILITY
146# define VSF_DMA_CFG_INHERIT_HAL_CAPABILITY ENABLED
147#endif
148
149
150/*============================ MACROFIED FUNCTIONS ===========================*/
151
161#define VSF_DMA_APIS(__prefix_name) \
162 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, dma, init, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr) \
163 __VSF_HAL_TEMPLATE_API(__prefix_name, void, dma, fini, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr) \
164 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_dma_capability_t, dma, capability, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr) \
165 __VSF_HAL_TEMPLATE_API(__prefix_name, int8_t, dma, channel_request, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr) \
166 __VSF_HAL_TEMPLATE_API(__prefix_name, void, dma, channel_release, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr, int8_t) \
167 __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) \
168 __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) \
169 __VSF_HAL_TEMPLATE_API(__prefix_name, vsf_err_t, dma, channel_cancel, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr, int8_t channel) \
170 __VSF_HAL_TEMPLATE_API(__prefix_name, uint32_t, dma, channel_get_transferred_count, VSF_MCONNECT(__prefix_name, _dma_t) *dma_ptr, int8_t channel) \
171 __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)
172
173/*============================ TYPES =========================================*/
174
175#if VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_MODE == DISABLED
181
185
189
196
203
212
221
222 //prio
223 VSF_DMA_PRIOPIRY_LOW = (0x00 << 22),
225 VSF_DMA_PRIOPIRY_HIGH = (0x02 << 22),
227
228 // request line
230#endif
231
232enum {
238
243
248
256
264
274
284
290
300
301};
302
303#if VSF_DMA_CFG_REIMPLEMENT_TYPE_IRQ_MASK == DISABLED
304typedef enum vsf_dma_irq_mask_t {
305 VSF_DMA_IRQ_MASK_CPL = (0x1ul << 0),
309#endif
310
311enum {
316};
317
318#if VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_CFG == DISABLED
319typedef struct vsf_dma_t vsf_dma_t;
320
321typedef void vsf_dma_isr_handler_t(void *target_ptr, vsf_dma_t *dma_ptr, int8_t channel, vsf_dma_irq_mask_t irq_mask);
322
323typedef struct vsf_dma_isr_t {
327
329typedef struct vsf_dma_channel_cfg_t {
337#endif
338
339#if VSF_DMA_CFG_REIMPLEMENT_TYPE_STATUS == DISABLED
341 union {
343 struct {
344 uint32_t is_busy : 1;
345 };
346 };
348#endif
349
350#if VSF_DMA_CFG_REIMPLEMENT_TYPE_CAPABILITY == DISABLED
351typedef struct vsf_dma_capability_t {
352#if VSF_DMA_CFG_INHERIT_HAL_CAPABILITY == ENABLED
354#endif
356
360#endif
361
362typedef struct vsf_dma_op_t {
364#undef __VSF_HAL_TEMPLATE_API
365#define __VSF_HAL_TEMPLATE_API VSF_HAL_TEMPLATE_API_FP
367
368 VSF_DMA_APIS(vsf)
370
371#if VSF_DMA_CFG_MULTI_CLASS == ENABLED
372struct vsf_dma_t {
374};
375#endif
376
377/*============================ PROTOTYPES ====================================*/
378
396extern vsf_err_t vsf_dma_init(vsf_dma_t *dma_ptr);
397
409extern void vsf_dma_fini(vsf_dma_t *dma_ptr);
410
423
436
450extern void vsf_dma_channel_release(vsf_dma_t *dma_ptr, int8_t channel);
451
467extern vsf_err_t vsf_dma_channel_config(vsf_dma_t *dma_ptr, int8_t channel, vsf_dma_channel_cfg_t *cfg_ptr);
468
488extern 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);
489
503extern vsf_err_t vsf_dma_channel_cancel(vsf_dma_t *dma_ptr, int8_t channel);
504
523
538
539/*============================ MACROFIED FUNCTIONS ===========================*/
540
542#if VSF_DMA_CFG_FUNCTION_RENAME == ENABLED
543# define __vsf_dma_t VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_t)
544# define vsf_dma_init(__DMA) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_init)((__vsf_dma_t *)(__DMA))
545# define vsf_dma_fini(__DMA) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_fini)((__vsf_dma_t *)(__DMA))
546# define vsf_dma_capability(__DMA) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_capability)((__vsf_dma_t *)(__DMA))
547# define vsf_dma_channel_request(__DMA) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_channel_request)((__vsf_dma_t *)(__DMA))
548# define vsf_dma_channel_release(__DMA, ...) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_channel_release)((__vsf_dma_t *)(__DMA), ##__VA_ARGS__)
549# define vsf_dma_channel_config(__DMA, ...) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_channel_config)((__vsf_dma_t *)(__DMA), ##__VA_ARGS__)
550# define vsf_dma_channel_start(__DMA, ...) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_channel_start)((__vsf_dma_t *)(__DMA), ##__VA_ARGS__)
551# define vsf_dma_channel_cancel(__DMA, ...) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_channel_cancel)((__vsf_dma_t *)(__DMA), ##__VA_ARGS__)
552# 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__)
553# define vsf_dma_channel_status(__DMA, ...) VSF_MCONNECT(VSF_DMA_CFG_PREFIX, _dma_channel_status)((__vsf_dma_t *)(__DMA), ##__VA_ARGS__)
554#endif
556
557#ifdef __cplusplus
558}
559#endif
560
561#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:351
uint8_t channel_count
Definition vsf_template_dma.h:358
uint32_t max_request_count
Definition vsf_template_dma.h:357
inherit(vsf_peripheral_capability_t) vsf_dma_irq_mask_t irq_mask
dma configuration
Definition vsf_template_dma.h:329
uint8_t src_idx
Index of the peripheral or memory corresponding to the source address of the DMA.
Definition vsf_template_dma.h:333
vsf_dma_channel_mode_t mode
Definition vsf_template_dma.h:330
uint8_t dst_idx
Index of the peripheral or memory corresponding to the destination address of the DMA.
Definition vsf_template_dma.h:335
vsf_dma_isr_t isr
Definition vsf_template_dma.h:331
Definition vsf_template_dma.h:340
Definition vsf_template_dma.h:323
vsf_dma_isr_handler_t * handler_fn
Definition vsf_template_dma.h:324
void * target_ptr
Definition vsf_template_dma.h:325
Definition vsf_template_dma.h:362
Definition vsf_template_dma.h:372
const vsf_dma_op_t * op
Definition vsf_template_dma.h:373
Definition vsf_template_hal_driver.h:203
Definition vsf_template_hal_driver.h:196
vsf_dma_channel_mode_t
Definition dma.h:118
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 dma.h:181
vsf_dma_irq_mask_t
Definition dma.h:172
vsf_dma_channel_mode_t
Definition vsf_template_dma.h:176
@ VSF_DMA_DST_WIDTH_BYTES_32
Definition vsf_template_dma.h:202
@ VSF_DMA_SRC_BURST_LENGTH_64
Definition vsf_template_dma.h:210
@ VSF_DMA_DST_BURST_LENGTH_64
Definition vsf_template_dma.h:219
@ VSF_DMA_SRC_WIDTH_BYTES_8
Definition vsf_template_dma.h:193
@ VSF_DMA_SRC_WIDTH_BYTES_2
Definition vsf_template_dma.h:191
@ VSF_DMA_DST_WIDTH_BYTES_16
Definition vsf_template_dma.h:201
@ VSF_DMA_SRC_BURST_LENGTH_16
Definition vsf_template_dma.h:208
@ VSF_DMA_DST_BURST_LENGTH_128
Definition vsf_template_dma.h:220
@ VSF_DMA_DST_WIDTH_BYTE_1
Definition vsf_template_dma.h:197
@ VSF_DMA_SRC_WIDTH_BYTES_16
Definition vsf_template_dma.h:194
@ VSF_DMA_DST_ADDR_NO_CHANGE
Definition vsf_template_dma.h:188
@ VSF_DMA_DST_BURST_LENGTH_4
Definition vsf_template_dma.h:215
@ VSF_DMA_DST_BURST_LENGTH_1
Definition vsf_template_dma.h:213
@ VSF_DMA_SRC_ADDR_INCREMENT
Definition vsf_template_dma.h:182
@ VSF_DMA_MEMORY_TO_PERIPHERAL
Definition vsf_template_dma.h:178
@ VSF_DMA_DST_BURST_LENGTH_32
Definition vsf_template_dma.h:218
@ VSF_DMA_SRC_BURST_LENGTH_4
Definition vsf_template_dma.h:206
@ VSF_DMA_SRC_BURST_LENGTH_128
Definition vsf_template_dma.h:211
@ VSF_DMA_PRIOPIRY_VERY_HIGH
Definition vsf_template_dma.h:226
@ VSF_DMA_SRC_WIDTH_BYTE_1
Definition vsf_template_dma.h:190
@ VSF_DMA_MEMORY_TO_MEMORY
Definition vsf_template_dma.h:177
@ VSF_DMA_SRC_WIDTH_BYTES_4
Definition vsf_template_dma.h:192
@ VSF_DMA_DST_WIDTH_BYTES_8
Definition vsf_template_dma.h:200
@ VSF_DMA_SRC_BURST_LENGTH_1
Definition vsf_template_dma.h:204
@ VSF_DMA_PERIPHERA_TO_MEMORY
Definition vsf_template_dma.h:179
@ VSF_DMA_DST_WIDTH_BYTES_2
Definition vsf_template_dma.h:198
@ VSF_DMA_DST_WIDTH_BYTES_4
Definition vsf_template_dma.h:199
@ VSF_DMA_PRIOPIRY_LOW
Definition vsf_template_dma.h:223
@ VSF_DMA_SRC_BURST_LENGTH_2
Definition vsf_template_dma.h:205
@ VSF_DMA_SRC_ADDR_DECREMENT
Definition vsf_template_dma.h:183
@ VSF_DMA_DST_BURST_LENGTH_8
Definition vsf_template_dma.h:216
@ VSF_DMA_PERIPHERA_TO_PERIPHERAL
Definition vsf_template_dma.h:180
@ VSF_DMA_SRC_ADDR_NO_CHANGE
Definition vsf_template_dma.h:184
@ VSF_DMA_DST_BURST_LENGTH_16
Definition vsf_template_dma.h:217
@ VSF_DMA_SRC_BURST_LENGTH_8
Definition vsf_template_dma.h:207
@ VSF_DMA_DST_BURST_LENGTH_2
Definition vsf_template_dma.h:214
@ VSF_DMA_SRC_WIDTH_BYTES_32
Definition vsf_template_dma.h:195
@ VSF_DMA_SRC_BURST_LENGTH_32
Definition vsf_template_dma.h:209
@ VSF_DMA_PRIOPIRY_HIGH
Definition vsf_template_dma.h:225
@ VSF_DMA_PRIOPIRY_MEDIUM
Definition vsf_template_dma.h:224
@ VSF_DMA_DST_ADDR_DECREMENT
Definition vsf_template_dma.h:187
@ VSF_DMA_DST_ADDR_INCREMENT
Definition vsf_template_dma.h:186
struct vsf_dma_isr_t vsf_dma_isr_t
vsf_err_t vsf_dma_channel_cancel(vsf_dma_t *dma_ptr, int8_t channel)
Cancel the transmission of a specific DMA channel.
Definition dma_common.c:105
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:321
@ VSF_DMA_PRIOPIRY_COUNT
Definition vsf_template_dma.h:285
@ VSF_DMA_DST_WIDTH_MASK
Definition vsf_template_dma.h:258
@ VSF_DMA_SRC_WIDTH_MASK
Definition vsf_template_dma.h:250
@ VSF_DMA_MODE_ALL_BITS_MASK
Definition vsf_template_dma.h:292
@ VSF_DMA_DST_ADDR_MASK
Definition vsf_template_dma.h:245
@ VSF_DMA_SRC_BURST_MASK
Definition vsf_template_dma.h:266
@ VSF_DMA_DST_ADDR_COUNT
Definition vsf_template_dma.h:244
@ VSF_DMA_DIRECTION_COUNT
Definition vsf_template_dma.h:233
@ VSF_DMA_DST_BURST_COUNT
Definition vsf_template_dma.h:275
@ VSF_DMA_SRC_BURST_COUNT
Definition vsf_template_dma.h:265
@ VSF_DMA_SRC_ADDR_COUNT
Definition vsf_template_dma.h:239
@ VSF_DMA_SRC_ADDR_MASK
Definition vsf_template_dma.h:240
@ VSF_DMA_DST_WIDTH_COUNT
Definition vsf_template_dma.h:257
@ VSF_DMA_DIRECTION_MASK
Definition vsf_template_dma.h:234
@ VSF_DMA_SRC_WIDTH_COUNT
Definition vsf_template_dma.h:249
@ VSF_DMA_PRIOPIRY_MASK
Definition vsf_template_dma.h:286
@ VSF_DMA_MODE_MASK_COUNT
Definition vsf_template_dma.h:291
@ VSF_DMA_DST_BURST_MASK
Definition vsf_template_dma.h:276
@ VSF_DMA_IRQ_COUNT
Definition vsf_template_dma.h:312
@ VSF_DMA_IRQ_ALL_BITS_MASK
Definition vsf_template_dma.h:313
struct vsf_dma_capability_t vsf_dma_capability_t
struct vsf_dma_channel_status_t vsf_dma_channel_status_t
vsf_err_t vsf_dma_init(vsf_dma_t *dma_ptr)
Initialize a DMA instance.
Definition dma_common.c:38
vsf_dma_channel_status_t vsf_dma_channel_status(vsf_dma_t *dma_ptr, int8_t channel)
Get status of a DMA channel.
Definition dma_common.c:123
int8_t vsf_dma_channel_request(vsf_dma_t *dma_ptr)
DMA request a new channel.
Definition dma_common.c:65
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)
Start a DMA channel transfer.
Definition dma_common.c:93
vsf_err_t vsf_dma_channel_config(vsf_dma_t *dma_ptr, int8_t channel, vsf_dma_channel_cfg_t *cfg_ptr)
Configure a DMA channel.
Definition dma_common.c:83
void vsf_dma_fini(vsf_dma_t *dma_ptr)
Finalize a DMA instance.
Definition dma_common.c:47
vsf_dma_irq_mask_t
Definition vsf_template_dma.h:304
@ VSF_DMA_IRQ_MASK_HALF_CPL
Definition vsf_template_dma.h:306
@ VSF_DMA_IRQ_MASK_CPL
Definition vsf_template_dma.h:305
@ VSF_DMA_IRQ_MASK_ERROR
Definition vsf_template_dma.h:307
uint32_t vsf_dma_channel_get_transferred_count(vsf_dma_t *dma_ptr, int8_t channel)
Get the counter of bytes transferred for a specific DMA channel.
Definition dma_common.c:114
struct vsf_dma_channel_cfg_t vsf_dma_channel_cfg_t
dma configuration
vsf_dma_capability_t vsf_dma_capability(vsf_dma_t *dma_ptr)
Get the capabilities of DMA instance.
Definition dma_common.c:56
void vsf_dma_channel_release(vsf_dma_t *dma_ptr, int8_t channel)
Release a DMA channel.
Definition dma_common.c:74
#define VSF_DMA_APIS(__prefix_name)
DMA API template, used to generate DMA type, specific prefix function declarations,...
Definition vsf_template_dma.h:161
Generated from commit: vsfteam/vsf@7ffe763