BLE5.2 1.0
开发文档说明
xc_drv_dma.h
浏览该文件的文档.
1
25#ifndef _XC_DRV_DMA_H_
26#define _XC_DRV_DMA_H_
27
28
29/*-----------------------------------------------------------------------------------
30 INCLUDE HEADE FILES
31 ------------------------------------------------------------------------------------*/
32#include <stdbool.h>
33#include <stdio.h>
34
35#include "xc6xxx.h"
36
37/*------------------------------------------------------------------------------------
38 Macros
39 -------------------------------------------------------------------------------------*/
40// Macro definitions for DMA operation return code
41#define DMA_OK 0 // operation normal
42#define DMA_EPERM 1 // operation not permitted
43#define DMA_EIO 5 // I/O error
44#define DMA_ENXIO 6 // no such device or address
45#define DMA_ENOMEM 12 // out of memory
46#define DMA_EACCES 13 // permission denied
47#define DMA_EBUSY 16 // device or resource busy
48#define DMA_ENODEV 19 // no such device
49#define DMA_EINVAL 22 // invalid argument
50#define DMA_ENOSPC 28 // no space left on device
51#define DMA_ENOSYS 38 // function not implemented/supported
52#define DMA_ECHRNG 44 // channel number out of range
53#define DMA_ENODATA 61 // no data available
54#define DMA_ETIME 62 // timer expired
55#define DMA_EPROTO 71 // protocol error
56
57// Macro definitions for DMA controller limits
58#define DMA_MAX_CHANNELS 2U //5A 2 CH; 5B 4 CH
59#define DMA_MAX_INTERRUPTS 5U
60
61/*------------------------------------------------------------------------------------
62 TypeDef
63 -------------------------------------------------------------------------------------*/
64
65typedef void (*DMA_Callback)(uint8_t eCode);
66
68{
69 // 4 channel configuration
71 DMA_CHANNEL0 = 0x0101,
72 DMA_CHANNEL1 = 0x0202,
74 // DMA_CHANNEL2 = 0x0404,
75 // DMA_CHANNEL3 = 0x0808,
76 // DMA_ALL_CHANNELS = 0x0f0f
78
80{
81 DMA_SRC = 0x1,
82 DMA_DST = 0x2,
83 DMA_SRC_DST = 0x3
85
86typedef enum dmac_ch_state
87{
88 DMA_IDLE = 0x0,
92
94{
95 DMA_TRANSFER_ROW1 = 0x1, /* single block or last multi-block */
96 /* no write back */
97 DMA_TRANSFER_ROW2 = 0x2, /* multi-block auto-reload DAR */
98 /* contiguous SAR no write back */
99 DMA_TRANSFER_ROW3 = 0x3, /* multi-block auto reload SAR */
100 /* contiguous DAR no write back */
101 DMA_TRANSFER_ROW4 = 0x4, /* multi-block auto-reload SAR DAR */
102 /* no write back */
103 DMA_TRANSFER_ROW5 = 0x5, /* single block or last multi-block */
104 /* with write back */
105 DMA_TRANSFER_ROW6 = 0x6, /* multi-block linked list DAR */
106 /* contiguous SAR with write back */
107 DMA_TRANSFER_ROW7 = 0x7, /* multi-block linked list DAR auto */
108 /* reload SAR with write back */
109 DMA_TRANSFER_ROW8 = 0x8, /* multi-block linked list SAR */
110 /* contiguous DAR with write back */
111 DMA_TRANSFER_ROW9 = 0x9, /* multi-block linked list SAR auto */
112 /* reload DAR with write back */
113 DMA_TRANSFER_ROW10 = 0xa /* multi-block linked list SAR DAR */
114 /* with write back */
116
117typedef enum dw_dmac_irq
118{
119 DMA_IRQ_NONE = 0x00, // no interrupts
120 DMA_IRQ_TRF = 0x01, // transfer complete
121 DMA_IRQ_BLOCK = 0x02, // block transfer complete
122 DMA_IRQ_SRCTRAN = 0x04, // source transaction complete
123 DMA_IRQ_DSTTRAN = 0x08, // destination transaction complete
124 DMA_IRQ_ERR = 0x10, // error
125 DMA_IRQ_ALL = 0x1f // all interrupts
127
129{
137 DMA_MSIZE_256 = 0x7
139
141{
146
148{
156
158{
160 DMA_HS_SOFTWARE = 0x1
162
164{
182
184{
185 DMA_MEM2MEM_DMA = 0x0, /* mem to mem - DMA flow ctlr */
186 DMA_MEM2PRF_DMA = 0x1, /* mem to prf - DMA flow ctlr */
187 DMA_PRF2MEM_DMA = 0x2, /* prf to mem - DMA flow ctlr */
188 DMA_PRF2PRF_DMA = 0x3, /* prf to prf - DMA flow ctlr */
189 DMA_PRF2MEM_PRF = 0x4, /* prf to mem - periph flow ctlr */
190 DMA_PRF2PRF_SRCPRF = 0x5, /* prf to prf - source flow ctlr */
191 DMA_MEM2PRF_PRF = 0x6, /* mem to prf - periph flow ctlr */
192 DMA_PRF2PRF_DSTPRF = 0x7 /* prf to prf - dest flow ctlr */
194
195typedef enum dmac_fifo_mode
196{
200
202{
210 DMA_PRIORITY_7 = 0x7
212
214{
215 uint32_t sar;
216 uint32_t dar;
225 uint32_t ctl_block_ts;
232
233typedef struct dmac_param_s
234{
235 bool encoded_params; /* include encoded hardware parameters */
236 uint8_t num_channels; /* number of DMA channels */
237 uint8_t num_hs_int; /* number of handshaking interfaces */
238 uint8_t intr_io; /* individual or combined interrupts */
239 bool big_endian; /* big or little endian 1=big */
240 uint16_t s_hdata_width; /* AHB slave data bus width */
241
243
244typedef struct dma_instance_s
245{
246 struct
247 {
248 eDMA_Ch_Num ch_num; // channel number
249 DMA_Callback userCallback; // callback functon for IRQ handler
250 DMA_Callback userListener; // listener functon for IRQ handler
251 } Ch[DMA_MAX_CHANNELS];
252 uint8_t Ch_Order[DMA_MAX_CHANNELS];
254
255/*------------------------------------------------------------------------------------
256 Global Variables
257 -------------------------------------------------------------------------------------*/
259
260/*------------------------------------------------------------------------------------
261 Exported Functions
262 -------------------------------------------------------------------------------------*/
263
264uint8_t xc_dma_init(void);
265void xc_dma_enable(void);
266uint8_t xc_dma_disable(void);
267bool xc_dma_is_enable(void);
268uint8_t xc_dma_enable_channel(eDMA_Ch_Num ch_num);
269uint8_t xc_dma_disable_channel(eDMA_Ch_Num ch_num);
273bool xc_dma_set_listener(eDMA_Ch_Num ch_num, DMA_Callback userFunction);
274uint8_t xc_dma_start_transfer(eDMA_Ch_Num ch_num, DMA_Callback cb_func);
275
276void xc_dma_set_test_mode(uint8_t mode);
277
283
285
286
287#endif /* _XC_DRV_DMA_H_ */
uint8_t Ch_Order[DMA_MAX_CHANNELS]
Definition xc_drv_dma.h:252
DMA_Callback userListener
Definition xc_drv_dma.h:250
struct dma_instance_s::@0 Ch[DMA_MAX_CHANNELS]
eDMA_Ch_Num ch_num
Definition xc_drv_dma.h:248
DMA_Callback userCallback
Definition xc_drv_dma.h:249
eDMA_CH_Priority cfg_ch_prior
Definition xc_drv_dma.h:230
eDMA_Burst_Trans_Len ctl_dst_msize
Definition xc_drv_dma.h:218
eDMA_Fifo_Mode cfg_fifo_mode
Definition xc_drv_dma.h:227
eDMA_Trans_Width ctl_src_tr_width
Definition xc_drv_dma.h:221
eDMA_SW_HW_HS_Select cfg_hs_sel_src
Definition xc_drv_dma.h:228
eDMA_SW_HW_HS_Select cfg_hs_sel_dst
Definition xc_drv_dma.h:229
eDMA_Burst_Trans_Len ctl_src_msize
Definition xc_drv_dma.h:217
eDMA_Trans_Flow ctl_tt_fc
Definition xc_drv_dma.h:226
eDMA_Trans_Width ctl_dst_tr_width
Definition xc_drv_dma.h:222
eDMA_HS_Interface cfg_dst_per
Definition xc_drv_dma.h:223
eDMA_Addr_Increment ctl_dinc
Definition xc_drv_dma.h:220
eDMA_HS_Interface cfg_src_per
Definition xc_drv_dma.h:224
eDMA_Addr_Increment ctl_sinc
Definition xc_drv_dma.h:219
uint8_t num_channels
Definition xc_drv_dma.h:236
uint8_t num_hs_int
Definition xc_drv_dma.h:237
bool encoded_params
Definition xc_drv_dma.h:235
uint8_t intr_io
Definition xc_drv_dma.h:238
uint16_t s_hdata_width
Definition xc_drv_dma.h:240
bool dma_irq_handler(DMA_Instance_t *inst)
dma_irq_handler
Definition xc_drv_dma.c:759
enum dmac_transfer_width eDMA_Trans_Width
void xc_dma_set_test_mode(uint8_t mode)
xc_dma_set_test_mode
Definition xc_drv_dma.c:48
enum dw_dmac_channel_priority eDMA_CH_Priority
uint8_t xc_dma_check_channel_range(eDMA_Ch_Num ch_num)
xc_dma_check_channel_range
Definition xc_drv_dma.c:146
struct dmac_param_s DMA_Params_t
uint8_t xc_dma_get_channel_index(eDMA_Ch_Num ch_num)
xc_dma_get_channel_index
Definition xc_drv_dma.c:194
struct dma_instance_s DMA_Instance_t
uint8_t xc_dma_init(void)
xc_dma_init
Definition xc_drv_dma.c:588
enum dmac_address_increment eDMA_Addr_Increment
dmac_fifo_mode
Definition xc_drv_dma.h:196
@ DMA_FIFO_MODE_SINGLE
Definition xc_drv_dma.h:197
@ DMA_FIFO_MODE_HALF
Definition xc_drv_dma.h:198
dmac_transfer_type
Definition xc_drv_dma.h:94
@ DMA_TRANSFER_ROW6
Definition xc_drv_dma.h:105
@ DMA_TRANSFER_ROW3
Definition xc_drv_dma.h:99
@ DMA_TRANSFER_ROW10
Definition xc_drv_dma.h:113
@ DMA_TRANSFER_ROW2
Definition xc_drv_dma.h:97
@ DMA_TRANSFER_ROW8
Definition xc_drv_dma.h:109
@ DMA_TRANSFER_ROW5
Definition xc_drv_dma.h:103
@ DMA_TRANSFER_ROW9
Definition xc_drv_dma.h:111
@ DMA_TRANSFER_ROW7
Definition xc_drv_dma.h:107
@ DMA_TRANSFER_ROW1
Definition xc_drv_dma.h:95
@ DMA_TRANSFER_ROW4
Definition xc_drv_dma.h:101
void xc_dma_set_channel_priority_order(DMA_Instance_t *inst)
xc_dma_set_channel_priority_order
Definition xc_drv_dma.c:64
bool xc_dma_set_listener(eDMA_Ch_Num ch_num, DMA_Callback userFunction)
xc_dma_set_listener
Definition xc_drv_dma.c:673
enum dmac_hs_interface eDMA_HS_Interface
uint8_t xc_dma_disable(void)
xc_dma_disable
Definition xc_drv_dma.c:235
dw_dmac_channel_priority
Definition xc_drv_dma.h:202
@ DMA_PRIORITY_6
Definition xc_drv_dma.h:209
@ DMA_PRIORITY_3
Definition xc_drv_dma.h:206
@ DMA_PRIORITY_2
Definition xc_drv_dma.h:205
@ DMA_PRIORITY_4
Definition xc_drv_dma.h:207
@ DMA_PRIORITY_5
Definition xc_drv_dma.h:208
@ DMA_PRIORITY_0
Definition xc_drv_dma.h:203
@ DMA_PRIORITY_1
Definition xc_drv_dma.h:204
@ DMA_PRIORITY_7
Definition xc_drv_dma.h:210
struct dmac_channel_config DMA_Chx_Cfg_t
bool xc_dma_is_channel_enabled(eDMA_Ch_Num ch_num)
xc_dma_is_channel_enabled
Definition xc_drv_dma.c:347
dmac_src_dst_select
Definition xc_drv_dma.h:80
@ DMA_SRC_DST
Definition xc_drv_dma.h:83
@ DMA_SRC
Definition xc_drv_dma.h:81
@ DMA_DST
Definition xc_drv_dma.h:82
void xc_dma_enable(void)
xc_dma_enable
Definition xc_drv_dma.c:222
dmac_ch_state
Definition xc_drv_dma.h:87
@ DMA_IDLE
Definition xc_drv_dma.h:88
@ DMA_SINGLE_REGION
Definition xc_drv_dma.h:89
@ DMA_BURST_REGION
Definition xc_drv_dma.h:90
dmac_transfer_flow
Definition xc_drv_dma.h:184
@ DMA_PRF2MEM_PRF
Definition xc_drv_dma.h:189
@ DMA_PRF2PRF_DSTPRF
Definition xc_drv_dma.h:192
@ DMA_MEM2MEM_DMA
Definition xc_drv_dma.h:185
@ DMA_PRF2MEM_DMA
Definition xc_drv_dma.h:187
@ DMA_PRF2PRF_SRCPRF
Definition xc_drv_dma.h:190
@ DMA_MEM2PRF_DMA
Definition xc_drv_dma.h:186
@ DMA_PRF2PRF_DMA
Definition xc_drv_dma.h:188
@ DMA_MEM2PRF_PRF
Definition xc_drv_dma.h:191
dmac_burst_trans_length
Definition xc_drv_dma.h:129
@ DMA_MSIZE_4
Definition xc_drv_dma.h:131
@ DMA_MSIZE_256
Definition xc_drv_dma.h:137
@ DMA_MSIZE_128
Definition xc_drv_dma.h:136
@ DMA_MSIZE_32
Definition xc_drv_dma.h:134
@ DMA_MSIZE_64
Definition xc_drv_dma.h:135
@ DMA_MSIZE_8
Definition xc_drv_dma.h:132
@ DMA_MSIZE_1
Definition xc_drv_dma.h:130
@ DMA_MSIZE_16
Definition xc_drv_dma.h:133
enum dmac_fifo_mode eDMA_Fifo_Mode
dw_dmac_irq
Definition xc_drv_dma.h:118
@ DMA_IRQ_TRF
Definition xc_drv_dma.h:120
@ DMA_IRQ_SRCTRAN
Definition xc_drv_dma.h:122
@ DMA_IRQ_ERR
Definition xc_drv_dma.h:124
@ DMA_IRQ_ALL
Definition xc_drv_dma.h:125
@ DMA_IRQ_DSTTRAN
Definition xc_drv_dma.h:123
@ DMA_IRQ_NONE
Definition xc_drv_dma.h:119
@ DMA_IRQ_BLOCK
Definition xc_drv_dma.h:121
dmac_hs_interface
Definition xc_drv_dma.h:164
@ DMA_HS_IF7
Definition xc_drv_dma.h:172
@ UART1_DMA_RX_HS_IF9
Definition xc_drv_dma.h:174
@ I2S_DMA_RX_HS_IF15
Definition xc_drv_dma.h:180
@ CDC_DMA_RX_HS_IF13
Definition xc_drv_dma.h:178
@ SSI2_DMA_RX_HS_IF14
Definition xc_drv_dma.h:179
@ DMA_HS_IF6
Definition xc_drv_dma.h:171
@ GPADC_DMA_RX_HS_IF12
Definition xc_drv_dma.h:177
@ UART0_DMA_TX_HS_IF0
Definition xc_drv_dma.h:165
@ SSI2_DMA_TX_HS_IF4
Definition xc_drv_dma.h:169
@ SSI1_DMA_TX_HS_IF3
Definition xc_drv_dma.h:168
@ UART0_DMA_RX_HS_IF8
Definition xc_drv_dma.h:173
@ SSI1_DMA_RX_HS_IF11
Definition xc_drv_dma.h:176
@ I2S_DMA_TX_HS_IF5
Definition xc_drv_dma.h:170
@ UART1_DMA_TX_HS_IF1
Definition xc_drv_dma.h:166
@ SSI0_DMA_TX_HS_IF2
Definition xc_drv_dma.h:167
@ SSI0_DMA_RX_HS_IF10
Definition xc_drv_dma.h:175
enum dw_dmac_irq eDMA_Irq
enum dmac_transfer_type eDMA_Trans_Type
enum dmac_burst_trans_length eDMA_Burst_Trans_Len
uint8_t xc_dma_enable_channel_irq(eDMA_Ch_Num ch_num)
xc_dma_enable_channel_irq
Definition xc_drv_dma.c:378
uint8_t xc_dma_set_channel_config(eDMA_Ch_Num ch_num, DMA_Chx_Cfg_t *ch)
xc_dma_set_channel_config
Definition xc_drv_dma.c:630
void xc_dma_reset_instance(DMA_Instance_t *inst)
xc_dma_reset_instance
Definition xc_drv_dma.c:109
bool xc_dma_is_enable(void)
xc_dma_is_enable
Definition xc_drv_dma.c:265
uint8_t xc_dma_enable_channel(eDMA_Ch_Num ch_num)
xc_dma_enable_channel
Definition xc_drv_dma.c:285
uint8_t xc_dma_disable_channel(eDMA_Ch_Num ch_num)
xc_dma_disable_channel
Definition xc_drv_dma.c:312
enum dmac_transfer_flow eDMA_Trans_Flow
uint8_t xc_dma_start_transfer(eDMA_Ch_Num ch_num, DMA_Callback cb_func)
xc_dma_start_transfer
Definition xc_drv_dma.c:705
enum dw_dmac_sw_hw_hs_select eDMA_SW_HW_HS_Select
enum dmac_channel_number eDMA_Ch_Num
enum dmac_src_dst_select eDMA_Src_Dst_Select
DMA_Instance_t DMA_Instance
Definition xc_drv_dma.c:33
dw_dmac_sw_hw_hs_select
Definition xc_drv_dma.h:158
@ DMA_HS_HARDWARE
Definition xc_drv_dma.h:159
@ DMA_HS_SOFTWARE
Definition xc_drv_dma.h:160
enum dmac_ch_state eDMA_CH_State
dmac_address_increment
Definition xc_drv_dma.h:141
@ DMA_ADDR_INCREMENT
Definition xc_drv_dma.h:142
@ DMA_ADDR_DECREMENT
Definition xc_drv_dma.h:143
@ DMA_ADDR_NOCHANGE
Definition xc_drv_dma.h:144
dmac_channel_number
Definition xc_drv_dma.h:68
@ DMA_ALL_CHANNELS
Definition xc_drv_dma.h:73
@ DMA_CHANNEL1
Definition xc_drv_dma.h:72
@ DMA_CHANNEL0
Definition xc_drv_dma.h:71
@ DMA_NO_CHANNEL
Definition xc_drv_dma.h:70
void(* DMA_Callback)(uint8_t eCode)
Definition xc_drv_dma.h:65
dmac_transfer_width
Definition xc_drv_dma.h:148
@ DMA_TRANS_WIDTH_128
Definition xc_drv_dma.h:153
@ DMA_TRANS_WIDTH_64
Definition xc_drv_dma.h:152
@ DMA_TRANS_WIDTH_256
Definition xc_drv_dma.h:154
@ DMA_TRANS_WIDTH_16
Definition xc_drv_dma.h:150
@ DMA_TRANS_WIDTH_32
Definition xc_drv_dma.h:151
@ DMA_TRANS_WIDTH_8
Definition xc_drv_dma.h:149