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#if defined(VSF_DMA_CFG_IMP_RENAME_DEVICE_PREFIX) && (VSF_DMA_CFG_IMP_RENAME_DEVICE_PREFIX == ENABLED)
24# define vsf_real_dma_t VSF_MCONNECT(VSF_DMA_CFG_IMP_DEVICE_PREFIX, _t)
25# define vsf_real_dma_capability VSF_MCONNECT(VSF_DMA_CFG_IMP_DEVICE_PREFIX, _capability)
26# define vsf_real_dma_ctrl VSF_MCONNECT(VSF_DMA_CFG_IMP_DEVICE_PREFIX, _ctrl)
27# define vsf_real_dma_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_DEVICE_PREFIX, _get_configuration)
28# define vsf_real_dma_channel_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_DEVICE_PREFIX, _channel_get_configuration)
29# define vsf_real_dma_channel_sg_config_desc VSF_MCONNECT(VSF_DMA_CFG_IMP_DEVICE_PREFIX, _channel_sg_config_desc)
30# define vsf_real_dma_channel_sg_start VSF_MCONNECT(VSF_DMA_CFG_IMP_DEVICE_PREFIX, _channel_sg_start)
31# define vsf_real_dma_channel_acquire_from_all VSF_MCONNECT(VSF_DMA_CFG_IMP_DEVICE_PREFIX, _channel_acquire_from_all)
32#else
33# define vsf_real_dma_t VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_t)
34# define vsf_real_dma_capability VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_capability)
35# define vsf_real_dma_ctrl VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_ctrl)
36# define vsf_real_dma_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_get_configuration)
37# define vsf_real_dma_channel_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_get_configuration)
38# define vsf_real_dma_channel_sg_config_desc VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_sg_config_desc)
39# define vsf_real_dma_channel_sg_start VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_sg_start)
40# define vsf_real_dma_channel_acquire_from_all VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_acquire_from_all)
41#endif
42
43#ifndef VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY
44# define VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY DISABLED
45#endif
46
47#ifndef VSF_DMA_CFG_REIMPLEMENT_API_CTRL
48# define VSF_DMA_CFG_REIMPLEMENT_API_CTRL DISABLED
49#endif
50
51#ifndef VSF_DMA_CFG_REIMPLEMENT_API_SG_CONFIG_DESC
52# define VSF_DMA_CFG_REIMPLEMENT_API_SG_CONFIG_DESC DISABLED
53#endif
54
55#ifndef VSF_DMA_CFG_REIMPLEMENT_API_SG_START
56# define VSF_DMA_CFG_REIMPLEMENT_API_SG_START DISABLED
57#endif
58
59#ifndef VSF_DMA_CFG_REIMPLEMENT_API_GET_CONFIGURATION
60# define VSF_DMA_CFG_REIMPLEMENT_API_GET_CONFIGURATION DISABLED
61#endif
62
63#ifndef VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_GET_CONFIGURATION
64# define VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_GET_CONFIGURATION \
65 DISABLED
66#endif
67
68#ifndef VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_ACQUIRE_FROM_ALL
69# define VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_ACQUIRE_FROM_ALL \
70 DISABLED
71#endif
72
73#ifdef VSF_DMA_CFG_IMP_REMAP_PREFIX
74# undef VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY
75# define VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY ENABLED
76# undef VSF_DMA_CFG_REIMPLEMENT_API_CTRL
77# define VSF_DMA_CFG_REIMPLEMENT_API_CTRL ENABLED
78# undef VSF_DMA_CFG_REIMPLEMENT_API_GET_CONFIGURATION
79# define VSF_DMA_CFG_REIMPLEMENT_API_GET_CONFIGURATION ENABLED
80# undef VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_GET_CONFIGURATION
81# define VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_GET_CONFIGURATION ENABLED
82#endif
83
84#if VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
85# ifndef VSF_DMA_CFG_CAPABILITY_IRQ_MASK
86# define VSF_DMA_CFG_CAPABILITY_IRQ_MASK VSF_DMA_IRQ_ALL_BITS_MASK
87# endif
88# ifndef VSF_DMA_CFG_CAPABILITY_CHANNEL_COUNT
89# define VSF_DMA_CFG_CAPABILITY_CHANNEL_COUNT 8
90# endif
91# ifndef VSF_DMA_CFG_CAPABILITY_IRQ_COUNT
92# define VSF_DMA_CFG_CAPABILITY_IRQ_COUNT VSF_DMA_CFG_CAPABILITY_CHANNEL_COUNT
93# endif
94# ifndef VSF_DMA_CFG_CAPABILITY_SUPPORTED_MODES
95# define VSF_DMA_CFG_CAPABILITY_SUPPORTED_MODES VSF_DMA_MODE_ALL_BITS_MASK
96# endif
97# ifndef VSF_DMA_CFG_CAPABILITY_MAX_TRANSFER_COUNT
98# define VSF_DMA_CFG_CAPABILITY_MAX_TRANSFER_COUNT 0xFFFFFFFF
99# endif
100# ifndef VSF_DMA_CFG_CAPABILITY_ADDR_ALIGNMENT
101# define VSF_DMA_CFG_CAPABILITY_ADDR_ALIGNMENT 1
102# endif
103# ifndef VSF_DMA_CFG_CAPABILITY_SUPPORT_SCATTER_GATHER
104# define VSF_DMA_CFG_CAPABILITY_SUPPORT_SCATTER_GATHER 0
105# endif
106#endif
107
108/*============================ LOCAL VARIABLES ===============================*/
109/*============================ IMPLEMENTATION ================================*/
110
111#if VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY == DISABLED
112vsf_dma_capability_t vsf_real_dma_capability(vsf_real_dma_t *dma_ptr)
113{
114 vsf_dma_capability_t dma_capability = {
115 .irq_mask = VSF_DMA_CFG_CAPABILITY_IRQ_MASK,
116 .channel_count = VSF_DMA_CFG_CAPABILITY_CHANNEL_COUNT,
117 .irq_count = VSF_DMA_CFG_CAPABILITY_IRQ_COUNT,
118 .supported_modes = VSF_DMA_CFG_CAPABILITY_SUPPORTED_MODES,
119 .max_transfer_count = VSF_DMA_CFG_CAPABILITY_MAX_TRANSFER_COUNT,
120 .addr_alignment = VSF_DMA_CFG_CAPABILITY_ADDR_ALIGNMENT,
121 .support_scatter_gather = VSF_DMA_CFG_CAPABILITY_SUPPORT_SCATTER_GATHER,
122 };
123
124 return dma_capability;
125}
126#endif
127
128#if VSF_DMA_CFG_REIMPLEMENT_API_SG_CONFIG_DESC == DISABLED
129vsf_err_t vsf_real_dma_channel_sg_config_desc(vsf_real_dma_t *dma_ptr, uint8_t channel, vsf_dma_isr_t isr,
130 vsf_dma_channel_sg_desc_t *sg_desc_ptr, uint32_t sg_count)
131{
132 VSF_HAL_ASSERT(dma_ptr != NULL);
133 VSF_HAL_ASSERT(sg_desc_ptr != NULL);
134 VSF_HAL_ASSERT(sg_count > 0);
135
136 if ((NULL == dma_ptr) || (NULL == sg_desc_ptr) || (sg_count == 0)) {
138 }
139
140 // TODO
141 return VSF_ERR_NOT_SUPPORT;
142}
143#endif
144
145#if VSF_DMA_CFG_REIMPLEMENT_API_SG_START == DISABLED
146vsf_err_t vsf_real_dma_channel_sg_start(vsf_real_dma_t *dma_ptr, uint8_t channel)
147{
148 VSF_HAL_ASSERT(dma_ptr != NULL);
149
150 if (NULL == dma_ptr) {
152 }
153
154 // TODO
155 return VSF_ERR_NOT_SUPPORT;
156}
157#endif
158
159#if VSF_DMA_CFG_REIMPLEMENT_API_GET_CONFIGURATION == DISABLED
160vsf_err_t vsf_real_dma_get_configuration(vsf_real_dma_t *dma_ptr, vsf_dma_cfg_t *cfg_ptr)
161{
162 VSF_HAL_ASSERT(NULL != dma_ptr);
163 VSF_HAL_ASSERT(NULL != cfg_ptr);
164
165 // Default implementation: not supported, trigger assertion
167
168 return VSF_ERR_NOT_SUPPORT;
169}
170#endif
171
172#if VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_GET_CONFIGURATION == DISABLED
173vsf_err_t vsf_real_dma_channel_get_configuration(vsf_real_dma_t *dma_ptr, uint8_t channel, vsf_dma_channel_cfg_t *cfg_ptr)
174{
175 VSF_HAL_ASSERT(NULL != dma_ptr);
176 VSF_HAL_ASSERT(NULL != cfg_ptr);
177
178 // Default implementation: not supported, trigger assertion
180
181 return VSF_ERR_NOT_SUPPORT;
182}
183#endif
184
185#if VSF_DMA_CFG_REIMPLEMENT_API_CTRL == DISABLED
186vsf_err_t vsf_real_dma_ctrl(vsf_real_dma_t *dma_ptr, vsf_dma_ctrl_t ctrl, void *param)
187{
188 VSF_HAL_ASSERT(NULL != dma_ptr);
189
190 // Default implementation: not supported, trigger assertion
192
193 return VSF_ERR_NOT_SUPPORT;
194}
195#endif
196
197#ifndef VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_ACQUIRE_ADJUST_HINT
198# define VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_ACQUIRE_ADJUST_HINT DISABLED
199#endif
200
201#if VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_ACQUIRE_FROM_ALL == DISABLED
202vsf_dma_t * vsf_real_dma_channel_acquire_from_all(vsf_dma_channel_hint_t *channel_hint_ptr)
203{
204 VSF_HAL_ASSERT(channel_hint_ptr != NULL);
205
206# define require_dma_channel(_idx, _hint_ptr) \
207 if (VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_acquire)( \
208 &VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma, _idx), _hint_ptr) == VSF_ERR_NONE) {\
209 return (vsf_dma_t *)&VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma, _idx); \
210 }
211
212# define __VSF_HAL_TEMPLATE_MASK VSF_MCONNECT(VSF_DMA_CFG_IMP_UPCASE_PREFIX, _DMA_MASK)
213# define __VSF_HAL_TEMPLATE_MACRO require_dma_channel
214# define __VSF_HAL_TEMPLATE_ARG channel_hint_ptr
216
217 return NULL;
218}
219#endif
220
221/*============================ MACROS ========================================*/
222
223#undef VSF_DMA_CFG_REIMPLEMENT_TYPE_ADDR
224#undef VSF_DMA_CFG_REIMPLEMENT_TYPE_CAPABILITY
225#undef VSF_DMA_CFG_REIMPLEMENT_TYPE_CFG
226#undef VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_CFG
227#undef VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_HINT
228#undef VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_MODE
229#undef VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_SG_CFG
230#undef VSF_DMA_CFG_REIMPLEMENT_TYPE_CHANNEL_STATUS
231#undef VSF_DMA_CFG_REIMPLEMENT_TYPE_IRQ_MASK
232#undef VSF_DMA_CFG_REIMPLEMENT_TYPE_CTRL
233#undef VSF_DMA_CFG_REIMPLEMENT_API_CAPABILITY
234#undef VSF_DMA_CFG_REIMPLEMENT_API_CTRL
235#undef VSF_DMA_CFG_REIMPLEMENT_API_GET_CONFIGURATION
236#undef VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_GET_CONFIGURATION
237#undef VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_ACQUIRE_ADJUST_HINT
238#undef VSF_DMA_CFG_REIMPLEMENT_API_CHANNEL_ACQUIRE_FROM_ALL
239#undef VSF_DMA_CFG_CAPABILITY_IRQ_MASK
240#undef VSF_DMA_CFG_CAPABILITY_CHANNEL_COUNT
241#undef VSF_DMA_CFG_CAPABILITY_IRQ_COUNT
242#undef VSF_DMA_CFG_CAPABILITY_SUPPORTED_MODES
243#undef VSF_DMA_CFG_CAPABILITY_MAX_TRANSFER_COUNT
244#undef VSF_DMA_CFG_CAPABILITY_ADDR_ALIGNMENT
245#undef VSF_DMA_CFG_CAPABILITY_SUPPORT_SCATTER_GATHER
246#undef vsf_real_dma_t
247#undef vsf_real_dma_capability
248#undef vsf_real_dma_ctrl
249#undef vsf_real_dma_get_configuration
250#undef vsf_real_dma_channel_get_configuration
251#undef vsf_real_dma_channel_sg_config_desc
252#undef vsf_real_dma_channel_sg_start
253#undef vsf_real_dma_channel_acquire_from_all
254
255/*============================ LOCAL VARIABLES ===============================*/
256/*============================ IMPLEMENTATION ================================*/
257/*============================ MACROS ========================================*/
258
259
260#ifdef VSF_DMA_CFG_IMP_REMAP_PREFIX
261# define vsf_imp_dma_t VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_t)
262# define vsf_imp_dma_init VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_init)
263# define vsf_imp_dma_fini VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_fini)
264# define vsf_imp_dma_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_get_configuration)
265# define vsf_imp_dma_capability VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_capability)
266# define vsf_imp_dma_ctrl VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_ctrl)
267# define vsf_imp_dma_channel_acquire VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_acquire)
268# define vsf_imp_dma_channel_release VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_release)
269# define vsf_imp_dma_channel_config VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_config)
270# define vsf_imp_dma_channel_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_get_configuration)
271# define vsf_imp_dma_channel_start VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_start)
272# define vsf_imp_dma_channel_cancel VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_cancel)
273# define vsf_imp_dma_channel_get_transferred_count VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_get_transferred_count)
274# define vsf_imp_dma_channel_status VSF_MCONNECT(VSF_DMA_CFG_IMP_PREFIX, _dma_channel_status)
275
276# define vsf_remap_dma_t VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_t)
277# define vsf_remap_dma_init VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_init)
278# define vsf_remap_dma_fini VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_fini)
279# define vsf_remap_dma_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_get_configuration)
280# define vsf_remap_dma_capability VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_capability)
281# define vsf_remap_dma_channel_acquire VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_acquire)
282# define vsf_remap_dma_channel_release VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_release)
283# define vsf_remap_dma_channel_config VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_config)
284# define vsf_remap_dma_channel_get_configuration VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_get_configuration)
285# define vsf_remap_dma_channel_start VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_start)
286# define vsf_remap_dma_channel_cancel VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_cancel)
287# define vsf_remap_dma_channel_get_transferred_count VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_get_transferred_count)
288# define vsf_remap_dma_channel_status VSF_MCONNECT(VSF_DMA_CFG_IMP_REMAP_PREFIX, _dma_channel_status)
289
290# define VSF_DMA_CFG_IMP_REMAP_FUNCTIONS \
291 vsf_err_t vsf_imp_dma_init(vsf_imp_dma_t *dma_ptr) \
292 { \
293 VSF_HAL_ASSERT(dma_ptr != NULL); \
294 return vsf_remap_dma_init(dma_ptr); \
295 } \
296 void vsf_imp_dma_fini(vsf_imp_dma_t *dma_ptr) \
297 { \
298 VSF_HAL_ASSERT(dma_ptr != NULL); \
299 vsf_remap_dma_fini(dma_ptr); \
300 } \
301 vsf_err_t vsf_imp_dma_get_configuration(vsf_imp_dma_t *dma_ptr, \
302 vsf_dma_cfg_t *cfg_ptr) \
303 { \
304 VSF_HAL_ASSERT(dma_ptr != NULL); \
305 VSF_HAL_ASSERT(cfg_ptr != NULL); \
306 return vsf_remap_dma_get_configuration(dma_ptr, cfg_ptr); \
307 } \
308 vsf_dma_capability_t vsf_imp_dma_capability(vsf_imp_dma_t *dma_ptr) \
309 { \
310 VSF_HAL_ASSERT(dma_ptr != NULL); \
311 return vsf_remap_dma_capability(dma_ptr); \
312 } \
313 vsf_err_t vsf_imp_dma_ctrl(vsf_imp_dma_t *dma_ptr, vsf_dma_ctrl_t ctrl, void *param) \
314 { \
315 VSF_HAL_ASSERT(dma_ptr != NULL); \
316 return vsf_remap_dma_ctrl(dma_ptr, ctrl, param); \
317 } \
318 vsf_err_t vsf_imp_dma_channel_acquire(vsf_imp_dma_t *dma_ptr, \
319 vsf_dma_channel_hint_t *channel_hint_ptr) \
320 { \
321 VSF_HAL_ASSERT(dma_ptr != NULL); \
322 return vsf_remap_dma_channel_acquire(dma_ptr, channel_hint_ptr); \
323 } \
324 void vsf_imp_dma_channel_release(vsf_imp_dma_t *dma_ptr, int8_t channel) \
325 { \
326 VSF_HAL_ASSERT(dma_ptr != NULL); \
327 vsf_remap_dma_channel_release(dma_ptr, channel); \
328 } \
329 vsf_err_t vsf_imp_dma_channel_config(vsf_imp_dma_t *dma_ptr, int8_t channel, \
330 vsf_dma_channel_cfg_t *cfg_ptr) \
331 { \
332 VSF_HAL_ASSERT(dma_ptr != NULL); \
333 return vsf_remap_dma_channel_config(dma_ptr, channel, cfg_ptr); \
334 } \
335 vsf_err_t vsf_imp_dma_channel_get_configuration(vsf_imp_dma_t *dma_ptr, \
336 int8_t channel, \
337 vsf_dma_channel_cfg_t *cfg_ptr) \
338 { \
339 VSF_HAL_ASSERT(dma_ptr != NULL); \
340 VSF_HAL_ASSERT(cfg_ptr != NULL); \
341 return vsf_remap_dma_channel_get_configuration(dma_ptr, channel, cfg_ptr); \
342 } \
343 vsf_err_t vsf_imp_dma_channel_start(vsf_imp_dma_t *dma_ptr, int8_t channel, \
344 uint32_t src_address, uint32_t dst_address, \
345 uint32_t count) \
346 { \
347 VSF_HAL_ASSERT(dma_ptr != NULL); \
348 return vsf_remap_dma_channel_start(dma_ptr, channel, src_address, \
349 dst_address, count); \
350 } \
351 vsf_err_t vsf_imp_dma_channel_cancel(vsf_imp_dma_t *dma_ptr, int8_t channel) \
352 { \
353 VSF_HAL_ASSERT(dma_ptr != NULL); \
354 return vsf_remap_dma_channel_cancel(dma_ptr, channel); \
355 } \
356 vsf_err_t vsf_imp_dma_channel_get_transferred_count(vsf_imp_dma_t *dma_ptr, \
357 int8_t channel) \
358 { \
359 VSF_HAL_ASSERT(dma_ptr != NULL); \
360 return vsf_remap_dma_channel_get_transferred_count(dma_ptr, channel); \
361 } \
362 vsf_dma_channel_status_t vsf_imp_dma_channel_status(vsf_imp_dma_t *dma_ptr, \
363 int8_t channel) \
364 { \
365 VSF_HAL_ASSERT(dma_ptr != NULL); \
366 return vsf_remap_dma_channel_status(dma_ptr, channel); \
367 }
368#endif
369
370
371/*============================ GLOBAL VARIABLES ==============================*/
372
373#define VSF_HAL_TEMPLATE_IMP_NAME _dma
374#define VSF_HAL_TEMPLATE_IMP_UPCASE_NAME _DMA
375
376#if !defined(VSF_DMA_CFG_IMP_PREFIX) && !defined(VSF_DMA_CFG_IMP_DEVICE_PREFIX)
377# error "Please define VSF_DMA_CFG_IMP_PREFIX in dma driver"
378#endif
379
380#if !defined(VSF_DMA_CFG_IMP_UPCASE_PREFIX) && !defined(VSF_DMA_CFG_IMP_DEVICE_UPCASE_PREFIX)
381# error "Please define VSF_DMA_CFG_IMP_UPCASE_PREFIX in dma driver"
382#endif
383
384#ifndef VSF_DMA_CFG_IMP_COUNT_MASK_PREFIX
385# define VSF_DMA_CFG_IMP_COUNT_MASK_PREFIX VSF_DMA_CFG_IMP_UPCASE_PREFIX
386#endif
387
388#ifdef VSF_DMA_CFG_IMP_REMAP_FUNCTIONS
389# define VSF_HAL_CFG_IMP_REMAP_FUNCTIONS VSF_DMA_CFG_IMP_REMAP_FUNCTIONS
390#endif
391
393
394#undef VSF_DMA_CFG_IMP_PREFIX
395#undef VSF_DMA_CFG_IMP_COUNT_MASK_PREFIX
396#undef VSF_DMA_CFG_IMP_UPCASE_PREFIX
397#undef VSF_DMA_CFG_IMP_DEVICE_PREFIX
398#undef VSF_DMA_CFG_IMP_DEVICE_UPCASE_PREFIX
399#undef VSF_DMA_CFG_IMP_LV0
400#undef VSF_DMA_CFG_IMP_RENAME_DEVICE_PREFIX
401#undef VSF_DMA_CFG_IMP_REMAP_FUNCTIONS
402#undef VSF_DMA_CFG_IMP_HAS_OP
403#undef VSF_DMA_CFG_IMP_EXTERN_OP
404
405#undef vsf_imp_dma_t
406#undef vsf_imp_dma_init
407#undef vsf_imp_dma_fini
408#undef vsf_imp_dma_get_configuration
409#undef vsf_imp_dma_capability
410#undef vsf_imp_dma_ctrl
411#undef vsf_imp_dma_channel_acquire
412#undef vsf_imp_dma_channel_release
413#undef vsf_imp_dma_channel_config
414#undef vsf_imp_dma_channel_get_configuration
415#undef vsf_imp_dma_channel_start
416#undef vsf_imp_dma_channel_cancel
417#undef vsf_imp_dma_channel_get_transferred_count
418#undef vsf_imp_dma_channel_status
419
420#undef vsf_remap_dma_t
421#undef vsf_remap_dma_init
422#undef vsf_remap_dma_fini
423#undef vsf_remap_dma_get_configuration
424#undef vsf_remap_dma_capability
425#undef vsf_remap_dma_ctrl
426#undef vsf_remap_dma_channel_acquire
427#undef vsf_remap_dma_channel_release
428#undef vsf_remap_dma_channel_config
429#undef vsf_remap_dma_channel_get_configuration
430#undef vsf_remap_dma_channel_start
431#undef vsf_remap_dma_channel_cancel
432#undef vsf_remap_dma_channel_get_transferred_count
433#undef vsf_remap_dma_channel_status
434
435#undef VSF_HAL_TEMPLATE_IMP_NAME
436#undef VSF_HAL_TEMPLATE_IMP_UPCASE_NAME
437
438/*============================ STATIC ASSERTIONS ==============================*/
439
440/* User-extensible macros for custom mode and IRQ mask values
441 * Users can define these macros before including this template to append
442 * their custom enum values to the uniqueness checks.
443 *
444 * Check modes for custom values:
445 * VSF_DMA_CFG_MODE_CHECK_UNIQUE - Check mode for custom mode values
446 * Default: VSF_HAL_CHECK_MODE_LOOSE (loose mode, no overlapping bits)
447 * Can be set to: VSF_HAL_CHECK_MODE_STRICT (strict mode, no overlapping bits)
448 * VSF_DMA_CFG_IRQ_MASK_CHECK_UNIQUE - Check mode for custom IRQ mask values
449 * Default: VSF_HAL_CHECK_MODE_STRICT (strict mode, no overlapping bits)
450 * Can be set to: VSF_HAL_CHECK_MODE_LOOSE (loose mode, no overlapping bits)
451 *
452 * Example usage in vendor driver:
453 * #define VSF_DMA_CUSTOM_MODE_VALUES MY_CUSTOM_MODE1, MY_CUSTOM_MODE2
454 * #define VSF_DMA_CFG_MODE_CHECK_UNIQUE VSF_HAL_CHECK_MODE_LOOSE
455 * #define VSF_DMA_CUSTOM_IRQ_MASK_VALUES MY_CUSTOM_IRQ1, MY_CUSTOM_IRQ2
456 * #define VSF_DMA_CFG_IRQ_MASK_CHECK_UNIQUE VSF_HAL_CHECK_MODE_STRICT
457 * #include "hal/driver/common/dma/dma_template.inc"
458 */
459
460
461#ifdef VSF_DMA_CFG_MODE_CHECK_UNIQUE
462/* Default mode lists - can be redefined by users before including this file */
463#ifndef VSF_DMA_CHECK_UNIQUE_DIRECTION_MODES
464# define VSF_DMA_CHECK_UNIQUE_DIRECTION_MODES \
465 VSF_DMA_MEMORY_TO_MEMORY, \
466 VSF_DMA_MEMORY_TO_PERIPHERAL, \
467 VSF_DMA_PERIPHERAL_TO_MEMORY, \
468 VSF_DMA_PERIPHERAL_TO_PERIPHERAL
469#endif
470
471#ifndef VSF_DMA_CHECK_UNIQUE_SRC_ADDR_MODES
472# define VSF_DMA_CHECK_UNIQUE_SRC_ADDR_MODES \
473 VSF_DMA_SRC_ADDR_INCREMENT, \
474 VSF_DMA_SRC_ADDR_DECREMENT, \
475 VSF_DMA_SRC_ADDR_NO_CHANGE
476#endif
477
478#ifndef VSF_DMA_CHECK_UNIQUE_DST_ADDR_MODES
479# define VSF_DMA_CHECK_UNIQUE_DST_ADDR_MODES \
480 VSF_DMA_DST_ADDR_INCREMENT, \
481 VSF_DMA_DST_ADDR_DECREMENT, \
482 VSF_DMA_DST_ADDR_NO_CHANGE
483#endif
484
485#ifndef VSF_DMA_CHECK_UNIQUE_PRIORITY_MODES
486# define VSF_DMA_CHECK_UNIQUE_PRIORITY_MODES \
487 VSF_DMA_PRIORITY_LOW, \
488 VSF_DMA_PRIORITY_MEDIUM, \
489 VSF_DMA_PRIORITY_HIGH, \
490 VSF_DMA_PRIORITY_VERY_HIGH
491#endif
492
493/* ==================== GROUP INTERNAL UNIQUENESS CHECKS ==================== */
494/* Check uniqueness within each functional group */
495
496/* Check direction mode uniqueness - all direction modes should have different values
497 * Mandatory: VSF_DMA_MEMORY_TO_MEMORY, VSF_DMA_MEMORY_TO_PERIPHERAL,
498 * VSF_DMA_PERIPHERAL_TO_MEMORY, VSF_DMA_PERIPHERAL_TO_PERIPHERAL
499 */
506);
507
508/* Check source address mode uniqueness - all source address modes should have different values
509 * Mandatory: VSF_DMA_SRC_ADDR_INCREMENT, VSF_DMA_SRC_ADDR_DECREMENT, VSF_DMA_SRC_ADDR_NO_CHANGE
510 */
516);
517
518/* Check destination address mode uniqueness - all destination address modes should have different values
519 * Mandatory: VSF_DMA_DST_ADDR_INCREMENT, VSF_DMA_DST_ADDR_DECREMENT, VSF_DMA_DST_ADDR_NO_CHANGE
520 */
526);
527
528/* Check priority mode uniqueness - all priority modes should have different values
529 * Mandatory: VSF_DMA_PRIORITY_LOW, VSF_DMA_PRIORITY_MEDIUM, VSF_DMA_PRIORITY_HIGH, VSF_DMA_PRIORITY_VERY_HIGH
530 */
537);
538
539#ifdef VSF_DMA_CUSTOM_MODE_VALUES
540/* Check uniqueness among custom mode values using user-specified check mode */
542#endif
543
546 /* Mandatory modes - always included */
552 /* Implementation Required modes - conditionally included */
553 /* User-defined modes - appended by user configuration */
554#ifdef VSF_DMA_CUSTOM_MODE_VALUES
555 , VSF_DMA_CUSTOM_MODE_VALUES
556#endif
557);
558
559#undef VSF_DMA_CHECK_UNIQUE_DIRECTION_MODES
560#undef VSF_DMA_CHECK_UNIQUE_SRC_ADDR_MODES
561#undef VSF_DMA_CHECK_UNIQUE_DST_ADDR_MODES
562#undef VSF_DMA_CHECK_UNIQUE_PRIORITY_MODES
563#endif /* VSF_DMA_CFG_MODE_CHECK_UNIQUE */
564
565/* ==================== IRQ MASK UNIQUENESS CHECKS ==================== */
566
567#ifdef VSF_DMA_CFG_IRQ_MASK_CHECK_UNIQUE
568
569#ifdef VSF_DMA_CUSTOM_IRQ_MASK_VALUES
570/* Check uniqueness among custom IRQ mask values using user-specified check mode */
572#endif
573
574/* Check uniqueness within vsf_dma_irq_mask_t enum */
575
576/* Check IRQ mask uniqueness - all IRQ mask bits should have different values
577 * Mandatory: VSF_DMA_IRQ_MASK_CPL, VSF_DMA_IRQ_MASK_HALF_CPL, VSF_DMA_IRQ_MASK_ERROR
578 */
581 /* Mandatory IRQ masks - always included */
585 /* User-defined IRQ masks - appended by user configuration */
586#ifdef VSF_DMA_CUSTOM_IRQ_MASK_VALUES
587 , VSF_DMA_CUSTOM_IRQ_MASK_VALUES
588#endif
589);
590#endif /* VSF_DMA_CFG_IRQ_MASK_CHECK_UNIQUE */
591
592#undef VSF_DMA_CFG_MODE_CHECK_UNIQUE
593#undef VSF_DMA_CFG_IRQ_MASK_CHECK_UNIQUE
594#undef VSF_DMA_CUSTOM_MODE_VALUES
595#undef VSF_DMA_CUSTOM_IRQ_MASK_VALUES
596
597#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
@ VSF_DMA_PRIORITY_MEDIUM
Definition dma.h:113
@ VSF_DMA_PRIORITY_HIGH
Definition dma.h:114
@ VSF_DMA_DST_ADDR_NO_CHANGE
Definition dma.h:105
@ VSF_DMA_SRC_ADDR_INCREMENT
Definition dma.h:96
@ VSF_DMA_MEMORY_TO_PERIPHERAL
Definition dma.h:89
@ VSF_DMA_MEMORY_TO_MEMORY
Definition dma.h:88
@ VSF_DMA_PRIORITY_LOW
Definition dma.h:112
@ VSF_DMA_SRC_ADDR_DECREMENT
Definition dma.h:130
@ VSF_DMA_SRC_ADDR_NO_CHANGE
Definition dma.h:97
@ VSF_DMA_PRIORITY_VERY_HIGH
Definition dma.h:115
@ VSF_DMA_DST_ADDR_DECREMENT
Definition dma.h:131
@ VSF_DMA_PERIPHERAL_TO_PERIPHERAL
Definition dma.h:129
@ VSF_DMA_PERIPHERAL_TO_MEMORY
Definition dma.h:90
@ VSF_DMA_DST_ADDR_INCREMENT
Definition dma.h:104
@ VSF_DMA_IRQ_MASK_HALF_CPL
Definition dma.h:190
@ VSF_DMA_IRQ_MASK_CPL
Definition dma.h:188
@ VSF_DMA_IRQ_MASK_ERROR
Definition dma.h:192
#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:255
uint8_t channel_count
Number of DMA channels.
Definition dma.h:260
Configuration structure for DMA.
Definition dma.h:249
dma configuration
Definition dma.h:211
DMA channel hint structure for channel allocation.
Definition dma.h:197
DMA scatter-gather descriptor structure.
Definition dma.h:239
Definition dma.h:207
Definition vsf_template_dma.h:906
vsf_adc_isr_t isr
Definition adc.h:113
#define VSF_DMA_CFG_MODE_CHECK_UNIQUE
Definition dma.c:312
#define VSF_DMA_CFG_IRQ_MASK_CHECK_UNIQUE
Definition dma.c:313
#define VSF_HAL_ASSERT(__CON)
all hal modules use this configuration file
Definition vsf_hal_cfg.h:36
vsf_dma_ctrl_t
Predefined VSF DMA control commands that can be reimplemented in specific HAL drivers.
Definition vsf_template_dma.h:818
#define VSF_HAL_CHECK_UNIQUE_CUSTOM(__CHECK_FUNC,...)
Definition vsf_template_static_assert_unique.h:2426
Generated from commit: vsfteam/vsf@1e06613