-
Notifications
You must be signed in to change notification settings - Fork 39
/
drv_dma.c
221 lines (186 loc) · 5.91 KB
/
drv_dma.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
/****************************************************************************
**
** Copyright (C) ${COPYRIGHT_YEAR} MikroElektronika d.o.o.
** Contact: https://www.mikroe.com/contact
**
** This file is part of the mikroSDK package
**
** Commercial License Usage
**
** Licensees holding valid commercial NECTO compilers AI licenses may use this
** file in accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The MikroElektronika Company.
** For licensing terms and conditions see
** https://www.mikroe.com/legal/software-license-agreement.
** For further information use the contact form at
** https://www.mikroe.com/contact.
**
**
** GNU Lesser General Public License Usage
**
** Alternatively, this file may be used for
** non-commercial projects under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** The above copyright notice and this permission notice shall be
** included in all copies or substantial portions of the Software.
**
** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** OF MERCHANTABILITY, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
** TO THE WARRANTIES FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
** DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
** OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
** OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
**
****************************************************************************/
/*!
* @file drv_dma.c
* @brief DMA driver implementation.
*/
#include "drv_dma.h"
void dma_configure_default( dma_config_t *config )
{
if ( config ) {
/**
* Fill all values to default ones.
* Leave only channel as UNINITIALIZED.
*/
config->module = 0xFF;
config->stream = 0xFF;
config->channel = 0xFF;
config->direction = DMA_DIRECTION_DEFAULT;
config->mode = DMA_MODE_DEFAULT;
config->priority = DMA_PRIORITY_DEFAULT;
/**
* Set memory values to default ones.
*/
config->src_inc = false;
config->data_align_source = DMA_DATA_ALIGN_DEFAULT;
config->burst_size_source = DMA_BURST_SIZE_INCREMENT_DEFAULT;
/**
* Set peripheral values to default ones.
*/
config->dst_inc = false;
config->data_align_destination = DMA_DATA_ALIGN_DEFAULT;
config->burst_size_destination = DMA_BURST_SIZE_INCREMENT_DEFAULT;
/**
* Set transfer values to default ones.
*/
config->addr_src = 0;
config->addr_dst = 0;
config->transfer_length = 0;
}
}
void dma_get_channels( dma_channel_t *channels )
{
if ( channels ) {
/*!< Used to check which channels are available. */
hal_dma_get_channels( channels );
}
}
err_t dma_open( dma_t *obj, dma_config_t *config )
{
err_t status = DMA_ERROR;
if ( obj ) {
if ( !obj->allocated ) {
/*!< Allocate and initialize DMA object. */
status = hal_dma_open( (hal_dma_t *)obj, (hal_dma_config_t *)config );
}
}
return status;
}
err_t dma_set_mode( dma_t *obj, dma_mode_t mode )
{
err_t status = DMA_ERROR;
if ( obj ) {
if ( obj->allocated ) {
/*!< Set dma mode - normal/circular etc. */
status = hal_dma_set_mode( (hal_dma_t *)obj, (hal_dma_mode_t)mode );
}
}
return status;
}
err_t dma_set_direction( dma_t *obj, dma_direction_t direction )
{
err_t status = DMA_ERROR;
if ( obj ) {
if ( obj->allocated ) {
/**
* Set DMA direction:
* M2M/M2P/P2M/P2P
*/
status = hal_dma_set_direction( (hal_dma_t *)obj, (hal_dma_direction_t)direction );
}
}
return status;
}
err_t dma_set_priority( dma_t *obj, dma_priority_t priority )
{
err_t status = DMA_ERROR;
if ( obj ) {
if ( obj->allocated ) {
/*!< Set priority of currently active channel. */
status = hal_dma_set_priority( (hal_dma_t *)obj, (hal_dma_priority_t)priority );
}
}
return status;
}
err_t dma_set_transfer_config( dma_t *obj, uint32_t addr_src, uint32_t addr_dst, size_t transfer_size, dma_source_memory_region_t src_mem_type )
{
err_t status = DMA_ERROR;
if ( obj ) {
if ( obj->allocated ) {
/*!< Configure the transfer type. */
status = hal_dma_set_transfer_config( (hal_dma_t *)obj, addr_src, addr_dst, transfer_size, (hal_dma_source_memory_region_t)src_mem_type );
}
}
return status;
}
err_t dma_transfer_start( dma_t *obj )
{
err_t status = DMA_ERROR;
if ( obj ) {
if ( obj->allocated ) {
/*!< Initialize transfer. */
status = hal_dma_transfer_start( (hal_dma_t *)obj );
}
}
return status;
}
err_t dma_transfer_stop( dma_t *obj )
{
err_t status = DMA_ERROR;
if ( obj ) {
if ( obj->allocated ) {
/*!< Stop transfer. */
status = hal_dma_transfer_stop( (hal_dma_t *)obj );
}
}
return status;
}
err_t dma_transfer_abort( dma_t *obj )
{
err_t status = DMA_ERROR;
if ( obj ) {
if ( obj->allocated ) {
/*!< Abort transfer. */
status = hal_dma_transfer_abort( (hal_dma_t *)obj );
}
}
return status;
}
err_t dma_close( dma_t *obj )
{
err_t status = DMA_ERROR;
if ( obj ) {
if ( obj->allocated ) {
/*!< Reset everything to default or uninitialized values. */
status = hal_dma_close( (hal_dma_t *)obj );
}
}
return status;
}
// ------------------------------------------------------------------------- END