SmartSnippets DA1459x SDK
hw_pdm.h
Go to the documentation of this file.
1 
43 #ifndef HW_PDM_H_
44 #define HW_PDM_H_
45 
46 
47 #if dg_configUSE_HW_PDM
48 
49 #include "sdk_defs.h"
50 #include "hw_src.h"
51 
63 #define HW_PDM_CRG_REG_FIELD_MASK(reg, field) REG_MSK(CRG_AUD, PDM_##reg##_REG, field)
64 
75 #define HW_PDM_CRG_REG_FIELD_POS(reg, field) REG_POS(CRG_AUD, PDM_##reg##_REG, field)
76 
86 #define HW_PDM_CRG_REG_GETF(reg, field) REG_GETF(CRG_AUD, PDM_##reg##_REG, field)
87 
96 #define HW_PDM_CRG_REG_SETF(reg, field, val) REG_SETF(CRG_AUD, PDM_##reg##_REG, field, val)
97 
104 #define HW_PDM_CRG_REG_SET_BIT(reg, field) REG_SET_BIT(CRG_AUD, PDM_##reg##_REG, field)
105 
112 #define HW_PDM_CRG_REG_CLR_BIT(reg, field) REG_CLR_BIT(CRG_AUD, PDM_##reg##_REG, field)
113 
124 #define HW_PDM_SRC_REG_GETF(id, reg, field) HW_SRC_REG_GETF(id, SRC1, reg##_REG, field)
125 
135 #define HW_PDM_SRC_REG_SETF(id, reg, field, val) HW_SRC_REG_SETF(id, SRC1, reg##_REG, field, val)
136 
144 #define HW_PDM_SRC_REG_SET_BIT(id, reg, field) HW_SRC_REG_SET_BIT(id, SRC1, reg##_REG, field)
145 
153 #define HW_PDM_SRC_REG_CLR_BIT(id, reg, field) HW_SRC_REG_CLR_BIT(id, SRC1, reg##_REG, field)
154 
159 typedef enum {
160  PDM_DIRECTION_INPUT,
161  PDM_DIRECTION_OUTPUT
163 
168 typedef enum {
171 } HW_PDM_MODE;
172 
177 typedef enum {
183 
188 typedef enum {
194 
199 typedef enum {
205 
210 typedef enum {
214 
218 typedef struct {
219  /* PDM mode configuration is placed in mode specific structures */
226  uint32_t clk_frequency;
233 
246 __STATIC_INLINE HW_PDM_DI_DELAY hw_pdm_get_input_delay(HW_SRC_ID id)
247 {
248  return(HW_PDM_SRC_REG_GETF(id, CTRL, SRC_PDM_DI_DEL));
249 }
250 
261 __STATIC_INLINE HW_PDM_DO_DELAY hw_pdm_get_output_delay(HW_SRC_ID id)
262 {
263  return(HW_PDM_SRC_REG_GETF(id, CTRL, SRC_PDM_DO_DEL));
264 }
265 
288 {
289  return(HW_PDM_SRC_REG_GETF(id, CTRL, SRC_PDM_MODE));
290 }
291 
298 __STATIC_INLINE HW_PDM_MODE hw_pdm_get_mode(void)
299 {
300 
301  return(HW_PDM_CRG_REG_GETF(DIV, PDM_MASTER_MODE));
302 }
303 
310 __STATIC_INLINE bool hw_pdm_get_status(void)
311 {
312  uint32_t pdm_div_reg = CRG_AUD->PDM_DIV_REG;
313 
314  if (pdm_div_reg & REG_MSK(CRG_AUD, PDM_DIV_REG, PDM_MASTER_MODE)) {
315  return true;
316  }
317 
318  return(!!(pdm_div_reg & REG_MSK(CRG_AUD, PDM_DIV_REG, CLK_PDM_EN)));
319 }
320 
327 __STATIC_INLINE uint8_t hw_pdm_get_clk_div(void) {
328 
329  return(HW_PDM_CRG_REG_GETF(DIV, PDM_DIV));
330 }
331 
340 __STATIC_INLINE bool hw_pdm_get_in_channel_swap(HW_SRC_ID id)
341 {
342  return(HW_SRC_REG_GETF(id, SRC1, CTRL_REG, SRC_PDM_IN_INV));
343 }
344 
351 __STATIC_INLINE bool hw_pdm_get_out_channel_swap(HW_SRC_ID id)
352 {
353  return(HW_PDM_SRC_REG_GETF(id, CTRL, SRC_PDM_OUT_INV));
354 }
355 
362 __STATIC_INLINE void hw_pdm_enable(void)
363 {
364  HW_PDM_CRG_REG_SET_BIT(DIV, CLK_PDM_EN);
365 }
366 
372 __STATIC_INLINE void hw_pdm_disable(void)
373 {
374  HW_PDM_CRG_REG_CLR_BIT(DIV, CLK_PDM_EN);
375 }
376 
388 __STATIC_INLINE void hw_pdm_set_input_delay(HW_SRC_ID id, HW_PDM_DI_DELAY delay)
389 {
390  HW_PDM_SRC_REG_SETF(id, CTRL, SRC_PDM_DI_DEL, delay);
391 }
392 
404 __STATIC_INLINE void hw_pdm_set_output_delay(HW_SRC_ID id, HW_PDM_DO_DELAY delay)
405 {
406  HW_PDM_SRC_REG_SETF(id, CTRL, SRC_PDM_DO_DEL, delay);
407 }
408 
429 __STATIC_INLINE void hw_pdm_set_output_channel_config(HW_SRC_ID id, HW_PDM_CHANNEL_CONFIG channel_conf)
430 {
431  HW_PDM_SRC_REG_SETF(id, CTRL, SRC_PDM_MODE, channel_conf);
432 }
433 
440 __STATIC_INLINE void hw_pdm_set_mode(HW_PDM_MODE mode)
441 {
442  HW_PDM_CRG_REG_SETF(DIV, PDM_MASTER_MODE, mode);
443 }
444 
452 __STATIC_INLINE void hw_pdm_set_in_channel_swap(HW_SRC_ID id, bool swap)
453 {
454  if (swap == true) {
455  HW_PDM_SRC_REG_SET_BIT(id, CTRL, SRC_PDM_IN_INV);
456  } else {
457  HW_PDM_SRC_REG_CLR_BIT(id, CTRL, SRC_PDM_IN_INV);
458  }
459 }
460 
468 __STATIC_INLINE void hw_pdm_set_out_channel_swap(HW_SRC_ID id, bool swap)
469 {
470  if (swap == true) {
471  HW_PDM_SRC_REG_SET_BIT(id, CTRL, SRC_PDM_OUT_INV);
472  } else {
473  HW_PDM_SRC_REG_CLR_BIT(id, CTRL, SRC_PDM_OUT_INV);
474  }
475 }
476 
484 __STATIC_INLINE void hw_pdm_set_pdm_output_mux(HW_PDM_MUX_OUT output)
485 {
486  // Set PDM_MUX_OUT field in SRC2 MUX register
487  REG_SETF(SRC2, SRC2_MUX_REG, PDM_MUX_OUT, output);
488 }
489 
498 {
499  // Get HW_PDM_MUX_OUT field in SRC2 MUX register
500  return(REG_GETF(SRC2, SRC2_MUX_REG, PDM_MUX_OUT));
501 }
502 
511 uint32_t hw_pdm_clk_init(uint32_t frequency);
512 
521 void hw_pdm_init(HW_SRC_ID id, hw_pdm_config_t *config);
522 #endif /* dg_configUSE_HW_PDM */
523 #endif /* HW_PDM_H_ */
524 
hw_pdm_get_mode
__STATIC_INLINE HW_PDM_MODE hw_pdm_get_mode(void)
Get PDM Master/Slave mode.
Definition: hw_pdm.h:298
REG_SETF
#define REG_SETF(base, reg, field, new_val)
Set the value of a register field.
Definition: sdk_defs.h:738
HW_PDM_CHANNEL_LR
Definition: hw_pdm.h:203
HW_PDM_MODE
HW_PDM_MODE
PDM Master/Slave mode.
Definition: hw_pdm.h:168
hw_pdm_get_clk_div
__STATIC_INLINE uint8_t hw_pdm_get_clk_div(void)
Get PDM clock divider.
Definition: hw_pdm.h:327
hw_pdm_set_in_channel_swap
__STATIC_INLINE void hw_pdm_set_in_channel_swap(HW_SRC_ID id, bool swap)
Swap left and right channel on the PDM input source.
Definition: hw_pdm.h:452
HW_PDM_CHANNEL_CONFIG
HW_PDM_CHANNEL_CONFIG
PDM output channel configuration.
Definition: hw_pdm.h:199
hw_pdm_set_output_delay
__STATIC_INLINE void hw_pdm_set_output_delay(HW_SRC_ID id, HW_PDM_DO_DELAY delay)
Set output delay in PDM interface.
Definition: hw_pdm.h:404
HW_PDM_CHANNEL_R
Definition: hw_pdm.h:201
HW_PDM_MUX_OUT
HW_PDM_MUX_OUT
PDM output multiplexer.
Definition: hw_pdm.h:210
hw_pdm_config_t
PDM interface mode configuration.
Definition: hw_pdm.h:218
HW_PDM_MUX_OUT_SRC2
Definition: hw_pdm.h:212
hw_pdm_set_output_channel_config
__STATIC_INLINE void hw_pdm_set_output_channel_config(HW_SRC_ID id, HW_PDM_CHANNEL_CONFIG channel_conf)
Set PDM output channel configuration applicable only for SRC1, APU.
Definition: hw_pdm.h:429
HW_PDM_CHANNEL_L
Definition: hw_pdm.h:202
HW_PDM_DO_NO_DELAY
Definition: hw_pdm.h:189
hw_pdm_set_out_channel_swap
__STATIC_INLINE void hw_pdm_set_out_channel_swap(HW_SRC_ID id, bool swap)
Swap left and right channel on the PDM output source.
Definition: hw_pdm.h:468
sdk_defs.h
Central include header file with platform definitions.
HW_PDM_DO_DELAY
HW_PDM_DO_DELAY
PDM output delay.
Definition: hw_pdm.h:188
hw_pdm_set_input_delay
__STATIC_INLINE void hw_pdm_set_input_delay(HW_SRC_ID id, HW_PDM_DI_DELAY delay)
Set input delay in PDM interface.
Definition: hw_pdm.h:388
HW_PDM_SRC_REG_GETF
#define HW_PDM_SRC_REG_GETF(id, reg, field)
Get the value of a field of a PDM register.
Definition: hw_pdm.h:124
hw_pdm_init
void hw_pdm_init(HW_SRC_ID id, hw_pdm_config_t *config)
Initialize PDM interface.
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_pdm_set_pdm_output_mux
__STATIC_INLINE void hw_pdm_set_pdm_output_mux(HW_PDM_MUX_OUT output)
Set output for the PDM_MUX_OUT multiplexer.
Definition: hw_pdm.h:484
HW_PDM_CRG_REG_SETF
#define HW_PDM_CRG_REG_SETF(reg, field, val)
Set the value of a field of a PDM register.
Definition: hw_pdm.h:96
HW_PDM_DO_16_NS_DELAY
Definition: hw_pdm.h:192
hw_pdm_get_pdm_output_mux
__STATIC_INLINE HW_PDM_MUX_OUT hw_pdm_get_pdm_output_mux(void)
Get output for the PDM_MUX_OUT multiplexer.
Definition: hw_pdm.h:497
hw_pdm_enable
__STATIC_INLINE void hw_pdm_enable(void)
Enable PDM block system clock source used only for Master mode.
Definition: hw_pdm.h:362
HW_PDM_CRG_REG_SET_BIT
#define HW_PDM_CRG_REG_SET_BIT(reg, field)
Set a bit of a PDM register.
Definition: hw_pdm.h:104
hw_src.h
Definition of the API for the Audio Unit SRC Low Level Driver.
hw_pdm_disable
__STATIC_INLINE void hw_pdm_disable(void)
Disable PDM block system clock source.
Definition: hw_pdm.h:372
hw_pdm_get_in_channel_swap
__STATIC_INLINE bool hw_pdm_get_in_channel_swap(HW_SRC_ID id)
Get the status of swap of the channels on the PDM input source.
Definition: hw_pdm.h:340
HW_PDM_DO_12_NS_DELAY
Definition: hw_pdm.h:191
HW_PDM_SLAVE_MODE
Definition: hw_pdm.h:169
hw_pdm_get_status
__STATIC_INLINE bool hw_pdm_get_status(void)
Get PDM status. Supported only for Master mode.
Definition: hw_pdm.h:310
HW_PDM_DI_8_NS_DELAY
Definition: hw_pdm.h:180
REG_MSK
#define REG_MSK(base, reg, field)
Access register field mask.
Definition: sdk_defs.h:583
mode
HW_GPIO_MODE mode
Definition: hw_gpio.h:211
hw_pdm_config_t::output_channel
HW_PDM_CHANNEL_CONFIG output_channel
Definition: hw_pdm.h:223
HW_PDM_DI_4_NS_DELAY
Definition: hw_pdm.h:179
hw_pdm_config_t::swap_channel
bool swap_channel
Definition: hw_pdm.h:224
HW_PDM_DI_DELAY
HW_PDM_DI_DELAY
PDM input delay.
Definition: hw_pdm.h:177
HW_PDM_SRC_REG_SET_BIT
#define HW_PDM_SRC_REG_SET_BIT(id, reg, field)
Set a bit of a PDM register.
Definition: hw_pdm.h:144
hw_pdm_get_out_channel_swap
__STATIC_INLINE bool hw_pdm_get_out_channel_swap(HW_SRC_ID id)
Get the status of swap of the channels on the PDM output source.
Definition: hw_pdm.h:351
hw_pdm_get_input_delay
__STATIC_INLINE HW_PDM_DI_DELAY hw_pdm_get_input_delay(HW_SRC_ID id)
Get input delay in PDM interface.
Definition: hw_pdm.h:246
hw_pdm_get_output_delay
__STATIC_INLINE HW_PDM_DO_DELAY hw_pdm_get_output_delay(HW_SRC_ID id)
Get output delay in PDM interface.
Definition: hw_pdm.h:261
hw_pdm_config_t::clk_frequency
uint32_t clk_frequency
Definition: hw_pdm.h:226
HW_PDM_SRC_REG_CLR_BIT
#define HW_PDM_SRC_REG_CLR_BIT(id, reg, field)
Clear a bit of a PDM register.
Definition: hw_pdm.h:153
REG_GETF
#define REG_GETF(base, reg, field)
Return the value of a register field.
Definition: sdk_defs.h:711
HW_PDM_DI_12_NS_DELAY
Definition: hw_pdm.h:181
HW_PDM_MUX_OUT_SRC1
Definition: hw_pdm.h:211
HW_PDM_CHANNEL_NONE
Definition: hw_pdm.h:200
HW_PDM_MASTER_MODE
Definition: hw_pdm.h:170
hw_pdm_config_t::out_delay
HW_PDM_DO_DELAY out_delay
Definition: hw_pdm.h:222
HW_PDM_DO_8_NS_DELAY
Definition: hw_pdm.h:190
hw_pdm_config_t::data_direction
HW_PDM_DATA_DIRECTION data_direction
Definition: hw_pdm.h:231
HW_PDM_CRG_REG_CLR_BIT
#define HW_PDM_CRG_REG_CLR_BIT(reg, field)
Clear a bit of a PDM register.
Definition: hw_pdm.h:112
HW_PDM_SRC_REG_SETF
#define HW_PDM_SRC_REG_SETF(id, reg, field, val)
Set the value of a field of a PDM register.
Definition: hw_pdm.h:135
HW_PDM_CRG_REG_GETF
#define HW_PDM_CRG_REG_GETF(reg, field)
Get the value of a field of a PDM register.
Definition: hw_pdm.h:86
HW_PDM_DI_NO_DELAY
Definition: hw_pdm.h:178
hw_pdm_config_t::in_delay
HW_PDM_DI_DELAY in_delay
Definition: hw_pdm.h:221
hw_pdm_config_t::config_mode
HW_PDM_MODE config_mode
Definition: hw_pdm.h:220
hw_pdm_get_output_channel_config
__STATIC_INLINE HW_PDM_CHANNEL_CONFIG hw_pdm_get_output_channel_config(HW_SRC_ID id)
Get PDM output channel configuration.
Definition: hw_pdm.h:287
hw_pdm_set_mode
__STATIC_INLINE void hw_pdm_set_mode(HW_PDM_MODE mode)
Set PDM Master/Slave mode.
Definition: hw_pdm.h:440
HW_PDM_DATA_DIRECTION
HW_PDM_DATA_DIRECTION
PDM data direction.
Definition: hw_pdm.h:159
hw_pdm_clk_init
uint32_t hw_pdm_clk_init(uint32_t frequency)
Initialize PDM clock.