HPM SDK
HPMicro Software Development Kit
hpm_sdm_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2022 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_SDM_DRV_H
9 #define HPM_SDM_DRV_H
10 
11 #include "hpm_common.h"
12 #include "hpm_sdm_regs.h"
13 
21 /* defined channel mask macro */
22 #define SAMPLING_MODE_MASK (0x7U)
23 #define CHN_SAMPLING_MODE_SHIFT(ch) ((ch) * 3U + SDM_CTRL_CHMD_SHIFT)
24 #define CHN_SAMPLING_MODE_MASK(ch) (SAMPLING_MODE_MASK << CHN_SAMPLING_MODE_SHIFT(ch))
25 
26 #define CH0_EN_MASK (0x1U << SDM_CTRL_CH_EN_SHIFT)
27 #define CHN_EN_MASK(ch) (CH0_EN_MASK << (ch))
28 
29 #define CHN_ERR_MASK(ch) (SDM_INT_EN_CH0ERR_MASK << (ch))
30 #define CHN_DRY_MASK(ch) (SDM_INT_EN_CH0DRY_MASK << (ch))
31 
32 typedef enum {
40 
41 typedef enum {
47 
48 typedef struct {
49  uint8_t clk_signal_sync; /* clk sync for channel */
50  uint8_t data_signal_sync; /* data sync for channel */
53 
54 typedef struct {
55  uint8_t sampling_mode;
59 
60 typedef struct {
61  uint16_t high_threshold;
63  uint16_t low_threshold;
64 
69  uint8_t filter_type;
72  bool enable;
74 
75 typedef struct {
76  uint8_t fifo_threshold;
79  uint8_t wdg_threshold :8;
80  uint8_t en_af_int :1;
83  uint8_t en_data_ready_int :1;
84  uint8_t sync_source :6;
85  uint8_t fifo_clean_on_sync :1;
86  uint8_t wtsynaclr :1;
87  uint8_t wtsynmclr :1;
88  uint8_t wtsyncen :1;
89  uint8_t output_32bit :1;
91  uint8_t enable :1;
92 
93  uint8_t filter_type;
95  uint8_t output_offset;
96  uint16_t oversampling_rate;
99 
100 typedef struct {
101  uint32_t count;
102  uint8_t *buff;
103  uint8_t data_len_in_bytes; /* 16bit-2 32bit-4 */
106 
107 typedef enum {
114 
115 typedef enum {
125 
126 typedef enum {
132 
133 #ifdef __cplusplus
134 extern "C" {
135 #endif
136 
143 static inline void sdm_enable_module_interrupt(SDM_Type *ptr, bool enable)
144 {
145  if (enable) {
146  ptr->CTRL |= SDM_CTRL_IE_MASK;
147  } else {
148  ptr->CTRL &= ~SDM_CTRL_IE_MASK;
149  }
150 }
151 
159 static inline void sdm_enable_channel(SDM_Type *ptr, uint8_t ch_index, bool enable)
160 {
161  if (enable) {
162  ptr->CTRL |= CHN_EN_MASK(ch_index);
163  } else {
164  ptr->CTRL &= ~CHN_EN_MASK(ch_index);
165  }
166 }
167 
176 static inline void sdm_enable_channel_by_mask(SDM_Type *ptr, uint32_t ch_mask)
177 {
178  ptr->CTRL = (ptr->CTRL & (~SDM_CTRL_CH_EN_MASK)) | ch_mask;
179 }
180 
188 static inline void sdm_set_channel_sampling_mode(SDM_Type *ptr, uint8_t ch_index, sdm_sampling_mode_t mode)
189 {
190  ptr->CTRL &= ~CHN_SAMPLING_MODE_MASK(ch_index);
191  ptr->CTRL |= mode << (SDM_CTRL_CHMD_SHIFT + ch_index);
192 }
193 
200 static inline void sdm_enable_channel_interrupt(SDM_Type *ptr, uint32_t mask)
201 {
202  ptr->INT_EN |= mask;
203 }
204 
211 static inline uint32_t sdm_get_status(SDM_Type *ptr)
212 {
213  return ptr->STATUS;
214 }
215 
224 static inline bool sdm_get_channel_data_ready_status(SDM_Type *ptr, uint8_t ch)
225 {
226  return (((ptr->STATUS) & CHN_DRY_MASK(ch)) == CHN_DRY_MASK(ch));
227 }
228 
237 static inline bool sdm_get_channel_data_error_status(SDM_Type *ptr, uint8_t ch)
238 {
239  return (((ptr->STATUS) & CHN_ERR_MASK(ch)) == CHN_ERR_MASK(ch));
240 }
241 
249 static inline void sdm_set_ch_fifo_threshold(SDM_Type *ptr, uint8_t ch, uint8_t threshold)
250 {
251  ptr->CH[ch].SDFIFOCTRL = SDM_CH_SDFIFOCTRL_THRSH_SET(threshold);
252 }
253 
261 static inline uint8_t sdm_get_ch_fifo_threshold(SDM_Type *ptr, uint8_t ch)
262 {
263  return (uint8_t)(SDM_CH_SDFIFOCTRL_THRSH_GET(ptr->CH[ch].SDFIFOCTRL));
264 }
265 
273 static inline uint32_t sdm_get_channel_filter_status(SDM_Type *ptr, uint8_t ch)
274 {
275  return ptr->CH[ch].SDST;
276 }
277 
285 static inline uint8_t sdm_get_channel_fifo_data_count(SDM_Type *ptr, uint8_t ch)
286 {
287  return (uint8_t)(SDM_CH_SDST_FILL_GET(ptr->CH[ch].SDST));
288 }
289 
297 static inline int32_t sdm_get_channel_fifo_data(SDM_Type *ptr, uint8_t ch)
298 {
299  return ptr->CH[ch].SDFIFO;
300 }
301 
309 static inline uint8_t sdm_get_channel_clock_cycle_count(SDM_Type *ptr, uint8_t ch)
310 {
311  return (uint8_t)(SDM_CH_SDST_PERIOD_MCLK_GET(ptr->CH[ch].SDST));
312 }
313 
321 static inline uint16_t sdm_get_channel_comparator_data(SDM_Type *ptr, uint8_t ch)
322 {
323  return (uint16_t)(ptr->CH[ch].SCAMP);
324 }
325 
333 static inline void sdm_set_channel_comparator_high_threshold(SDM_Type *ptr, uint8_t ch, uint16_t value)
334 {
335  ptr->CH[ch].SCHTL = value;
336 }
337 
345 static inline void sdm_set_channel_comparator_zero_crossing_threshold(SDM_Type *ptr, uint8_t ch, uint16_t value)
346 {
347  ptr->CH[ch].SCHTLZ = value;
348 }
349 
357 static inline void sdm_set_channel_comparator_low_threshold(SDM_Type *ptr, uint8_t ch, uint16_t value)
358 {
359  ptr->CH[ch].SCLLT = value;
360 }
361 
369 static inline uint32_t sdm_get_channel_comparator_status(SDM_Type *ptr, uint8_t ch)
370 {
371  return ptr->CH[ch].SCST;
372 }
373 
381 
388 void sdm_init_module(SDM_Type *ptr, sdm_control_t *control);
389 
397 
405 void sdm_config_channel_common_setting(SDM_Type *ptr, uint8_t ch_index, sdm_channel_common_config_t *config);
406 
414 
422 void sdm_config_channel_filter(SDM_Type *ptr, uint8_t ch_index, sdm_filter_config_t *filter_config);
423 
431 
439 void sdm_config_channel_comparator(SDM_Type *ptr, uint8_t ch_index, sdm_comparator_config_t *cmp_config);
440 
451 hpm_stat_t sdm_receive_one_filter_data(SDM_Type *ptr, uint8_t ch_index, bool using_fifo, int8_t *data, uint8_t data_len_in_bytes);
452 
464 hpm_stat_t sdm_receive_filter_data(SDM_Type *ptr, uint8_t ch_index, bool using_fifo, int8_t *data, uint32_t count, uint8_t data_len_in_bytes);
465 
470 #ifdef __cplusplus
471 }
472 #endif
473 
474 #endif /* HPM_SDM_DRV_H */
475 
#define SDM_CH_SCST_CMPH_MASK
Definition: hpm_sdm_regs.h:835
#define SDM_INT_EN_CH3ERR_MASK
Definition: hpm_sdm_regs.h:153
#define SDM_CH_SDST_PERIOD_MCLK_GET(x)
Definition: hpm_sdm_regs.h:580
#define SDM_INT_EN_CH2ERR_MASK
Definition: hpm_sdm_regs.h:163
#define SDM_INT_EN_CH1DRY_MASK
Definition: hpm_sdm_regs.h:133
#define SDM_CH_SCST_HZ_MASK
Definition: hpm_sdm_regs.h:815
#define SDM_CH_SDST_FILL_GET(x)
Definition: hpm_sdm_regs.h:658
#define SDM_CTRL_CH_EN_MASK
Definition: hpm_sdm_regs.h:92
#define SDM_CH_SCST_MF_MASK
Definition: hpm_sdm_regs.h:825
#define SDM_CH_SDFIFOCTRL_THRSH_SET(x)
Definition: hpm_sdm_regs.h:282
#define SDM_CTRL_IE_MASK
Definition: hpm_sdm_regs.h:102
#define SDM_CTRL_CH_EN_SHIFT
Definition: hpm_sdm_regs.h:93
#define SDM_INT_EN_CH3DRY_MASK
Definition: hpm_sdm_regs.h:113
#define SDM_INT_EN_CH1ERR_MASK
Definition: hpm_sdm_regs.h:173
#define SDM_CTRL_CHMD_SHIFT
Definition: hpm_sdm_regs.h:63
#define SDM_INT_EN_CH2DRY_MASK
Definition: hpm_sdm_regs.h:123
#define SDM_CH_SCST_CMPL_MASK
Definition: hpm_sdm_regs.h:845
#define SDM_INT_EN_CH0ERR_MASK
Definition: hpm_sdm_regs.h:183
#define SDM_INT_EN_CH0DRY_MASK
Definition: hpm_sdm_regs.h:143
#define SDM_CH_SDFIFOCTRL_THRSH_GET(x)
Definition: hpm_sdm_regs.h:283
uint32_t hpm_stat_t
Definition: hpm_common.h:123
void sdm_init_module(SDM_Type *ptr, sdm_control_t *control)
sdm init module
Definition: hpm_sdm_drv.c:23
void sdm_get_channel_common_setting(SDM_Type *ptr, sdm_channel_common_config_t *config)
sdm get channel common setting
Definition: hpm_sdm_drv.c:34
static void sdm_enable_channel_interrupt(SDM_Type *ptr, uint32_t mask)
sdm enable channel interrupt
Definition: hpm_sdm_drv.h:200
void sdm_config_channel_common_setting(SDM_Type *ptr, uint8_t ch_index, sdm_channel_common_config_t *config)
sdm config channel's common setting
Definition: hpm_sdm_drv.c:42
void sdm_config_channel_comparator(SDM_Type *ptr, uint8_t ch_index, sdm_comparator_config_t *cmp_config)
sdm config channel comparator
Definition: hpm_sdm_drv.c:129
sdm_comparator_event_t
Definition: hpm_sdm_drv.h:107
sdm_filter_type_t
Definition: hpm_sdm_drv.h:41
static void sdm_set_ch_fifo_threshold(SDM_Type *ptr, uint8_t ch, uint8_t threshold)
sdm set channel's fifo threshold
Definition: hpm_sdm_drv.h:249
#define CHN_SAMPLING_MODE_MASK(ch)
Definition: hpm_sdm_drv.h:24
void sdm_get_default_module_control(SDM_Type *ptr, sdm_control_t *control)
sdm get default module control
Definition: hpm_sdm_drv.c:15
#define CHN_DRY_MASK(ch)
Definition: hpm_sdm_drv.h:30
sdm_sampling_mode_t
Definition: hpm_sdm_drv.h:32
#define CHN_ERR_MASK(ch)
Definition: hpm_sdm_drv.h:29
void sdm_get_channel_default_filter_config(SDM_Type *ptr, sdm_filter_config_t *filter_config)
sdm get channel default filter config
Definition: hpm_sdm_drv.c:56
static void sdm_enable_module_interrupt(SDM_Type *ptr, bool enable)
sdm enable module interrupt
Definition: hpm_sdm_drv.h:143
hpm_stat_t sdm_receive_one_filter_data(SDM_Type *ptr, uint8_t ch_index, bool using_fifo, int8_t *data, uint8_t data_len_in_bytes)
sdm receive one filter data
Definition: hpm_sdm_drv.c:146
static uint32_t sdm_get_channel_filter_status(SDM_Type *ptr, uint8_t ch)
sdm get channel filter status
Definition: hpm_sdm_drv.h:273
sdm_channel_int_status_mask_t
Definition: hpm_sdm_drv.h:115
static uint8_t sdm_get_channel_fifo_data_count(SDM_Type *ptr, uint8_t ch)
sdm get channel data count in fifo
Definition: hpm_sdm_drv.h:285
static uint16_t sdm_get_channel_comparator_data(SDM_Type *ptr, uint8_t ch)
sdm get channel comparator data
Definition: hpm_sdm_drv.h:321
static void sdm_enable_channel_by_mask(SDM_Type *ptr, uint32_t ch_mask)
sdm enable channel by mask
Definition: hpm_sdm_drv.h:176
sdm_channel_enable_mask_t
Definition: hpm_sdm_drv.h:126
static int32_t sdm_get_channel_fifo_data(SDM_Type *ptr, uint8_t ch)
sdm get channel filter output data in fifo
Definition: hpm_sdm_drv.h:297
static uint32_t sdm_get_status(SDM_Type *ptr)
sdm get status register value
Definition: hpm_sdm_drv.h:211
static void sdm_set_channel_comparator_low_threshold(SDM_Type *ptr, uint8_t ch, uint16_t value)
sdm set channel comparator low threshold
Definition: hpm_sdm_drv.h:357
hpm_stat_t sdm_receive_filter_data(SDM_Type *ptr, uint8_t ch_index, bool using_fifo, int8_t *data, uint32_t count, uint8_t data_len_in_bytes)
sdm receive filter data
Definition: hpm_sdm_drv.c:175
static uint8_t sdm_get_channel_clock_cycle_count(SDM_Type *ptr, uint8_t ch)
sdm get channel input clock cycle count
Definition: hpm_sdm_drv.h:309
static void sdm_enable_channel(SDM_Type *ptr, uint8_t ch_index, bool enable)
sdm enable channel
Definition: hpm_sdm_drv.h:159
static uint32_t sdm_get_channel_comparator_status(SDM_Type *ptr, uint8_t ch)
sdm get channel comparator status register value
Definition: hpm_sdm_drv.h:369
static void sdm_set_channel_comparator_high_threshold(SDM_Type *ptr, uint8_t ch, uint16_t value)
sdm set channel comparator high threshold
Definition: hpm_sdm_drv.h:333
#define CHN_EN_MASK(ch)
Definition: hpm_sdm_drv.h:27
void sdm_config_channel_filter(SDM_Type *ptr, uint8_t ch_index, sdm_filter_config_t *filter_config)
sdm config channel filter
Definition: hpm_sdm_drv.c:100
static bool sdm_get_channel_data_error_status(SDM_Type *ptr, uint8_t ch)
get channel error status
Definition: hpm_sdm_drv.h:237
static void sdm_set_channel_comparator_zero_crossing_threshold(SDM_Type *ptr, uint8_t ch, uint16_t value)
sdm set channel comparator zero crossing threshold
Definition: hpm_sdm_drv.h:345
static void sdm_set_channel_sampling_mode(SDM_Type *ptr, uint8_t ch_index, sdm_sampling_mode_t mode)
sdm set channel sampling mode
Definition: hpm_sdm_drv.h:188
static bool sdm_get_channel_data_ready_status(SDM_Type *ptr, uint8_t ch)
get channel data ready status
Definition: hpm_sdm_drv.h:224
static uint8_t sdm_get_ch_fifo_threshold(SDM_Type *ptr, uint8_t ch)
sdm get channel fifo threshold
Definition: hpm_sdm_drv.h:261
void sdm_get_channel_default_comparator_config(SDM_Type *ptr, sdm_comparator_config_t *cmp_config)
sdm get channel default comparator config
Definition: hpm_sdm_drv.c:83
@ sdm_comparator_no_event
Definition: hpm_sdm_drv.h:108
@ sdm_comparator_event_invalid_clk
Definition: hpm_sdm_drv.h:112
@ sdm_comparator_event_out_high_threshold
Definition: hpm_sdm_drv.h:109
@ sdm_comparator_event_hz
Definition: hpm_sdm_drv.h:111
@ sdm_comparator_event_out_low_threshold
Definition: hpm_sdm_drv.h:110
@ sdm_filter_sinc2
Definition: hpm_sdm_drv.h:43
@ sdm_filter_sinc1
Definition: hpm_sdm_drv.h:42
@ sdm_filter_fast_sinc2
Definition: hpm_sdm_drv.h:45
@ sdm_filter_sinc3
Definition: hpm_sdm_drv.h:44
@ sdm_sampling_falling_clk_edge
Definition: hpm_sdm_drv.h:36
@ sdm_sampling_falling_two_clk_edge
Definition: hpm_sdm_drv.h:38
@ sdm_sampling_rising_clk_edge
Definition: hpm_sdm_drv.h:33
@ sdm_sampling_every_clk_edge
Definition: hpm_sdm_drv.h:34
@ sdm_sampling_rising_two_clk_edge
Definition: hpm_sdm_drv.h:37
@ sdm_sampling_manchester_mode
Definition: hpm_sdm_drv.h:35
@ sdm_chn3_data_ready_mask
Definition: hpm_sdm_drv.h:123
@ sdm_chn2_data_ready_mask
Definition: hpm_sdm_drv.h:122
@ sdm_chn0_data_ready_mask
Definition: hpm_sdm_drv.h:120
@ sdm_chn2_error_mask
Definition: hpm_sdm_drv.h:118
@ sdm_chn1_error_mask
Definition: hpm_sdm_drv.h:117
@ sdm_chn1_data_ready_mask
Definition: hpm_sdm_drv.h:121
@ sdm_chn3_error_mask
Definition: hpm_sdm_drv.h:119
@ sdm_chn0_error_mask
Definition: hpm_sdm_drv.h:116
@ sdm_chn0_enable_mask
Definition: hpm_sdm_drv.h:127
@ sdm_chn1_enable_mask
Definition: hpm_sdm_drv.h:128
@ sdm_chn3_enable_mask
Definition: hpm_sdm_drv.h:130
@ sdm_chn2_enable_mask
Definition: hpm_sdm_drv.h:129
Definition: hpm_sdm_regs.h:12
__R uint32_t SCAMP
Definition: hpm_sdm_regs.h:24
__RW uint32_t INT_EN
Definition: hpm_sdm_regs.h:14
__RW uint32_t SCLLT
Definition: hpm_sdm_regs.h:27
__RW uint32_t SDST
Definition: hpm_sdm_regs.h:21
__RW uint32_t CTRL
Definition: hpm_sdm_regs.h:13
__RW uint32_t SDFIFOCTRL
Definition: hpm_sdm_regs.h:18
__RW uint32_t SCHTL
Definition: hpm_sdm_regs.h:25
__RW uint32_t SCST
Definition: hpm_sdm_regs.h:29
__R uint32_t STATUS
Definition: hpm_sdm_regs.h:15
__R uint32_t SDFIFO
Definition: hpm_sdm_regs.h:23
struct SDM_Type::@389 CH[4]
__RW uint32_t SCHTLZ
Definition: hpm_sdm_regs.h:26
Definition: hpm_sdm_drv.h:54
bool enable_err_interrupt
Definition: hpm_sdm_drv.h:56
bool enable_data_ready_interrupt
Definition: hpm_sdm_drv.h:57
uint8_t sampling_mode
Definition: hpm_sdm_drv.h:55
Definition: hpm_sdm_drv.h:60
uint16_t high_threshold
Definition: hpm_sdm_drv.h:61
uint8_t ignore_invalid_samples
Definition: hpm_sdm_drv.h:71
uint16_t low_threshold
Definition: hpm_sdm_drv.h:63
bool enable
Definition: hpm_sdm_drv.h:72
bool en_low_threshold_int
Definition: hpm_sdm_drv.h:68
bool en_zero_cross_threshold_int
Definition: hpm_sdm_drv.h:65
uint8_t oversampling_rate
Definition: hpm_sdm_drv.h:70
bool en_clock_invalid_int
Definition: hpm_sdm_drv.h:66
uint8_t filter_type
Definition: hpm_sdm_drv.h:69
uint16_t zero_cross_threshold
Definition: hpm_sdm_drv.h:62
bool en_high_threshold_int
Definition: hpm_sdm_drv.h:67
Definition: hpm_sdm_drv.h:48
uint8_t clk_signal_sync
Definition: hpm_sdm_drv.h:49
uint8_t data_signal_sync
Definition: hpm_sdm_drv.h:50
bool interrupt_en
Definition: hpm_sdm_drv.h:51
Definition: hpm_sdm_drv.h:75
uint8_t en_cic_data_saturation_int
Definition: hpm_sdm_drv.h:82
uint8_t wtsynmclr
Definition: hpm_sdm_drv.h:87
uint8_t enable
Definition: hpm_sdm_drv.h:91
uint16_t oversampling_rate
Definition: hpm_sdm_drv.h:96
uint8_t ignore_invalid_samples
Definition: hpm_sdm_drv.h:97
uint8_t en_af_int
Definition: hpm_sdm_drv.h:80
uint8_t fifo_clean_on_sync
Definition: hpm_sdm_drv.h:85
uint8_t sync_source
Definition: hpm_sdm_drv.h:84
uint8_t wtsynaclr
Definition: hpm_sdm_drv.h:86
uint8_t wdg_threshold
Definition: hpm_sdm_drv.h:79
uint8_t fifo_threshold
Definition: hpm_sdm_drv.h:76
uint8_t filter_type
Definition: hpm_sdm_drv.h:93
uint8_t output_offset
Definition: hpm_sdm_drv.h:95
bool en_fifo_threshold_int
Definition: hpm_sdm_drv.h:77
uint8_t en_data_ready_int
Definition: hpm_sdm_drv.h:83
bool pwm_signal_sync
Definition: hpm_sdm_drv.h:94
uint8_t en_data_overflow_int
Definition: hpm_sdm_drv.h:81
uint8_t output_32bit
Definition: hpm_sdm_drv.h:89
uint8_t wtsyncen
Definition: hpm_sdm_drv.h:88
uint8_t data_ready_flag_by_fifo
Definition: hpm_sdm_drv.h:90
uint8_t manchester_threshold
Definition: hpm_sdm_drv.h:78
Definition: hpm_sdm_drv.h:100
bool using_fifo
Definition: hpm_sdm_drv.h:104
uint8_t data_len_in_bytes
Definition: hpm_sdm_drv.h:103
uint32_t count
Definition: hpm_sdm_drv.h:101
uint8_t * buff
Definition: hpm_sdm_drv.h:102