HPM SDK
HPMicro Software Development Kit
hpm_dma_mgr.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022-2024 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_DMA_MGR_H
9 #define HPM_DMA_MGR_H
10 
11 #include "hpm_common.h"
12 #include "hpm_dmamux_drv.h"
13 #include "hpm_dmamux_src.h"
14 #ifdef HPMSOC_HAS_HPMSDK_DMAV2
15 #include "hpm_dmav2_drv.h"
16 #else
17 #include "hpm_dma_drv.h"
18 #endif
19 #include "hpm_soc_feature.h"
20 
21 #ifdef HPMSOC_HAS_HPMSDK_DMAV2
22 #define DMA_MGR_HAS_INFINITE_LOOP (1U)
23 #define DMA_MGR_HAS_HALF_TC_INT (1U)
24 #define DMA_MGR_HAS_HANDSHAKE_OPT (1U)
25 #define DMA_MGR_HAS_BURST_OPT (1U)
26 #if defined(HPM_IP_FEATURE_DMAV2_BURST_IN_FIXED_TRANS) && (HPM_IP_FEATURE_DMAV2_BURST_IN_FIXED_TRANS == 1)
27 #define DMA_MGR_HAS_BURST_IN_FIXED_TRANS HPM_IP_FEATURE_DMAV2_BURST_IN_FIXED_TRANS
28 #else
29 #define DMA_MGR_HAS_BURST_IN_FIXED_TRANS 0
30 #endif
31 #if defined(HPM_IP_FEATURE_DMAV2_BYTE_ORDER_SWAP) && (HPM_IP_FEATURE_DMAV2_BYTE_ORDER_SWAP == 1)
32 #define DMA_MGR_HAS_BYTE_ORDER_SWAP HPM_IP_FEATURE_DMAV2_BYTE_ORDER_SWAP
33 #else
34 #define DMA_MGR_HAS_BYTE_ORDER_SWAP 0
35 #endif
36 #endif
37 
38 #define DMA_MGR_CHANNEL_PRIORITY_LOW DMA_CHANNEL_PRIORITY_LOW
39 #define DMA_MGR_CHANNEL_PRIORITY_HIGH DMA_CHANNEL_PRIORITY_HIGH
40 
41 #define DMA_MGR_NUM_TRANSFER_PER_BURST_1T DMA_NUM_TRANSFER_PER_BURST_1T
42 #define DMA_MGR_NUM_TRANSFER_PER_BURST_2T DMA_NUM_TRANSFER_PER_BURST_2T
43 #define DMA_MGR_NUM_TRANSFER_PER_BURST_4T DMA_NUM_TRANSFER_PER_BURST_4T
44 #define DMA_MGR_NUM_TRANSFER_PER_BURST_8T DMA_NUM_TRANSFER_PER_BURST_8T
45 #define DMA_MGR_NUM_TRANSFER_PER_BURST_16T DMA_NUM_TRANSFER_PER_BURST_16T
46 #define DMA_MGR_NUM_TRANSFER_PER_BURST_32T DMA_NUM_TRANSFER_PER_BURST_32T
47 #define DMA_MGR_NUM_TRANSFER_PER_BURST_64T DMA_NUM_TRANSFER_PER_BURST_64T
48 #define DMA_MGR_NUM_TRANSFER_PER_BURST_128T DMA_NUM_TRANSFER_PER_BURST_128T
49 #define DMA_MGR_NUM_TRANSFER_PER_BURST_256T DMA_NUM_TRANSFER_PER_BURST_256T
50 #define DMA_MGR_NUM_TRANSFER_PER_BURST_512T DMA_NUM_TRANSFER_PER_BURST_512T
51 #define DMA_MGR_NUM_TRANSFER_PER_BURST_1024T DMA_NUM_TRANSFER_PER_BURST_1024T
52 
53 #define DMA_MGR_TRANSFER_WIDTH_BYTE DMA_TRANSFER_WIDTH_BYTE
54 #define DMA_MGR_TRANSFER_WIDTH_HALF_WORD DMA_TRANSFER_WIDTH_HALF_WORD
55 #define DMA_MGR_TRANSFER_WIDTH_WORD DMA_TRANSFER_WIDTH_WORD
56 #define DMA_MGR_TRANSFER_WIDTH_DOUBLE_WORD DMA_TRANSFER_WIDTH_DOUBLE_WORD
57 
58 #define DMA_MGR_HANDSHAKE_MODE_NORMAL DMA_HANDSHAKE_MODE_NORMAL
59 #define DMA_MGR_HANDSHAKE_MODE_HANDSHAKE DMA_HANDSHAKE_MODE_HANDSHAKE
60 
61 #define DMA_MGR_ADDRESS_CONTROL_INCREMENT DMA_ADDRESS_CONTROL_INCREMENT
62 #define DMA_MGR_ADDRESS_CONTROL_DECREMENT DMA_ADDRESS_CONTROL_DECREMENT
63 #define DMA_MGR_ADDRESS_CONTROL_FIXED DMA_ADDRESS_CONTROL_FIXED
64 
65 #if defined(DMA_MGR_HAS_BURST_OPT) && DMA_MGR_HAS_BURST_OPT
66 #define DMA_MGR_SRC_BURST_OPT_STANDAND_SIZE DMA_SRC_BURST_OPT_STANDAND_SIZE
67 #define DMA_MGR_SRC_BURST_OPT_CUSTOM_SIZE DMA_SRC_BURST_OPT_CUSTOM_SIZE
68 #else
69 #define DMA_MGR_SRC_BURST_OPT_STANDAND_SIZE 0
70 #define DMA_MGR_SRC_BURST_OPT_CUSTOM_SIZE 0
71 #endif
72 
73 #if defined(DMA_MGR_HAS_HANDSHAKE_OPT) && DMA_MGR_HAS_HANDSHAKE_OPT
74 #define DMA_MGR_HANDSHAKE_OPT_ONE_BURST DMA_HANDSHAKE_OPT_ONE_BURST
75 #define DMA_MGR_HANDSHAKE_OPT_ALL_TRANSIZE DMA_HANDSHAKE_OPT_ALL_TRANSIZE
76 #else
77 #define DMA_MGR_HANDSHAKE_OPT_ONE_BURST 0
78 #define DMA_MGR_HANDSHAKE_OPT_ALL_TRANSIZE 0
79 #endif
80 
81 #define DMA_MGR_CHANNEL_STATUS_ONGOING DMA_CHANNEL_STATUS_ONGOING
82 #define DMA_MGR_CHANNEL_STATUS_ERROR DMA_CHANNEL_STATUS_ERROR
83 #define DMA_MGR_CHANNEL_STATUS_ABORT DMA_CHANNEL_STATUS_ABORT
84 #define DMA_MGR_CHANNEL_STATUS_TC DMA_CHANNEL_STATUS_TC
85 #if defined(DMA_MGR_HAS_HALF_TC_INT) && DMA_MGR_HAS_HALF_TC_INT
86 #define DMA_MGR_CHANNEL_STATUS_HALF_TC DMA_CHANNEL_STATUS_HALF_TC
87 #else
88 #define DMA_MGR_CHANNEL_STATUS_HALF_TC 0
89 #endif
90 #define DMA_MGR_INTERRUPT_MASK_NONE DMA_INTERRUPT_MASK_NONE
91 #define DMA_MGR_INTERRUPT_MASK_ERROR DMA_INTERRUPT_MASK_ERROR
92 #define DMA_MGR_INTERRUPT_MASK_ABORT DMA_INTERRUPT_MASK_ABORT
93 #define DMA_MGR_INTERRUPT_MASK_TC DMA_INTERRUPT_MASK_TERMINAL_COUNT
94 #if defined(DMA_MGR_HAS_HALF_TC_INT) && DMA_MGR_HAS_HALF_TC_INT
95 #define DMA_MGR_INTERRUPT_MASK_HALF_TC DMA_INTERRUPT_MASK_HALF_TC
96 #else
97 #define DMA_MGR_INTERRUPT_MASK_HALF_TC 0
98 #endif
99 #define DMA_MGR_INTERRUPT_MASK_ALL DMA_INTERRUPT_MASK_ALL
100 
101 #if defined(DMA_MGR_HAS_BYTE_ORDER_SWAP) && DMA_MGR_HAS_BYTE_ORDER_SWAP
102 #define DMA_MGR_SWAP_MODE_TABLE DMA_SWAP_MODE_TABLE
103 #define DMA_MGR_SWAP_MODE_BYTE DMA_SWAP_MODE_BYTE
104 #define DMA_MGR_SWAP_MODE_HALF_WORD DMA_SWAP_MODE_HALF_WORD
105 #define DMA_MGR_SWAP_MODE_WORD DMA_SWAP_MODE_WORD
106 #else
107 #define DMA_MGR_SWAP_MODE_TABLE 0
108 #define DMA_MGR_SWAP_MODE_BYTE 0
109 #define DMA_MGR_SWAP_MODE_HALF_WORD 0
110 #define DMA_MGR_SWAP_MODE_WORD 0
111 #endif
112 
113 #ifdef __cplusplus
114 
115 extern "C" {
116 #endif
117 
121 enum {
123 };
124 
132 typedef void (*dma_mgr_chn_cb_t)(DMA_Type *base, uint32_t channel, void *cb_data_ptr);
133 
137 typedef struct _dma_resource {
138  DMA_Type *base;
139  uint32_t channel;
140  int32_t irq_num;
142 
143 typedef struct hpm_dma_mgr_chn_conf {
144  bool en_dmamux;
145  uint8_t dmamux_src;
146  uint8_t priority;
147  uint8_t src_burst_size;
148  uint8_t src_mode;
149  uint8_t dst_mode;
150  uint8_t src_width;
151  uint8_t dst_width;
152  uint8_t src_addr_ctrl;
153  uint8_t dst_addr_ctrl;
154  uint16_t interrupt_mask;
155  uint32_t src_addr;
156  uint32_t dst_addr;
157  uint32_t linked_ptr;
158  uint32_t size_in_byte;
160  uint8_t handshake_opt;
161  uint8_t burst_opt;
164  uint8_t swap_mode;
165  uint32_t swap_table;
167 
169  uint32_t descriptor[8];
171 
175 void dma_mgr_isr_handler(DMA_Type *ptr, uint32_t instance);
176 
180 void dma_mgr_init(void);
181 
191 
201 
210 hpm_stat_t dma_mgr_enable_dma_irq_with_priority(const dma_resource_t *resource, uint32_t priority);
211 
223 
234 hpm_stat_t dma_mgr_install_chn_tc_callback(const dma_resource_t *resource, dma_mgr_chn_cb_t callback, void *user_data);
235 
246 hpm_stat_t dma_mgr_install_chn_half_tc_callback(const dma_resource_t *resource, dma_mgr_chn_cb_t callback, void *user_data);
247 
258 hpm_stat_t dma_mgr_install_chn_error_callback(const dma_resource_t *resource, dma_mgr_chn_cb_t callback, void *user_data);
259 
270 hpm_stat_t dma_mgr_install_chn_abort_callback(const dma_resource_t *resource, dma_mgr_chn_cb_t callback, void *user_data);
271 
278 
289 
301 
311 
321 
331 hpm_stat_t dma_mgr_check_chn_enable(const dma_resource_t *resource, bool *enable);
332 
340 hpm_stat_t dma_mgr_enable_chn_irq(const dma_resource_t *resource, uint32_t irq_mask);
341 
349 hpm_stat_t dma_mgr_disable_chn_irq(const dma_resource_t *resource, uint32_t irq_mask);
350 
362 hpm_stat_t dma_mgr_set_chn_priority(const dma_resource_t *resource, uint8_t priority);
363 
375 hpm_stat_t dma_mgr_set_chn_src_work_mode(const dma_resource_t *resource, uint8_t mode);
376 
388 hpm_stat_t dma_mgr_set_chn_dst_work_mode(const dma_resource_t *resource, uint8_t mode);
389 
412 hpm_stat_t dma_mgr_set_chn_src_burst_size(const dma_resource_t *resource, uint8_t burstsize);
413 
424 
434 hpm_stat_t dma_mgr_set_chn_transize(const dma_resource_t *resource, uint32_t size);
435 
449 hpm_stat_t dma_mgr_set_chn_src_width(const dma_resource_t *resource, uint8_t width);
450 
464 hpm_stat_t dma_mgr_set_chn_dst_width(const dma_resource_t *resource, uint8_t width);
465 
475 hpm_stat_t dma_mgr_set_chn_src_addr(const dma_resource_t *resource, uint32_t addr);
476 
486 hpm_stat_t dma_mgr_set_chn_dst_addr(const dma_resource_t *resource, uint32_t addr);
487 
500 hpm_stat_t dma_mgr_set_chn_src_addr_ctrl(const dma_resource_t *resource, uint8_t addr_ctrl);
501 
514 hpm_stat_t dma_mgr_set_chn_dst_addr_ctrl(const dma_resource_t *resource, uint8_t addr_ctrl);
515 
525 hpm_stat_t dma_mgr_set_chn_infinite_loop_mode(const dma_resource_t *resource, bool infinite_loop);
526 
538 hpm_stat_t dma_mgr_set_chn_src_busrt_option(const dma_resource_t *resource, uint8_t burst_opt);
539 
551 hpm_stat_t dma_mgr_set_chn_handshake_option(const dma_resource_t *resource, uint8_t handshake_opt);
552 
562 
577 hpm_stat_t dma_mgr_check_chn_transfer_status(const dma_resource_t *resource, uint32_t *status);
578 
587 
596 
608 hpm_stat_t dma_mgr_set_swap_mode(const dma_resource_t *resource, uint8_t swap_mode);
609 
617 hpm_stat_t dma_mgr_set_swap_table(const dma_resource_t *resource, uint32_t swap_table);
618 
619 #ifdef __cplusplus
620 }
621 #endif
622 
623 #endif /* HPM_DMA_MGR_H */
uint32_t hpm_stat_t
Definition: hpm_common.h:123
#define MAKE_STATUS(group, code)
Definition: hpm_common.h:132
@ status_group_dma_manager
Definition: hpm_common.h:168
static void size
Definition: hpm_math.h:6899
struct hpm_dma_mgr_linked_descriptor dma_mgr_linked_descriptor_t
hpm_stat_t dma_mgr_install_chn_error_callback(const dma_resource_t *resource, dma_mgr_chn_cb_t callback, void *user_data)
Install Interrupt Callback for DMA channel transfer error.
Definition: hpm_dma_mgr.c:299
hpm_stat_t dma_mgr_get_chn_remaining_transize(const dma_resource_t *resource, uint32_t *size)
Get DMA channel remaining transfer size.
Definition: hpm_dma_mgr.c:584
hpm_stat_t dma_mgr_set_swap_mode(const dma_resource_t *resource, uint8_t swap_mode)
Set DMA channel swap mode.
Definition: hpm_dma_mgr.c:834
struct hpm_dma_mgr_chn_conf dma_mgr_chn_conf_t
struct _dma_resource dma_resource_t
DMA Resource Structure.
hpm_stat_t dma_mgr_set_chn_src_burst_size(const dma_resource_t *resource, uint8_t burstsize)
Set DMA channel source burst size.
Definition: hpm_dma_mgr.c:569
hpm_stat_t dma_mgr_request_resource(dma_resource_t *resource)
Request DMA resource from DMA Manager.
Definition: hpm_dma_mgr.c:147
hpm_stat_t dma_mgr_enable_chn_irq(const dma_resource_t *resource, uint32_t irq_mask)
Enable DMA channel interrupt.
Definition: hpm_dma_mgr.c:494
hpm_stat_t dma_mgr_set_chn_src_width(const dma_resource_t *resource, uint8_t width)
Set DMA channel source width.
Definition: hpm_dma_mgr.c:614
hpm_stat_t dma_mgr_set_chn_src_busrt_option(const dma_resource_t *resource, uint8_t burst_opt)
Set DMA channel source burst option. Attention: only DMAV2 support.
Definition: hpm_dma_mgr.c:724
hpm_stat_t dma_mgr_install_chn_abort_callback(const dma_resource_t *resource, dma_mgr_chn_cb_t callback, void *user_data)
Install Interrupt Callback for DMA channel transfer abort.
Definition: hpm_dma_mgr.c:315
hpm_stat_t dma_mgr_disable_chn_irq(const dma_resource_t *resource, uint32_t irq_mask)
Disable DMA channel interrupt.
Definition: hpm_dma_mgr.c:509
hpm_stat_t dma_mgr_enable_dma_irq_with_priority(const dma_resource_t *resource, uint32_t priority)
Enable DMA interrupt with priority.
Definition: hpm_dma_mgr.c:237
hpm_stat_t dma_mgr_set_source_burst_in_fixed_transize_enable(const dma_resource_t *resource, bool enable)
Set DMA channel source burst in fixed transfer size enable or disable.
Definition: hpm_dma_mgr.c:794
hpm_stat_t dma_mgr_install_chn_half_tc_callback(const dma_resource_t *resource, dma_mgr_chn_cb_t callback, void *user_data)
Install Interrupt Callback for DMA channel half transfer complete.
Definition: hpm_dma_mgr.c:283
hpm_stat_t dma_mgr_enable_channel(const dma_resource_t *resource)
Enable DMA channel, start transfer.
Definition: hpm_dma_mgr.c:450
void dma_mgr_isr_handler(DMA_Type *ptr, uint32_t instance)
DMA Manager ISR handler.
Definition: hpm_dma_mgr.c:78
void dma_mgr_get_default_chn_config(dma_mgr_chn_conf_t *config)
Get DMA channel default config.
Definition: hpm_dma_mgr.c:331
hpm_stat_t dma_mgr_set_chn_dst_addr(const dma_resource_t *resource, uint32_t addr)
Set DMA channel destination address.
Definition: hpm_dma_mgr.c:659
hpm_stat_t dma_mgr_set_chn_priority(const dma_resource_t *resource, uint8_t priority)
Set DMA channel priority.
Definition: hpm_dma_mgr.c:524
hpm_stat_t dma_mgr_setup_channel(const dma_resource_t *resource, dma_mgr_chn_conf_t *config)
Setup channel config.
Definition: hpm_dma_mgr.c:357
hpm_stat_t dma_mgr_disable_channel(const dma_resource_t *resource)
Disable DMA channel.
Definition: hpm_dma_mgr.c:464
hpm_stat_t dma_mgr_set_chn_handshake_option(const dma_resource_t *resource, uint8_t handshake_opt)
Set DMA channel handshake option. Attention: only DMAV2 support.
Definition: hpm_dma_mgr.c:744
@ status_dma_mgr_no_resource
Definition: hpm_dma_mgr.h:122
hpm_stat_t dma_mgr_set_chn_transize(const dma_resource_t *resource, uint32_t size)
Set DMA channel transfer size.
Definition: hpm_dma_mgr.c:599
hpm_stat_t dma_mgr_config_linked_descriptor(const dma_resource_t *resource, dma_mgr_chn_conf_t *config, dma_mgr_linked_descriptor_t *descriptor)
Setup chain linked descriptor config.
Definition: hpm_dma_mgr.c:405
hpm_stat_t dma_mgr_set_chn_infinite_loop_mode(const dma_resource_t *resource, bool infinite_loop)
Set DMA channel infinite loop mode. Attention: only DMAV2 support.
Definition: hpm_dma_mgr.c:704
hpm_stat_t dma_mgr_abort_chn_transfer(const dma_resource_t *resource)
Abort DMA channel transfer.
Definition: hpm_dma_mgr.c:764
hpm_stat_t dma_mgr_set_swap_table(const dma_resource_t *resource, uint32_t swap_table)
Set DMA channel swap table.
Definition: hpm_dma_mgr.c:854
hpm_stat_t dma_mgr_install_chn_tc_callback(const dma_resource_t *resource, dma_mgr_chn_cb_t callback, void *user_data)
Install Interrupt Callback for DMA channel transfer complete.
Definition: hpm_dma_mgr.c:267
hpm_stat_t dma_mgr_release_resource(const dma_resource_t *resource)
Release DMA resource.
Definition: hpm_dma_mgr.c:212
hpm_stat_t dma_mgr_set_chn_dst_work_mode(const dma_resource_t *resource, uint8_t mode)
Set DMA channel destination work mode.
Definition: hpm_dma_mgr.c:554
hpm_stat_t dma_mgr_set_chn_src_addr(const dma_resource_t *resource, uint32_t addr)
Set DMA channel source address.
Definition: hpm_dma_mgr.c:644
hpm_stat_t dma_mgr_check_chn_enable(const dma_resource_t *resource, bool *enable)
Check DMA channel enable status.
Definition: hpm_dma_mgr.c:479
hpm_stat_t dma_mgr_set_chn_dst_addr_ctrl(const dma_resource_t *resource, uint8_t addr_ctrl)
Set DMA channel destination address control mode.
Definition: hpm_dma_mgr.c:689
void dma_mgr_init(void)
Initialize DMA Manager Context.
Definition: hpm_dma_mgr.c:136
hpm_stat_t dma_mgr_disable_dma_irq(const dma_resource_t *resource)
Disable DMA interrupt NOTE: Each DMA instance consists of several DMA channels, disabling the DMA int...
Definition: hpm_dma_mgr.c:252
hpm_stat_t dma_mgr_set_chn_src_work_mode(const dma_resource_t *resource, uint8_t mode)
Set DMA channel source work mode.
Definition: hpm_dma_mgr.c:539
hpm_stat_t dma_mgr_set_chn_src_addr_ctrl(const dma_resource_t *resource, uint8_t addr_ctrl)
Set DMA channel source address control mode.
Definition: hpm_dma_mgr.c:674
void(* dma_mgr_chn_cb_t)(DMA_Type *base, uint32_t channel, void *cb_data_ptr)
DMA Channel Interrupt callback.
Definition: hpm_dma_mgr.h:132
hpm_stat_t dma_mgr_check_chn_transfer_status(const dma_resource_t *resource, uint32_t *status)
Check DMA channel transfer status.
Definition: hpm_dma_mgr.c:779
hpm_stat_t dma_mgr_set_chn_dst_width(const dma_resource_t *resource, uint8_t width)
Set DMA channel destination width.
Definition: hpm_dma_mgr.c:629
hpm_stat_t dma_mgr_set_destination_burst_in_fix_transize_enable(const dma_resource_t *resource, bool enable)
Set DMA channel destination burst in fixed transfer size enable or disable.
Definition: hpm_dma_mgr.c:814
Definition: hpm_dma_regs.h:12
Definition: hpm_dma_mgr.h:143
bool en_dmamux
Definition: hpm_dma_mgr.h:144
uint8_t dst_width
Definition: hpm_dma_mgr.h:151
uint8_t dmamux_src
Definition: hpm_dma_mgr.h:145
uint16_t interrupt_mask
Definition: hpm_dma_mgr.h:154
uint8_t src_addr_ctrl
Definition: hpm_dma_mgr.h:152
uint8_t priority
Definition: hpm_dma_mgr.h:146
uint8_t dst_mode
Definition: hpm_dma_mgr.h:149
bool en_src_burst_in_fixed_trans
Definition: hpm_dma_mgr.h:162
bool en_infiniteloop
Definition: hpm_dma_mgr.h:159
uint32_t linked_ptr
Definition: hpm_dma_mgr.h:157
uint32_t size_in_byte
Definition: hpm_dma_mgr.h:158
uint8_t handshake_opt
Definition: hpm_dma_mgr.h:160
uint8_t dst_addr_ctrl
Definition: hpm_dma_mgr.h:153
uint8_t src_width
Definition: hpm_dma_mgr.h:150
uint32_t src_addr
Definition: hpm_dma_mgr.h:155
uint32_t dst_addr
Definition: hpm_dma_mgr.h:156
uint8_t src_mode
Definition: hpm_dma_mgr.h:148
uint8_t burst_opt
Definition: hpm_dma_mgr.h:161
uint8_t swap_mode
Definition: hpm_dma_mgr.h:164
uint8_t src_burst_size
Definition: hpm_dma_mgr.h:147
bool en_dst_burst_in_fixed_trans
Definition: hpm_dma_mgr.h:163
uint32_t swap_table
Definition: hpm_dma_mgr.h:165
Definition: hpm_dma_mgr.h:168
uint32_t descriptor[8]
Definition: hpm_dma_mgr.h:169