HPM SDK
HPMicro Software Development Kit
hpm_pdm_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_PDM_DRV_H
9 #define HPM_PDM_DRV_H
10 
11 #include "hpm_common.h"
12 #include "hpm_pdm_regs.h"
13 
24 #define PDM_EVENT_FILT_CRX_ERROR (PDM_ST_FILT_CRX_ERR_MASK)
25 #define PDM_EVENT_OFIFO_OVERFLOW_ERROR (PDM_ST_OFIFO_OVFL_ERR_MASK)
26 #define PDM_EVENT_CIC_OVERLOAD_ERROR (PDM_ST_CIC_OVLD_ERR_MASK)
27 #define PDM_EVENT_CIC_SAT_ERROR (PDM_ST_CIC_SAT_ERR_MASK)
28 
32 #define PDM_CIC_SIGMA_DELTA_ORDER_5 (2U)
33 #define PDM_CIC_SIGMA_DELTA_ORDER_6 (1U)
34 #define PDM_CIC_SIGMA_DELTA_ORDER_7 (0U)
35 
39 typedef struct pdm_config {
43  bool enable_hpf;
44  uint8_t pdm_clk_div;
45  uint8_t capture_delay;
46  uint8_t dec_after_cic;
47  uint8_t post_scale;
49  uint8_t cic_dec_ratio;
51 
52 #ifdef __cplusplus
53 extern "C" {
54 #endif
55 
63 static inline void pdm_config_hpf(PDM_Type *ptr,
64  uint32_t hpf_coef_ma,
65  uint32_t hpf_coef_b)
66 {
67  ptr->HPF_MA = PDM_HPF_MA_COEF_SET(hpf_coef_ma);
68  ptr->HPF_B = PDM_HPF_B_COEF_SET(hpf_coef_b);
69 }
70 
76 static inline void pdm_enable_hpf(PDM_Type *ptr)
77 {
78  ptr->CTRL |= PDM_CTRL_HPF_EN_MASK;
79 }
80 
86 static inline void pdm_disable_hpf(PDM_Type *ptr)
87 {
88  ptr->CTRL &= ~PDM_CTRL_HPF_EN_MASK;
89 }
90 
97 static inline bool pdm_is_running(PDM_Type *ptr)
98 {
99  return ptr->RUN & PDM_RUN_PDM_EN_MASK;
100 }
101 
107 static inline void pdm_stop(PDM_Type *ptr)
108 {
109  ptr->RUN &= ~PDM_RUN_PDM_EN_MASK;
110 }
111 
117 static inline void pdm_start(PDM_Type *ptr)
118 {
119  ptr->RUN |= PDM_RUN_PDM_EN_MASK;
120 }
121 
128 static inline void pdm_disable_channel(PDM_Type *ptr,
129  uint16_t channel_disable_mask)
130 {
131  ptr->CH_CTRL &= ~PDM_CH_CTRL_CH_EN_SET(channel_disable_mask);
132 }
133 
141 static inline void pdm_enable_channel(PDM_Type *ptr,
142  uint16_t capture_high_level_mask,
143  uint16_t channel_enable_mask)
144 {
145  ptr->CH_CTRL |= PDM_CH_CTRL_CH_POL_SET(capture_high_level_mask)
146  | PDM_CH_CTRL_CH_EN_SET(channel_enable_mask);
147 }
148 
154 static inline void pdm_disable_pdm_clock_out(PDM_Type *ptr)
155 {
157 }
158 
164 static inline void pdm_enable_pdm_clock_out(PDM_Type *ptr)
165 {
167 }
168 
177 static inline void pdm_config_cic(PDM_Type *ptr,
178  uint8_t sigma_delta_order,
179  uint8_t div,
180  uint8_t post_scale)
181 {
182  ptr->CIC_CFG = PDM_CIC_CFG_POST_SCALE_SET(post_scale)
183  | PDM_CIC_CFG_SGD_SET(sigma_delta_order)
185 }
186 
192 static inline void pdm_software_reset(PDM_Type *ptr)
193 {
194  ptr->CTRL |= PDM_CTRL_SFTRST_MASK;
195  ptr->CTRL &= ~PDM_CTRL_SFTRST_MASK;
196 }
197 
204 static inline void pdm_enable_irq(PDM_Type *ptr, uint8_t mask)
205 {
207 }
208 
215 static inline void pdm_disable_irq(PDM_Type *ptr, uint8_t mask)
216 {
218 }
219 
228 
235 void pdm_get_default_config(PDM_Type *ptr, pdm_config_t *config);
236 
241 #ifdef __cplusplus
242 }
243 #endif
244 
245 #endif /* HPM_PDM_DRV_H */
246 
#define PDM_CIC_CFG_POST_SCALE_SET(x)
Definition: hpm_pdm_regs.h:333
#define PDM_CTRL_CIC_SAT_ERR_IE_SHIFT
Definition: hpm_pdm_regs.h:99
#define PDM_CH_CTRL_CH_POL_SET(x)
Definition: hpm_pdm_regs.h:175
#define PDM_CTRL_PDM_CLK_OE_MASK
Definition: hpm_pdm_regs.h:152
#define PDM_CIC_CFG_SGD_SET(x)
Definition: hpm_pdm_regs.h:347
#define PDM_CIC_CFG_CIC_DEC_RATIO_SET(x)
Definition: hpm_pdm_regs.h:357
#define PDM_CTRL_HPF_EN_MASK
Definition: hpm_pdm_regs.h:162
#define PDM_CH_CTRL_CH_EN_SET(x)
Definition: hpm_pdm_regs.h:187
#define PDM_CTRL_SFTRST_MASK
Definition: hpm_pdm_regs.h:35
#define PDM_ST_CIC_SAT_ERR_SHIFT
Definition: hpm_pdm_regs.h:227
#define PDM_HPF_B_COEF_SET(x)
Definition: hpm_pdm_regs.h:486
#define PDM_RUN_PDM_EN_MASK
Definition: hpm_pdm_regs.h:439
#define PDM_HPF_MA_COEF_SET(x)
Definition: hpm_pdm_regs.h:475
uint32_t hpm_stat_t
Definition: hpm_common.h:123
static void pdm_enable_channel(PDM_Type *ptr, uint16_t capture_high_level_mask, uint16_t channel_enable_mask)
enable channel
Definition: hpm_pdm_drv.h:141
static void pdm_enable_hpf(PDM_Type *ptr)
enable high pass filter
Definition: hpm_pdm_drv.h:76
static void pdm_disable_pdm_clock_out(PDM_Type *ptr)
disable pdm clock out
Definition: hpm_pdm_drv.h:154
static void pdm_stop(PDM_Type *ptr)
stop pdm
Definition: hpm_pdm_drv.h:107
static void pdm_disable_channel(PDM_Type *ptr, uint16_t channel_disable_mask)
disable channel
Definition: hpm_pdm_drv.h:128
static void pdm_enable_irq(PDM_Type *ptr, uint8_t mask)
pdm enable irq
Definition: hpm_pdm_drv.h:204
static void pdm_config_hpf(PDM_Type *ptr, uint32_t hpf_coef_ma, uint32_t hpf_coef_b)
config high pass filter
Definition: hpm_pdm_drv.h:63
static void pdm_config_cic(PDM_Type *ptr, uint8_t sigma_delta_order, uint8_t div, uint8_t post_scale)
pdm config cic
Definition: hpm_pdm_drv.h:177
struct pdm_config pdm_config_t
PDM config.
hpm_stat_t pdm_init(PDM_Type *ptr, pdm_config_t *config)
pdm initialization
Definition: hpm_pdm_drv.c:25
static void pdm_disable_hpf(PDM_Type *ptr)
disable high pass filter
Definition: hpm_pdm_drv.h:86
static void pdm_enable_pdm_clock_out(PDM_Type *ptr)
enable pdm clock out
Definition: hpm_pdm_drv.h:164
void pdm_get_default_config(PDM_Type *ptr, pdm_config_t *config)
pdm get default config
Definition: hpm_pdm_drv.c:10
static void pdm_start(PDM_Type *ptr)
start pdm
Definition: hpm_pdm_drv.h:117
static void pdm_disable_irq(PDM_Type *ptr, uint8_t mask)
pdm disable irq
Definition: hpm_pdm_drv.h:215
static bool pdm_is_running(PDM_Type *ptr)
check whether PDM is running
Definition: hpm_pdm_drv.h:97
static void pdm_software_reset(PDM_Type *ptr)
pdm software reset
Definition: hpm_pdm_drv.h:192
Definition: hpm_pdm_regs.h:12
__RW uint32_t CH_CTRL
Definition: hpm_pdm_regs.h:14
__RW uint32_t HPF_MA
Definition: hpm_pdm_regs.h:24
__RW uint32_t HPF_B
Definition: hpm_pdm_regs.h:25
__RW uint32_t RUN
Definition: hpm_pdm_regs.h:21
__RW uint32_t CIC_CFG
Definition: hpm_pdm_regs.h:17
__RW uint32_t CTRL
Definition: hpm_pdm_regs.h:13
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
bool enable_hpf
Definition: hpm_pdm_drv.h:43
uint8_t capture_delay
Definition: hpm_pdm_drv.h:45
bool sof_at_ref_clk_falling_edge
Definition: hpm_pdm_drv.h:40
uint8_t dec_after_cic
Definition: hpm_pdm_drv.h:46