1 /*
2 * Copyright (c) 2023, Nordic Semiconductor ASA
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright notice, this
11 * list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * 3. Neither the name of the copyright holder nor the names of its
18 * contributors may be used to endorse or promote products derived from this
19 * software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 #ifndef NRF_MVDMA_H__
35 #define NRF_MVDMA_H__
36
37 #include <nrfx.h>
38 #include <helpers/nrf_vdma.h>
39
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43
44 /**
45 * @defgroup nrf_mvdma_hal MVDMA HAL
46 * @{
47 * @ingroup nrf_mvdma
48 * @brief Hardware access layer for managing the Memory-to-Memory Vector DMA (MVDMA) peripheral.
49 */
50
51 #if defined(MVDMA_TASKS_PAUSE_TASKS_PAUSE_Pos) || defined(__NRFX_DOXYGEN__)
52 /** @brief Symbol indicating whether MVDMA uses new or old version. */
53 #define NRF_MVDMA_HAS_NEW_VER 1
54 #else
55 #define NRF_MVDMA_HAS_NEW_VER 0
56 #endif
57
58 #if defined(MVDMA_CONFIG_AXIMODE_AXIMODE_Msk) || defined(__NRFX_DOXYGEN__)
59 /** @brief Symbol indicating whether AXIMODE configuration is present. */
60 #define NRF_MVDMA_HAS_AXIMODE 1
61 #else
62 #define NRF_MVDMA_HAS_AXIMODE 0
63 #endif
64
65 #if (MVDMA_JOBLISTCOUNT > 1) || defined(__NRFX_DOXYGEN__)
66 /** @brief Macro for checking if multi-mode operation is available. */
67 #define NRF_MVDMA_HAS_MULTIMODE 1
68 #else
69 #define NRF_MVDMA_HAS_MULTIMODE 0
70 #endif
71
72 /** @brief MVDMA tasks. */
73 typedef enum
74 {
75 #if NRF_MVDMA_HAS_NEW_VER
76 NRF_MVDMA_TASK_PAUSE = offsetof(NRF_MVDMA_Type, TASKS_PAUSE), ///< Pause DMA transaction at next idle stage on memory bus.
77 #else
78 NRF_MVDMA_TASK_STOP = offsetof(NRF_MVDMA_Type, TASKS_STOP), ///< Stop DMA transaction immediately, or after an ongoing AXI burst.
79 #endif
80 NRF_MVDMA_TASK_RESET = offsetof(NRF_MVDMA_Type, TASKS_RESET), ///< Return all registers to default state and FSMs to IDLE.
81 NRF_MVDMA_TASK_START0 = offsetof(NRF_MVDMA_Type, TASKS_START[0]), ///< Start or continue processing of descriptor list 0.
82 NRF_MVDMA_TASK_START1 = offsetof(NRF_MVDMA_Type, TASKS_START[1]), ///< Start or continue processing of descriptor list 1.
83 NRF_MVDMA_TASK_START2 = offsetof(NRF_MVDMA_Type, TASKS_START[2]), ///< Start or continue processing of descriptor list 2.
84 NRF_MVDMA_TASK_START3 = offsetof(NRF_MVDMA_Type, TASKS_START[3]), ///< Start or continue processing of descriptor list 3.
85 NRF_MVDMA_TASK_START4 = offsetof(NRF_MVDMA_Type, TASKS_START[4]), ///< Start or continue processing of descriptor list 4.
86 NRF_MVDMA_TASK_START5 = offsetof(NRF_MVDMA_Type, TASKS_START[5]), ///< Start or continue processing of descriptor list 5.
87 NRF_MVDMA_TASK_START6 = offsetof(NRF_MVDMA_Type, TASKS_START[6]), ///< Start or continue processing of descriptor list 6.
88 NRF_MVDMA_TASK_START7 = offsetof(NRF_MVDMA_Type, TASKS_START[7]), ///< Start or continue processing of descriptor list 7.
89 } nrf_mvdma_task_t;
90
91 /** @brief MVDMA events. */
92 typedef enum
93 {
94 NRF_MVDMA_EVENT_END = offsetof(NRF_MVDMA_Type, EVENTS_END), ///< Sink data descriptor list has been completed.
95 NRF_MVDMA_EVENT_STARTED = offsetof(NRF_MVDMA_Type, EVENTS_STARTED), ///< Data descriptor list processing has been started.
96 #if NRF_MVDMA_HAS_NEW_VER
97 NRF_MVDMA_EVENT_PAUSED = offsetof(NRF_MVDMA_Type, EVENTS_PAUSED), ///< Data transfer has been paused.
98 #else
99 NRF_MVDMA_EVENT_STOPPED = offsetof(NRF_MVDMA_Type, EVENTS_STOPPED), ///< Data descriptor list processing has been stopped.
100 #endif
101 NRF_MVDMA_EVENT_RESET = offsetof(NRF_MVDMA_Type, EVENTS_RESET), ///< MVDMA has been reset.
102 #if NRF_MVDMA_HAS_NEW_VER
103 NRF_MVDMA_EVENT_SOURCEBUSERROR = offsetof(NRF_MVDMA_Type, EVENTS_SOURCE.BUSERROR), ///< Bus error has been received on the source channel.
104 NRF_MVDMA_EVENT_SOURCESELECTJOBDONE = offsetof(NRF_MVDMA_Type, EVENTS_SOURCE.SELECTJOBDONE), ///< Job on the source channel with event enable attribute bit active has been processed.
105 #else
106 NRF_MVDMA_EVENT_SOURCEBUSERROR = offsetof(NRF_MVDMA_Type, EVENTS_SOURCEBUSERROR), ///< Bus error has been received on the source channel.
107 #endif
108 #if NRF_MVDMA_HAS_NEW_VER
109 NRF_MVDMA_EVENT_SINKBUSERROR = offsetof(NRF_MVDMA_Type, EVENTS_SINK.BUSERROR), ///< Bus error has been received on the sink channel.
110 NRF_MVDMA_EVENT_SINKSELECTJOBDONE = offsetof(NRF_MVDMA_Type, EVENTS_SINK.SELECTJOBDONE), ///< Job on the sink channel with event enable attribute bit active has been processed.
111 #else
112 NRF_MVDMA_EVENT_SINKBUSERROR = offsetof(NRF_MVDMA_Type, EVENTS_SINKBUSERROR), ///< Bus error has been received on the sink channel.
113 #endif
114 } nrf_mvdma_event_t;
115
116 /** @brief MVDMA interrupts. */
117 typedef enum
118 {
119 NRF_MVDMA_INT_END_MASK = MVDMA_INTENSET_END_Msk, ///< Interrupt on END event.
120 NRF_MVDMA_INT_STARTED_MASK = MVDMA_INTENSET_STARTED_Msk, ///< Interrupt on STARTED event.
121 #if NRF_MVDMA_HAS_NEW_VER
122 NRF_MVDMA_INT_PAUSED_MASK = MVDMA_INTENSET_PAUSED_Msk, ///< Interrupt on PAUSED event.
123 #else
124 NRF_MVDMA_INT_STOPPED_MASK = MVDMA_INTENSET_STOPPED_Msk, ///< Interrupt on STOPPED event.
125 #endif
126 NRF_MVDMA_INT_RESET_MASK = MVDMA_INTENSET_RESET_Msk, ///< Interrupt on RESET event.
127 NRF_MVDMA_INT_SOURCEBUSERROR_MASK = MVDMA_INTENSET_SOURCEBUSERROR_Msk, ///< Interrupt on SOURCEBUSERROR event.
128 NRF_MVDMA_INT_SINKBUSERROR_MASK = MVDMA_INTENSET_SINKBUSERROR_Msk, ///< Interrupt on SINKBUSERROR event.
129 #if NRF_MVDMA_HAS_NEW_VER
130 NRF_MVDMA_INT_SOURCESELECTJOBDONE_MASK = MVDMA_INTENSET_SOURCESELECTJOBDONE_Msk, ///< Interrupt on SOURCESELECTJOBDONE event.
131 NRF_MVDMA_INT_SINKSELECTJOBDONE_MASK = MVDMA_INTENSET_SINKSELECTJOBDONE_Msk, ///< Interrupt on SINKSELECTJOBDONE event.
132 #endif
133 } nrf_mvdma_int_mask_t;
134
135 /** @brief MVDMA modes of operation. */
136 typedef enum
137 {
138 NRF_MVDMA_MODE_SINGLE = MVDMA_CONFIG_MODE_MODE_SingleMode, ///< Descriptor list pointers are stored in SOURCELISTPTR and SINKLISTPTR registers.
139 NRF_MVDMA_MODE_MULTI = MVDMA_CONFIG_MODE_MODE_MultiMode, ///< Descriptor list pointers are stored in a list in the memory.
140 } nrf_mvdma_mode_t;
141
142 #if NRF_MVDMA_HAS_AXIMODE
143 /** @brief MVDMA AXI modes. */
144 typedef enum
145 {
146 NRF_MVDMA_AXIMODE_AXI = MVDMA_CONFIG_AXIMODE_AXIMODE_AXI, ///< AXI burst transactions may be longer than one beat.
147 NRF_MVDMA_AXIMODE_AXILITE = MVDMA_CONFIG_AXIMODE_AXIMODE_AXILITE, ///< All AXI transactions are one-beat accesses.
148 } nrf_mvdma_aximode_t;
149 #endif
150
151 /** @brief MVDMA FIFO status. */
152 typedef enum
153 {
154 NRF_MVDMA_FIFO_STATUS_EMPTY = MVDMA_STATUS_FIFO_FIFOSTATUS_Empty, ///< No data in intermediate FIFO.
155 #if NRF_MVDMA_HAS_NEW_VER
156 NRF_MVDMA_FIFO_STATUS_NOT_EMPTY = MVDMA_STATUS_FIFO_FIFOSTATUS_NotEmpty, ///< Intermediate FIFO contains data.
157 #else
158 NRF_MVDMA_FIFO_STATUS_ALMOST_FULL = MVDMA_STATUS_FIFO_FIFOSTATUS_AlmostFull, ///< Intermediate FIFO is almost full.
159 #endif
160 NRF_MVDMA_FIFO_STATUS_FULL = MVDMA_STATUS_FIFO_FIFOSTATUS_Full, ///< Intermediate FIFO is full.
161 } nrf_mvdma_fifo_status_t;
162
163 /** @brief MVDMA data source errors. */
164 typedef enum
165 {
166 #if NRF_MVDMA_HAS_NEW_VER
167 NRF_MVDMA_SOURCE_ERROR_NONE = MVDMA_SOURCE_BUSERROR_BUSERROR_NoError, ///< No error.
168 NRF_MVDMA_SOURCE_ERROR_READ = MVDMA_SOURCE_BUSERROR_BUSERROR_ReadError, ///< Error related to memory when reading joblist or memory/register when reading data.
169 NRF_MVDMA_SOURCE_ERROR_READ_DECODE = MVDMA_SOURCE_BUSERROR_BUSERROR_ReadDecodeError, ///< Error related to the joblist address or address when reading memory/register.
170 #else
171 NRF_MVDMA_SOURCE_ERROR_NONE = MVDMA_STATUS_SOURCEBUSERROR_BUSERROR_NoError, ///< No error.
172 NRF_MVDMA_SOURCE_ERROR_SLAVE = MVDMA_STATUS_SOURCEBUSERROR_BUSERROR_SlaveError, ///< Error generated by AXI slave.
173 NRF_MVDMA_SOURCE_ERROR_DECODE = MVDMA_STATUS_SOURCEBUSERROR_BUSERROR_DecodeError, ///< Error generated by interconnect.
174 #endif
175 } nrf_mvdma_source_error_t;
176
177 /** @brief MVDMA data sink errors. */
178 typedef enum
179 {
180 #if NRF_MVDMA_HAS_NEW_VER
181 NRF_MVDMA_SINK_ERROR_NONE = MVDMA_SINK_BUSERROR_BUSERROR_NoError, ///< No error.
182 NRF_MVDMA_SINK_ERROR_READ = MVDMA_SINK_BUSERROR_BUSERROR_ReadError, ///< Error related to memory when reading joblist.
183 NRF_MVDMA_SINK_ERROR_WRITE = MVDMA_SINK_BUSERROR_BUSERROR_WriteError, ///< Error related to memory/register when writing data.
184 NRF_MVDMA_SINK_ERROR_DECODE_READ = MVDMA_SINK_BUSERROR_BUSERROR_ReadDecodeError, ///< Error related to the joblist address when reading joblist.
185 NRF_MVDMA_SINK_ERROR_DECODE_WRITE = MVDMA_SINK_BUSERROR_BUSERROR_WriteDecodeError, ///< Error related to the memory/register address when writing data.
186 #else
187 NRF_MVDMA_SINK_ERROR_NONE = MVDMA_STATUS_SINKBUSERROR_BUSERROR_NoError, ///< No error.
188 NRF_MVDMA_SINK_ERROR_SLAVE_READ = MVDMA_STATUS_SINKBUSERROR_BUSERROR_ReadSlaveError, ///< Read error generated by AXI slave.
189 NRF_MVDMA_SINK_ERROR_SLAVE_WRITE = MVDMA_STATUS_SINKBUSERROR_BUSERROR_WriteSlaveError, ///< Write error generated by AXI slave.
190 NRF_MVDMA_SINK_ERROR_DECODE_READ = MVDMA_STATUS_SINKBUSERROR_BUSERROR_ReadDecodeError, ///< Read error generated by interconnect.
191 NRF_MVDMA_SINK_ERROR_DECODE_WRITE = MVDMA_STATUS_SINKBUSERROR_BUSERROR_WriteDecodeError, ///< Write error generated by interconnect.
192 #endif
193 } nrf_mvdma_sink_error_t;
194
195 /**
196 * @brief Function for activating the specified MVDMA task.
197 *
198 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
199 * @param[in] task Task to be activated.
200 */
201 NRF_STATIC_INLINE void nrf_mvdma_task_trigger(NRF_MVDMA_Type * p_reg,
202 nrf_mvdma_task_t task);
203
204 /**
205 * @brief Function for getting the address of the specified MVDMA task register.
206 *
207 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
208 * @param[in] task Specified task.
209 *
210 * @return Address of the specified task register.
211 */
212 NRF_STATIC_INLINE uint32_t nrf_mvdma_task_address_get(NRF_MVDMA_Type const * p_reg,
213 nrf_mvdma_task_t task);
214
215 /**
216 * @brief Function for getting START task by its index.
217 *
218 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
219 * @param[in] index Index of the START task.
220 *
221 * @return START task.
222 */
223 NRF_STATIC_INLINE nrf_mvdma_task_t nrf_mvdma_start_task_get(NRF_MVDMA_Type const * p_reg,
224 uint8_t index);
225
226 /**
227 * @brief Function for clearing the specified MVDMA event.
228 *
229 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
230 * @param[in] event Event to clear.
231 */
232 NRF_STATIC_INLINE void nrf_mvdma_event_clear(NRF_MVDMA_Type * p_reg,
233 nrf_mvdma_event_t event);
234
235 /**
236 * @brief Function for retrieving the state of the MVDMA event.
237 *
238 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
239 * @param[in] event Event to be checked.
240 *
241 * @retval true The event has been generated.
242 * @retval false The event has not been generated.
243 */
244 NRF_STATIC_INLINE bool nrf_mvdma_event_check(NRF_MVDMA_Type const * p_reg,
245 nrf_mvdma_event_t event);
246
247 /**
248 * @brief Function for getting the address of the specified MVDMA event register.
249 *
250 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
251 * @param[in] event Specified event.
252 *
253 * @return Address of the specified event register.
254 */
255 NRF_STATIC_INLINE uint32_t nrf_mvdma_event_address_get(NRF_MVDMA_Type const * p_reg,
256 nrf_mvdma_event_t event);
257
258 /**
259 * @brief Function for enabling specified interrupts.
260 *
261 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
262 * @param[in] mask Mask of interrupts to be enabled.
263 * Use @ref nrf_mvdma_int_mask_t values for bit masking.
264 */
265 NRF_STATIC_INLINE void nrf_mvdma_int_enable(NRF_MVDMA_Type * p_reg, uint32_t mask);
266
267 /**
268 * @brief Function for disabling specified interrupts.
269 *
270 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
271 * @param[in] mask Mask of interrupts to be disabled.
272 * Use @ref nrf_mvdma_int_mask_t values for bit masking.
273 */
274 NRF_STATIC_INLINE void nrf_mvdma_int_disable(NRF_MVDMA_Type * p_reg, uint32_t mask);
275
276 /**
277 * @brief Function for checking if the specified interrupts are enabled.
278 *
279 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
280 * @param[in] mask Mask of interrupts to be checked.
281 * Use @ref nrf_mvdma_int_mask_t values for bit masking.
282 *
283 * @return Mask of enabled interrupts.
284 */
285 NRF_STATIC_INLINE uint32_t nrf_mvdma_int_enable_check(NRF_MVDMA_Type const * p_reg, uint32_t mask);
286
287 /**
288 * @brief Function for retrieving the state of pending interrupts.
289 *
290 * @note States of pending interrupt are saved as a bitmask.
291 * One set at particular position means that interrupt for event is pending.
292 *
293 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
294 *
295 * @return Bitmask with information about pending interrupts.
296 * Use @ref nrf_mvdma_int_mask_t values for bit masking.
297 */
298 NRF_STATIC_INLINE uint32_t nrf_mvdma_int_pending_get(NRF_MVDMA_Type const * p_reg);
299
300 #if defined(DPPI_PRESENT) || defined(__NRFX_DOXYGEN__)
301 /**
302 * @brief Function for setting the subscribe configuration for a given
303 * MVDMA task.
304 *
305 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
306 * @param[in] task Task for which to set the configuration.
307 * @param[in] channel Channel through which to subscribe events.
308 */
309 NRF_STATIC_INLINE void nrf_mvdma_subscribe_set(NRF_MVDMA_Type * p_reg,
310 nrf_mvdma_task_t task,
311 uint8_t channel);
312
313 /**
314 * @brief Function for clearing the subscribe configuration for a given
315 * MVDMA task.
316 *
317 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
318 * @param[in] task Task for which to clear the configuration.
319 */
320 NRF_STATIC_INLINE void nrf_mvdma_subscribe_clear(NRF_MVDMA_Type * p_reg,
321 nrf_mvdma_task_t task);
322
323 /**
324 * @brief Function for setting the publish configuration for a given
325 * MVDMA event.
326 *
327 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
328 * @param[in] event Event for which to set the configuration.
329 * @param[in] channel Channel through which to publish the event.
330 */
331 NRF_STATIC_INLINE void nrf_mvdma_publish_set(NRF_MVDMA_Type * p_reg,
332 nrf_mvdma_event_t event,
333 uint8_t channel);
334
335 /**
336 * @brief Function for clearing the publish configuration for a given
337 * MVDMA event.
338 *
339 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
340 * @param[in] event Event for which to clear the configuration.
341 */
342 NRF_STATIC_INLINE void nrf_mvdma_publish_clear(NRF_MVDMA_Type * p_reg,
343 nrf_mvdma_event_t event);
344 #endif // defined(DPPI_PRESENT) || defined(__NRFX_DOXYGEN__)
345
346 /**
347 * @brief Function for setting the MVDMA mode.
348 *
349 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
350 * @param[in] mode Desired operating mode for MVDMA.
351 */
352 NRF_STATIC_INLINE void nrf_mvdma_mode_set(NRF_MVDMA_Type * p_reg, nrf_mvdma_mode_t mode);
353
354 #if NRF_MVDMA_HAS_AXIMODE
355 /**
356 * @brief Function for setting the AXI mode.
357 *
358 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
359 * @param[in] aximode Desired AXI mode for MVDMA.
360 */
361 NRF_STATIC_INLINE void nrf_mvdma_aximode_set(NRF_MVDMA_Type * p_reg, nrf_mvdma_aximode_t aximode);
362 #endif
363
364 /**
365 * @brief Function for setting the pointer to the source descriptor list
366 * or pointer to the list of descriptor list pointers,
367 * depending on configured @ref nrf_mvdma_mode_t mode.
368 *
369 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
370 * @param[in] p_job Pointer to a job list.
371 */
372 NRF_STATIC_INLINE void nrf_mvdma_source_list_ptr_set(NRF_MVDMA_Type * p_reg,
373 nrf_vdma_job_t const * p_job);
374
375 /**
376 * @brief Function for getting the pointer to the source descriptor list
377 * or pointer to the list of descriptor list pointers,
378 * depending on configured @ref nrf_mvdma_mode_t mode.
379 *
380 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
381 *
382 * @return Pointer to a job list.
383 */
384 NRF_STATIC_INLINE nrf_vdma_job_t * nrf_mvdma_source_list_ptr_get(NRF_MVDMA_Type const * p_reg);
385
386 /**
387 * @brief Function for getting the pointer to the sink descriptor list
388 * or pointer to the list of descriptor list pointers,
389 * depending on configured @ref nrf_mvdma_mode_t mode.
390 *
391 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
392 * @param[in] p_job Pointer to a job list.
393 */
394 NRF_STATIC_INLINE void nrf_mvdma_sink_list_ptr_set(NRF_MVDMA_Type * p_reg,
395 nrf_vdma_job_t const * p_job);
396
397 /**
398 * @brief Function for getting the pointer to the sink descriptor list
399 * or pointer to the list of descriptor list pointers,
400 * depending on configured @ref nrf_mvdma_mode_t mode.
401 *
402 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
403 *
404 * @return Pointer to a job list.
405 */
406 NRF_STATIC_INLINE nrf_vdma_job_t * nrf_mvdma_sink_list_ptr_get(NRF_MVDMA_Type const * p_reg);
407
408 /**
409 * @brief Function for getting the result of CRC checksum calculation.
410 *
411 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
412 *
413 * @return Result of CRC checksum calculation.
414 */
415 NRF_STATIC_INLINE uint32_t nrf_mvdma_crc_result_get(NRF_MVDMA_Type const * p_reg);
416
417 /**
418 * @brief Function for getting the status of intermediate FIFO.
419 *
420 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
421 *
422 * @return Intermediate FIFO status.
423 */
424 NRF_STATIC_INLINE nrf_mvdma_fifo_status_t nrf_mvdma_fifo_status_get(NRF_MVDMA_Type const * p_reg);
425
426 /**
427 * @brief Function for checking the MVDMA activity.
428 *
429 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
430 *
431 * @retval true MVDMA is processing data.
432 * @retval false MVDMA is idle.
433 */
434 NRF_STATIC_INLINE bool nrf_mvdma_activity_check(NRF_MVDMA_Type const * p_reg);
435
436 /**
437 * @brief Function for getting the bus error of MVDMA data source.
438 *
439 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
440 *
441 * @return Bus error of data source.
442 */
443 NRF_STATIC_INLINE nrf_mvdma_source_error_t nrf_mvdma_source_error_get(NRF_MVDMA_Type const * p_reg);
444
445 /**
446 * @brief Function for getting the bus error of MVDMA data source.
447 *
448 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
449 *
450 * @return Bus error of data sink.
451 */
452 NRF_STATIC_INLINE nrf_mvdma_sink_error_t nrf_mvdma_sink_error_get(NRF_MVDMA_Type const * p_reg);
453
454 /**
455 * @brief Function for getting the latest address being accessed on the source AXI channel.
456 *
457 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
458 *
459 * @return Latest address being accessed on the source AXI channel.
460 */
461 NRF_STATIC_INLINE uint32_t nrf_mvdma_last_source_address_get(NRF_MVDMA_Type const * p_reg);
462
463 /**
464 * @brief Function for getting the latest address being accessed on the sink AXI channel.
465 *
466 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
467 *
468 * @return Latest address being accessed on the sink AXI channel.
469 */
470 NRF_STATIC_INLINE uint32_t nrf_mvdma_last_sink_address_get(NRF_MVDMA_Type const * p_reg);
471
472 /**
473 * @brief Function for getting the number of completed jobs in the current source descriptor list.
474 *
475 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
476 *
477 * @return Number of completed jobs in the current source descriptor list.
478 */
479 NRF_STATIC_INLINE uint32_t nrf_mvdma_source_job_count_get(NRF_MVDMA_Type const * p_reg);
480
481 /**
482 * @brief Function for getting the number of completed jobs in the current sink descriptor list.
483 *
484 * @param[in] p_reg Pointer to the structure of registers of the peripheral.
485 *
486 * @return Number of completed jobs in the current sink descriptor list.
487 */
488 NRF_STATIC_INLINE uint32_t nrf_mvdma_sink_job_count_get(NRF_MVDMA_Type const * p_reg);
489
490 #ifndef NRF_DECLARE_ONLY
491
nrf_mvdma_task_trigger(NRF_MVDMA_Type * p_reg,nrf_mvdma_task_t task)492 NRF_STATIC_INLINE void nrf_mvdma_task_trigger(NRF_MVDMA_Type * p_reg,
493 nrf_mvdma_task_t task)
494 {
495 *((volatile uint32_t *)((uint8_t *)p_reg + (uint32_t)task)) = 0x1uL;
496 }
497
nrf_mvdma_task_address_get(NRF_MVDMA_Type const * p_reg,nrf_mvdma_task_t task)498 NRF_STATIC_INLINE uint32_t nrf_mvdma_task_address_get(NRF_MVDMA_Type const * p_reg,
499 nrf_mvdma_task_t task)
500 {
501 return ((uint32_t)p_reg + (uint32_t)task);
502 }
503
nrf_mvdma_start_task_get(NRF_MVDMA_Type const * p_reg,uint8_t index)504 NRF_STATIC_INLINE nrf_mvdma_task_t nrf_mvdma_start_task_get(NRF_MVDMA_Type const * p_reg,
505 uint8_t index)
506 {
507 (void)p_reg;
508 return (nrf_mvdma_task_t)(NRFX_OFFSETOF(NRF_MVDMA_Type, TASKS_START[index]));
509 }
510
nrf_mvdma_event_clear(NRF_MVDMA_Type * p_reg,nrf_mvdma_event_t event)511 NRF_STATIC_INLINE void nrf_mvdma_event_clear(NRF_MVDMA_Type * p_reg,
512 nrf_mvdma_event_t event)
513 {
514 *((volatile uint32_t *)((uint8_t *)p_reg + (uint32_t)event)) = 0x0uL;
515 }
516
nrf_mvdma_event_check(NRF_MVDMA_Type const * p_reg,nrf_mvdma_event_t event)517 NRF_STATIC_INLINE bool nrf_mvdma_event_check(NRF_MVDMA_Type const * p_reg,
518 nrf_mvdma_event_t event)
519 {
520 return nrf_event_check(p_reg, event);
521 }
522
nrf_mvdma_event_address_get(NRF_MVDMA_Type const * p_reg,nrf_mvdma_event_t event)523 NRF_STATIC_INLINE uint32_t nrf_mvdma_event_address_get(NRF_MVDMA_Type const * p_reg,
524 nrf_mvdma_event_t event)
525 {
526 return ((uint32_t)p_reg + (uint32_t)event);
527 }
528
nrf_mvdma_int_enable(NRF_MVDMA_Type * p_reg,uint32_t mask)529 NRF_STATIC_INLINE void nrf_mvdma_int_enable(NRF_MVDMA_Type * p_reg, uint32_t mask)
530 {
531 p_reg->INTENSET = mask;
532 }
533
nrf_mvdma_int_disable(NRF_MVDMA_Type * p_reg,uint32_t mask)534 NRF_STATIC_INLINE void nrf_mvdma_int_disable(NRF_MVDMA_Type * p_reg, uint32_t mask)
535 {
536 p_reg->INTENCLR = mask;
537 }
538
nrf_mvdma_int_enable_check(NRF_MVDMA_Type const * p_reg,uint32_t mask)539 NRF_STATIC_INLINE uint32_t nrf_mvdma_int_enable_check(NRF_MVDMA_Type const * p_reg, uint32_t mask)
540 {
541 return (p_reg->INTENSET & mask);
542 }
543
nrf_mvdma_int_pending_get(NRF_MVDMA_Type const * p_reg)544 NRF_STATIC_INLINE uint32_t nrf_mvdma_int_pending_get(NRF_MVDMA_Type const * p_reg)
545 {
546 return p_reg->INTPEND;
547 }
548
549 #if defined(DPPI_PRESENT)
nrf_mvdma_subscribe_set(NRF_MVDMA_Type * p_reg,nrf_mvdma_task_t task,uint8_t channel)550 NRF_STATIC_INLINE void nrf_mvdma_subscribe_set(NRF_MVDMA_Type * p_reg,
551 nrf_mvdma_task_t task,
552 uint8_t channel)
553 {
554 *((volatile uint32_t *) ((uint8_t *) p_reg + (uint32_t) task + 0x80uL)) =
555 ((uint32_t)channel | NRF_SUBSCRIBE_PUBLISH_ENABLE);
556 }
557
nrf_mvdma_subscribe_clear(NRF_MVDMA_Type * p_reg,nrf_mvdma_task_t task)558 NRF_STATIC_INLINE void nrf_mvdma_subscribe_clear(NRF_MVDMA_Type * p_reg,
559 nrf_mvdma_task_t task)
560 {
561 *((volatile uint32_t *) ((uint8_t *) p_reg + (uint32_t) task + 0x80uL)) = 0;
562 }
563
nrf_mvdma_publish_set(NRF_MVDMA_Type * p_reg,nrf_mvdma_event_t event,uint8_t channel)564 NRF_STATIC_INLINE void nrf_mvdma_publish_set(NRF_MVDMA_Type * p_reg,
565 nrf_mvdma_event_t event,
566 uint8_t channel)
567 {
568 *((volatile uint32_t *) ((uint8_t *) p_reg + (uint32_t) event + 0x80uL)) =
569 ((uint32_t)channel | NRF_SUBSCRIBE_PUBLISH_ENABLE);
570 }
571
nrf_mvdma_publish_clear(NRF_MVDMA_Type * p_reg,nrf_mvdma_event_t event)572 NRF_STATIC_INLINE void nrf_mvdma_publish_clear(NRF_MVDMA_Type * p_reg,
573 nrf_mvdma_event_t event)
574 {
575 *((volatile uint32_t *) ((uint8_t *) p_reg + (uint32_t) event + 0x80uL)) = 0;
576 }
577 #endif // defined(DPPI_PRESENT)
578
nrf_mvdma_mode_set(NRF_MVDMA_Type * p_reg,nrf_mvdma_mode_t mode)579 NRF_STATIC_INLINE void nrf_mvdma_mode_set(NRF_MVDMA_Type * p_reg, nrf_mvdma_mode_t mode)
580 {
581 p_reg->CONFIG.MODE = ((uint32_t)mode << MVDMA_CONFIG_MODE_MODE_Pos);
582 }
583
584 #if NRF_MVDMA_HAS_AXIMODE
nrf_mvdma_aximode_set(NRF_MVDMA_Type * p_reg,nrf_mvdma_aximode_t aximode)585 NRF_STATIC_INLINE void nrf_mvdma_aximode_set(NRF_MVDMA_Type * p_reg, nrf_mvdma_aximode_t aximode)
586 {
587 p_reg->CONFIG.AXIMODE = ((uint32_t)aximode << MVDMA_CONFIG_AXIMODE_AXIMODE_Pos);
588 }
589 #endif
590
nrf_mvdma_source_list_ptr_set(NRF_MVDMA_Type * p_reg,nrf_vdma_job_t const * p_job)591 NRF_STATIC_INLINE void nrf_mvdma_source_list_ptr_set(NRF_MVDMA_Type * p_reg,
592 nrf_vdma_job_t const * p_job)
593 {
594 #if NRF_MVDMA_HAS_NEW_VER
595 p_reg->SOURCE.LISTPTR = (uint32_t)p_job;
596 #else
597 p_reg->CONFIG.SOURCELISTPTR = (uint32_t)p_job;
598 #endif
599 }
600
nrf_mvdma_source_list_ptr_get(NRF_MVDMA_Type const * p_reg)601 NRF_STATIC_INLINE nrf_vdma_job_t * nrf_mvdma_source_list_ptr_get(NRF_MVDMA_Type const * p_reg)
602 {
603 #if NRF_MVDMA_HAS_NEW_VER
604 return (nrf_vdma_job_t *)(p_reg->SOURCE.LISTPTR);
605 #else
606 return (nrf_vdma_job_t *)(p_reg->CONFIG.SOURCELISTPTR);
607 #endif
608 }
609
nrf_mvdma_sink_list_ptr_set(NRF_MVDMA_Type * p_reg,nrf_vdma_job_t const * p_job)610 NRF_STATIC_INLINE void nrf_mvdma_sink_list_ptr_set(NRF_MVDMA_Type * p_reg,
611 nrf_vdma_job_t const * p_job)
612 {
613 #if NRF_MVDMA_HAS_NEW_VER
614 p_reg->SINK.LISTPTR = (uint32_t)p_job;
615 #else
616 p_reg->CONFIG.SINKLISTPTR = (uint32_t)p_job;
617 #endif
618 }
619
nrf_mvdma_sink_list_ptr_get(NRF_MVDMA_Type const * p_reg)620 NRF_STATIC_INLINE nrf_vdma_job_t * nrf_mvdma_sink_list_ptr_get(NRF_MVDMA_Type const * p_reg)
621 {
622 #if NRF_MVDMA_HAS_NEW_VER
623 return (nrf_vdma_job_t *)(p_reg->SINK.LISTPTR);
624 #else
625 return (nrf_vdma_job_t *)(p_reg->CONFIG.SINKLISTPTR);
626 #endif
627 }
628
nrf_mvdma_crc_result_get(NRF_MVDMA_Type const * p_reg)629 NRF_STATIC_INLINE uint32_t nrf_mvdma_crc_result_get(NRF_MVDMA_Type const * p_reg)
630 {
631 return p_reg->STATUS.CRCRESULT;
632 }
633
nrf_mvdma_fifo_status_get(NRF_MVDMA_Type const * p_reg)634 NRF_STATIC_INLINE nrf_mvdma_fifo_status_t nrf_mvdma_fifo_status_get(NRF_MVDMA_Type const * p_reg)
635 {
636 return (nrf_mvdma_fifo_status_t)(p_reg->STATUS.FIFO);
637 }
638
nrf_mvdma_activity_check(NRF_MVDMA_Type const * p_reg)639 NRF_STATIC_INLINE bool nrf_mvdma_activity_check(NRF_MVDMA_Type const * p_reg)
640 {
641 return (p_reg->STATUS.ACTIVE ==
642 (MVDMA_STATUS_ACTIVE_ACTIVE_Active << MVDMA_STATUS_ACTIVE_ACTIVE_Pos));
643 }
644
nrf_mvdma_source_error_get(NRF_MVDMA_Type const * p_reg)645 NRF_STATIC_INLINE nrf_mvdma_source_error_t nrf_mvdma_source_error_get(NRF_MVDMA_Type const * p_reg)
646 {
647 #if NRF_MVDMA_HAS_NEW_VER
648 return (nrf_mvdma_source_error_t)(p_reg->SOURCE.BUSERROR);
649 #else
650 return (nrf_mvdma_source_error_t)(p_reg->STATUS.SOURCEBUSERROR);
651 #endif
652 }
653
nrf_mvdma_sink_error_get(NRF_MVDMA_Type const * p_reg)654 NRF_STATIC_INLINE nrf_mvdma_sink_error_t nrf_mvdma_sink_error_get(NRF_MVDMA_Type const * p_reg)
655 {
656 #if NRF_MVDMA_HAS_NEW_VER
657 return (nrf_mvdma_sink_error_t)(p_reg->SINK.BUSERROR);
658 #else
659 return (nrf_mvdma_sink_error_t)(p_reg->STATUS.SINKBUSERROR);
660 #endif
661 }
662
nrf_mvdma_last_source_address_get(NRF_MVDMA_Type const * p_reg)663 NRF_STATIC_INLINE uint32_t nrf_mvdma_last_source_address_get(NRF_MVDMA_Type const * p_reg)
664 {
665 #if NRF_MVDMA_HAS_NEW_VER
666 return p_reg->SOURCE.ADDRESS;
667 #else
668 return p_reg->STATUS.SOURCEADDRESS;
669 #endif
670 }
671
nrf_mvdma_last_sink_address_get(NRF_MVDMA_Type const * p_reg)672 NRF_STATIC_INLINE uint32_t nrf_mvdma_last_sink_address_get(NRF_MVDMA_Type const * p_reg)
673 {
674 #if NRF_MVDMA_HAS_NEW_VER
675 return p_reg->SINK.ADDRESS;
676 #else
677 return p_reg->STATUS.SINKADDRESS;
678 #endif
679 }
680
nrf_mvdma_source_job_count_get(NRF_MVDMA_Type const * p_reg)681 NRF_STATIC_INLINE uint32_t nrf_mvdma_source_job_count_get(NRF_MVDMA_Type const * p_reg)
682 {
683 #if NRF_MVDMA_HAS_NEW_VER
684 return p_reg->SOURCE.JOBCOUNT;
685 #else
686 return p_reg->STATUS.SOURCEJOBCOUNT;
687 #endif
688 }
689
nrf_mvdma_sink_job_count_get(NRF_MVDMA_Type const * p_reg)690 NRF_STATIC_INLINE uint32_t nrf_mvdma_sink_job_count_get(NRF_MVDMA_Type const * p_reg)
691 {
692 #if NRF_MVDMA_HAS_NEW_VER
693 return p_reg->SINK.JOBCOUNT;
694 #else
695 return p_reg->STATUS.SINKJOBCOUNT;
696 #endif
697 }
698
699 #endif // NRF_DECLARE_ONLY
700
701 /** @} */
702
703 #ifdef __cplusplus
704 }
705 #endif
706
707 #endif // NRF_MVDMA_H__
708