VSF Documented
dma_template.inc
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#if VSF_HAL_USE_DMA == ENABLED
19
20/*============================ INCLUDES ======================================*/
21/*============================ MACROS ========================================*/
22
23#define vsf_real_dma_t VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_t)
24#define vsf_real_dma_capability VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_capability)
25#define vsf_real_dma_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_get_configuration)
26#define vsf_real_dma_channel_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_get_configuration)
27#define vsf_real_dma_channel_sg_config_desc VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_sg_config_desc)
28#define vsf_real_dma_channel_sg_start VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_sg_start)
29
30#ifndef VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY
31# define VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY DISABLED
32#endif
33
34#ifndef VSF_DMA_CFG_REIMPLEMENT_API_SG_CONFIG_DESC
35# define VSF_DMA_CFG_REIMPLEMENT_API_SG_CONFIG_DESC DISABLED
36#endif
37
38#ifndef VSF_DMA_CFG_REIMPLEMENT_API_SG_START
39# define VSF_DMA_CFG_REIMPLEMENT_API_SG_START DISABLED
40#endif
41
42#ifndef VSF_DMA_CFG_REIMPLEMENT_API_GET_CONFIGURATION
43# define VSF_DMA_CFG_REIMPLEMENT_API_GET_CONFIGURATION DISABLED
44#endif
45
46#ifndef VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_GET_CONFIGURATION
47# define VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_GET_CONFIGURATION DISABLED
48#endif
49
50#ifdef VSF_DMA_CFG_IMP_REMAP_PREFIX
51# undef VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY
52# define VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY ENABLED
53# undef VSF_DMA_CFG_REIMPLEMENT_API_GET_CONFIGURATION
54# define VSF_DMA_CFG_REIMPLEMENT_API_GET_CONFIGURATION ENABLED
55# undef VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_GET_CONFIGURATION
56# define VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_GET_CONFIGURATION ENABLED
57#endif
58
59#if VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
60# ifndef VSF_DMA_CFG_CAPABILITY_IRQ_MASK
61# define VSF_DMA_CFG_CAPABILITY_IRQ_MASK VSF_DMA_IRQ_ALL_BITS_MASK
62# endif
63# ifndef VSF_DMA_CFG_CAPABILITY_CHANNEL_COUNT
64# define VSF_DMA_CFG_CAPABILITY_CHANNEL_COUNT 8
65# endif
66# ifndef VSF_DMA_CFG_CAPABILITY_IRQ_COUNT
67# define VSF_DMA_CFG_CAPABILITY_IRQ_COUNT VSF_DMA_CFG_CAPABILITY_CHANNEL_COUNT
68# endif
69# ifndef VSF_DMA_CFG_CAPABILITY_SUPPORTED_MODES
70# define VSF_DMA_CFG_CAPABILITY_SUPPORTED_MODES VSF_DMA_MODE_ALL_BITS_MASK
71# endif
72# ifndef VSF_DMA_CFG_CAPABILITY_MAX_TRANSFER_COUNT
73# define VSF_DMA_CFG_CAPABILITY_MAX_TRANSFER_COUNT 0xFFFFFFFF
74# endif
75# ifndef VSF_DMA_CFG_CAPABILITY_ADDR_ALIGNMENT
76# define VSF_DMA_CFG_CAPABILITY_ADDR_ALIGNMENT 1
77# endif
78# ifndef VSF_DMA_CFG_CAPABILITY_SUPPORT_SCATTER_GATHER
79# define VSF_DMA_CFG_CAPABILITY_SUPPORT_SCATTER_GATHER 0
80# endif
81#endif
82
83/*============================ LOCAL VARIABLES ===============================*/
84/*============================ IMPLEMENTATION ================================*/
85
86#if VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
87vsf_dma_capability_t vsf_real_dma_capability(vsf_real_dma_t *dma_ptr)
88{
89 vsf_dma_capability_t dma_capability = {
90 .irq_mask = VSF_DMA_CFG_CAPABILITY_IRQ_MASK,
91 .channel_count = VSF_DMA_CFG_CAPABILITY_CHANNEL_COUNT,
92 .irq_count = VSF_DMA_CFG_CAPABILITY_IRQ_COUNT,
93 .supported_modes = VSF_DMA_CFG_CAPABILITY_SUPPORTED_MODES,
94 .max_transfer_count = VSF_DMA_CFG_CAPABILITY_MAX_TRANSFER_COUNT,
95 .addr_alignment = VSF_DMA_CFG_CAPABILITY_ADDR_ALIGNMENT,
96 .support_scatter_gather = VSF_DMA_CFG_CAPABILITY_SUPPORT_SCATTER_GATHER,
97 };
98
99 return dma_capability;
100}
101#endif
102
103#if VSF_DMA_CFG_REIMPLEMENT_API_SG_CONFIG_DESC == DISABLED
104vsf_err_t vsf_real_dma_channel_sg_config_desc(vsf_real_dma_t *dma_ptr, uint8_t channel, vsf_dma_isr_t isr,
105 vsf_dma_channel_sg_desc_t *sg_desc_ptr, uint32_t sg_count)
106{
107 VSF_HAL_ASSERT(dma_ptr != NULL);
108 VSF_HAL_ASSERT(sg_desc_ptr != NULL);
109 VSF_HAL_ASSERT(sg_count > 0);
110
111 if ((NULL == dma_ptr) || (NULL == sg_desc_ptr) || (sg_count == 0)) {
113 }
114
115 // TODO
116 return VSF_ERR_NOT_SUPPORT;
117}
118#endif
119
120#if VSF_DMA_CFG_REIMPLEMENT_API_SG_START == DISABLED
121vsf_err_t vsf_real_dma_channel_sg_start(vsf_real_dma_t *dma_ptr, uint8_t channel)
122{
123 VSF_HAL_ASSERT(dma_ptr != NULL);
124
125 if (NULL == dma_ptr) {
127 }
128
129 // TODO
130 return VSF_ERR_NOT_SUPPORT;
131}
132#endif
133
134#if VSF_DMA_CFG_REIMPLEMENT_API_GET_CONFIGURATION == DISABLED
135vsf_err_t vsf_real_dma_get_configuration(vsf_real_dma_t *dma_ptr, vsf_dma_cfg_t *cfg_ptr)
136{
137 VSF_HAL_ASSERT(NULL != dma_ptr);
138 VSF_HAL_ASSERT(NULL != cfg_ptr);
139
140 // Default implementation: not supported, trigger assertion
142
143 return VSF_ERR_NOT_SUPPORT;
144}
145#endif
146
147#if VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_GET_CONFIGURATION == DISABLED
148vsf_err_t vsf_real_dma_channel_get_configuration(vsf_real_dma_t *dma_ptr, uint8_t channel, vsf_dma_channel_cfg_t *cfg_ptr)
149{
150 VSF_HAL_ASSERT(NULL != dma_ptr);
151 VSF_HAL_ASSERT(NULL != cfg_ptr);
152
153 // Default implementation: not supported, trigger assertion
155
156 return VSF_ERR_NOT_SUPPORT;
157}
158#endif
159
160/*============================ MACROS ========================================*/
161
162#undef VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY
163#undef VSF_DMA_CFG_REIMPLEMENT_API_GET_CONFIGURATION
164#undef VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_GET_CONFIGURATION
165#undef VSF_DMA_CFG_CAPABILITY_IRQ_MASK
166#undef VSF_DMA_CFG_CAPABILITY_CHANNEL_COUNT
167#undef VSF_DMA_CFG_CAPABILITY_IRQ_COUNT
168#undef VSF_DMA_CFG_CAPABILITY_SUPPORTED_MODES
169#undef VSF_DMA_CFG_CAPABILITY_MAX_TRANSFER_COUNT
170#undef VSF_DMA_CFG_CAPABILITY_ADDR_ALIGNMENT
171#undef VSF_DMA_CFG_CAPABILITY_SUPPORT_SCATTER_GATHER
172#undef vsf_real_dma_t
173#undef vsf_real_dma_capability
174#undef vsf_real_dma_get_configuration
175#undef vsf_real_dma_channel_get_configuration
176
177/*============================ LOCAL VARIABLES ===============================*/
178/*============================ IMPLEMENTATION ================================*/
179/*============================ MACROS ========================================*/
180
181
182#ifdef VSF_DMA_CFG_IMP_REMAP_PREFIX
183# define vsf_imp_dma_t VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_t)
184# define vsf_imp_dma_init VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_init)
185# define vsf_imp_dma_fini VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_fini)
186# define vsf_imp_dma_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_get_configuration)
187# define vsf_imp_dma_capability VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_capability)
188# define vsf_imp_dma_channel_acquire VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_acquire)
189# define vsf_imp_dma_channel_release VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_release)
190# define vsf_imp_dma_channel_config VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_config)
191# define vsf_imp_dma_channel_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_get_configuration)
192# define vsf_imp_dma_channel_start VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_start)
193# define vsf_imp_dma_channel_cancel VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_cancel)
194# define vsf_imp_dma_channel_get_transferred_count VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_get_transferred_count)
195# define vsf_imp_dma_channel_status VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_status)
196
197# define vsf_remap_dma_t VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_t)
198# define vsf_remap_dma_init VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_init)
199# define vsf_remap_dma_fini VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_fini)
200# define vsf_remap_dma_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_get_configuration)
201# define vsf_remap_dma_capability VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_capability)
202# define vsf_remap_dma_channel_acquire VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_acquire)
203# define vsf_remap_dma_channel_release VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_release)
204# define vsf_remap_dma_channel_config VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_config)
205# define vsf_remap_dma_channel_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_get_configuration)
206# define vsf_remap_dma_channel_start VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_start)
207# define vsf_remap_dma_channel_cancel VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_cancel)
208# define vsf_remap_dma_channel_get_transferred_count VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_get_transferred_count)
209# define vsf_remap_dma_channel_status VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_status)
210
211# define VSF_DMA_CFG_IMP_REMAP_FUNCTIONS \
212 vsf_err_t vsf_imp_dma_init(vsf_imp_dma_t *dma_ptr) \
213 { \
214 VSF_HAL_ASSERT(dma_ptr != NULL); \
215 return vsf_remap_dma_init(dma_ptr); \
216 } \
217 void vsf_imp_dma_fini(vsf_imp_dma_t *dma_ptr) \
218 { \
219 VSF_HAL_ASSERT(dma_ptr != NULL); \
220 vsf_remap_dma_fini(dma_ptr); \
221 } \
222 vsf_err_t vsf_imp_dma_get_configuration(vsf_imp_dma_t *dma_ptr, \
223 vsf_dma_cfg_t *cfg_ptr) \
224 { \
225 VSF_HAL_ASSERT(dma_ptr != NULL); \
226 VSF_HAL_ASSERT(cfg_ptr != NULL); \
227 return vsf_remap_dma_get_configuration(dma_ptr, cfg_ptr); \
228 } \
229 vsf_dma_capability_t vsf_imp_dma_capability(vsf_imp_dma_t *dma_ptr) \
230 { \
231 VSF_HAL_ASSERT(dma_ptr != NULL); \
232 return vsf_remap_dma_capability(dma_ptr); \
233 } \
234 vsf_err_t vsf_imp_dma_channel_acquire(vsf_imp_dma_t *dma_ptr, \
235 vsf_dma_channel_hint_t *channel_hint_ptr) \
236 { \
237 VSF_HAL_ASSERT(dma_ptr != NULL); \
238 return vsf_remap_dma_channel_acquire(dma_ptr, channel_hint_ptr); \
239 } \
240 void vsf_imp_dma_channel_release(vsf_imp_dma_t *dma_ptr, int8_t channel) \
241 { \
242 VSF_HAL_ASSERT(dma_ptr != NULL); \
243 vsf_remap_dma_channel_release(dma_ptr, channel); \
244 } \
245 vsf_err_t vsf_imp_dma_channel_config(vsf_imp_dma_t *dma_ptr, int8_t channel, \
246 vsf_dma_channel_cfg_t *cfg_ptr) \
247 { \
248 VSF_HAL_ASSERT(dma_ptr != NULL); \
249 return vsf_remap_dma_channel_config(dma_ptr, channel, cfg_ptr); \
250 } \
251 vsf_err_t vsf_imp_dma_channel_get_configuration(vsf_imp_dma_t *dma_ptr, \
252 int8_t channel, \
253 vsf_dma_channel_cfg_t *cfg_ptr) \
254 { \
255 VSF_HAL_ASSERT(dma_ptr != NULL); \
256 VSF_HAL_ASSERT(cfg_ptr != NULL); \
257 return vsf_remap_dma_channel_get_configuration(dma_ptr, channel, cfg_ptr); \
258 } \
259 vsf_err_t vsf_imp_dma_channel_start(vsf_imp_dma_t *dma_ptr, int8_t channel, \
260 uint32_t src_address, uint32_t dst_address, \
261 uint32_t count) \
262 { \
263 VSF_HAL_ASSERT(dma_ptr != NULL); \
264 return vsf_remap_dma_channel_start(dma_ptr, channel, src_address, \
265 dst_address, count); \
266 } \
267 vsf_err_t vsf_imp_dma_channel_cancel(vsf_imp_dma_t *dma_ptr, int8_t channel) \
268 { \
269 VSF_HAL_ASSERT(dma_ptr != NULL); \
270 return vsf_remap_dma_channel_cancel(dma_ptr, channel); \
271 } \
272 vsf_err_t vsf_imp_dma_channel_get_transferred_count(vsf_imp_dma_t *dma_ptr, \
273 int8_t channel) \
274 { \
275 VSF_HAL_ASSERT(dma_ptr != NULL); \
276 return vsf_remap_dma_channel_get_transferred_count(dma_ptr, channel); \
277 } \
278 vsf_dma_channel_status_t vsf_imp_dma_channel_status(vsf_imp_dma_t *dma_ptr, \
279 int8_t channel) \
280 { \
281 VSF_HAL_ASSERT(dma_ptr != NULL); \
282 return vsf_remap_dma_channel_status(dma_ptr, channel); \
283 }
284#endif
285
286
287/*============================ GLOBAL VARIABLES ==============================*/
288
289#define VSF_HAL_TEMPLATE_IMP_NAME _dma
290#define VSF_HAL_TEMPLATE_IMP_UPCASE_NAME _DMA
291
292#if !defined(VSF_DMA_CFG_IMP_PREFIX) && !defined(VSF_DMA_CFG_IMP_DEVICE_PREFIX)
293# error "Please define VSF_DMA_CFG_IMP_PREFIX in dma driver"
294#endif
295
296#if !defined(VSF_DMA_CFG_IMP_UPCASE_PREFIX) && !defined(VSF_DMA_CFG_IMP_DEVICE_UPCASE_PREFIX)
297# error "Please define VSF_DMA_CFG_IMP_UPCASE_PREFIX in dma driver"
298#endif
299
300#ifndef VSF_DMA_CFG_IMP_COUNT_MASK_PREFIX
301# define VSF_DMA_CFG_IMP_COUNT_MASK_PREFIX VSF_DMA_CFG_IMP_UPCASE_PREFIX
302#endif
303
304#ifdef VSF_DMA_CFG_IMP_REMAP_FUNCTIONS
305# define VSF_HAL_CFG_IMP_REMAP_FUNCTIONS VSF_DMA_CFG_IMP_REMAP_FUNCTIONS
306#endif
307
309
310#undef VSF_DMA_CFG_IMP_PREFIX
311#undef VSF_DMA_CFG_IMP_COUNT_MASK_PREFIX
312#undef VSF_DMA_CFG_IMP_UPCASE_PREFIX
313#undef VSF_DMA_CFG_IMP_DEVICE_PREFIX
314#undef VSF_DMA_CFG_IMP_DEVICE_UPCASE_PREFIX
315#undef VSF_DMA_CFG_IMP_LV0
316#undef VSF_DMA_CFG_IMP_REMAP_FUNCTIONS
317#undef VSF_DMA_CFG_IMP_HAS_OP
318#undef VSF_DMA_CFG_IMP_EXTERN_OP
319
320#undef vsf_imp_dma_t
321#undef vsf_imp_dma_init
322#undef vsf_imp_dma_fini
323#undef vsf_imp_dma_get_configuration
324#undef vsf_imp_dma_capability
325#undef vsf_imp_dma_channel_acquire
326#undef vsf_imp_dma_channel_release
327#undef vsf_imp_dma_channel_config
328#undef vsf_imp_dma_channel_get_configuration
329#undef vsf_imp_dma_channel_start
330#undef vsf_imp_dma_channel_cancel
331#undef vsf_imp_dma_channel_get_transferred_count
332#undef vsf_imp_dma_channel_status
333
334#undef vsf_remap_dma_t
335#undef vsf_remap_dma_init
336#undef vsf_remap_dma_fini
337#undef vsf_remap_dma_get_configuration
338#undef vsf_remap_dma_capability
339#undef vsf_remap_dma_channel_acquire
340#undef vsf_remap_dma_channel_release
341#undef vsf_remap_dma_channel_config
342#undef vsf_remap_dma_channel_get_configuration
343#undef vsf_remap_dma_channel_start
344#undef vsf_remap_dma_channel_cancel
345#undef vsf_remap_dma_channel_get_transferred_count
346#undef vsf_remap_dma_channel_status
347
348#endif /* VSF_HAL_USE_DMA */
vsf_err_t
Definition __type.h:42
@ VSF_ERR_NOT_SUPPORT
function not supported
Definition __type.h:46
@ VSF_ERR_INVALID_PARAMETER
invalid parameter
Definition __type.h:52
#define NULL
Definition lvgl.h:26
unsigned uint32_t
Definition stdint.h:9
unsigned char uint8_t
Definition stdint.h:5
DMA capability structure that can be reimplemented in specific HAL drivers.
Definition dma.h:228
uint8_t channel_count
Number of DMA channels.
Definition dma.h:233
Configuration structure for DMA.
Definition dma.h:222
dma configuration
Definition dma.h:184
DMA scatter-gather descriptor structure.
Definition dma.h:212
Definition dma.h:180
vsf_adc_isr_t isr
Definition adc.h:111
#define VSF_HAL_ASSERT(__CON)
all hal modules use this configuration file
Definition vsf_hal_cfg.h:36
Generated from commit: vsfteam/vsf@f5be458