HPM SDK
HPMicro Software Development Kit
hpm_dmav2_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_DMAV2_DRV_H
10 #define HPM_DMAV2_DRV_H
11 #include "hpm_common.h"
12 #include "hpm_soc_feature.h"
13 #include "hpm_dmav2_regs.h"
14 
23 #define DMA_Type DMAV2_Type
24 
25 #define DMA_CHANNEL_PRIORITY_LOW (0U)
26 #define DMA_CHANNEL_PRIORITY_HIGH (1U)
27 
28 #define DMA_NUM_TRANSFER_PER_BURST_1T (0U)
29 #define DMA_NUM_TRANSFER_PER_BURST_2T (1U)
30 #define DMA_NUM_TRANSFER_PER_BURST_4T (2U)
31 #define DMA_NUM_TRANSFER_PER_BURST_8T (3U)
32 #define DMA_NUM_TRANSFER_PER_BURST_16T (4U)
33 #define DMA_NUM_TRANSFER_PER_BURST_32T (5U)
34 #define DMA_NUM_TRANSFER_PER_BURST_64T (6U)
35 #define DMA_NUM_TRANSFER_PER_BURST_128T (7U)
36 #define DMA_NUM_TRANSFER_PER_BURST_256T (8U)
37 #define DMA_NUM_TRANSFER_PER_BURST_512T (9U)
38 #define DMA_NUM_TRANSFER_PER_BURST_1024T (10U)
39 
40 #define DMA_TRANSFER_WIDTH_BYTE (0U)
41 #define DMA_TRANSFER_WIDTH_HALF_WORD (1U)
42 #define DMA_TRANSFER_WIDTH_WORD (2U)
43 #define DMA_TRANSFER_WIDTH_DOUBLE_WORD (3U)
44 
45 #define DMA_ALIGN_HALF_WORD(x) (x & ~(1u))
46 #define DMA_ALIGN_WORD(x) (x & ~(3u))
47 #define DMA_ALIGN_DOUBLE_WORD(x) (x & ~(7u))
48 
49 #define DMA_CHANNEL_STATUS_ONGOING (1U)
50 #define DMA_CHANNEL_STATUS_ERROR (2U)
51 #define DMA_CHANNEL_STATUS_ABORT (4U)
52 #define DMA_CHANNEL_STATUS_TC (8U)
53 #define DMA_CHANNEL_STATUS_HALF_TC (16U)
54 
55 #define DMA_CHANNEL_IRQ_STATUS_ERROR(x) (uint32_t)(1 << x)
56 #define DMA_CHANNEL_IRQ_STATUS_ABORT(x) (uint32_t)(1 << x)
57 #define DMA_CHANNEL_IRQ_STATUS_TC(x) (uint32_t)(1 << x)
58 #define DMA_CHANNEL_IRQ_STATUS_HALF_TC(x) (uint32_t)(1 << x)
59 
60 #define DMA_HANDSHAKE_MODE_NORMAL (0U)
61 #define DMA_HANDSHAKE_MODE_HANDSHAKE (1U)
62 
63 #define DMA_ADDRESS_CONTROL_INCREMENT (0U)
64 #define DMA_ADDRESS_CONTROL_DECREMENT (1U)
65 #define DMA_ADDRESS_CONTROL_FIXED (2U)
66 
67 #define DMA_SRC_BURST_OPT_STANDAND_SIZE (0U)
68 #define DMA_SRC_BURST_OPT_CUSTOM_SIZE (1U)
69 
70 #define DMA_HANDSHAKE_OPT_ONE_BURST (0U)
71 #define DMA_HANDSHAKE_OPT_ALL_TRANSIZE (1U)
72 
73 #define DMA_SWAP_MODE_TABLE (0U)
74 #define DMA_SWAP_MODE_BYTE (1U)
75 #define DMA_SWAP_MODE_HALF_WORD (2U)
76 #define DMA_SWAP_MODE_WORD (3U)
77 
78 #define DMA_INTERRUPT_MASK_NONE (0U)
79 #define DMA_INTERRUPT_MASK_ERROR DMAV2_CHCTRL_CTRL_INTERRMASK_MASK
80 #define DMA_INTERRUPT_MASK_ABORT DMAV2_CHCTRL_CTRL_INTABTMASK_MASK
81 #define DMA_INTERRUPT_MASK_TERMINAL_COUNT DMAV2_CHCTRL_CTRL_INTTCMASK_MASK
82 #define DMA_INTERRUPT_MASK_HALF_TC DMAV2_CHCTRL_CTRL_INTHALFCNTMASK_MASK
83 #define DMA_INTERRUPT_MASK_ALL \
84  (uint8_t)(DMA_INTERRUPT_MASK_TERMINAL_COUNT \
85  | DMA_INTERRUPT_MASK_ABORT \
86  | DMA_INTERRUPT_MASK_ERROR \
87  | DMA_INTERRUPT_MASK_HALF_TC)
88 
89 #define DMA_SUPPORT_64BIT_ADDR (0)
90 
91 
92 enum {
101 };
102 
108 typedef struct dma_linked_descriptor {
109  uint32_t ctrl;
110  uint32_t trans_size;
111  uint32_t src_addr;
112  uint32_t req_ctrl;
113  uint32_t dst_addr;
114  uint32_t swap_table;
115  uint32_t linked_ptr;
116  uint32_t reserved0;
118 
119 /* @brief Channel config */
120 typedef struct dma_channel_config {
121  uint8_t priority;
122  uint8_t src_burst_size;
123  uint8_t src_mode;
124  uint8_t dst_mode;
125  uint8_t src_width;
126  uint8_t dst_width;
127  uint8_t src_addr_ctrl;
128  uint8_t dst_addr_ctrl;
129  uint16_t interrupt_mask;
130  uint32_t src_addr;
131  uint32_t dst_addr;
132  uint32_t linked_ptr;
133  uint32_t size_in_byte;
135  uint8_t handshake_opt;
136  uint8_t burst_opt;
137 #if defined(HPM_IP_FEATURE_DMAV2_BURST_IN_FIXED_TRANS) && (HPM_IP_FEATURE_DMAV2_BURST_IN_FIXED_TRANS == 1)
138  bool en_src_burst_in_fixed_trans;
139  bool en_dst_burst_in_fixed_trans;
140 #endif
141 #if defined(HPM_IP_FEATURE_DMAV2_BYTE_ORDER_SWAP) && (HPM_IP_FEATURE_DMAV2_BYTE_ORDER_SWAP == 1)
142  uint8_t swap_mode;
143  uint32_t swap_table;
144 #endif
146 
147 /* @brief Channel config */
148 typedef struct dma_handshake_config {
149  uint32_t dst;
150  uint32_t src;
151  uint32_t size_in_byte;
152  uint8_t data_width; /* data width, value defined by DMA_TRANSFER_WIDTH_xxx */
153  uint8_t ch_index;
154  bool dst_fixed;
155  bool src_fixed;
157  uint16_t interrupt_mask;
159 
160 
161 /* @brief DMA specific status */
162 enum {
169 };
170 
171 #ifdef __cplusplus
172 extern "C" {
173 #endif
174 
180 static inline void dma_reset(DMAV2_Type *ptr)
181 {
183 }
184 
193 static inline hpm_stat_t dma_enable_channel(DMAV2_Type *ptr, uint32_t ch_index)
194 {
195  ptr->CHCTRL[ch_index].CTRL |= DMAV2_CHCTRL_CTRL_ENABLE_MASK;
196 
197  if ((ptr->CHEN == 0) || !(ptr->CHEN & 1 << ch_index)) {
198  return status_fail;
199  }
200  return status_success;
201 }
202 
210 static inline void dma_disable_channel(DMAV2_Type *ptr, uint32_t ch_index)
211 {
212  ptr->CHCTRL[ch_index].CTRL &= ~DMAV2_CHCTRL_CTRL_ENABLE_MASK;
213 }
214 
224 static inline bool dma_channel_is_enable(DMAV2_Type *ptr, uint32_t ch_index)
225 {
226  return (ptr->CHCTRL[ch_index].CTRL & DMAV2_CHCTRL_CTRL_ENABLE_MASK) ? true : false;
227 }
228 
239 static inline void dma_set_priority(DMAV2_Type *ptr, uint32_t ch_index, uint8_t priority)
240 {
241  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_PRIORITY_MASK) | DMAV2_CHCTRL_CTRL_PRIORITY_SET(priority);
242 }
243 
254 static inline void dma_set_source_work_mode(DMAV2_Type *ptr, uint32_t ch_index, uint8_t mode)
255 {
256  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_SRCMODE_MASK) | DMAV2_CHCTRL_CTRL_SRCMODE_SET(mode);
257 }
258 
269 static inline void dma_set_destination_work_mode(DMAV2_Type *ptr, uint32_t ch_index, uint8_t mode)
270 {
271  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_DSTMODE_MASK) | DMAV2_CHCTRL_CTRL_DSTMODE_SET(mode);
272 }
273 
295 static inline void dma_set_source_burst_size(DMAV2_Type *ptr, uint32_t ch_index, uint8_t burstsize)
296 {
297  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_SRCBURSTSIZE_MASK) | DMAV2_CHCTRL_CTRL_SRCBURSTSIZE_SET(burstsize);
298 }
299 
309 static inline uint32_t dma_get_remaining_transfer_size(DMAV2_Type *ptr, uint32_t ch_index)
310 {
311  return ptr->CHCTRL[ch_index].TRANSIZE;
312 }
313 
323 static inline void dma_set_transfer_size(DMAV2_Type *ptr, uint32_t ch_index, uint32_t size_in_width)
324 {
325  ptr->CHCTRL[ch_index].TRANSIZE = DMAV2_CHCTRL_TRANSIZE_TRANSIZE_SET(size_in_width);
326 }
327 
339 static inline void dma_set_source_width(DMAV2_Type *ptr, uint32_t ch_index, uint8_t width)
340 {
341  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_SRCWIDTH_MASK) | DMAV2_CHCTRL_CTRL_SRCWIDTH_SET(width);
342 }
343 
355 static inline void dma_set_destination_width(DMAV2_Type *ptr, uint32_t ch_index, uint8_t width)
356 {
357  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_DSTWIDTH_MASK) | DMAV2_CHCTRL_CTRL_DSTWIDTH_SET(width);
358 }
359 
373 static inline void dma_set_transfer_src_width_byte_size(DMAV2_Type *ptr, uint32_t ch_index, uint8_t src_width, uint32_t size_in_byte)
374 {
375  assert((src_width == DMA_TRANSFER_WIDTH_BYTE) || (src_width == DMA_TRANSFER_WIDTH_HALF_WORD)
376  || (src_width == DMA_TRANSFER_WIDTH_WORD) || (src_width == DMA_TRANSFER_WIDTH_DOUBLE_WORD));
377 
378  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_SRCWIDTH_MASK) | DMAV2_CHCTRL_CTRL_SRCWIDTH_SET(src_width);
379  ptr->CHCTRL[ch_index].TRANSIZE = DMAV2_CHCTRL_TRANSIZE_TRANSIZE_SET(size_in_byte >> src_width);
380 }
381 
390 static inline void dma_set_source_address(DMAV2_Type *ptr, uint32_t ch_index, uint32_t addr)
391 {
392  ptr->CHCTRL[ch_index].SRCADDR = addr;
393 }
394 
403 static inline void dma_set_destination_address(DMAV2_Type *ptr, uint32_t ch_index, uint32_t addr)
404 {
405  ptr->CHCTRL[ch_index].DSTADDR = addr;
406 }
407 
419 static inline void dma_set_source_address_ctrl(DMAV2_Type *ptr, uint32_t ch_index, uint8_t addr_ctrl)
420 {
421  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_SRCADDRCTRL_MASK) | DMAV2_CHCTRL_CTRL_SRCADDRCTRL_SET(addr_ctrl);
422 }
423 
435 static inline void dma_set_destination_address_ctrl(DMAV2_Type *ptr, uint32_t ch_index, uint8_t addr_ctrl)
436 {
437  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_DSTADDRCTRL_MASK) | DMAV2_CHCTRL_CTRL_DSTADDRCTRL_SET(addr_ctrl);
438 }
439 
448 static inline void dma_set_infinite_loop_mode(DMAV2_Type *ptr, uint32_t ch_index, bool infinite_loop)
449 {
450  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_INFINITELOOP_MASK) | DMAV2_CHCTRL_CTRL_INFINITELOOP_SET(infinite_loop);
451 }
452 
463 static inline void dma_set_src_busrt_option(DMAV2_Type *ptr, uint32_t ch_index, uint8_t burst_opt)
464 {
465  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_BURSTOPT_MASK) | DMAV2_CHCTRL_CTRL_BURSTOPT_SET(burst_opt);
466 }
467 
478 static inline void dma_set_handshake_option(DMAV2_Type *ptr, uint32_t ch_index, uint8_t handshake_opt)
479 {
480  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_HANDSHAKEOPT_MASK) | DMAV2_CHCTRL_CTRL_HANDSHAKEOPT_SET(handshake_opt);
481 }
482 
483 #if defined(HPM_IP_FEATURE_DMAV2_BURST_IN_FIXED_TRANS) && (HPM_IP_FEATURE_DMAV2_BURST_IN_FIXED_TRANS == 1)
492 static inline void dma_set_source_burst_in_fixed_transize_enable(DMAV2_Type *ptr, uint32_t ch_index, bool enable)
493 {
494  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_SRC_FIXBURST_MASK) | DMAV2_CHCTRL_CTRL_SRC_FIXBURST_SET(enable);
495 }
496 
505 static inline void dma_set_destination_burst_in_fixed_transize_enable(DMAV2_Type *ptr, uint32_t ch_index, bool enable)
506 {
507  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_DST_FIXBURST_MASK) | DMAV2_CHCTRL_CTRL_DST_FIXBURST_SET(enable);
508 }
509 #endif
510 
511 #if defined(HPM_IP_FEATURE_DMAV2_BYTE_ORDER_SWAP) && (HPM_IP_FEATURE_DMAV2_BYTE_ORDER_SWAP == 1)
524 static inline void dma_set_swap_mode(DMAV2_Type *ptr, uint32_t ch_index, uint8_t swap_mode)
525 {
526  ptr->CHCTRL[ch_index].CTRL = (ptr->CHCTRL[ch_index].CTRL & ~DMAV2_CHCTRL_CTRL_SWAP_CTL_MASK) | DMAV2_CHCTRL_CTRL_SWAP_CTL_SET(swap_mode);
527 }
528 
537 static inline void dma_set_swap_table(DMAV2_Type *ptr, uint32_t ch_index, uint32_t swap_table)
538 {
539  ptr->CHCTRL[ch_index].SWAPTABLE = swap_table;
540 }
541 #endif
542 
549 static inline void dma_abort_channel(DMAV2_Type *ptr, uint32_t ch_index_mask)
550 {
551  ptr->CHABORT |= DMAV2_CHABORT_CHABORT_SET(ch_index_mask);
552 }
553 
562 static inline uint32_t dma_check_enabled_channel(DMAV2_Type *ptr,
563  uint32_t ch_index_mask)
564 {
565  return (ch_index_mask & ptr->CHEN);
566 }
567 
576 static inline bool dma_has_linked_pointer_configured(DMAV2_Type *ptr, uint32_t ch_index)
577 {
578  return ptr->CHCTRL[ch_index].LLPOINTER != 0;
579 }
580 
593 static inline uint32_t dma_check_transfer_status(DMAV2_Type *ptr, uint8_t ch_index)
594 {
595  uint32_t dma_status = 0;
596 
597  if (ptr->INTTCSTS & (1 << ch_index)) {
598  dma_status |= DMA_CHANNEL_STATUS_TC;
599  ptr->INTTCSTS = (1 << ch_index); /* W1C clear status*/
600  }
601  if (ptr->INTHALFSTS & (1 << ch_index)) {
602  dma_status |= DMA_CHANNEL_STATUS_HALF_TC;
603  ptr->INTHALFSTS = (1 << ch_index); /* W1C clear status*/
604  }
605  if (ptr->INTERRSTS & (1 << ch_index)) {
606  dma_status |= DMA_CHANNEL_STATUS_ERROR;
607  ptr->INTERRSTS = (1 << ch_index); /* W1C clear status*/
608  }
609  if (ptr->INTABORTSTS & (1 << ch_index)) {
610  dma_status |= DMA_CHANNEL_STATUS_ABORT;
611  ptr->INTABORTSTS = (1 << ch_index); /* W1C clear status*/
612  }
613  if (dma_status == 0) {
614  dma_status = DMA_CHANNEL_STATUS_ONGOING;
615  }
616  return dma_status;
617 }
618 
626 static inline void dma_clear_transfer_status(DMAV2_Type *ptr, uint8_t ch_index)
627 {
628  /* W1C */
629  ptr->INTHALFSTS = (1 << ch_index);
630  ptr->INTTCSTS = (1 << ch_index);
631  ptr->INTABORTSTS = (1 << ch_index);
632  ptr->INTERRSTS = (1 << ch_index);
633 }
634 
642 static inline void dma_enable_channel_interrupt(DMAV2_Type *ptr, uint8_t ch_index, int32_t interrupt_mask)
643 {
644  ptr->CHCTRL[ch_index].CTRL &= ~(interrupt_mask & DMA_INTERRUPT_MASK_ALL);
645 }
646 
654 static inline void dma_disable_channel_interrupt(DMAV2_Type *ptr, uint8_t ch_index, int32_t interrupt_mask)
655 {
656  ptr->CHCTRL[ch_index].CTRL |= (interrupt_mask & DMA_INTERRUPT_MASK_ALL);
657 }
658 
659 
667 static inline uint32_t dma_check_channel_interrupt_mask(DMAV2_Type *ptr, uint8_t ch_index)
668 {
669  return ptr->CHCTRL[ch_index].CTRL & DMA_INTERRUPT_MASK_ALL;
670 }
671 
679 
690 hpm_stat_t dma_setup_channel(DMAV2_Type *ptr, uint8_t ch_num,
691  dma_channel_config_t *ch, bool start_transfer);
692 
704 
718 hpm_stat_t dma_start_memcpy(DMAV2_Type *ptr, uint8_t ch_num,
719  uint32_t dst, uint32_t src,
720  uint32_t size_in_byte, uint32_t burst_len_in_byte);
721 
729 
739 hpm_stat_t dma_setup_handshake(DMAV2_Type *ptr, dma_handshake_config_t *pconfig, bool start_transfer);
740 
747 static inline bool dma_is_idle(DMAV2_Type *ptr)
748 {
749  return (DMAV2_IDMISC_DMASTATE_GET(ptr->IDMISC) == dmav2_state_idle) ? true : false;
750 }
751 
752 
753 #ifdef __cplusplus
754 }
755 #endif
759 #endif /* HPM_DMAV2_DRV_H */
#define DMAV2_CHCTRL_CTRL_DSTADDRCTRL_MASK
Definition: hpm_dmav2_regs.h:428
#define DMAV2_CHCTRL_CTRL_SRCWIDTH_MASK
Definition: hpm_dmav2_regs.h:349
#define DMAV2_CHCTRL_CTRL_HANDSHAKEOPT_SET(x)
Definition: hpm_dmav2_regs.h:289
#define DMAV2_CHCTRL_CTRL_SRCMODE_MASK
Definition: hpm_dmav2_regs.h:384
#define DMAV2_CHCTRL_CTRL_DSTADDRCTRL_SET(x)
Definition: hpm_dmav2_regs.h:430
#define DMAV2_CHCTRL_CTRL_HANDSHAKEOPT_MASK
Definition: hpm_dmav2_regs.h:287
#define DMAV2_CHCTRL_CTRL_SRCADDRCTRL_MASK
Definition: hpm_dmav2_regs.h:414
#define DMAV2_CHCTRL_CTRL_DSTMODE_SET(x)
Definition: hpm_dmav2_regs.h:402
#define DMAV2_CHCTRL_CTRL_ENABLE_MASK
Definition: hpm_dmav2_regs.h:488
#define DMAV2_CHCTRL_CTRL_DSTWIDTH_SET(x)
Definition: hpm_dmav2_regs.h:372
#define DMAV2_CHABORT_CHABORT_SET(x)
Definition: hpm_dmav2_regs.h:203
#define DMAV2_CHCTRL_CTRL_SRCADDRCTRL_SET(x)
Definition: hpm_dmav2_regs.h:416
#define DMAV2_CHCTRL_CTRL_BURSTOPT_MASK
Definition: hpm_dmav2_regs.h:309
#define DMAV2_CHCTRL_CTRL_SRCWIDTH_SET(x)
Definition: hpm_dmav2_regs.h:351
#define DMAV2_CHCTRL_CTRL_PRIORITY_SET(x)
Definition: hpm_dmav2_regs.h:301
#define DMAV2_CHCTRL_TRANSIZE_TRANSIZE_SET(x)
Definition: hpm_dmav2_regs.h:502
#define DMAV2_CHCTRL_CTRL_SRCMODE_SET(x)
Definition: hpm_dmav2_regs.h:386
#define DMAV2_CHCTRL_CTRL_DSTWIDTH_MASK
Definition: hpm_dmav2_regs.h:370
#define DMAV2_DMACTRL_RESET_MASK
Definition: hpm_dmav2_regs.h:189
#define DMAV2_CHCTRL_CTRL_SRCBURSTSIZE_MASK
Definition: hpm_dmav2_regs.h:332
#define DMAV2_CHCTRL_CTRL_INFINITELOOP_SET(x)
Definition: hpm_dmav2_regs.h:278
#define DMAV2_CHCTRL_CTRL_BURSTOPT_SET(x)
Definition: hpm_dmav2_regs.h:311
#define DMAV2_IDMISC_DMASTATE_GET(x)
Definition: hpm_dmav2_regs.h:55
#define DMAV2_CHCTRL_CTRL_DSTMODE_MASK
Definition: hpm_dmav2_regs.h:400
#define DMAV2_CHCTRL_CTRL_PRIORITY_MASK
Definition: hpm_dmav2_regs.h:299
#define DMAV2_CHCTRL_CTRL_INFINITELOOP_MASK
Definition: hpm_dmav2_regs.h:276
#define DMAV2_CHCTRL_CTRL_SRCBURSTSIZE_SET(x)
Definition: hpm_dmav2_regs.h:334
#define DMAV2_CHCTRL_CTRL_SRC_FIXBURST_SET(x)
Definition: hpm_dmav2_regs.h:440
#define DMAV2_CHCTRL_CTRL_SWAP_CTL_MASK
Definition: hpm_dmav2_regs.h:461
#define DMAV2_CHCTRL_CTRL_SWAP_CTL_SET(x)
Definition: hpm_dmav2_regs.h:463
#define DMAV2_CHCTRL_CTRL_DST_FIXBURST_SET(x)
Definition: hpm_dmav2_regs.h:450
#define DMAV2_CHCTRL_CTRL_DST_FIXBURST_MASK
Definition: hpm_dmav2_regs.h:448
#define DMAV2_CHCTRL_CTRL_SRC_FIXBURST_MASK
Definition: hpm_dmav2_regs.h:438
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 void dma_set_destination_address_ctrl(DMAV2_Type *ptr, uint32_t ch_index, uint8_t addr_ctrl)
Set DMA channel destination address control mode.
Definition: hpm_dmav2_drv.h:435
static void dma_set_source_address_ctrl(DMAV2_Type *ptr, uint32_t ch_index, uint8_t addr_ctrl)
Set DMA channel source address control mode.
Definition: hpm_dmav2_drv.h:419
hpm_stat_t dma_start_memcpy(DMAV2_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_dmav2_drv.c:147
static void dma_set_source_work_mode(DMAV2_Type *ptr, uint32_t ch_index, uint8_t mode)
Set DMA channel source work mode.
Definition: hpm_dmav2_drv.h:254
#define DMA_CHANNEL_STATUS_ABORT
Definition: hpm_dmav2_drv.h:51
static void dma_set_source_burst_size(DMAV2_Type *ptr, uint32_t ch_index, uint8_t burstsize)
Set DMA channel source burst size.
Definition: hpm_dmav2_drv.h:295
#define DMA_INTERRUPT_MASK_ALL
Definition: hpm_dmav2_drv.h:83
hpm_stat_t dma_setup_channel(DMAV2_Type *ptr, uint8_t ch_num, dma_channel_config_t *ch, bool start_transfer)
Setup DMA channel.
Definition: hpm_dmav2_drv.c:34
static void dma_abort_channel(DMAV2_Type *ptr, uint32_t ch_index_mask)
Abort channel transfer with mask.
Definition: hpm_dmav2_drv.h:549
static void dma_set_source_address(DMAV2_Type *ptr, uint32_t ch_index, uint32_t addr)
Set DMA channel source address.
Definition: hpm_dmav2_drv.h:390
#define DMA_CHANNEL_STATUS_ERROR
Definition: hpm_dmav2_drv.h:50
static void dma_disable_channel(DMAV2_Type *ptr, uint32_t ch_index)
Disable DMA channel.
Definition: hpm_dmav2_drv.h:210
static void dma_set_destination_address(DMAV2_Type *ptr, uint32_t ch_index, uint32_t addr)
Set DMA channel destination address.
Definition: hpm_dmav2_drv.h:403
static void dma_set_handshake_option(DMAV2_Type *ptr, uint32_t ch_index, uint8_t handshake_opt)
Set DMA channel handshake option.
Definition: hpm_dmav2_drv.h:478
hpm_stat_t dma_config_linked_descriptor(DMAV2_Type *ptr, dma_linked_descriptor_t *descriptor, uint8_t ch_num, dma_channel_config_t *config)
Config linked descriptor function.
Definition: hpm_dmav2_drv.c:92
static uint32_t dma_check_transfer_status(DMAV2_Type *ptr, uint8_t ch_index)
Check transfer status.
Definition: hpm_dmav2_drv.h:593
#define DMA_CHANNEL_STATUS_HALF_TC
Definition: hpm_dmav2_drv.h:53
static void dma_set_destination_width(DMAV2_Type *ptr, uint32_t ch_index, uint8_t width)
Set DMA channel destination width.
Definition: hpm_dmav2_drv.h:355
#define DMA_TRANSFER_WIDTH_DOUBLE_WORD
Definition: hpm_dmav2_drv.h:43
struct dma_linked_descriptor dma_linked_descriptor_t
Linked descriptor.
#define DMA_CHANNEL_STATUS_ONGOING
Definition: hpm_dmav2_drv.h:49
struct dma_handshake_config dma_handshake_config_t
static uint32_t dma_check_enabled_channel(DMAV2_Type *ptr, uint32_t ch_index_mask)
Check if channels are enabled with mask.
Definition: hpm_dmav2_drv.h:562
#define DMA_TRANSFER_WIDTH_WORD
Definition: hpm_dmav2_drv.h:42
static bool dma_channel_is_enable(DMAV2_Type *ptr, uint32_t ch_index)
Check whether DMA channel is enable.
Definition: hpm_dmav2_drv.h:224
static void dma_set_destination_work_mode(DMAV2_Type *ptr, uint32_t ch_index, uint8_t mode)
Set DMA channel destination work mode.
Definition: hpm_dmav2_drv.h:269
struct dma_channel_config dma_channel_config_t
static void dma_set_infinite_loop_mode(DMAV2_Type *ptr, uint32_t ch_index, bool infinite_loop)
Set DMA channel infinite loop mode.
Definition: hpm_dmav2_drv.h:448
static uint32_t dma_get_remaining_transfer_size(DMAV2_Type *ptr, uint32_t ch_index)
Get DMA channel remaining transfer size.
Definition: hpm_dmav2_drv.h:309
static bool dma_is_idle(DMAV2_Type *ptr)
Check whether DMA is idle.
Definition: hpm_dmav2_drv.h:747
static void dma_clear_transfer_status(DMAV2_Type *ptr, uint8_t ch_index)
Clear transfer status.
Definition: hpm_dmav2_drv.h:626
static uint32_t dma_check_channel_interrupt_mask(DMAV2_Type *ptr, uint8_t ch_index)
Check Channel interrupt master.
Definition: hpm_dmav2_drv.h:667
static void dma_disable_channel_interrupt(DMAV2_Type *ptr, uint8_t ch_index, int32_t interrupt_mask)
Disable DMA Channel interrupt.
Definition: hpm_dmav2_drv.h:654
static hpm_stat_t dma_enable_channel(DMAV2_Type *ptr, uint32_t ch_index)
Enable DMA channel.
Definition: hpm_dmav2_drv.h:193
static void dma_reset(DMAV2_Type *ptr)
Reset DMA.
Definition: hpm_dmav2_drv.h:180
void dma_default_handshake_config(DMAV2_Type *ptr, dma_handshake_config_t *config)
Get default handshake config.
Definition: hpm_dmav2_drv.c:209
static void dma_set_transfer_size(DMAV2_Type *ptr, uint32_t ch_index, uint32_t size_in_width)
Set DMA channel transfer size.
Definition: hpm_dmav2_drv.h:323
static void dma_set_priority(DMAV2_Type *ptr, uint32_t ch_index, uint8_t priority)
Set DMA channel priority.
Definition: hpm_dmav2_drv.h:239
#define DMA_TRANSFER_WIDTH_HALF_WORD
Definition: hpm_dmav2_drv.h:41
#define DMA_TRANSFER_WIDTH_BYTE
Definition: hpm_dmav2_drv.h:40
static void dma_set_src_busrt_option(DMAV2_Type *ptr, uint32_t ch_index, uint8_t burst_opt)
Set DMA channel source burst option.
Definition: hpm_dmav2_drv.h:463
void dma_default_channel_config(DMAV2_Type *ptr, dma_channel_config_t *ch)
Get default channel config.
Definition: hpm_dmav2_drv.c:10
static void dma_enable_channel_interrupt(DMAV2_Type *ptr, uint8_t ch_index, int32_t interrupt_mask)
Enable DMA Channel interrupt.
Definition: hpm_dmav2_drv.h:642
hpm_stat_t dma_setup_handshake(DMAV2_Type *ptr, dma_handshake_config_t *pconfig, bool start_transfer)
config dma handshake function
Definition: hpm_dmav2_drv.c:217
#define DMA_CHANNEL_STATUS_TC
Definition: hpm_dmav2_drv.h:52
static void dma_set_source_width(DMAV2_Type *ptr, uint32_t ch_index, uint8_t width)
Set DMA channel source width.
Definition: hpm_dmav2_drv.h:339
static bool dma_has_linked_pointer_configured(DMAV2_Type *ptr, uint32_t ch_index)
Check if linked pointer has been configured.
Definition: hpm_dmav2_drv.h:576
static void dma_set_transfer_src_width_byte_size(DMAV2_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_dmav2_drv.h:373
@ dmav2_state_idle
Definition: hpm_dmav2_drv.h:93
@ dmav2_state_end
Definition: hpm_dmav2_drv.h:99
@ dmav2_state_read
Definition: hpm_dmav2_drv.h:94
@ dmav2_state_write_ack
Definition: hpm_dmav2_drv.h:97
@ dmav2_state_ll
Definition: hpm_dmav2_drv.h:98
@ dmav2_state_read_ack
Definition: hpm_dmav2_drv.h:95
@ dmav2_state_write
Definition: hpm_dmav2_drv.h:96
@ dmav2_state_end_wait
Definition: hpm_dmav2_drv.h:100
@ status_dma_transfer_abort
Definition: hpm_dmav2_drv.h:165
@ status_dma_transfer_ongoing
Definition: hpm_dmav2_drv.h:166
@ status_dma_transfer_done
Definition: hpm_dmav2_drv.h:163
@ status_dma_transfer_half_done
Definition: hpm_dmav2_drv.h:168
@ status_dma_transfer_error
Definition: hpm_dmav2_drv.h:164
@ status_dma_alignment_error
Definition: hpm_dmav2_drv.h:167
Definition: hpm_dmav2_regs.h:12
__RW uint32_t LLPOINTER
Definition: hpm_dmav2_regs.h:33
__RW uint32_t SRCADDR
Definition: hpm_dmav2_regs.h:29
__W uint32_t INTTCSTS
Definition: hpm_dmav2_regs.h:21
__R uint32_t IDMISC
Definition: hpm_dmav2_regs.h:14
struct DMAV2_Type::@292 CHCTRL[32]
__RW uint32_t DSTADDR
Definition: hpm_dmav2_regs.h:31
__W uint32_t DMACTRL
Definition: hpm_dmav2_regs.h:17
__W uint32_t INTERRSTS
Definition: hpm_dmav2_regs.h:23
__W uint32_t CHABORT
Definition: hpm_dmav2_regs.h:18
__W uint32_t INTABORTSTS
Definition: hpm_dmav2_regs.h:22
__RW uint32_t SWAPTABLE
Definition: hpm_dmav2_regs.h:32
__RW uint32_t INTHALFSTS
Definition: hpm_dmav2_regs.h:20
__R uint32_t CHEN
Definition: hpm_dmav2_regs.h:24
__RW uint32_t TRANSIZE
Definition: hpm_dmav2_regs.h:28
__RW uint32_t CTRL
Definition: hpm_dmav2_regs.h:27
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
bool en_infiniteloop
Definition: hpm_dmav2_drv.h:134
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 handshake_opt
Definition: hpm_dmav2_drv.h:135
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 burst_opt
Definition: hpm_dmav2_drv.h:136
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 en_infiniteloop
Definition: hpm_dmav2_drv.h:156
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
uint16_t interrupt_mask
Definition: hpm_dmav2_drv.h:157
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 reserved0
Definition: hpm_dmav2_drv.h:116
uint32_t req_ctrl
Definition: hpm_dmav2_drv.h:112
uint32_t swap_table
Definition: hpm_dmav2_drv.h:114