SmartSnippets DA1459x SDK
hw_dma.h
Go to the documentation of this file.
1 
42 #ifndef HW_DMA_H_
43 #define HW_DMA_H_
44 
45 
46 #if dg_configUSE_HW_DMA
47 
48 #include <stdint.h>
49 #include <sdk_defs.h>
50 
51 #define HW_DMA_SECURE_DMA_CHANNEL HW_DMA_CHANNEL_5
52 
53 /*
54 * ENUMERATION DEFINITIONS
55 *****************************************************************************************
56 */
57 
62 typedef enum {
71 
76 typedef enum {
79 } HW_DMA_STATE;
80 
85 typedef enum {
89 } HW_DMA_BW;
90 
95 typedef enum {
99 
104 typedef enum {
107 } HW_DMA_DREQ;
108 
112 typedef enum {
119 
124 typedef enum {
127 } HW_DMA_BINC;
128 
133 typedef enum {
136 } HW_DMA_AINC;
137 
150 typedef enum {
153 } HW_DMA_MODE;
154 
163 typedef enum {
164  HW_DMA_PRIO_0 = 0x000,
165  HW_DMA_PRIO_1 = 0x080,
166  HW_DMA_PRIO_2 = 0x100,
167  HW_DMA_PRIO_3 = 0x180,
168  HW_DMA_PRIO_4 = 0x200,
169  HW_DMA_PRIO_5 = 0x280,
170  HW_DMA_PRIO_6 = 0x300,
171  HW_DMA_PRIO_7 = 0x380
172 } HW_DMA_PRIO;
173 
186 typedef enum {
189 } HW_DMA_IDLE;
190 
195 typedef enum {
198 } HW_DMA_INIT;
199 
204 typedef enum {
205  HW_DMA_TRIG_SPI_RXTX = 0x0,
206  HW_DMA_TRIG_UART_RXTX = 0x1,
207  HW_DMA_TRIG_UART2_RXTX = 0x2,
208  HW_DMA_TRIG_I2C_RXTX = 0x3,
209  HW_DMA_TRIG_PCM_RXTX = 0x4,
210  HW_DMA_TRIG_SRC_RXRX = 0x5,
211  HW_DMA_TRIG_SRC_TXTX = 0x6,
212  HW_DMA_TRIG_SRC2_RXRX = 0x7,
213  HW_DMA_TRIG_SRC2_TXTX = 0x8,
214  HW_DMA_TRIG_SRC_SRC2_RXTX = 0x9,
215  HW_DMA_TRIG_SRC2_SRC_RXTX = 0xA,
216  HW_DMA_TRIG_SRC_RXTX = 0xB,
217  HW_DMA_TRIG_SRC2_RXTX = 0xC,
218  HW_DMA_TRIG_ADC = 0xD,
219  HW_DMA_TRIG_SD_ADC_FCU = 0xE,
220  HW_DMA_TRIG_NONE = 0xF
221 } HW_DMA_TRIG;
222 
227 typedef uint32_t dma_size_t;
228 
239 typedef void (*hw_dma_transfer_cb)(void *user_data, dma_size_t len);
240 
245 typedef struct {
260  uint32 src_address;
261  uint32 dest_address;
264  void *user_data;
265 } DMA_setup;
266 
275 typedef struct {
276  bool use_prio;
280 
281 /*
282 * API FUNCTIONS DEFINITIONS
283 *****************************************************************************************
284 */
285 
292 void hw_dma_channel_initialization(DMA_setup *channel_setup);
293 
309 void hw_dma_channel_update_source(HW_DMA_CHANNEL channel, void* addr, dma_size_t length,
310  hw_dma_transfer_cb cb);
311 
327 void hw_dma_channel_update_destination(HW_DMA_CHANNEL channel, void *addr, dma_size_t length,
328  hw_dma_transfer_cb cb);
329 
342 void hw_dma_channel_update_int_ix(HW_DMA_CHANNEL channel, uint16_t int_ix);
343 
351 void hw_dma_channel_enable(HW_DMA_CHANNEL channel_number, HW_DMA_STATE dma_on);
352 
363 void hw_dma_channel_stop(HW_DMA_CHANNEL channel_number);
364 
379 
384 __STATIC_INLINE void hw_dma_freeze(void)
385 {
386  GPREG->SET_FREEZE_REG = REG_MSK(GPREG, SET_FREEZE_REG, FRZ_DMA);
387 }
388 
393 __STATIC_INLINE void hw_dma_unfreeze(void)
394 {
395  GPREG->RESET_FREEZE_REG = REG_MSK(GPREG, RESET_FREEZE_REG, FRZ_DMA);
396 }
397 
403 __STATIC_INLINE bool hw_dma_is_aes_key_protection_enabled(void)
404 {
405  return (REG_GETF(CRG_TOP, SECURE_BOOT_REG, PROT_APP_KEY) == 1);
406 }
407 
420 __STATIC_INLINE bool hw_dma_secure_channel_is_free(void)
421 {
422  uint32_t secure_features_msk = REG_MSK(CRG_TOP, SECURE_BOOT_REG, PROT_APP_KEY);
423 
424  return ((CRG_TOP->SECURE_BOOT_REG & secure_features_msk) == 0);
425 }
426 
434 __STATIC_INLINE bool hw_dma_bus_error_detected(HW_DMA_CHANNEL channel_number)
435 {
436  return ((DMA->DMA_INT_STATUS_REG & (REG_MSK(DMA, DMA_INT_STATUS_REG, DMA_BUS_ERR0) << channel_number)) != 0);
437 }
438 
447 bool hw_dma_is_channel_active(HW_DMA_CHANNEL channel_number);
448 
454 __RETAINED_CODE bool hw_dma_channel_active(void);
455 
456 #endif /* dg_configUSE_HW_DMA */
457 #endif /* HW_DMA_H_ */
458 
DMA_setup::dreq_mode
HW_DMA_DREQ dreq_mode
Definition: hw_dma.h:251
HW_DMA_INIT
HW_DMA_INIT
DMA init mode.
Definition: hw_dma.h:195
DMA_DMA0_CTRL_REG_DMA_INIT_Msk
#define DMA_DMA0_CTRL_REG_DMA_INIT_Msk
Definition: DA1459x-00.h:2460
hw_dma_channel_update_int_ix
void hw_dma_channel_update_int_ix(HW_DMA_CHANNEL channel, uint16_t int_ix)
Update DMA interrupt trigger index.
hw_dma_channel_update_destination
void hw_dma_channel_update_destination(HW_DMA_CHANNEL channel, void *addr, dma_size_t length, hw_dma_transfer_cb cb)
Update DMA destination address and length.
HW_DMA_DREQ_START
Definition: hw_dma.h:105
hw_dma_is_aes_key_protection_enabled
__STATIC_INLINE bool hw_dma_is_aes_key_protection_enabled(void)
Check if the aes key read protection is enabled.
Definition: hw_dma.h:403
HW_DMA_CHANNEL_3
Definition: hw_dma.h:66
HW_DMA_CHANNEL_INVALID
Definition: hw_dma.h:69
hw_dma_freeze
__STATIC_INLINE void hw_dma_freeze(void)
Freeze DMA.
Definition: hw_dma.h:384
HW_DMA_INIT_AX_BX_BY
Definition: hw_dma.h:197
HW_DMA_BURST_MODE_4x
Definition: hw_dma.h:114
DMA_DMA0_CTRL_REG_DREQ_MODE_Msk
#define DMA_DMA0_CTRL_REG_DREQ_MODE_Msk
Definition: DA1459x-00.h:2472
HW_DMA_IRQ_STATE
HW_DMA_IRQ_STATE
DMA channel interrupt enable/disable.
Definition: hw_dma.h:95
HW_DMA_BURST_MODE_8x
Definition: hw_dma.h:116
HW_DMA_DREQ_TRIGGERED
Definition: hw_dma.h:106
HW_DMA_AINC
HW_DMA_AINC
Increment of source address mode.
Definition: hw_dma.h:133
DMA_setup::dma_req_mux
HW_DMA_TRIG dma_req_mux
Definition: hw_dma.h:259
HW_DMA_STATE_ENABLED
Definition: hw_dma.h:78
HW_DMA_CHANNEL_2
Definition: hw_dma.h:65
HW_DMA_IDLE
HW_DMA_IDLE
DMA idle mode.
Definition: hw_dma.h:186
sdk_defs.h
Central include header file with platform definitions.
HW_DMA_PRIO_2
Definition: hw_dma.h:166
HW_DMA_AINC_FALSE
Definition: hw_dma.h:134
HW_DMA_BURST_MODE_DISABLED
Definition: hw_dma.h:113
HW_DMA_PRIO_4
Definition: hw_dma.h:168
DMA_setup::user_data
void * user_data
Definition: hw_dma.h:264
hw_dma_periph_prio_t
DMA peripherals priority structure.
Definition: hw_dma.h:275
HW_DMA_IDLE_INTERRUPTING_MODE
Definition: hw_dma.h:188
HW_DMA_DREQ
HW_DMA_DREQ
DMA request input multiplexer controlled.
Definition: hw_dma.h:104
DMA_setup::b_inc
HW_DMA_BINC b_inc
Definition: hw_dma.h:254
HW_DMA_IRQ_STATE_DISABLED
Definition: hw_dma.h:96
HW_DMA_PRIO_5
Definition: hw_dma.h:169
hw_dma_is_channel_active
bool hw_dma_is_channel_active(HW_DMA_CHANNEL channel_number)
Check if the corresponding DMA channel is active.
DMA_setup::irq_enable
HW_DMA_IRQ_STATE irq_enable
Definition: hw_dma.h:248
HW_DMA_PRIO_0
Definition: hw_dma.h:164
DMA_setup::dma_prio
HW_DMA_PRIO dma_prio
Definition: hw_dma.h:256
HW_DMA_CHANNEL
HW_DMA_CHANNEL
DMA channel number.
Definition: hw_dma.h:62
HW_DMA_MODE
HW_DMA_MODE
Channel mode.
Definition: hw_dma.h:150
HW_DMA_BINC_FALSE
Definition: hw_dma.h:125
HW_DMA_BW_WORD
Definition: hw_dma.h:88
HW_DMA_CHANNEL_1
Definition: hw_dma.h:64
DMA_setup::irq_nr_of_trans
uint16 irq_nr_of_trans
Definition: hw_dma.h:249
HW_DMA_TRIG
HW_DMA_TRIG
Channel request trigger.
Definition: hw_dma.h:204
HW_DMA_IRQ_STATE_ENABLED
Definition: hw_dma.h:97
hw_dma_periph_prio_t::use_prio
bool use_prio
Definition: hw_dma.h:276
hw_dma_bus_error_detected
__STATIC_INLINE bool hw_dma_bus_error_detected(HW_DMA_CHANNEL channel_number)
Check if a bus error response has been detected on a specific DMA channel.
Definition: hw_dma.h:434
HW_DMA_BINC
HW_DMA_BINC
Increment destination address mode.
Definition: hw_dma.h:124
HW_DMA_STATE
HW_DMA_STATE
DMA channel enable/disable.
Definition: hw_dma.h:76
hw_dma_periph_prio_t::rx_prio
HW_DMA_PRIO rx_prio
Definition: hw_dma.h:277
HW_DMA_PRIO
HW_DMA_PRIO
Channel priority.
Definition: hw_dma.h:163
HW_DMA_CHANNEL_0
Definition: hw_dma.h:63
DMA_setup::burst_mode
HW_DMA_BURST_MODE burst_mode
Definition: hw_dma.h:252
hw_dma_channel_active
__RETAINED_CODE bool hw_dma_channel_active(void)
Check if any DMA channel is active.
REG_MSK
#define REG_MSK(base, reg, field)
Access register field mask.
Definition: sdk_defs.h:583
DMA_setup::channel_number
HW_DMA_CHANNEL channel_number
Definition: hw_dma.h:246
DMA_setup::circular
HW_DMA_MODE circular
Definition: hw_dma.h:255
HW_DMA_PRIO_1
Definition: hw_dma.h:165
DMA_setup
DMA parameters structure.
Definition: hw_dma.h:245
HW_DMA_BW_BYTE
Definition: hw_dma.h:86
HW_DMA_MODE_NORMAL
Definition: hw_dma.h:151
hw_dma_secure_channel_is_free
__STATIC_INLINE bool hw_dma_secure_channel_is_free(void)
Check if the DMA secure channel is free. If any encryption protection is enabled (OQSPIF or AES),...
Definition: hw_dma.h:420
HW_DMA_IDLE_BLOCKING_MODE
Definition: hw_dma.h:187
DMA_setup::dma_idle
HW_DMA_IDLE dma_idle
Definition: hw_dma.h:257
HW_DMA_CHANNEL_5
Definition: hw_dma.h:68
DMA_setup::callback
hw_dma_transfer_cb callback
Definition: hw_dma.h:263
DMA_setup::a_inc
HW_DMA_AINC a_inc
Definition: hw_dma.h:253
REG_GETF
#define REG_GETF(base, reg, field)
Return the value of a register field.
Definition: sdk_defs.h:711
HW_DMA_BINC_TRUE
Definition: hw_dma.h:126
HW_DMA_INIT_AX_BX_AY_BY
Definition: hw_dma.h:196
hw_dma_periph_prio_t::tx_prio
HW_DMA_PRIO tx_prio
Definition: hw_dma.h:278
HW_DMA_MODE_CIRCULAR
Definition: hw_dma.h:152
hw_dma_channel_update_source
void hw_dma_channel_update_source(HW_DMA_CHANNEL channel, void *addr, dma_size_t length, hw_dma_transfer_cb cb)
Update DMA source address and length.
HW_DMA_AINC_TRUE
Definition: hw_dma.h:135
DMA_DMA0_CTRL_REG_AINC_Msk
#define DMA_DMA0_CTRL_REG_AINC_Msk
Definition: DA1459x-00.h:2468
DMA_DMA0_CTRL_REG_BINC_Msk
#define DMA_DMA0_CTRL_REG_BINC_Msk
Definition: DA1459x-00.h:2470
DMA_setup::dest_address
uint32 dest_address
Definition: hw_dma.h:261
hw_dma_channel_enable
void hw_dma_channel_enable(HW_DMA_CHANNEL channel_number, HW_DMA_STATE dma_on)
Enable or disable a DMA channel.
hw_dma_transfered_bytes
dma_size_t hw_dma_transfered_bytes(HW_DMA_CHANNEL channel_number)
Read number of transmitted bytes so far.
HW_DMA_PRIO_6
Definition: hw_dma.h:170
hw_dma_channel_stop
void hw_dma_channel_stop(HW_DMA_CHANNEL channel_number)
Stop DMA channel if operation is in progress.
HW_DMA_PRIO_7
Definition: hw_dma.h:171
dma_size_t
uint32_t dma_size_t
DMA transfer size type.
Definition: hw_dma.h:227
DMA_setup::src_address
uint32 src_address
Definition: hw_dma.h:260
HW_DMA_STATE_DISABLED
Definition: hw_dma.h:77
HW_DMA_PRIO_3
Definition: hw_dma.h:167
DMA_DMA0_CTRL_REG_DMA_IDLE_Msk
#define DMA_DMA0_CTRL_REG_DMA_IDLE_Msk
Definition: DA1459x-00.h:2462
DMA_setup::bus_width
HW_DMA_BW bus_width
Definition: hw_dma.h:247
DMA_setup::dma_init
HW_DMA_INIT dma_init
Definition: hw_dma.h:258
HW_DMA_BW_HALFWORD
Definition: hw_dma.h:87
DMA_setup::length
dma_size_t length
Definition: hw_dma.h:262
HW_DMA_BURST_MODE
HW_DMA_BURST_MODE
DMA channel burst mode.
Definition: hw_dma.h:112
hw_dma_unfreeze
__STATIC_INLINE void hw_dma_unfreeze(void)
Unfreeze DMA.
Definition: hw_dma.h:393
hw_dma_channel_initialization
void hw_dma_channel_initialization(DMA_setup *channel_setup)
Initialize DMA Channel.
HW_DMA_CHANNEL_4
Definition: hw_dma.h:67
hw_dma_transfer_cb
void(* hw_dma_transfer_cb)(void *user_data, dma_size_t len)
DMA channel transfer callback.
Definition: hw_dma.h:239
DMA_DMA0_CTRL_REG_CIRCULAR_Msk
#define DMA_DMA0_CTRL_REG_CIRCULAR_Msk
Definition: DA1459x-00.h:2466
HW_DMA_BW
HW_DMA_BW
DMA channel bus width transfer.
Definition: hw_dma.h:85