HPM SDK
HPMicro Software Development Kit
hpm_pdmlite_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2025 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_PDMLITE_DRV_H
9 #define HPM_PDMLITE_DRV_H
10 
11 #include "hpm_common.h"
12 #include "hpm_pdmlite_regs.h"
13 
24 #define PDM_EVENT_OFIFO_OVERFLOW_ERROR (PDM_ST_OFIFO_OVFL_ERR_MASK)
25 #define PDM_EVENT_CIC_OVERLOAD_ERROR (PDM_ST_CIC_OVLD_ERR_MASK)
26 #define PDM_EVENT_CIC_SAT_ERROR (PDM_ST_CIC_SAT_ERR_MASK)
27 
31 #define PDM_CIC_SIGMA_DELTA_ORDER_5 (2U)
32 #define PDM_CIC_SIGMA_DELTA_ORDER_6 (1U)
33 #define PDM_CIC_SIGMA_DELTA_ORDER_7 (0U)
34 
38 typedef struct pdm_config {
39  bool sof_at_ref_clk_falling_edge; /* sof at ref clk falling edge */
40  bool bypass_pdm_clk_div; /* bypass PDM clock divider */
41  bool enable_pdm_clk_out; /* enable PDM clock output */
42  uint8_t pdm_clk_div; /* PDM clock divider */
43  uint8_t capture_delay; /* adjust capture timing */
44  uint8_t post_scale; /* cic post scale */
45  uint8_t sigma_delta_order; /* cic sigma_delta filter order */
46  uint8_t cic_dec_ratio; /* cic decimation rate */
48 
49 #ifdef __cplusplus
50 extern "C" {
51 #endif
52 
59 static inline bool pdm_is_running(PDMLITE_Type *ptr)
60 {
61  return ptr->RUN & PDMLITE_RUN_PDM_EN_MASK;
62 }
63 
69 static inline void pdm_stop(PDMLITE_Type *ptr)
70 {
72 }
73 
79 static inline void pdm_start(PDMLITE_Type *ptr)
80 {
82 }
83 
90 static inline void pdm_disable_channel(PDMLITE_Type *ptr,
91  uint16_t channel_disable_mask)
92 {
93  ptr->CH_CTRL &= ~PDMLITE_CH_CTRL_CH_EN_SET(channel_disable_mask);
94 }
95 
103 static inline void pdm_enable_channel(PDMLITE_Type *ptr,
104  uint16_t capture_high_level_mask,
105  uint16_t channel_enable_mask)
106 {
107  ptr->CH_CTRL |= PDMLITE_CH_CTRL_CH_POL_SET(capture_high_level_mask)
108  | PDMLITE_CH_CTRL_CH_EN_SET(channel_enable_mask);
109 }
110 
116 static inline void pdm_disable_pdm_clock_out(PDMLITE_Type *ptr)
117 {
119 }
120 
126 static inline void pdm_enable_pdm_clock_out(PDMLITE_Type *ptr)
127 {
129 }
130 
139 static inline void pdm_config_cic(PDMLITE_Type *ptr,
140  uint8_t sigma_delta_order,
141  uint8_t dec_ratio,
142  uint8_t post_scale)
143 {
144  ptr->CIC_CFG = PDMLITE_CIC_CFG_POST_SCALE_SET(post_scale)
145  | PDMLITE_CIC_CFG_SGD_SET(sigma_delta_order)
147 }
148 
154 static inline void pdm_software_reset(PDMLITE_Type *ptr)
155 {
158 }
159 
166 static inline void pdm_enable_irq(PDMLITE_Type *ptr, uint8_t mask)
167 {
169 }
170 
177 static inline void pdm_disable_irq(PDMLITE_Type *ptr, uint8_t mask)
178 {
180 }
181 
190 
200 
212 hpm_stat_t pdm_config_sample_rate(PDMLITE_Type *ptr, uint32_t mclk_in_hz, uint32_t sample_rate_hz);
213 
221 static inline void pdm_config_divider(PDMLITE_Type *ptr, uint8_t div, bool bypass)
222 {
223  assert((div >= 1U) && (div <= 15U));
226 }
227 
232 #ifdef __cplusplus
233 }
234 #endif
235 
236 #endif /* HPM_PDMLITE_DRV_H */
237 
#define PDMLITE_CTRL_PDM_CLK_HFDIV_MASK
Definition: hpm_pdmlite_regs.h:96
#define PDMLITE_CIC_CFG_SGD_SET(x)
Definition: hpm_pdmlite_regs.h:197
#define PDMLITE_ST_CIC_SAT_ERR_SHIFT
Definition: hpm_pdmlite_regs.h:171
#define PDMLITE_CTRL_PDM_CLK_DIV_BYPASS_MASK
Definition: hpm_pdmlite_regs.h:106
#define PDMLITE_CTRL_PDM_CLK_DIV_BYPASS_SET(x)
Definition: hpm_pdmlite_regs.h:108
#define PDMLITE_CH_CTRL_CH_EN_SET(x)
Definition: hpm_pdmlite_regs.h:141
#define PDMLITE_CTRL_PDM_CLK_OE_MASK
Definition: hpm_pdmlite_regs.h:116
#define PDMLITE_CIC_CFG_POST_SCALE_SET(x)
Definition: hpm_pdmlite_regs.h:183
#define PDMLITE_RUN_PDM_EN_MASK
Definition: hpm_pdmlite_regs.h:216
#define PDMLITE_CIC_CFG_CIC_DEC_RATIO_SET(x)
Definition: hpm_pdmlite_regs.h:207
#define PDMLITE_CTRL_PDM_CLK_HFDIV_SET(x)
Definition: hpm_pdmlite_regs.h:98
#define PDMLITE_CTRL_CIC_SAT_ERR_IE_SHIFT
Definition: hpm_pdmlite_regs.h:73
#define PDMLITE_CH_CTRL_CH_POL_SET(x)
Definition: hpm_pdmlite_regs.h:129
#define PDMLITE_CTRL_SFTRST_MASK
Definition: hpm_pdmlite_regs.h:29
uint32_t hpm_stat_t
Definition: hpm_common.h:135
static void pdm_disable_pdm_clock_out(PDMLITE_Type *ptr)
disable pdm clock out
Definition: hpm_pdmlite_drv.h:116
static void pdm_config_divider(PDMLITE_Type *ptr, uint8_t div, bool bypass)
pdm config clock divider
Definition: hpm_pdmlite_drv.h:221
static void pdm_disable_channel(PDMLITE_Type *ptr, uint16_t channel_disable_mask)
disable channel
Definition: hpm_pdmlite_drv.h:90
static void pdm_enable_irq(PDMLITE_Type *ptr, uint8_t mask)
pdm enable irq
Definition: hpm_pdmlite_drv.h:166
static void pdm_start(PDMLITE_Type *ptr)
start pdm
Definition: hpm_pdmlite_drv.h:79
hpm_stat_t pdm_config_sample_rate(PDMLITE_Type *ptr, uint32_t mclk_in_hz, uint32_t sample_rate_hz)
pdm config sample rate
Definition: hpm_pdmlite_drv.c:82
static void pdm_enable_pdm_clock_out(PDMLITE_Type *ptr)
enable pdm clock out
Definition: hpm_pdmlite_drv.h:126
struct pdm_config pdm_config_t
PDM config.
hpm_stat_t pdm_init(PDMLITE_Type *ptr, pdm_config_t *config)
pdm initialization
Definition: hpm_pdmlite_drv.c:31
static bool pdm_is_running(PDMLITE_Type *ptr)
check whether PDM is running
Definition: hpm_pdmlite_drv.h:59
static void pdm_disable_irq(PDMLITE_Type *ptr, uint8_t mask)
pdm disable irq
Definition: hpm_pdmlite_drv.h:177
static void pdm_stop(PDMLITE_Type *ptr)
stop pdm
Definition: hpm_pdmlite_drv.h:69
static void pdm_config_cic(PDMLITE_Type *ptr, uint8_t sigma_delta_order, uint8_t dec_ratio, uint8_t post_scale)
pdm config cic
Definition: hpm_pdmlite_drv.h:139
static void pdm_enable_channel(PDMLITE_Type *ptr, uint16_t capture_high_level_mask, uint16_t channel_enable_mask)
enable channel
Definition: hpm_pdmlite_drv.h:103
void pdm_get_default_config(PDMLITE_Type *ptr, pdm_config_t *config)
pdm get default config
Definition: hpm_pdmlite_drv.c:18
static void pdm_software_reset(PDMLITE_Type *ptr)
pdm software reset
Definition: hpm_pdmlite_drv.h:154
Definition: hpm_pdmlite_regs.h:12
__RW uint32_t CIC_CFG
Definition: hpm_pdmlite_regs.h:17
__RW uint32_t CH_CTRL
Definition: hpm_pdmlite_regs.h:14
__RW uint32_t CTRL
Definition: hpm_pdmlite_regs.h:13
__RW uint32_t RUN
Definition: hpm_pdmlite_regs.h:19
PDM config.
Definition: hpm_pdm_drv.h:39
bool enable_pdm_clk_out
Definition: hpm_pdm_drv.h:42
bool bypass_pdm_clk_div
Definition: hpm_pdm_drv.h:41
uint8_t sigma_delta_order
Definition: hpm_pdm_drv.h:48
uint8_t cic_dec_ratio
Definition: hpm_pdm_drv.h:49
uint8_t post_scale
Definition: hpm_pdm_drv.h:47
uint8_t pdm_clk_div
Definition: hpm_pdm_drv.h:44
uint8_t capture_delay
Definition: hpm_pdm_drv.h:45
bool sof_at_ref_clk_falling_edge
Definition: hpm_pdm_drv.h:40