HPM SDK
HPMicro Software Development Kit
hpm_dma_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2022 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 
9 #ifndef HPM_DMAV1_DRV_H
10 #define HPM_DMAV1_DRV_H
11 #include "hpm_common.h"
12 #include "hpm_soc_feature.h"
13 #include "hpm_dma_regs.h"
14 
23 #define DMA_CHANNEL_PRIORITY_LOW (0U)
24 #define DMA_CHANNEL_PRIORITY_HIGH (1U)
25 
26 #define DMA_NUM_TRANSFER_PER_BURST_1T (0U)
27 #define DMA_NUM_TRANSFER_PER_BURST_2T (1U)
28 #define DMA_NUM_TRANSFER_PER_BURST_4T (2U)
29 #define DMA_NUM_TRANSFER_PER_BURST_8T (3U)
30 #define DMA_NUM_TRANSFER_PER_BURST_16T (4U)
31 #define DMA_NUM_TRANSFER_PER_BURST_32T (5U)
32 #define DMA_NUM_TRANSFER_PER_BURST_64T (6U)
33 #define DMA_NUM_TRANSFER_PER_BURST_128T (7U)
34 #define DMA_NUM_TRANSFER_PER_BURST_256T (8U)
35 #define DMA_NUM_TRANSFER_PER_BURST_512T (9U)
36 #define DMA_NUM_TRANSFER_PER_BURST_1024T (10U)
37 
38 #define DMA_TRANSFER_WIDTH_BYTE (0U)
39 #define DMA_TRANSFER_WIDTH_HALF_WORD (1U)
40 #define DMA_TRANSFER_WIDTH_WORD (2U)
41 #define DMA_TRANSFER_WIDTH_DOUBLE_WORD (3U)
42 
43 #define DMA_ALIGN_HALF_WORD(x) (x & ~(1u))
44 #define DMA_ALIGN_WORD(x) (x & ~(3u))
45 #define DMA_ALIGN_DOUBLE_WORD(x) (x & ~(7u))
46 
47 #define DMA_STATUS_ERROR_SHIFT (0U)
48 #define DMA_STATUS_ABORT_SHIFT (8U)
49 #define DMA_STATUS_TC_SHIFT (16U)
50 
51 #define DMA_CHANNEL_STATUS_ONGOING (1U)
52 #define DMA_CHANNEL_STATUS_ERROR (2U)
53 #define DMA_CHANNEL_STATUS_ABORT (4U)
54 #define DMA_CHANNEL_STATUS_TC (8U)
55 
56 #define DMA_CHANNEL_IRQ_STATUS_ERROR(x) (uint32_t)(1 << (DMA_STATUS_ERROR_SHIFT + x))
57 #define DMA_CHANNEL_IRQ_STATUS_ABORT(x) (uint32_t)(1 << (DMA_STATUS_ABORT_SHIFT + x))
58 #define DMA_CHANNEL_IRQ_STATUS_TC(x) (uint32_t)(1 << (DMA_STATUS_TC_SHIFT + x))
59 #define DMA_CHANNEL_IRQ_STATUS(x) (uint32_t)(DMA_CHANNEL_IRQ_STATUS_TC(x) | \
60  DMA_CHANNEL_IRQ_STATUS_ABORT(x) | \
61  DMA_CHANNEL_IRQ_STATUS_ERROR(x))
62 
63 #define DMA_CHANNEL_IRQ_STATUS_GET_ALL_TC(x) ((x) & (((0x01UL << DMA_SOC_CHANNEL_NUM) - 1) << DMA_STATUS_TC_SHIFT))
64 #define DMA_CHANNEL_IRQ_STATUS_GET_ALL_ABORT(x) ((x) & (((0x01UL << DMA_SOC_CHANNEL_NUM) - 1) << DMA_STATUS_ABORT_SHIFT))
65 #define DMA_CHANNEL_IRQ_STATUS_GET_ALL_ERROR(x) ((x) & (((0x01UL << DMA_SOC_CHANNEL_NUM) - 1) << DMA_STATUS_ERROR_SHIFT))
66 
67 #define DMA_HANDSHAKE_MODE_NORMAL (0U)
68 #define DMA_HANDSHAKE_MODE_HANDSHAKE (1U)
69 
70 #define DMA_ADDRESS_CONTROL_INCREMENT (0U)
71 #define DMA_ADDRESS_CONTROL_DECREMENT (1U)
72 #define DMA_ADDRESS_CONTROL_FIXED (2U)
73 
74 #define DMA_INTERRUPT_MASK_NONE (0U)
75 #define DMA_INTERRUPT_MASK_ERROR DMA_CHCTRL_CTRL_INTERRMASK_MASK
76 #define DMA_INTERRUPT_MASK_ABORT DMA_CHCTRL_CTRL_INTABTMASK_MASK
77 #define DMA_INTERRUPT_MASK_TERMINAL_COUNT DMA_CHCTRL_CTRL_INTTCMASK_MASK
78 #define DMA_INTERRUPT_MASK_ALL \
79  (uint8_t)(DMA_INTERRUPT_MASK_TERMINAL_COUNT \
80  | DMA_INTERRUPT_MASK_ABORT \
81  | DMA_INTERRUPT_MASK_ERROR)
82 
83 #ifndef DMA_SUPPORT_64BIT_ADDR
84 #define DMA_SUPPORT_64BIT_ADDR (0)
85 #endif
86 
92 typedef struct dma_linked_descriptor {
93  uint32_t ctrl;
94  uint32_t trans_size;
95  uint32_t src_addr;
96  uint32_t src_addr_high;
97  uint32_t dst_addr;
98  uint32_t dst_addr_high;
99  uint32_t linked_ptr;
100  uint32_t linked_ptr_high;
102 
103 /* @brief Channel config */
104 typedef struct dma_channel_config {
105  uint8_t priority;
106  uint8_t src_burst_size;
107  uint8_t src_mode;
108  uint8_t dst_mode;
109  uint8_t src_width;
110  uint8_t dst_width;
111  uint8_t src_addr_ctrl;
112  uint8_t dst_addr_ctrl;
113  uint16_t interrupt_mask;
114  uint32_t src_addr;
115  uint32_t dst_addr;
116  uint32_t linked_ptr;
117  uint32_t size_in_byte;
118 #if DMA_SUPPORT_64BIT_ADDR
119  uint32_t src_addr_high;
120  uint32_t dst_addr_high;
121  uint32_t linked_ptr_high;
122 #endif
124 
125 
126 /* @brief Channel config */
127 typedef struct dma_handshake_config {
128  uint32_t dst;
129  uint32_t src;
130  uint32_t size_in_byte;
131  uint8_t data_width; /* data width, value defined by DMA_TRANSFER_WIDTH_xxx */
132  uint8_t ch_index;
133  bool dst_fixed;
134  bool src_fixed;
136 
137 
138 /* @brief DMA specific status */
139 enum {
145 };
146 
147 #ifdef __cplusplus
148 extern "C" {
149 #endif
150 
156 static inline void dma_reset(DMA_Type *ptr)
157 {
159 }
160 
169 static inline hpm_stat_t dma_enable_channel(DMA_Type *ptr, uint32_t ch_index)
170 {
171  ptr->CHCTRL[ch_index].CTRL |= DMA_CHCTRL_CTRL_ENABLE_MASK;
172 
173  if ((ptr->CHEN == 0) || !(ptr->CHEN & 1 << ch_index)) {
174  return status_fail;
175  }
176  return status_success;
177 }
178 
186 static inline void dma_disable_channel(DMA_Type *ptr, uint32_t ch_index)
187 {
188  ptr->CHCTRL[ch_index].CTRL &= ~DMA_CHCTRL_CTRL_ENABLE_MASK;
189 }
190 
200 static inline bool dma_channel_is_enable(DMA_Type *ptr, uint32_t ch_index)
201 {
202  return (ptr->CHCTRL[ch_index].CTRL & DMA_CHCTRL_CTRL_ENABLE_MASK) ? true : false;
203 }
204 
215 static inline void dma_set_priority(DMA_Type *ptr, uint32_t ch_index, uint8_t priority)
216 {
217  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMA_CHCTRL_CTRL_PRIORITY_MASK) | DMA_CHCTRL_CTRL_PRIORITY_SET(priority);
218 }
219 
230 static inline void dma_set_source_work_mode(DMA_Type *ptr, uint32_t ch_index, uint8_t mode)
231 {
232  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMA_CHCTRL_CTRL_SRCMODE_MASK) | DMA_CHCTRL_CTRL_SRCMODE_SET(mode);
233 }
234 
245 static inline void dma_set_destination_work_mode(DMA_Type *ptr, uint32_t ch_index, uint8_t mode)
246 {
247  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMA_CHCTRL_CTRL_DSTMODE_MASK) | DMA_CHCTRL_CTRL_DSTMODE_SET(mode);
248 }
249 
269 static inline void dma_set_source_burst_size(DMA_Type *ptr, uint32_t ch_index, uint8_t burstsize)
270 {
271  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMA_CHCTRL_CTRL_SRCBURSTSIZE_MASK) | DMA_CHCTRL_CTRL_SRCBURSTSIZE_SET(burstsize);
272 }
273 
283 static inline uint32_t dma_get_remaining_transfer_size(DMA_Type *ptr, uint32_t ch_index)
284 {
285  return ptr->CHCTRL[ch_index].TRANSIZE;
286 }
287 
297 static inline void dma_set_transfer_size(DMA_Type *ptr, uint32_t ch_index, uint32_t size_in_width)
298 {
299  ptr->CHCTRL[ch_index].TRANSIZE = DMA_CHCTRL_TRANSIZE_TRANSIZE_SET(size_in_width);
300 }
301 
313 static inline void dma_set_source_width(DMA_Type *ptr, uint32_t ch_index, uint8_t width)
314 {
315  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMA_CHCTRL_CTRL_SRCWIDTH_MASK) | DMA_CHCTRL_CTRL_SRCWIDTH_SET(width);
316 }
317 
329 static inline void dma_set_destination_width(DMA_Type *ptr, uint32_t ch_index, uint8_t width)
330 {
331  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMA_CHCTRL_CTRL_DSTWIDTH_MASK) | DMA_CHCTRL_CTRL_DSTWIDTH_SET(width);
332 }
333 
347 static inline void dma_set_transfer_src_width_byte_size(DMA_Type *ptr, uint32_t ch_index, uint8_t src_width, uint32_t size_in_byte)
348 {
349  assert((src_width == DMA_TRANSFER_WIDTH_BYTE) || (src_width == DMA_TRANSFER_WIDTH_HALF_WORD)
350  || (src_width == DMA_TRANSFER_WIDTH_WORD) || (src_width == DMA_TRANSFER_WIDTH_DOUBLE_WORD));
351 
352  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMA_CHCTRL_CTRL_SRCWIDTH_MASK) | DMA_CHCTRL_CTRL_SRCWIDTH_SET(src_width);
353  ptr->CHCTRL[ch_index].TRANSIZE = DMA_CHCTRL_TRANSIZE_TRANSIZE_SET(size_in_byte >> src_width);
354 }
355 
364 static inline void dma_set_source_address(DMA_Type *ptr, uint32_t ch_index, uint32_t addr)
365 {
366  ptr->CHCTRL[ch_index].SRCADDR = addr;
367 }
368 
377 static inline void dma_set_destination_address(DMA_Type *ptr, uint32_t ch_index, uint32_t addr)
378 {
379  ptr->CHCTRL[ch_index].DSTADDR = addr;
380 }
381 
393 static inline void dma_set_source_address_ctrl(DMA_Type *ptr, uint32_t ch_index, uint8_t addr_ctrl)
394 {
395  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMA_CHCTRL_CTRL_SRCADDRCTRL_MASK) | DMA_CHCTRL_CTRL_SRCADDRCTRL_SET(addr_ctrl);
396 }
397 
409 static inline void dma_set_destination_address_ctrl(DMA_Type *ptr, uint32_t ch_index, uint8_t addr_ctrl)
410 {
411  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMA_CHCTRL_CTRL_DSTADDRCTRL_MASK) | DMA_CHCTRL_CTRL_DSTADDRCTRL_SET(addr_ctrl);
412 }
413 
420 static inline void dma_abort_channel(DMA_Type *ptr, uint32_t ch_index_mask)
421 {
422  ptr->CHABORT |= DMA_CHABORT_CHABORT_SET(ch_index_mask);
423 }
424 
433 static inline uint32_t dma_check_enabled_channel(DMA_Type *ptr,
434  uint32_t ch_index_mask)
435 {
436  return (ch_index_mask & ptr->CHEN);
437 }
438 
447 static inline bool dma_has_linked_pointer_configured(DMA_Type *ptr, uint32_t ch_index)
448 {
449  return ptr->CHCTRL[ch_index].LLPOINTER != 0;
450 }
451 
463 static inline uint32_t dma_check_transfer_status(DMA_Type *ptr, uint8_t ch_index)
464 {
465  volatile uint32_t tmp = ptr->INTSTATUS;
466  volatile uint32_t tmp_channel;
467  uint32_t dma_status;
468 
469  dma_status = 0;
470  tmp_channel = tmp & (1 << (DMA_STATUS_TC_SHIFT + ch_index));
471  if (tmp_channel) {
472  dma_status |= DMA_CHANNEL_STATUS_TC;
473  ptr->INTSTATUS = tmp_channel;
474  }
475  tmp_channel = tmp & (1 << (DMA_STATUS_ERROR_SHIFT + ch_index));
476  if (tmp_channel) {
477  dma_status |= DMA_CHANNEL_STATUS_ERROR;
478  ptr->INTSTATUS = tmp_channel;
479  }
480  tmp_channel = tmp & (1 << (DMA_STATUS_ABORT_SHIFT + ch_index));
481  if (tmp_channel) {
482  dma_status |= DMA_CHANNEL_STATUS_ABORT;
483  ptr->INTSTATUS = tmp_channel;
484  }
485  if (dma_status == 0) {
486  dma_status = DMA_CHANNEL_STATUS_ONGOING;
487  }
488  return dma_status;
489 }
490 
498 static inline void dma_clear_transfer_status(DMA_Type *ptr, uint8_t ch_index)
499 {
500  ptr->INTSTATUS = ((1 << (DMA_STATUS_TC_SHIFT + ch_index)) | (1 << (DMA_STATUS_ERROR_SHIFT + ch_index)) | (1 << (DMA_STATUS_ABORT_SHIFT + ch_index)));
501 }
502 
510 static inline void dma_enable_channel_interrupt(DMA_Type *ptr, uint8_t ch_index, int32_t interrupt_mask)
511 {
512  ptr->CHCTRL[ch_index].CTRL &= ~(interrupt_mask & DMA_INTERRUPT_MASK_ALL);
513 }
514 
522 static inline void dma_disable_channel_interrupt(DMA_Type *ptr, uint8_t ch_index, int32_t interrupt_mask)
523 {
524  ptr->CHCTRL[ch_index].CTRL |= (interrupt_mask & DMA_INTERRUPT_MASK_ALL);
525 }
526 
527 
535 static inline uint32_t dma_check_channel_interrupt_mask(DMA_Type *ptr, uint8_t ch_index)
536 {
537  return ptr->CHCTRL[ch_index].CTRL & DMA_INTERRUPT_MASK_ALL;
538 }
539 
546 static inline void dma_clear_irq_status(DMA_Type *ptr, uint32_t mask)
547 {
548  ptr->INTSTATUS = mask; /* Write-1-Clear */
549 }
550 
556 static inline uint32_t dma_get_irq_status(DMA_Type *ptr)
557 {
558  return ptr->INTSTATUS;
559 }
560 
568 
579 hpm_stat_t dma_setup_channel(DMA_Type *ptr, uint8_t ch_num,
580  dma_channel_config_t *ch, bool start_transfer);
581 
593 
607 hpm_stat_t dma_start_memcpy(DMA_Type *ptr, uint8_t ch_num,
608  uint32_t dst, uint32_t src,
609  uint32_t size_in_byte, uint32_t burst_len_in_byte);
610 
618 
628 hpm_stat_t dma_setup_handshake(DMA_Type *ptr, dma_handshake_config_t *pconfig, bool start_transfer);
629 
630 
631 #if defined(DMA_SOC_HAS_IDLE_FLAG) && (DMA_SOC_HAS_IDLE_FLAG == 1)
638 static inline bool dma_is_idle(DMA_Type *ptr)
639 {
640  return ((ptr->IDMISC & DMA_IDMISC_IDLE_FLAG_MASK) != 0U);
641 }
642 #endif
643 
644 
645 #ifdef __cplusplus
646 }
647 #endif
651 #endif /* HPM_DMAV1_DRV_H */
#define DMA_CHCTRL_CTRL_ENABLE_MASK
Definition: hpm_dma_regs.h:431
#define DMA_DMACTRL_RESET_MASK
Definition: hpm_dma_regs.h:172
#define DMA_CHCTRL_CTRL_DSTMODE_SET(x)
Definition: hpm_dma_regs.h:337
#define DMA_CHCTRL_CTRL_SRCADDRCTRL_MASK
Definition: hpm_dma_regs.h:349
#define DMA_CHCTRL_CTRL_DSTWIDTH_SET(x)
Definition: hpm_dma_regs.h:313
#define DMA_IDMISC_IDLE_FLAG_MASK
Definition: hpm_dma_regs.h:45
#define DMA_CHCTRL_CTRL_SRCADDRCTRL_SET(x)
Definition: hpm_dma_regs.h:351
#define DMA_CHCTRL_CTRL_PRIORITY_MASK
Definition: hpm_dma_regs.h:248
#define DMA_CHCTRL_CTRL_SRCWIDTH_SET(x)
Definition: hpm_dma_regs.h:292
#define DMA_CHCTRL_CTRL_DSTADDRCTRL_SET(x)
Definition: hpm_dma_regs.h:365
#define DMA_CHCTRL_CTRL_SRCBURSTSIZE_SET(x)
Definition: hpm_dma_regs.h:274
#define DMA_CHCTRL_CTRL_DSTWIDTH_MASK
Definition: hpm_dma_regs.h:311
#define DMA_CHCTRL_TRANSIZE_TRANSIZE_SET(x)
Definition: hpm_dma_regs.h:445
#define DMA_CHCTRL_CTRL_DSTMODE_MASK
Definition: hpm_dma_regs.h:335
#define DMA_CHCTRL_CTRL_SRCBURSTSIZE_MASK
Definition: hpm_dma_regs.h:272
#define DMA_CHCTRL_CTRL_SRCWIDTH_MASK
Definition: hpm_dma_regs.h:290
#define DMA_CHCTRL_CTRL_PRIORITY_SET(x)
Definition: hpm_dma_regs.h:250
#define DMA_CHCTRL_CTRL_DSTADDRCTRL_MASK
Definition: hpm_dma_regs.h:363
#define DMA_CHABORT_CHABORT_SET(x)
Definition: hpm_dma_regs.h:186
#define DMA_CHCTRL_CTRL_SRCMODE_MASK
Definition: hpm_dma_regs.h:323
#define DMA_CHCTRL_CTRL_SRCMODE_SET(x)
Definition: hpm_dma_regs.h:325
uint32_t hpm_stat_t
Definition: hpm_common.h:126
#define MAKE_STATUS(group, code)
Definition: hpm_common.h:135
@ status_success
Definition: hpm_common.h:180
@ status_fail
Definition: hpm_common.h:181
@ status_group_dma
Definition: hpm_common.h:146
static bool dma_has_linked_pointer_configured(DMA_Type *ptr, uint32_t ch_index)
Check if linked pointer has been configured.
Definition: hpm_dma_drv.h:447
static void dma_set_destination_work_mode(DMA_Type *ptr, uint32_t ch_index, uint8_t mode)
Set DMA channel destination work mode.
Definition: hpm_dma_drv.h:245
#define DMA_CHANNEL_STATUS_ABORT
Definition: hpm_dma_drv.h:53
static void dma_clear_irq_status(DMA_Type *ptr, uint32_t mask)
Get clear IRQ status.
Definition: hpm_dma_drv.h:546
#define DMA_INTERRUPT_MASK_ALL
Definition: hpm_dma_drv.h:78
static void dma_set_priority(DMA_Type *ptr, uint32_t ch_index, uint8_t priority)
Set DMA channel priority.
Definition: hpm_dma_drv.h:215
hpm_stat_t dma_config_linked_descriptor(DMA_Type *ptr, dma_linked_descriptor_t *descriptor, uint8_t ch_num, dma_channel_config_t *config)
Config linked descriptor function.
Definition: hpm_dma_drv.c:76
static void dma_set_transfer_size(DMA_Type *ptr, uint32_t ch_index, uint32_t size_in_width)
Set DMA channel transfer size.
Definition: hpm_dma_drv.h:297
#define DMA_CHANNEL_STATUS_ERROR
Definition: hpm_dma_drv.h:52
static uint32_t dma_get_irq_status(DMA_Type *ptr)
Get IRQ status.
Definition: hpm_dma_drv.h:556
hpm_stat_t dma_setup_channel(DMA_Type *ptr, uint8_t ch_num, dma_channel_config_t *ch, bool start_transfer)
Setup DMA channel.
Definition: hpm_dma_drv.c:10
static void dma_set_source_address_ctrl(DMA_Type *ptr, uint32_t ch_index, uint8_t addr_ctrl)
Set DMA channel source address control mode.
Definition: hpm_dma_drv.h:393
static void dma_clear_transfer_status(DMA_Type *ptr, uint8_t ch_index)
Clear transfer status.
Definition: hpm_dma_drv.h:498
void dma_default_handshake_config(DMA_Type *ptr, dma_handshake_config_t *config)
Get default handshake config.
Definition: hpm_dma_drv.c:185
static void dma_reset(DMA_Type *ptr)
Reset DMA.
Definition: hpm_dma_drv.h:156
#define DMA_TRANSFER_WIDTH_DOUBLE_WORD
Definition: hpm_dma_drv.h:41
void dma_default_channel_config(DMA_Type *ptr, dma_channel_config_t *ch)
Get default channel config.
Definition: hpm_dma_drv.c:60
struct dma_linked_descriptor dma_linked_descriptor_t
Linked descriptor.
#define DMA_CHANNEL_STATUS_ONGOING
Definition: hpm_dma_drv.h:51
struct dma_handshake_config dma_handshake_config_t
static void dma_set_source_width(DMA_Type *ptr, uint32_t ch_index, uint8_t width)
Set DMA channel source width.
Definition: hpm_dma_drv.h:313
static uint32_t dma_check_channel_interrupt_mask(DMA_Type *ptr, uint8_t ch_index)
Check Channel interrupt master.
Definition: hpm_dma_drv.h:535
static void dma_set_source_address(DMA_Type *ptr, uint32_t ch_index, uint32_t addr)
Set DMA channel source address.
Definition: hpm_dma_drv.h:364
#define DMA_TRANSFER_WIDTH_WORD
Definition: hpm_dma_drv.h:40
static void dma_disable_channel_interrupt(DMA_Type *ptr, uint8_t ch_index, int32_t interrupt_mask)
Disable DMA Channel interrupt.
Definition: hpm_dma_drv.h:522
static void dma_abort_channel(DMA_Type *ptr, uint32_t ch_index_mask)
Abort channel transfer with mask.
Definition: hpm_dma_drv.h:420
#define DMA_STATUS_ERROR_SHIFT
Definition: hpm_dma_drv.h:47
static void dma_set_destination_address(DMA_Type *ptr, uint32_t ch_index, uint32_t addr)
Set DMA channel destination address.
Definition: hpm_dma_drv.h:377
static void dma_set_source_work_mode(DMA_Type *ptr, uint32_t ch_index, uint8_t mode)
Set DMA channel source work mode.
Definition: hpm_dma_drv.h:230
struct dma_channel_config dma_channel_config_t
static bool dma_is_idle(DMAV2_Type *ptr)
Check whether DMA is idle.
Definition: hpm_dmav2_drv.h:747
#define DMA_STATUS_TC_SHIFT
Definition: hpm_dma_drv.h:49
static void dma_enable_channel_interrupt(DMA_Type *ptr, uint8_t ch_index, int32_t interrupt_mask)
Enable DMA Channel interrupt.
Definition: hpm_dma_drv.h:510
static void dma_set_transfer_src_width_byte_size(DMA_Type *ptr, uint32_t ch_index, uint8_t src_width, uint32_t size_in_byte)
Set DMA channel transfer width and size in byte.
Definition: hpm_dma_drv.h:347
static bool dma_channel_is_enable(DMA_Type *ptr, uint32_t ch_index)
Check whether DMA channel is enable.
Definition: hpm_dma_drv.h:200
static uint32_t dma_check_enabled_channel(DMA_Type *ptr, uint32_t ch_index_mask)
Check if channels are enabled with mask.
Definition: hpm_dma_drv.h:433
static uint32_t dma_check_transfer_status(DMA_Type *ptr, uint8_t ch_index)
Check transfer status.
Definition: hpm_dma_drv.h:463
#define DMA_STATUS_ABORT_SHIFT
Definition: hpm_dma_drv.h:48
hpm_stat_t dma_start_memcpy(DMA_Type *ptr, uint8_t ch_num, uint32_t dst, uint32_t src, uint32_t size_in_byte, uint32_t burst_len_in_byte)
Start DMA copy.
Definition: hpm_dma_drv.c:123
static void dma_set_source_burst_size(DMA_Type *ptr, uint32_t ch_index, uint8_t burstsize)
Set DMA channel source burst size.
Definition: hpm_dma_drv.h:269
static hpm_stat_t dma_enable_channel(DMA_Type *ptr, uint32_t ch_index)
Enable DMA channel.
Definition: hpm_dma_drv.h:169
#define DMA_TRANSFER_WIDTH_HALF_WORD
Definition: hpm_dma_drv.h:39
static uint32_t dma_get_remaining_transfer_size(DMA_Type *ptr, uint32_t ch_index)
Get DMA channel remaining transfer size.
Definition: hpm_dma_drv.h:283
#define DMA_TRANSFER_WIDTH_BYTE
Definition: hpm_dma_drv.h:38
hpm_stat_t dma_setup_handshake(DMA_Type *ptr, dma_handshake_config_t *pconfig, bool start_transfer)
config dma handshake function
Definition: hpm_dma_drv.c:191
static void dma_set_destination_address_ctrl(DMA_Type *ptr, uint32_t ch_index, uint8_t addr_ctrl)
Set DMA channel destination address control mode.
Definition: hpm_dma_drv.h:409
#define DMA_CHANNEL_STATUS_TC
Definition: hpm_dma_drv.h:54
static void dma_disable_channel(DMA_Type *ptr, uint32_t ch_index)
Disable DMA channel.
Definition: hpm_dma_drv.h:186
static void dma_set_destination_width(DMA_Type *ptr, uint32_t ch_index, uint8_t width)
Set DMA channel destination width.
Definition: hpm_dma_drv.h:329
@ status_dma_transfer_abort
Definition: hpm_dma_drv.h:142
@ status_dma_transfer_ongoing
Definition: hpm_dma_drv.h:143
@ status_dma_transfer_done
Definition: hpm_dma_drv.h:140
@ status_dma_transfer_error
Definition: hpm_dma_drv.h:141
@ status_dma_alignment_error
Definition: hpm_dma_drv.h:144
Definition: hpm_dma_regs.h:12
__RW uint32_t LLPOINTER
Definition: hpm_dma_regs.h:31
__R uint32_t CHEN
Definition: hpm_dma_regs.h:22
__RW uint32_t TRANSIZE
Definition: hpm_dma_regs.h:26
__RW uint32_t SRCADDR
Definition: hpm_dma_regs.h:27
__RW uint32_t CTRL
Definition: hpm_dma_regs.h:25
__RW uint32_t DSTADDR
Definition: hpm_dma_regs.h:29
struct DMA_Type::@368 CHCTRL[8]
__W uint32_t INTSTATUS
Definition: hpm_dma_regs.h:21
__W uint32_t DMACTRL
Definition: hpm_dma_regs.h:18
__W uint32_t CHABORT
Definition: hpm_dma_regs.h:19
__R uint32_t IDMISC
Definition: hpm_dma_regs.h:14
Definition: hpm_dma_drv.h:104
uint32_t linked_ptr
Definition: hpm_dma_drv.h:116
uint8_t dst_addr_ctrl
Definition: hpm_dma_drv.h:112
uint32_t dst_addr
Definition: hpm_dma_drv.h:115
uint32_t src_addr
Definition: hpm_dma_drv.h:114
uint8_t src_mode
Definition: hpm_dma_drv.h:107
uint8_t priority
Definition: hpm_dma_drv.h:105
uint8_t src_burst_size
Definition: hpm_dma_drv.h:106
uint8_t src_addr_ctrl
Definition: hpm_dma_drv.h:111
uint32_t size_in_byte
Definition: hpm_dma_drv.h:117
uint8_t src_width
Definition: hpm_dma_drv.h:109
uint8_t dst_mode
Definition: hpm_dma_drv.h:108
uint16_t interrupt_mask
Definition: hpm_dma_drv.h:113
uint8_t dst_width
Definition: hpm_dma_drv.h:110
Definition: hpm_dma_drv.h:127
uint8_t data_width
Definition: hpm_dma_drv.h:131
bool dst_fixed
Definition: hpm_dma_drv.h:133
uint32_t size_in_byte
Definition: hpm_dma_drv.h:130
uint32_t dst
Definition: hpm_dma_drv.h:128
bool src_fixed
Definition: hpm_dma_drv.h:134
uint8_t ch_index
Definition: hpm_dma_drv.h:132
uint32_t src
Definition: hpm_dma_drv.h:129
Linked descriptor.
Definition: hpm_dma_drv.h:92
uint32_t dst_addr
Definition: hpm_dma_drv.h:97
uint32_t ctrl
Definition: hpm_dma_drv.h:93
uint32_t src_addr
Definition: hpm_dma_drv.h:95
uint32_t linked_ptr
Definition: hpm_dma_drv.h:99
uint32_t trans_size
Definition: hpm_dma_drv.h:94
uint32_t src_addr_high
Definition: hpm_dma_drv.h:96
uint32_t dst_addr_high
Definition: hpm_dma_drv.h:98
uint32_t linked_ptr_high
Definition: hpm_dma_drv.h:100