HPM SDK
HPMicro Software Development Kit
hpm_trgm_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2025 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 
62 
66 typedef struct trgm_output {
67  bool invert;
69  uint8_t input;
71 
72 #ifdef __cplusplus
73 extern "C" {
74 #endif
75 
82 static inline void trgm_enable_io_output(TRGM_Type *ptr, uint32_t mask)
83 {
84  ptr->GCR |= mask;
85 }
86 
93 static inline void trgm_disable_io_output(TRGM_Type *ptr, uint32_t mask)
94 {
95  ptr->GCR &= ~mask;
96 }
97 
105 static inline void trgm_filter_set_filter_length(TRGM_Type *ptr, uint8_t input, uint32_t length)
106 {
107 #if defined(TRGM_SOC_HAS_FILTER_SHIFT) && TRGM_SOC_HAS_FILTER_SHIFT
108  uint32_t len = length;
109  uint8_t shift;
110  for (shift = 0; shift <= (TRGM_FILTCFG_FILTLEN_SHIFT_MASK >> TRGM_FILTCFG_FILTLEN_SHIFT_SHIFT); shift++) {
111  if (shift > 0) {
112  len >>= 1u;
113  }
115  break;
116  }
117  }
121  }
124 #else
125  ptr->FILTCFG[input] = (ptr->FILTCFG[input] & ~TRGM_FILTCFG_FILTLEN_MASK)
126  | TRGM_FILTCFG_FILTLEN_SET(length);
127 #endif
128 }
129 
137 static inline void trgm_filter_set_filter_shift(TRGM_Type *ptr, uint8_t input, uint8_t shift)
138 {
139 #if defined(TRGM_SOC_HAS_FILTER_SHIFT) && TRGM_SOC_HAS_FILTER_SHIFT
140  ptr->FILTCFG[input] = (ptr->FILTCFG[input] & ~TRGM_FILTCFG_FILTLEN_SHIFT_MASK)
142 #else
143  (void) ptr;
144  (void) input;
145  (void) shift;
146 #endif
147 }
148 
155 static inline void trgm_filter_enable_sync(TRGM_Type *ptr, uint8_t input)
156 {
157  ptr->FILTCFG[input] |= TRGM_FILTCFG_SYNCEN_MASK;
158 }
159 
166 static inline void trgm_filter_disable_sync(TRGM_Type *ptr, uint8_t input)
167 {
168  ptr->FILTCFG[input] &= ~TRGM_FILTCFG_SYNCEN_MASK;
169 }
170 
178 static inline void trgm_filter_set_mode(TRGM_Type *ptr, uint8_t input, trgm_filter_mode_t mode)
179 {
180  ptr->FILTCFG[input] = (ptr->FILTCFG[input] & ~TRGM_FILTCFG_MODE_MASK)
181  | TRGM_FILTCFG_MODE_SET(mode);
182 }
183 
191 static inline void trgm_filter_invert(TRGM_Type *ptr, uint8_t input, bool invert)
192 {
193  ptr->FILTCFG[input] = (ptr->FILTCFG[input] & ~TRGM_FILTCFG_OUTINV_MASK)
194  | TRGM_FILTCFG_OUTINV_SET(invert);
195 }
196 
204 static inline void trgm_filter_config(TRGM_Type *ptr, uint8_t input, trgm_filter_t *filter)
205 {
206  ptr->FILTCFG[input] = TRGM_FILTCFG_OUTINV_SET(filter->invert)
207  | TRGM_FILTCFG_MODE_SET(filter->mode)
208  | TRGM_FILTCFG_SYNCEN_SET(filter->sync);
209  trgm_filter_set_filter_length(ptr, input, filter->filter_length);
210 }
211 
219 static inline void trgm_input_filter_set_filter_length(TRGM_Type *ptr, uint8_t input, uint32_t length)
220 {
221  trgm_filter_set_filter_length(ptr, input, length);
222 }
223 
231 static inline void trgm_input_filter_set_filter_shift(TRGM_Type *ptr, uint8_t input, uint8_t shift)
232 {
233  trgm_filter_set_filter_shift(ptr, input, shift);
234 }
235 
242 static inline void trgm_input_filter_enable_sync(TRGM_Type *ptr, uint8_t input)
243 {
244  trgm_filter_enable_sync(ptr, input);
245 }
246 
253 static inline void trgm_input_filter_disable_sync(TRGM_Type *ptr, uint8_t input)
254 {
255  trgm_filter_disable_sync(ptr, input);
256 }
257 
265 static inline void trgm_input_filter_set_mode(TRGM_Type *ptr, uint8_t input, trgm_filter_mode_t mode)
266 {
267  trgm_filter_set_mode(ptr, input, mode);
268 }
269 
277 static inline void trgm_input_filter_invert(TRGM_Type *ptr, uint8_t input, bool invert)
278 {
279  trgm_filter_invert(ptr, input, invert);
280 }
281 
289 static inline void trgm_input_filter_config(TRGM_Type *ptr, uint8_t input, trgm_input_filter_t *filter)
290 {
291  trgm_filter_config(ptr, input, filter);
292 }
293 
301 static inline void trgm_output_update_source(TRGM_Type *ptr, uint8_t output, uint8_t source)
302 {
303  ptr->TRGOCFG[output] = (ptr->TRGOCFG[output] & ~TRGM_TRGOCFG_TRIGOSEL_MASK)
304  | TRGM_TRGOCFG_TRIGOSEL_SET(source);
305 }
306 
314 static inline void trgm_output_config(TRGM_Type *ptr, uint8_t output, trgm_output_t *config)
315 {
316  ptr->TRGOCFG[output] = TRGM_TRGOCFG_TRIGOSEL_SET(config->input)
317  | (config->type & TRGM_TRGOCFG_FEDG2PEN_MASK)
318  | (config->type & TRGM_TRGOCFG_REDG2PEN_MASK)
319  | TRGM_TRGOCFG_OUTINV_SET(config->invert);
320 }
321 
329 static inline void trgm_dma_request_config(TRGM_Type *ptr, uint8_t dma_out, uint8_t dma_src)
330 {
331 #if defined(TRGM_SOC_HAS_DMAMUX_EN) && TRGM_SOC_HAS_DMAMUX_EN
333 #else
334  ptr->DMACFG[dma_out] = TRGM_DMACFG_DMASRCSEL_SET(dma_src);
335 #endif
336 }
337 
338 #if defined(HPM_IP_FEATURE_TRGM_HAS_TRGM_IN_OUT_STATUS) && HPM_IP_FEATURE_TRGM_HAS_TRGM_IN_OUT_STATUS
346 static inline uint32_t trgm_input_get_group_status(TRGM_Type *ptr, uint8_t trgm_in_group)
347 {
348  if (trgm_in_group > TRGM_SOC_TRIM_IN_GROUP_MAX)
349  return 0;
350 
351  return ptr->TRGM_IN[trgm_in_group];
352 }
353 
361 static inline int trgm_input_get_signal_status(TRGM_Type *ptr, uint8_t trgm_in_index)
362 {
363  uint8_t group = trgm_in_index / 32;
364  uint8_t index = trgm_in_index % 32;
365 
366  if (group > TRGM_SOC_TRIM_IN_GROUP_MAX)
367  return -1;
368 
369  return ((ptr->TRGM_IN[group] >> index) & 0x01);
370 }
371 #endif
372 
373 #if defined(HPM_IP_FEATURE_TRGM_HRPWM_CALIBRATION_2) || defined(HPM_IP_FEATURE_TRGM_HRPWM_CALIBRATION_1)
381 static inline void trgm_pwmv2_calibrate_delay_chain(TRGM_Type *trgm, trgm_pwmv2_calibration_mode_t *status)
382 {
383 #if defined(HPM_IP_FEATURE_TRGM_HRPWM_CALIBRATION_2)
384  uint16_t val_n, val_p;
385 #endif
386  uint32_t delay_val;
387 #if defined(HPM_IP_FEATURE_TRGM_HRPWM_CALIBRATION_1)
388  static uint16_t last_val = 0;
389  int16_t diff_val;
390 #endif
391 
392  switch (*status) {
398  break;
401 #if defined(HPM_IP_FEATURE_TRGM_HRPWM_CALIBRATION_2)
404  if ((val_n > 3) && (val_p > 3)) {
407  trgm->PWM_DELAY_CFG = delay_val;
409  } else {
411  }
412 #endif
413 #if defined(HPM_IP_FEATURE_TRGM_HRPWM_CALIBRATION_1)
415  if (last_val == 0U) {
416  if (delay_val > 10) {
417  last_val = delay_val;
418  trgm->PWM_DELAY_CFG = delay_val;
420  } else {
422  }
423  } else {
424  diff_val = ((delay_val - last_val) > 0) ? (delay_val - last_val) : (last_val - delay_val);
425 
426  if (((float)diff_val / last_val) > 0.25f) {
427  trgm->PWM_DELAY_CFG = delay_val;
428  last_val = delay_val;
430  } else {
432  }
433  }
434 #endif
435  }
436  break;
438  default:
439  break;
440  }
441 }
442 #endif
443 
444 #ifdef __cplusplus
445 }
446 #endif
451 #endif /* HPM_TRGM_DRV_H */
452 
453 
#define TRGM_SOC_TRIM_IN_GROUP_MAX
Definition: hpm_soc_feature.h:178
#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
#define TRGM_PWM_CALIB_STATUS1_CALIB_RESULT_P_GET(x)
Definition: hpm_trgm_regs.h:636
#define TRGM_PWM_DELAY_CFG_DELAY_CHAN_CALIB_N_SW_SET(x)
Definition: hpm_trgm_regs.h:578
#define TRGM_PWM_CALIB_STATUS1_CALIB_RESULT_N_GET(x)
Definition: hpm_trgm_regs.h:628
#define TRGM_PWM_DELAY_CFG_DELAY_CHAN_CALIB_P_SW_SET(x)
Definition: hpm_trgm_regs.h:588
trgm_filter_t trgm_input_filter_t
Definition: hpm_trgm_drv.h:61
trgm_output_type
Output type.
Definition: hpm_trgm_drv.h:37
static void trgm_filter_enable_sync(TRGM_Type *ptr, uint8_t input)
Enable sync input with TRGM clock.
Definition: hpm_trgm_drv.h:155
static void trgm_input_filter_config(TRGM_Type *ptr, uint8_t input, trgm_input_filter_t *filter)
Configure filter, legacy API for compatibility.
Definition: hpm_trgm_drv.h:289
static void trgm_filter_config(TRGM_Type *ptr, uint8_t input, trgm_filter_t *filter)
Configure filter.
Definition: hpm_trgm_drv.h:204
trgm_pwmv2_calibration_mode_t
Definition: hpm_trgm_drv.h:45
static void trgm_filter_set_filter_shift(TRGM_Type *ptr, uint8_t input, uint8_t shift)
Set filter length shift.
Definition: hpm_trgm_drv.h:137
static void trgm_input_filter_set_filter_shift(TRGM_Type *ptr, uint8_t input, uint8_t shift)
Set filter length shift, legacy API for compatibility.
Definition: hpm_trgm_drv.h:231
static void trgm_input_filter_enable_sync(TRGM_Type *ptr, uint8_t input)
Enable sync input with TRGM clock, legacy API for compatibility.
Definition: hpm_trgm_drv.h:242
static void trgm_filter_set_filter_length(TRGM_Type *ptr, uint8_t input, uint32_t length)
Set filter length.
Definition: hpm_trgm_drv.h:105
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:301
static void trgm_input_filter_set_mode(TRGM_Type *ptr, uint8_t input, trgm_filter_mode_t mode)
Set filter working mode, legacy API for compatibility.
Definition: hpm_trgm_drv.h:265
enum trgm_filter_mode trgm_filter_mode_t
Filter mode.
static void trgm_filter_disable_sync(TRGM_Type *ptr, uint8_t input)
Disable sync input with TRGM clock.
Definition: hpm_trgm_drv.h:166
static void trgm_output_config(TRGM_Type *ptr, uint8_t output, trgm_output_t *config)
Configure output.
Definition: hpm_trgm_drv.h:314
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, legacy API for compatibility.
Definition: hpm_trgm_drv.h:219
static void trgm_input_filter_disable_sync(TRGM_Type *ptr, uint8_t input)
Disable sync input with TRGM clock, legacy API for compatibility.
Definition: hpm_trgm_drv.h:253
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:329
static void trgm_filter_set_mode(TRGM_Type *ptr, uint8_t input, trgm_filter_mode_t mode)
Set filter working mode.
Definition: hpm_trgm_drv.h:178
static void trgm_filter_invert(TRGM_Type *ptr, uint8_t input, bool invert)
Invert filter output.
Definition: hpm_trgm_drv.h:191
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:82
static void trgm_input_filter_invert(TRGM_Type *ptr, uint8_t input, bool invert)
Invert filter output, legacy API for compatibility.
Definition: hpm_trgm_drv.h:277
struct trgm_input_filter trgm_filter_t
Filter configuration.
static void trgm_disable_io_output(TRGM_Type *ptr, uint32_t mask)
Disable IO output.
Definition: hpm_trgm_drv.h:93
@ 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
__R uint32_t PWM_CALIB_STATUS1
Definition: hpm_trgm_regs.h:43
__R uint32_t TRGM_IN[4]
Definition: hpm_trgm_regs.h:26
__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
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:66
trgm_output_type_t type
Definition: hpm_trgm_drv.h:68
bool invert
Definition: hpm_trgm_drv.h:67
uint8_t input
Definition: hpm_trgm_drv.h:69