blob: 1e08434a169477603e251e0078a8f7501f670f4b [file] [log] [blame]
Kévin Redon69b92d92019-01-24 16:39:20 +01001/**
2 * \file
3 *
4 * \brief DMA related functionality declaration.
5 *
6 * Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
7 *
8 * \asf_license_start
9 *
10 * \page License
11 *
12 * Subject to your compliance with these terms, you may use Microchip
13 * software and any derivatives exclusively with Microchip products.
14 * It is your responsibility to comply with third party license terms applicable
15 * to your use of third party software (including open source software) that
16 * may accompany Microchip software.
17 *
18 * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
19 * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
20 * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
21 * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
22 * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
23 * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
24 * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
25 * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
26 * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
27 * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
28 * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
29 *
30 * \asf_license_stop
31 *
32 */
33
34#ifndef _HPL_DMA_H_INCLUDED
35#define _HPL_DMA_H_INCLUDED
36
37/**
38 * \addtogroup HPL DMA
39 *
40 * \section hpl_dma_rev Revision History
41 * - v1.0.0 Initial Release
42 *
43 *@{
44 */
45
46#include <compiler.h>
47#include <hpl_irq.h>
48
49#ifdef __cplusplus
50extern "C" {
51#endif
52
53struct _dma_resource;
54
55/**
56 * \brief DMA callback types
57 */
58enum _dma_callback_type { DMA_TRANSFER_COMPLETE_CB, DMA_TRANSFER_ERROR_CB };
59
60/**
61 * \brief DMA interrupt callbacks
62 */
63struct _dma_callbacks {
64 void (*transfer_done)(struct _dma_resource *resource);
65 void (*error)(struct _dma_resource *resource);
66};
67
68/**
69 * \brief DMA resource structure
70 */
71struct _dma_resource {
72 struct _dma_callbacks dma_cb;
73 void * back;
74};
75
76/**
77 * \brief Initialize DMA
78 *
79 * This function does low level DMA configuration.
80 *
81 * \return initialize status
82 */
83int32_t _dma_init(void);
84
85/**
86 * \brief Set destination address
87 *
88 * \param[in] channel DMA channel to set destination address for
89 * \param[in] dst Destination address
90 *
91 * \return setting status
92 */
93int32_t _dma_set_destination_address(const uint8_t channel, const void *const dst);
94
95/**
96 * \brief Set source address
97 *
98 * \param[in] channel DMA channel to set source address for
99 * \param[in] src Source address
100 *
101 * \return setting status
102 */
103int32_t _dma_set_source_address(const uint8_t channel, const void *const src);
104
105/**
106 * \brief Set next descriptor address
107 *
108 * \param[in] current_channel Current DMA channel to set next descriptor address
109 * \param[in] next_channel Next DMA channel used as next descriptor
110 *
111 * \return setting status
112 */
113int32_t _dma_set_next_descriptor(const uint8_t current_channel, const uint8_t next_channel);
114
115/**
116 * \brief Enable/disable source address incrementation during DMA transaction
117 *
118 * \param[in] channel DMA channel to set source address for
119 * \param[in] enable True to enable, false to disable
120 *
121 * \return status of operation
122 */
123int32_t _dma_srcinc_enable(const uint8_t channel, const bool enable);
124
125/**
126 * \brief Enable/disable Destination address incrementation during DMA transaction
127 *
128 * \param[in] channel DMA channel to set destination address for
129 * \param[in] enable True to enable, false to disable
130 *
131 * \return status of operation
132 */
133int32_t _dma_dstinc_enable(const uint8_t channel, const bool enable);
134/**
135 * \brief Set the amount of data to be transfered per transaction
136 *
137 * \param[in] channel DMA channel to set data amount for
138 * \param[in] amount Data amount
139 *
140 * \return status of operation
141 */
142int32_t _dma_set_data_amount(const uint8_t channel, const uint32_t amount);
143
144/**
145 * \brief Trigger DMA transaction on the given channel
146 *
147 * \param[in] channel DMA channel to trigger transaction on
148 *
149 * \return status of operation
150 */
151int32_t _dma_enable_transaction(const uint8_t channel, const bool software_trigger);
152
153/**
154 * \brief Retrieves DMA resource structure
155 *
156 * \param[out] resource The resource to be retrieved
157 * \param[in] channel DMA channel to retrieve structure for
158 *
159 * \return status of operation
160 */
161int32_t _dma_get_channel_resource(struct _dma_resource **resource, const uint8_t channel);
162
163/**
164 * \brief Enable/disable DMA interrupt
165 *
166 * \param[in] channel DMA channel to enable/disable interrupt for
167 * \param[in] type The type of interrupt to disable/enable if applicable
168 * \param[in] state Enable or disable
169 */
170void _dma_set_irq_state(const uint8_t channel, const enum _dma_callback_type type, const bool state);
171
172#ifdef __cplusplus
173}
174#endif
175
176#endif /* HPL_DMA_H_INCLUDED */