HPM SDK
HPMicro Software Development Kit
hpm_trgm_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_TRGM_DRV_H
9 #define HPM_TRGM_DRV_H
10 
11 #include "hpm_common.h"
12 #include "hpm_soc_ip_feature.h"
13 #include "hpm_trgm_regs.h"
14 #include "hpm_trgmmux_src.h"
15 
26 typedef enum trgm_filter_mode {
33 
37 typedef enum trgm_output_type {
44 
45 typedef enum {
50 
54 typedef struct trgm_input_filter {
55  bool invert;
56  bool sync;
57  uint32_t filter_length;
60 
64 typedef struct trgm_output {
65  bool invert;
67  uint8_t input;
69 
70 #ifdef __cplusplus
71 extern "C" {
72 #endif
73 
80 static inline void trgm_enable_io_output(TRGM_Type *ptr, uint32_t mask)
81 {
82  ptr->GCR |= mask;
83 }
84 
91 static inline void trgm_disable_io_output(TRGM_Type *ptr, uint32_t mask)
92 {
93  ptr->GCR &= ~mask;
94 }
95 
103 static inline void trgm_input_filter_set_filter_length(TRGM_Type *ptr, uint8_t input, uint32_t length)
104 {
105 #if defined(TRGM_SOC_HAS_FILTER_SHIFT) && TRGM_SOC_HAS_FILTER_SHIFT
106  uint32_t len = length;
107  uint8_t shift;
108  for (shift = 0; shift <= (TRGM_FILTCFG_FILTLEN_SHIFT_MASK >> TRGM_FILTCFG_FILTLEN_SHIFT_SHIFT); shift++) {
109  if (shift > 0) {
110  len >>= 1u;
111  }
113  break;
114  }
115  }
119  }
122 #else
123  ptr->FILTCFG[input] = (ptr->FILTCFG[input] & ~TRGM_FILTCFG_FILTLEN_MASK)
124  | TRGM_FILTCFG_FILTLEN_SET(length);
125 #endif
126 }
127 
135 static inline void trgm_input_filter_set_filter_shift(TRGM_Type *ptr, uint8_t input, uint8_t shift)
136 {
137 #if defined(TRGM_SOC_HAS_FILTER_SHIFT) && TRGM_SOC_HAS_FILTER_SHIFT
138  ptr->FILTCFG[input] = (ptr->FILTCFG[input] & ~TRGM_FILTCFG_FILTLEN_SHIFT_MASK)
140 #else
141  (void) ptr;
142  (void) input;
143  (void) shift;
144 #endif
145 }
146 
153 static inline void trgm_input_filter_enable_sync(TRGM_Type *ptr, uint8_t input)
154 {
155  ptr->FILTCFG[input] |= TRGM_FILTCFG_SYNCEN_MASK;
156 }
157 
164 static inline void trgm_input_filter_disable_sync(TRGM_Type *ptr, uint8_t input)
165 {
166  ptr->FILTCFG[input] &= ~TRGM_FILTCFG_SYNCEN_MASK;
167 }
168 
176 static inline void trgm_input_filter_set_mode(TRGM_Type *ptr, uint8_t input, trgm_filter_mode_t mode)
177 {
178  ptr->FILTCFG[input] = (ptr->FILTCFG[input] & ~TRGM_FILTCFG_MODE_MASK)
179  | TRGM_FILTCFG_MODE_SET(mode);
180 }
181 
189 static inline void trgm_input_filter_invert(TRGM_Type *ptr, uint8_t input, bool invert)
190 {
191  ptr->FILTCFG[input] = (ptr->FILTCFG[input] & ~TRGM_FILTCFG_OUTINV_MASK)
192  | TRGM_FILTCFG_OUTINV_SET(invert);
193 }
194 
202 static inline void trgm_input_filter_config(TRGM_Type *ptr, uint8_t input, trgm_input_filter_t *filter)
203 {
204  ptr->FILTCFG[input] = TRGM_FILTCFG_OUTINV_SET(filter->invert)
205  | TRGM_FILTCFG_MODE_SET(filter->mode)
206  | TRGM_FILTCFG_SYNCEN_SET(filter->sync);
208 }
209 
217 static inline void trgm_output_update_source(TRGM_Type *ptr, uint8_t output, uint8_t source)
218 {
219  ptr->TRGOCFG[output] = (ptr->TRGOCFG[output] & ~TRGM_TRGOCFG_TRIGOSEL_MASK)
220  | TRGM_TRGOCFG_TRIGOSEL_SET(source);
221 }
222 
230 static inline void trgm_output_config(TRGM_Type *ptr, uint8_t output, trgm_output_t *config)
231 {
232  ptr->TRGOCFG[output] = TRGM_TRGOCFG_TRIGOSEL_SET(config->input)
233  | (config->type & TRGM_TRGOCFG_FEDG2PEN_MASK)
234  | (config->type & TRGM_TRGOCFG_REDG2PEN_MASK)
235  | TRGM_TRGOCFG_OUTINV_SET(config->invert);
236 }
237 
245 static inline void trgm_dma_request_config(TRGM_Type *ptr, uint8_t dma_out, uint8_t dma_src)
246 {
247 #if defined(TRGM_SOC_HAS_DMAMUX_EN) && TRGM_SOC_HAS_DMAMUX_EN
249 #else
250  ptr->DMACFG[dma_out] = TRGM_DMACFG_DMASRCSEL_SET(dma_src);
251 #endif
252 }
253 
254 #if defined(HPM_IP_FEATURE_TRGM_HRPWM_CALIBRATION_2) || defined(HPM_IP_FEATURE_TRGM_HRPWM_CALIBRATION_1)
262 static inline void trgm_pwmv2_calibrate_delay_chain(TRGM_Type *trgm, trgm_pwmv2_calibration_mode_t *status)
263 {
264 #if defined(HPM_IP_FEATURE_TRGM_HRPWM_CALIBRATION_2)
265  uint16_t val_n, val_p;
266 #endif
267  uint32_t delay_val;
268 #if defined(HPM_IP_FEATURE_TRGM_HRPWM_CALIBRATION_1)
269  static uint16_t last_val = 0;
270  int16_t diff_val;
271 #endif
272 
273  switch (*status) {
279  break;
282 #if defined(HPM_IP_FEATURE_TRGM_HRPWM_CALIBRATION_2)
283  val_n = TRGM_PWM_CALIB_STATUS1_CALIB_RESULT_N_GET(trgm->PWM_CALIB_STATUS1);
284  val_p = TRGM_PWM_CALIB_STATUS1_CALIB_RESULT_P_GET(trgm->PWM_CALIB_STATUS1);
285  if ((val_n > 3) && (val_p > 3)) {
286  delay_val = TRGM_PWM_DELAY_CFG_DELAY_CHAN_CALIB_N_SW_SET(val_n) |
287  TRGM_PWM_DELAY_CFG_DELAY_CHAN_CALIB_P_SW_SET(val_p);
288  trgm->PWM_DELAY_CFG = delay_val;
290  } else {
292  }
293 #endif
294 #if defined(HPM_IP_FEATURE_TRGM_HRPWM_CALIBRATION_1)
296  if (last_val == 0U) {
297  if (delay_val > 10) {
298  last_val = delay_val;
299  trgm->PWM_DELAY_CFG = delay_val;
301  } else {
303  }
304  } else {
305  diff_val = ((delay_val - last_val) > 0) ? (delay_val - last_val) : (last_val - delay_val);
306 
307  if (((float)diff_val / last_val) > 0.25f) {
308  trgm->PWM_DELAY_CFG = delay_val;
309  last_val = delay_val;
311  } else {
313  }
314  }
315 #endif
316  }
317  break;
319  default:
320  break;
321  }
322 }
323 #endif
324 
325 #ifdef __cplusplus
326 }
327 #endif
332 #endif /* HPM_TRGM_DRV_H */
333 
334 
#define TRGM_TRGOCFG_OUTINV_SET(x)
Definition: hpm_trgm_regs.h:96
#define TRGM_TRGOCFG_REDG2PEN_MASK
Definition: hpm_trgm_regs.h:114
#define TRGM_TRGOCFG_FEDG2PEN_MASK
Definition: hpm_trgm_regs.h:104
#define TRGM_DMACFG_DMAMUX_EN_MASK
Definition: hpm_trgm_regs.h:134
#define TRGM_FILTCFG_SYNCEN_MASK
Definition: hpm_trgm_regs.h:64
#define TRGM_FILTCFG_OUTINV_MASK
Definition: hpm_trgm_regs.h:39
#define TRGM_FILTCFG_FILTLEN_BASE_SHIFT
Definition: hpm_trgm_regs.h:84
#define TRGM_FILTCFG_MODE_MASK
Definition: hpm_trgm_regs.h:54
#define TRGM_FILTCFG_FILTLEN_BASE_SET(x)
Definition: hpm_trgm_regs.h:85
#define TRGM_FILTCFG_FILTLEN_BASE_MASK
Definition: hpm_trgm_regs.h:83
#define TRGM_TRGOCFG_TRIGOSEL_MASK
Definition: hpm_trgm_regs.h:124
#define TRGM_FILTCFG_OUTINV_SET(x)
Definition: hpm_trgm_regs.h:41
#define TRGM_FILTCFG_SYNCEN_SET(x)
Definition: hpm_trgm_regs.h:66
#define TRGM_FILTCFG_MODE_SET(x)
Definition: hpm_trgm_regs.h:56
#define TRGM_TRGOCFG_TRIGOSEL_SET(x)
Definition: hpm_trgm_regs.h:126
#define TRGM_FILTCFG_FILTLEN_SHIFT_SHIFT
Definition: hpm_trgm_regs.h:74
#define TRGM_DMACFG_DMASRCSEL_SET(x)
Definition: hpm_trgm_regs.h:146
#define TRGM_FILTCFG_FILTLEN_SHIFT_MASK
Definition: hpm_trgm_regs.h:73
#define TRGM_FILTCFG_FILTLEN_SHIFT_SET(x)
Definition: hpm_trgm_regs.h:75
#define TRGM_FILTCFG_FILTLEN_MASK
Definition: hpm_trgm_regs.h:65
#define TRGM_FILTCFG_FILTLEN_SET(x)
Definition: hpm_trgm_regs.h:67
#define TRGM_PWM_CALIB_CFG_CALIB_HW_ENABLE_MASK
Definition: hpm_trgm_regs.h:771
#define TRGM_PWM_CALIB_STATUS0_CALIB_RESULT_GET(x)
Definition: hpm_trgm_regs.h:791
#define TRGM_PWM_CALIB_CFG_CALIB_SW_START_MASK
Definition: hpm_trgm_regs.h:762
#define TRGM_PWM_CALIB_STATUS0_CALIB_ON_GET(x)
Definition: hpm_trgm_regs.h:783
trgm_output_type
Output type.
Definition: hpm_trgm_drv.h:37
static void trgm_input_filter_config(TRGM_Type *ptr, uint8_t input, trgm_input_filter_t *filter)
Configure filter.
Definition: hpm_trgm_drv.h:202
trgm_pwmv2_calibration_mode_t
Definition: hpm_trgm_drv.h:45
static void trgm_input_filter_set_filter_shift(TRGM_Type *ptr, uint8_t input, uint8_t shift)
Set filter length.
Definition: hpm_trgm_drv.h:135
static void trgm_input_filter_enable_sync(TRGM_Type *ptr, uint8_t input)
Enable sync input with TRGM clock.
Definition: hpm_trgm_drv.h:153
struct trgm_output trgm_output_t
Output configuration.
static void trgm_output_update_source(TRGM_Type *ptr, uint8_t output, uint8_t source)
Update source for TRGM output.
Definition: hpm_trgm_drv.h:217
static void trgm_input_filter_set_mode(TRGM_Type *ptr, uint8_t input, trgm_filter_mode_t mode)
Set filter working mode.
Definition: hpm_trgm_drv.h:176
enum trgm_filter_mode trgm_filter_mode_t
Filter mode.
static void trgm_output_config(TRGM_Type *ptr, uint8_t output, trgm_output_t *config)
Configure output.
Definition: hpm_trgm_drv.h:230
enum trgm_output_type trgm_output_type_t
Output type.
static void trgm_input_filter_set_filter_length(TRGM_Type *ptr, uint8_t input, uint32_t length)
Set filter length.
Definition: hpm_trgm_drv.h:103
static void trgm_input_filter_disable_sync(TRGM_Type *ptr, uint8_t input)
Disable sync input with TRGM clock.
Definition: hpm_trgm_drv.h:164
struct trgm_input_filter trgm_input_filter_t
Input filter configuration.
static void trgm_dma_request_config(TRGM_Type *ptr, uint8_t dma_out, uint8_t dma_src)
Configure DMA request.
Definition: hpm_trgm_drv.h:245
trgm_filter_mode
Filter mode.
Definition: hpm_trgm_drv.h:26
static void trgm_enable_io_output(TRGM_Type *ptr, uint32_t mask)
Enable IO output.
Definition: hpm_trgm_drv.h:80
static void trgm_input_filter_invert(TRGM_Type *ptr, uint8_t input, bool invert)
Invert filter output.
Definition: hpm_trgm_drv.h:189
static void trgm_disable_io_output(TRGM_Type *ptr, uint32_t mask)
Disable IO output.
Definition: hpm_trgm_drv.h:91
@ trgm_output_pulse_at_input_rising_edge
Definition: hpm_trgm_drv.h:40
@ trgm_output_pulse_at_input_falling_edge
Definition: hpm_trgm_drv.h:39
@ trgm_output_pulse_at_input_both_edge
Definition: hpm_trgm_drv.h:41
@ trgm_output_same_as_input
Definition: hpm_trgm_drv.h:38
@ trgm_pwmv2_calibration_mode_end
Definition: hpm_trgm_drv.h:48
@ trgm_pwmv2_calibration_mode_wait
Definition: hpm_trgm_drv.h:47
@ trgm_pwmv2_calibration_mode_begin
Definition: hpm_trgm_drv.h:46
@ trgm_filter_mode_rapid_change
Definition: hpm_trgm_drv.h:28
@ trgm_filter_mode_delay
Definition: hpm_trgm_drv.h:29
@ trgm_filter_mode_bypass
Definition: hpm_trgm_drv.h:27
@ trgm_filter_mode_stable_high
Definition: hpm_trgm_drv.h:31
@ trgm_filter_mode_stable_low
Definition: hpm_trgm_drv.h:30
Definition: hpm_trgm_regs.h:12
__R uint32_t PWM_CALIB_STATUS0
Definition: hpm_trgm_regs.h:45
__RW uint32_t TRGOCFG[137]
Definition: hpm_trgm_regs.h:15
__RW uint32_t DMACFG[8]
Definition: hpm_trgm_regs.h:17
__RW uint32_t PWM_CALIB_CFG
Definition: hpm_trgm_regs.h:43
__RW uint32_t FILTCFG[28]
Definition: hpm_trgm_regs.h:13
__RW uint32_t PWM_DELAY_CFG
Definition: hpm_trgm_regs.h:42
__RW uint32_t GCR
Definition: hpm_trgm_regs.h:19
Input filter configuration.
Definition: hpm_trgm_drv.h:54
trgm_filter_mode_t mode
Definition: hpm_trgm_drv.h:58
bool sync
Definition: hpm_trgm_drv.h:56
bool invert
Definition: hpm_trgm_drv.h:55
uint32_t filter_length
Definition: hpm_trgm_drv.h:57
Output configuration.
Definition: hpm_trgm_drv.h:64
trgm_output_type_t type
Definition: hpm_trgm_drv.h:66
bool invert
Definition: hpm_trgm_drv.h:65
uint8_t input
Definition: hpm_trgm_drv.h:67