SmartSnippets DA1459x SDK
hw_src.h
Go to the documentation of this file.
1 
42 #ifndef HW_SRC_H_
43 #define HW_SRC_H_
44 
45 #if dg_configUSE_HW_SRC
46 #include <stdbool.h>
47 #include <stdint.h>
48 #include "sdk_defs.h"
49 
50 #define BASE_TYPE SRC1_Type
51 
55 #define HW_SRC1 ((void *)SRC1_BASE)
56 #define HW_SRC2 ((void *)SRC2_BASE)
57 
58 /* SRC Base Address */
59 #define SRCBA(id) ((BASE_TYPE *)id)
60 
61 typedef void * HW_SRC_ID;
62 
63 #define MUX_REG SRC1_MUX_REG
64 
65 #define CTRL_REG SRC1_CTRL_REG
66 
77 #define HW_SRC_REG_GETF(id, base, reg, field) \
78  ((SRCBA(id)->SRC1_##reg & (base##_SRC1_##reg##_##field##_Msk)) >> (base##_SRC1_##reg##_##field##_Pos))
79 
90 #define HW_SRC_REG_SETF(id, base, reg, field, val) \
91  SRCBA(id)->SRC1_##reg = ((SRCBA(id)->SRC1_##reg & ~(base##_SRC1_##reg##_##field##_Msk)) | \
92  ((base##_SRC1_##reg##_##field##_Msk) & ((val) << (base##_SRC1_##reg##_##field##_Pos))))
93 
108 #define HW_SRC_REG_SET_FIELD(base, reg, field, var, val) \
109  var = (((var & ~(base##_SRC1_##reg##_##field##_Msk))) | \
110  (((val) << (base##_SRC1_##reg##_##field##_Pos)) & \
111  (base##_SRC1_##reg##_##field##_Msk)))
112 
127 #define HW_SRC_REG_GET_FIELD(base, reg, field, var) \
128  ((var & (base##_SRC1_##reg##_##field##_Msk)) >> \
129  (base##_SRC1_##reg##_##field##_Pos))
130 
144 #define HW_SRC_REG_CLR_FIELD(base, reg, field, var) \
145  var &= ~(base##_SRC1_##reg##_##field##_Msk)
146 
155 #define HW_SRC_REG_SET_BIT(id, base, reg, field) \
156  do { \
157  SRCBA(id)->SRC1_##reg |= (1 << (base##_SRC1_##reg##_##field##_Pos)); \
158  } while (0)
159 
160 
169 #define HW_SRC_REG_CLR_BIT(id, base, reg, field) \
170  do { \
171  SRCBA(id)->SRC1_##reg &= ~(base##_SRC1_##reg##_##field##_Msk); \
172  } while (0)
173 
177 typedef enum {
181 
185 typedef enum {
191 
195 typedef enum {
199 # if dg_configUSE_HW_SDADC
200  HW_SRC_SDADC,
201 # endif /* dg_configUSE_HW_SDADC */
202  HW_SRC_SELECTION_SIZE
204 
209 typedef enum {
214  HW_SRCx_MUX_IN_SIZE
216 
221 typedef enum {
225 
229 typedef struct {
230  HW_SRC_ID id;
231  uint16_t src_clk;
234  uint32_t in_sample_rate;
236  uint32_t out_sample_rate;
240 
241 /* *************************************************************************
242  *
243  * ENABLE-DISABLE FUNCTIONS
244  *
245  * ************************************************************************* */
246 
252 __STATIC_INLINE void hw_src_enable(HW_SRC_ID id)
253 {
254 
255 
256  ASSERT_WARNING(id == HW_SRC1 || id == HW_SRC2);
257 
258  /*
259  * The under/overflows that occur due to the reconfiguration can be
260  * ignored, so we disable under/overflow notifications until
261  * (SRC_IN_OK == 1 && SRC_OUT_OK == 1).
262  */
263  SRCBA(id)->SRC1_CTRL_REG |= REG_MSK(SRC1, SRC1_CTRL_REG, SRC_IN_FLOWCLR) |
264  REG_MSK(SRC1, SRC1_CTRL_REG, SRC_OUT_FLOWCLR) |
265  REG_MSK(SRC1, SRC1_CTRL_REG, SRC_EN);
266 
267  while (!(SRCBA(id)->SRC1_CTRL_REG & (REG_MSK(SRC1, SRC1_CTRL_REG, SRC_IN_OK) |
268  REG_MSK(SRC1, SRC1_CTRL_REG, SRC_OUT_OK))));
269 
270  SRCBA(id)->SRC1_CTRL_REG &= ~(REG_MSK(SRC1, SRC1_CTRL_REG, SRC_IN_FLOWCLR) |
271  REG_MSK(SRC1, SRC1_CTRL_REG, SRC_OUT_FLOWCLR));
272 }
273 
279 __STATIC_INLINE void hw_src_disable(HW_SRC_ID id)
280 {
281 
282  ASSERT_WARNING(id == HW_SRC1 || id == HW_SRC2);
283 
284  HW_SRC_REG_CLR_BIT(id, SRC1, CTRL_REG, SRC_EN);
285 }
286 
296 __STATIC_INLINE bool hw_src_is_enabled(HW_SRC_ID id)
297 {
298 
299  ASSERT_WARNING(id == HW_SRC1 || id == HW_SRC2);
300 
301  return (HW_SRC_REG_GETF(id, SRC1, CTRL_REG, SRC_EN));
302 }
303 
312 __STATIC_INLINE void hw_src_enable_fifo(HW_SRC_ID id, HW_SRC_DIRECTION direction)
313 {
314 
315  ASSERT_WARNING(id == HW_SRC1 || id == HW_SRC2);
316 
317  uint32_t src1_ctrl_reg = SRCBA(id)->SRC1_CTRL_REG;
318 
319  switch (direction) {
320  case HW_SRC_IN:
321  REG_CLR_FIELD(SRC1, SRC1_CTRL_REG, SRC_FIFO_DIRECTION, src1_ctrl_reg);
322  break;
323  case HW_SRC_OUT:
324  src1_ctrl_reg |= REG_MSK(SRC1, SRC1_CTRL_REG, SRC_FIFO_DIRECTION);
325  break;
326  default:
327  ASSERT_WARNING(0);
328  }
329 
330  src1_ctrl_reg |= REG_MSK(SRC1, SRC1_CTRL_REG, SRC_FIFO_ENABLE);
331  SRCBA(id)->SRC1_CTRL_REG = src1_ctrl_reg;
332 }
333 
339 __STATIC_INLINE void hw_src_disable_fifo(HW_SRC_ID id)
340 {
341 
342  ASSERT_WARNING(id == HW_SRC1 || id == HW_SRC2);
343 
344  HW_SRC_REG_CLR_BIT(id, SRC1, CTRL_REG, SRC_FIFO_ENABLE);
345 }
346 
355 __STATIC_INLINE bool hw_src_is_fifo_enabled(HW_SRC_ID id)
356 {
357 
358  ASSERT_WARNING(id == HW_SRC1 || id == HW_SRC2);
359 
360  return(HW_SRC_REG_GETF(id, SRC1, CTRL_REG, SRC_FIFO_ENABLE));
361 }
362 
363 /* *************************************************************************
364  *
365  * SET FUNCTIONS
366  *
367  * ************************************************************************* */
368 
376 __STATIC_INLINE void hw_src_set_automode(HW_SRC_ID id, HW_SRC_DIRECTION direction)
377 {
378 
379  ASSERT_WARNING(id == HW_SRC1 || id == HW_SRC2);
380 
381  if (direction == HW_SRC_IN) {
382  HW_SRC_REG_SET_BIT(id, SRC1, CTRL_REG, SRC_IN_AMODE);
383  } else {
384  HW_SRC_REG_SET_BIT(id, SRC1, CTRL_REG, SRC_OUT_AMODE);
385  }
386 }
387 
395 __STATIC_INLINE void hw_src_set_manual_mode(HW_SRC_ID id, HW_SRC_DIRECTION direction)
396 {
397 
398  ASSERT_WARNING(id == HW_SRC1 || id == HW_SRC2);
399 
400  if (direction == HW_SRC_IN) {
401  HW_SRC_REG_CLR_BIT(id, SRC1, CTRL_REG, SRC_IN_AMODE);
402  } else {
403  HW_SRC_REG_CLR_BIT(id, SRC1, CTRL_REG, SRC_OUT_AMODE);
404  }
405 }
406 
415 __STATIC_INLINE void hw_src_select_input(HW_SRC_SELECTION input, hw_src_config_t *config)
416 {
417  ASSERT_WARNING(input < HW_SRC_SELECTION_SIZE);
418 
419  config->data_input = input;
420 
421  ASSERT_WARNING(config->id == HW_SRC1 || config->id == HW_SRC2);
422  uint32_t address = SRCBA(config->id)->MUX_REG;
423 
424  switch (config->data_input) {
425  case HW_SRC_PDM:
426  HW_SRC_REG_SET_FIELD(SRC1, MUX_REG, PDM1_MUX_IN, address, HW_PDM_INPUT_MUX_PDM_INPUT);
427  HW_SRC_REG_CLR_FIELD(SRC1, MUX_REG, SRC1_MUX_IN, address);
428  break;
429  case HW_SRC_PCM:
430  HW_SRC_REG_SET_FIELD(SRC1, MUX_REG, SRC1_MUX_IN, address, HW_SRC_INPUT_MUX_PCM_OUT_REG);
431  HW_SRC_REG_CLR_FIELD(SRC1, MUX_REG, PDM1_MUX_IN, address); // HW_PDM_INPUT_MUX_SRCx_MUX_IN
432  break;
433  case HW_SRC_REGS:
434  HW_SRC_REG_SET_FIELD(SRC1, MUX_REG, SRC1_MUX_IN, address, HW_SRC_INPUT_MUX_SRCx_IN_REG);
435  HW_SRC_REG_CLR_FIELD(SRC1, MUX_REG, PDM1_MUX_IN, address);// HW_PDM_INPUT_MUX_SRCx_MUX_IN
436  break;
437 # if dg_configUSE_HW_SDADC
438  case HW_SRC_SDADC:
439  HW_SRC_REG_SET_FIELD(SRC1, MUX_REG, SRC1_MUX_IN, address, HW_SRC_INPUT_MUX_SDADC_OUT);
440  HW_SRC_REG_CLR_FIELD(SRC1, MUX_REG, PDM1_MUX_IN, address);// HW_PDM_INPUT_MUX_SRCx_MUX_IN
441  break;
442 # endif /* dg_configUSE_HW_SDADC */
443  default:
444  ASSERT_WARNING(0);
445  }
446 
447  SRCBA(config->id)->MUX_REG = address;
448 }
449 
457 __STATIC_INLINE void hw_src_write_input(HW_SRC_ID id, uint8_t stream, uint32_t value)
458 {
459 
460  ASSERT_WARNING(id == HW_SRC1 || id == HW_SRC2);
461 
462  switch (stream) {
463  case 1:
464  HW_SRC_REG_SETF(id, SRC1, IN1_REG, SRC_IN, value);
465  break;
466  case 2:
467  HW_SRC_REG_SETF(id, SRC1, IN2_REG, SRC_IN, value);
468  break;
469  default:
470  ASSERT_WARNING(0);
471  }
472 }
473 
474 /* *************************************************************************
475  *
476  * GET FUNCTIONS
477  *
478  * ************************************************************************* */
479 
490 __STATIC_INLINE bool hw_src_is_auto_mode(HW_SRC_ID id, HW_SRC_DIRECTION direction)
491 {
492 
493  ASSERT_WARNING(id == HW_SRC1 || id == HW_SRC2);
494 
495  if (direction == HW_SRC_IN) {
496  return HW_SRC_REG_GETF(id, SRC1, CTRL_REG, SRC_IN_AMODE);
497  } else {
498  return HW_SRC_REG_GETF(id, SRC1, CTRL_REG, SRC_OUT_AMODE);
499  }
500 }
501 
510 __STATIC_INLINE uint32_t hw_src_read_output(HW_SRC_ID id, uint8_t stream)
511 {
512 
513  ASSERT_WARNING(id == HW_SRC1 || id == HW_SRC2);
514 
515  switch (stream) {
516  case 1:
517  return HW_SRC_REG_GETF(id, SRC1, OUT1_REG, SRC_OUT);
518  case 2:
519  return HW_SRC_REG_GETF(id, SRC1, OUT2_REG, SRC_OUT);
520  default:
521  ASSERT_WARNING(0);
522  return 0;
523  }
524 }
525 
535 
547 void hw_src_init(HW_SRC_ID id, hw_src_config_t *config);
548 #endif /* dg_configUSE_HW_SRC */
549 #endif /* HW_SRC_H_ */
550 
HW_PDM_INPUT_MUX_PDM_INPUT
Definition: hw_src.h:223
hw_src_set_automode
__STATIC_INLINE void hw_src_set_automode(HW_SRC_ID id, HW_SRC_DIRECTION direction)
Set Automatic Conversion mode.
Definition: hw_src.h:376
HW_SRCx_MUX_IN
HW_SRCx_MUX_IN
SRCx input multiplexer.
Definition: hw_src.h:209
hw_src_is_fifo_enabled
__STATIC_INLINE bool hw_src_is_fifo_enabled(HW_SRC_ID id)
Check if SRC FIFO is enabled. FIFO is used to store samples from/to SRC.
Definition: hw_src.h:355
hw_src_write_input
__STATIC_INLINE void hw_src_write_input(HW_SRC_ID id, uint8_t stream, uint32_t value)
Write data to an input SRC register.
Definition: hw_src.h:457
hw_src_get_flow_status
HW_SRC_FLOW_STATUS hw_src_get_flow_status(HW_SRC_ID id, HW_SRC_DIRECTION direction)
Check if SRC flow errors have occurred and clear the indication.
hw_src_select_input
__STATIC_INLINE void hw_src_select_input(HW_SRC_SELECTION input, hw_src_config_t *config)
Select the SRC input.
Definition: hw_src.h:415
sdk_defs.h
Central include header file with platform definitions.
hw_src_set_manual_mode
__STATIC_INLINE void hw_src_set_manual_mode(HW_SRC_ID id, HW_SRC_DIRECTION direction)
Clear Automatic Conversion mode. Use manual mode.
Definition: hw_src.h:395
hw_src_is_auto_mode
__STATIC_INLINE bool hw_src_is_auto_mode(HW_SRC_ID id, HW_SRC_DIRECTION direction)
Get the mode.
Definition: hw_src.h:490
HW_SRC_FLOW_OVER_UNDER
Definition: hw_src.h:189
HW_SRC1
#define HW_SRC1
SRC id.
Definition: hw_src.h:55
HW_SRC_REG_GETF
#define HW_SRC_REG_GETF(id, base, reg, field)
Get the value of a field of a SRC register.
Definition: hw_src.h:77
HW_SRC_PCM
Definition: hw_src.h:196
HW_SRC_FLOW_OK
Definition: hw_src.h:186
hw_src_init
void hw_src_init(HW_SRC_ID id, hw_src_config_t *config)
Initialize the SRC.
HW_SRC_DIRECTION
HW_SRC_DIRECTION
Input/Output direction.
Definition: hw_src.h:177
hw_src_disable
__STATIC_INLINE void hw_src_disable(HW_SRC_ID id)
Disable SRC.
Definition: hw_src.h:279
HW_SRC_REG_SET_FIELD
#define HW_SRC_REG_SET_FIELD(base, reg, field, var, val)
Set SRC register field value.
Definition: hw_src.h:108
HW_SRC_REG_SETF
#define HW_SRC_REG_SETF(id, base, reg, field, val)
Set the value of a field of a SRC register.
Definition: hw_src.h:90
HW_PDM1_MUX_IN
HW_PDM1_MUX_IN
PDM input multiplexer.
Definition: hw_src.h:221
HW_SRC_SELECTION
HW_SRC_SELECTION
Input/Output selection.
Definition: hw_src.h:195
hw_src_config_t::out_sample_rate
uint32_t out_sample_rate
Definition: hw_src.h:236
hw_src_config_t::in_sample_rate
uint32_t in_sample_rate
Definition: hw_src.h:234
hw_src_disable_fifo
__STATIC_INLINE void hw_src_disable_fifo(HW_SRC_ID id)
Disable SRC FIFO. On each SRC request, one sample is serviced.
Definition: hw_src.h:339
HW_SRC_FLOW_OVER
Definition: hw_src.h:187
HW_SRC_IN
Definition: hw_src.h:178
hw_src_enable
__STATIC_INLINE void hw_src_enable(HW_SRC_ID id)
Enable SRC.
Definition: hw_src.h:252
hw_src_config_t::id
HW_SRC_ID id
Definition: hw_src.h:230
REG_MSK
#define REG_MSK(base, reg, field)
Access register field mask.
Definition: sdk_defs.h:583
hw_src_config_t::data_input
HW_SRC_SELECTION data_input
Definition: hw_src.h:238
hw_src_config_t
SRC configuration structure definition.
Definition: hw_src.h:229
HW_SRC_INPUT_MUX_SDADC_OUT
Definition: hw_src.h:213
hw_src_read_output
__STATIC_INLINE uint32_t hw_src_read_output(HW_SRC_ID id, uint8_t stream)
Read data from an output SRC register.
Definition: hw_src.h:510
HW_SRC_REG_SET_BIT
#define HW_SRC_REG_SET_BIT(id, base, reg, field)
Set a bit of a SRC register.
Definition: hw_src.h:155
HW_SRC_INPUT_MUX_SRCx_IN_REG
Definition: hw_src.h:212
hw_src_config_t::src_clk
uint16_t src_clk
Definition: hw_src.h:231
HW_SRC_FLOW_UNDER
Definition: hw_src.h:188
hw_src_enable_fifo
__STATIC_INLINE void hw_src_enable_fifo(HW_SRC_ID id, HW_SRC_DIRECTION direction)
Enable SRC FIFO. FIFO is used to store samples from/to SRC.
Definition: hw_src.h:312
REG_CLR_FIELD
#define REG_CLR_FIELD(base, reg, field, var)
Clear register field value.
Definition: sdk_defs.h:661
HW_SRC_INPUT_MUX_PCM_OUT_REG
Definition: hw_src.h:211
HW_SRC_REGS
Definition: hw_src.h:198
hw_src_is_enabled
__STATIC_INLINE bool hw_src_is_enabled(HW_SRC_ID id)
Check if SRC is enabled.
Definition: hw_src.h:296
HW_SRC_REG_CLR_BIT
#define HW_SRC_REG_CLR_BIT(id, base, reg, field)
Clear a bit of a SRC register.
Definition: hw_src.h:169
HW_SRC_PDM
Definition: hw_src.h:197
HW_SRC_INPUT_MUX_OFF
Definition: hw_src.h:210
HW_PDM_INPUT_MUX_SRCx_MUX_IN
Definition: hw_src.h:222
HW_SRC_FLOW_STATUS
HW_SRC_FLOW_STATUS
Flow status.
Definition: hw_src.h:185
HW_SRC_REG_CLR_FIELD
#define HW_SRC_REG_CLR_FIELD(base, reg, field, var)
Clear register field value.
Definition: hw_src.h:144
HW_SRC_OUT
Definition: hw_src.h:179