HPM SDK
HPMicro Software Development Kit
hpm_pcfg_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_PCFG_DRV_H
9 #define HPM_PCFG_DRV_H
10 
11 #include "hpm_common.h"
12 #include "hpm_pcfg_regs.h"
13 
21 #define PCFG_CLOCK_GATE_MODE_ALWAYS_ON (0x3UL)
22 #define PCFG_CLOCK_GATE_MODE_ALWAYS_OFF (0x2UL)
23 
24 #define PCFG_PERIPH_KEEP_CLOCK_ON(p) (PCFG_CLOCK_GATE_MODE_ALWAYS_ON << (p))
25 #define PCFG_PERIPH_KEEP_CLOCK_OFF(p) (PCFG_CLOCK_GATE_MODE_ALWAYS_OFF << (p))
26 
27 /* @brief PCFG irc24m reference */
28 typedef enum {
32 
33 /* @brief PCFG dcdc current limit */
34 typedef enum {
38 
39 /* @brief PCFG dcdc current hys */
40 typedef enum {
44 
45 /* @brief PCFG dcdc mode */
46 typedef enum {
52 
53 /* @brief PCFG pmc domain peripherals */
54 typedef enum {
61 
62 /* @brief PCFG wakeup source */
63 typedef enum {
64  pcfg_wakeup_src_soc = (1 << 0),
68  pcfg_wakeup_src_pgpio = (1 << 10),
70  pcfg_wakeup_src_bgpio = (1 << 17),
71  pcfg_wakeup_src_rtc = (1 << 19),
72  pcfg_wakeup_src_wkup = (1 << 31),
74 
75 /* @brief PCFG status */
76 enum {
78 };
79 
80 /* @brief PCFG irc24m config */
81 typedef struct {
82  uint32_t freq_in_hz;
83  pcfg_irc24m_reference_t reference;
84  bool return_to_default_on_xtal_loss;
85  bool free_run;
87 
88 
89 #define PCFG_CLOCK_GATE_CONTROL_MASK(module, mode) \
90  ((uint32_t) (mode) << ((module) << 1))
91 
92 #ifdef __cplusplus
93 extern "C" {
94 #endif
95 
103 static inline bool pcfg_bandgap_is_trimmed(PCFG_Type *ptr)
104 {
106 }
107 
113 static inline void pcfg_bandgap_reload_trim(PCFG_Type *ptr)
114 {
116 }
117 
123 static inline void pcfg_ldo2p5_turn_off(PCFG_Type *ptr)
124 {
126 }
127 
133 static inline void pcfg_ldo2p5_turn_on(PCFG_Type *ptr)
134 {
136 }
137 
145 static inline bool pcfg_ldo2p5_is_stable(PCFG_Type *ptr)
146 {
147  return PCFG_LDO2P5_READY_GET(ptr->LDO2P5);
148 }
149 
150 /*
151  * @brief check if DCDC is stable or not
152  * @param[in] ptr base address
153  * @retval true if DCDC is stable
154  */
155 static inline bool pcfg_dcdc_is_stable(PCFG_Type *ptr)
156 {
157  return PCFG_DCDC_MODE_READY_GET(ptr->DCDC_MODE);
158 }
159 
160 /*
161  * @brief set DCDC work mode
162  * @param[in] ptr base address
163  */
164 static inline void pcfg_dcdc_set_mode(PCFG_Type *ptr, uint8_t mode)
165 {
167 }
168 
176 static inline void pcfg_dcdc_set_lp_current_limit(PCFG_Type *ptr, pcfg_dcdc_lp_current_limit_t limit, bool over_limit)
177 {
178  (void) over_limit;
180 }
181 
189 static inline bool pcfg_dcdc_is_power_loss(PCFG_Type *ptr)
190 {
192 }
193 
200 {
202 }
203 
210 {
212 }
213 
220 static inline bool pcfg_dcdc_is_over_voltage(PCFG_Type *ptr)
221 {
223 }
224 
231 {
233 }
234 
241 {
243 }
244 
253 {
255 }
256 
264 static inline uint32_t pcfg_dcdc_get_start_time_in_cycle(PCFG_Type *ptr)
265 {
267 }
268 
276 static inline uint32_t pcfg_dcdc_get_resume_time_in_cycle(PCFG_Type *ptr)
277 {
279 }
280 
287 static inline void pcfg_dcdc_set_start_time_in_cycle(PCFG_Type *ptr, uint32_t cycles)
288 {
290 }
291 
298 static inline void pcfg_dcdc_set_resume_time_in_cycle(PCFG_Type *ptr, uint32_t cycles)
299 {
301 }
302 
310 {
312 }
313 
319 static inline void pcfg_disable_power_trap(PCFG_Type *ptr)
320 {
322 }
323 
329 static inline void pcfg_enable_power_trap(PCFG_Type *ptr)
330 {
332 }
333 
341 static inline bool pcfg_is_power_trap_triggered(PCFG_Type *ptr)
342 {
344 }
345 
352 {
354 }
355 
361 static inline void pcfg_disable_dcdc_retention(PCFG_Type *ptr)
362 {
364 }
365 
371 static inline void pcfg_enable_dcdc_retention(PCFG_Type *ptr)
372 {
374 }
375 
382 static inline void pcfg_clear_wakeup_cause(PCFG_Type *ptr, uint32_t mask)
383 {
384  ptr->WAKE_CAUSE = mask;
385 }
386 
394 static inline uint32_t pcfg_get_wakeup_cause(PCFG_Type *ptr)
395 {
396  return ptr->WAKE_CAUSE;
397 }
398 
405 static inline void pcfg_enable_wakeup_source(PCFG_Type *ptr, uint32_t mask)
406 {
407  ptr->WAKE_MASK &= ~mask;
408 }
409 
416 static inline void pcfg_disable_wakeup_source(PCFG_Type *ptr, uint32_t mask)
417 {
418  ptr->WAKE_MASK |= mask;
419 }
420 
427 static inline void pcfg_set_periph_clock_mode(PCFG_Type *ptr, uint32_t mode)
428 {
429  ptr->SCG_CTRL = mode;
430 }
431 
439 static inline void pcfg_update_periph_clock_mode(PCFG_Type *ptr, pcfg_pmc_periph_t periph, bool on)
440 {
441  if (on) {
442  ptr->SCG_CTRL = (ptr->SCG_CTRL & ~(0x03 << periph)) | PCFG_PERIPH_KEEP_CLOCK_ON(periph);
443  } else {
444  ptr->SCG_CTRL = (ptr->SCG_CTRL & ~(0x03 << periph)) | PCFG_PERIPH_KEEP_CLOCK_OFF(periph);
445  }
446 }
447 
455 static inline bool pcfg_irc24m_is_trimmed(PCFG_Type *ptr)
456 {
457  return ptr->RC24M & PCFG_RC24M_RC_TRIMMED_MASK;
458 }
459 
465 static inline void pcfg_irc24m_reload_trim(PCFG_Type *ptr)
466 {
468 }
469 
477 
478 /*
479  * @brief set DCDC voltage at standby mode
480  * @param[in] ptr base address
481  * @param[in] mv target voltage
482  * @retval status_success if successfully configured
483  */
485 
486 /*
487  * @brief set output voltage of LDO 2.5V in mV
488  * @param[in] ptr base address
489  * @param[in] mv target voltage
490  * @retval status_success if successfully configured
491  */
492 hpm_stat_t pcfg_ldo2p5_set_voltage(PCFG_Type *ptr, uint16_t mv);
493 
494 /*
495  * @brief set DCDC voltage
496  * @param[in] ptr base address
497  * @param[in] mv target voltage
498  * @retval status_success if successfully configured
499  */
500 hpm_stat_t pcfg_dcdc_set_voltage(PCFG_Type *ptr, uint16_t mv);
501 
502 /*
503  * @brief set output voltage of LDO 1V in mV
504  * @param[in] ptr base address
505  * @param[in] mv target voltage
506  * @retval status_success if successfully configured
507  */
508 hpm_stat_t pcfg_ldo1p1_set_voltage(PCFG_Type *ptr, uint16_t mv);
509 
510 /*
511  * @brief get current DCDC current level in mA
512  *
513  * @param[in] ptr base address
514  * @retval Current level at mA
515  */
517 
518 
519 #ifdef __cplusplus
520 }
521 #endif
526 #endif /* HPM_PCFG_DRV_H */
#define PCFG_DCDC_RESUME_TIME_RESUME_TIME_GET(x)
Definition: hpm_pcfg_regs.h:592
#define PCFG_LDO2P5_READY_GET(x)
Definition: hpm_pcfg_regs.h:108
#define PCFG_POWER_TRAP_TRIGGERED_MASK
Definition: hpm_pcfg_regs.h:602
#define PCFG_DCDC_CURRENT_VALID_MASK
Definition: hpm_pcfg_regs.h:303
#define PCFG_DCDC_MISC_OL_HYST_MASK
Definition: hpm_pcfg_regs.h:520
#define PCFG_POWER_TRAP_RETENTION_MASK
Definition: hpm_pcfg_regs.h:614
#define PCFG_DCDC_CURRENT_ESTI_EN_MASK
Definition: hpm_pcfg_regs.h:291
#define PCFG_DCDC_MODE_MODE_SET(x)
Definition: hpm_pcfg_regs.h:160
#define PCFG_LDO2P5_ENABLE_MASK
Definition: hpm_pcfg_regs.h:117
#define PCFG_DCDC_MODE_READY_GET(x)
Definition: hpm_pcfg_regs.h:146
#define PCFG_DCDC_START_TIME_START_TIME_GET(x)
Definition: hpm_pcfg_regs.h:581
#define PCFG_DCDC_START_TIME_START_TIME_SET(x)
Definition: hpm_pcfg_regs.h:580
#define PCFG_DCDC_MISC_OL_HYST_SET(x)
Definition: hpm_pcfg_regs.h:522
#define PCFG_POWER_TRAP_TRAP_MASK
Definition: hpm_pcfg_regs.h:626
#define PCFG_DCDC_PROT_OVERVOLT_FLAG_MASK
Definition: hpm_pcfg_regs.h:246
#define PCFG_BANDGAP_VBG_TRIMMED_MASK
Definition: hpm_pcfg_regs.h:48
#define PCFG_DCDC_PROT_DISABLE_OVERVOLTAGE_MASK
Definition: hpm_pcfg_regs.h:234
#define PCFG_DCDC_RESUME_TIME_RESUME_TIME_SET(x)
Definition: hpm_pcfg_regs.h:591
#define PCFG_DCDC_MODE_MODE_MASK
Definition: hpm_pcfg_regs.h:158
#define PCFG_DCDC_PROT_ILIMIT_LP_MASK
Definition: hpm_pcfg_regs.h:200
#define PCFG_DCDC_PROT_OVERVOLT_FLAG_GET(x)
Definition: hpm_pcfg_regs.h:248
#define PCFG_DCDC_PROT_POWER_LOSS_FLAG_GET(x)
Definition: hpm_pcfg_regs.h:225
#define PCFG_RC24M_RC_TRIMMED_MASK
Definition: hpm_pcfg_regs.h:696
#define PCFG_DCDC_PROT_ILIMIT_LP_SET(x)
Definition: hpm_pcfg_regs.h:202
static void pcfg_ldo2p5_turn_on(PCFG_Type *ptr)
turn on LDO 2.5V
Definition: hpm_pcfg_drv.h:133
static bool pcfg_bandgap_is_trimmed(PCFG_Type *ptr)
check if bandgap is trimmed or not
Definition: hpm_pcfg_drv.h:103
static void pcfg_enable_power_trap(PCFG_Type *ptr)
enable power trap
Definition: hpm_pcfg_drv.h:329
static void pcfg_update_periph_clock_mode(PCFG_Type *ptr, pcfg_pmc_periph_t periph, bool on)
update clock gate mode in vpmc domain
Definition: hpm_pcfg_drv.h:439
static bool pcfg_dcdc_is_measure_current_valid(PCFG_Type *ptr)
check if measured current is valid
Definition: hpm_pcfg_drv.h:252
static void pcfg_dcdc_set_current_hys_range(PCFG_Type *ptr, pcfg_dcdc_current_hys_t range)
set dcdc current hysteres range
Definition: hpm_pcfg_drv.h:309
static void pcfg_clear_power_trap_trigger_flag(PCFG_Type *ptr)
clear power trap trigger flag
Definition: hpm_pcfg_drv.h:351
static void pcfg_bandgap_reload_trim(PCFG_Type *ptr)
bandgap reload trim value
Definition: hpm_pcfg_drv.h:113
static uint32_t pcfg_dcdc_get_start_time_in_cycle(PCFG_Type *ptr)
get DCDC start time in number of 24MHz clock cycles
Definition: hpm_pcfg_drv.h:264
static void pcfg_dcdc_ensable_over_voltage_prot(PCFG_Type *ptr)
enable over voltage protection
Definition: hpm_pcfg_drv.h:209
static void pcfg_dcdc_disable_over_voltage_prot(PCFG_Type *ptr)
disable over voltage protection
Definition: hpm_pcfg_drv.h:199
static void pcfg_disable_dcdc_retention(PCFG_Type *ptr)
disable dcdc retention
Definition: hpm_pcfg_drv.h:361
static bool pcfg_is_power_trap_triggered(PCFG_Type *ptr)
check if power trap is triggered
Definition: hpm_pcfg_drv.h:341
static bool pcfg_dcdc_is_stable(PCFG_Type *ptr)
Definition: hpm_pcfg_drv.h:155
static void pcfg_set_periph_clock_mode(PCFG_Type *ptr, uint32_t mode)
set clock gate mode in vpmc domain
Definition: hpm_pcfg_drv.h:427
static void pcfg_dcdc_set_mode(PCFG_Type *ptr, uint8_t mode)
Definition: hpm_pcfg_drv.h:164
static void pcfg_disable_wakeup_source(PCFG_Type *ptr, uint32_t mask)
disable wakeup source
Definition: hpm_pcfg_drv.h:416
static bool pcfg_dcdc_is_power_loss(PCFG_Type *ptr)
check if power loss flag is set
Definition: hpm_pcfg_drv.h:189
static bool pcfg_irc24m_is_trimmed(PCFG_Type *ptr)
check if irc24m is trimmed
Definition: hpm_pcfg_drv.h:455
static void pcfg_dcdc_set_resume_time_in_cycle(PCFG_Type *ptr, uint32_t cycles)
set DCDC resuem time in 24MHz clock cycles
Definition: hpm_pcfg_drv.h:298
static bool pcfg_ldo2p5_is_stable(PCFG_Type *ptr)
check if LDO 2.5V is stable
Definition: hpm_pcfg_drv.h:145
static void pcfg_irc24m_reload_trim(PCFG_Type *ptr)
reload irc24m trim value
Definition: hpm_pcfg_drv.h:465
static void pcfg_dcdc_set_start_time_in_cycle(PCFG_Type *ptr, uint32_t cycles)
set DCDC start time in 24MHz clock cycles
Definition: hpm_pcfg_drv.h:287
static void pcfg_dcdc_enable_measure_current(PCFG_Type *ptr)
enable current measurement
Definition: hpm_pcfg_drv.h:240
static void pcfg_clear_wakeup_cause(PCFG_Type *ptr, uint32_t mask)
clear wakeup cause flag
Definition: hpm_pcfg_drv.h:382
static void pcfg_enable_wakeup_source(PCFG_Type *ptr, uint32_t mask)
enable wakeup source
Definition: hpm_pcfg_drv.h:405
static void pcfg_dcdc_disable_measure_current(PCFG_Type *ptr)
disable current measurement
Definition: hpm_pcfg_drv.h:230
static void pcfg_disable_power_trap(PCFG_Type *ptr)
disable power trap
Definition: hpm_pcfg_drv.h:319
static void pcfg_dcdc_set_lp_current_limit(PCFG_Type *ptr, pcfg_dcdc_lp_current_limit_t limit, bool over_limit)
set low power current limit
Definition: hpm_pcfg_drv.h:176
static bool pcfg_dcdc_is_over_voltage(PCFG_Type *ptr)
checkover voltage flag
Definition: hpm_pcfg_drv.h:220
static uint32_t pcfg_get_wakeup_cause(PCFG_Type *ptr)
get wakeup cause
Definition: hpm_pcfg_drv.h:394
static void pcfg_enable_dcdc_retention(PCFG_Type *ptr)
enable dcdc retention to retain soc sram data
Definition: hpm_pcfg_drv.h:371
static void pcfg_ldo2p5_turn_off(PCFG_Type *ptr)
turn off LDO2P5
Definition: hpm_pcfg_drv.h:123
static uint32_t pcfg_dcdc_get_resume_time_in_cycle(PCFG_Type *ptr)
get DCDC resume time in number of 24MHz clock cycles
Definition: hpm_pcfg_drv.h:276
uint32_t hpm_stat_t
Definition: hpm_common.h:126
#define MAKE_STATUS(group, code)
Definition: hpm_common.h:135
@ status_group_pcfg
Definition: hpm_common.h:159
void pcfg_irc24m_config_track(PCFG_Type *ptr, pcfg_irc24m_config_t *config)
config irc24m track
Definition: hpm_pcfg_drv.c:74
hpm_stat_t pcfg_ldo1p1_set_voltage(PCFG_Type *ptr, uint16_t mv)
Definition: hpm_pcfg_drv.c:14
hpm_stat_t pcfg_ldo2p5_set_voltage(PCFG_Type *ptr, uint16_t mv)
Definition: hpm_pcfg_drv.c:24
pcfg_dcdc_lp_current_limit_t
Definition: hpm_pcfg_drv.h:34
uint16_t pcfg_dcdc_get_current_level(PCFG_Type *ptr)
Definition: hpm_pcfg_drv.c:47
hpm_stat_t pcfg_dcdc_set_voltage(PCFG_Type *ptr, uint16_t mv)
Definition: hpm_pcfg_drv.c:63
#define PCFG_PERIPH_KEEP_CLOCK_OFF(p)
Definition: hpm_pcfg_drv.h:25
pcfg_pmc_periph_t
Definition: hpm_pcfg_drv.h:54
pcfg_wakeup_src_t
Definition: hpm_pcfg_drv.h:63
pcfg_dcdc_mode_t
Definition: hpm_pcfg_drv.h:46
pcfg_dcdc_current_hys_t
Definition: hpm_pcfg_drv.h:40
#define PCFG_PERIPH_KEEP_CLOCK_ON(p)
Definition: hpm_pcfg_drv.h:24
pcfg_irc24m_reference_t
Definition: hpm_pcfg_drv.h:28
hpm_stat_t pcfg_dcdc_set_lpmode_voltage(PCFG_Type *ptr, uint16_t mv)
Definition: hpm_pcfg_drv.c:95
@ pcfg_dcdc_lp_current_limit_250ma
Definition: hpm_pcfg_drv.h:35
@ pcfg_dcdc_lp_current_limit_200ma
Definition: hpm_pcfg_drv.h:36
@ status_pcfg_ldo_out_of_range
Definition: hpm_pcfg_drv.h:74
@ pcfg_pmc_periph_timer
Definition: hpm_pcfg_drv.h:57
@ pcfg_pmc_periph_uart
Definition: hpm_pcfg_drv.h:59
@ pcfg_pmc_periph_ioc
Definition: hpm_pcfg_drv.h:56
@ pcfg_pmc_periph_gpio
Definition: hpm_pcfg_drv.h:55
@ pcfg_pmc_periph_wdog
Definition: hpm_pcfg_drv.h:58
@ pcfg_wakeup_src_bgpio
Definition: hpm_pcfg_drv.h:77
@ pcfg_wakeup_src_pwdg
Definition: hpm_pcfg_drv.h:67
@ pcfg_wakeup_src_wkup
Definition: hpm_pcfg_drv.h:69
@ pcfg_wakeup_src_pgpio
Definition: hpm_pcfg_drv.h:68
@ pcfg_wakeup_src_puart
Definition: hpm_pcfg_drv.h:65
@ pcfg_wakeup_src_soc
Definition: hpm_pcfg_drv.h:64
@ pcfg_wakeup_src_bsecurity
Definition: hpm_pcfg_drv.h:76
@ pcfg_wakeup_src_ptimer
Definition: hpm_pcfg_drv.h:66
@ pcfg_wakeup_src_rtc
Definition: hpm_pcfg_drv.h:79
@ pcfg_dcdc_mode_general
Definition: hpm_pcfg_drv.h:49
@ pcfg_dcdc_mode_off
Definition: hpm_pcfg_drv.h:47
@ pcfg_dcdc_mode_basic
Definition: hpm_pcfg_drv.h:48
@ pcfg_dcdc_mode_expert
Definition: hpm_pcfg_drv.h:50
@ pcfg_dcdc_current_hys_25mv
Definition: hpm_pcfg_drv.h:42
@ pcfg_dcdc_current_hys_12_5mv
Definition: hpm_pcfg_drv.h:41
@ pcfg_irc24m_reference_24m_xtal
Definition: hpm_pcfg_drv.h:30
@ pcfg_irc24m_reference_32k
Definition: hpm_pcfg_drv.h:29
Definition: hpm_pcfg_regs.h:12
__RW uint32_t LDO2P5
Definition: hpm_pcfg_regs.h:15
__RW uint32_t POWER_TRAP
Definition: hpm_pcfg_regs.h:28
__RW uint32_t DCDC_CURRENT
Definition: hpm_pcfg_regs.h:20
__RW uint32_t WAKE_MASK
Definition: hpm_pcfg_regs.h:30
__RW uint32_t BANDGAP
Definition: hpm_pcfg_regs.h:13
__RW uint32_t SCG_CTRL
Definition: hpm_pcfg_regs.h:31
__RW uint32_t DCDC_START_TIME
Definition: hpm_pcfg_regs.h:25
__RW uint32_t DCDC_PROT
Definition: hpm_pcfg_regs.h:19
__RW uint32_t DCDC_MODE
Definition: hpm_pcfg_regs.h:17
__RW uint32_t DCDC_MISC
Definition: hpm_pcfg_regs.h:23
__RW uint32_t DCDC_RESUME_TIME
Definition: hpm_pcfg_regs.h:26
__RW uint32_t WAKE_CAUSE
Definition: hpm_pcfg_regs.h:29
__RW uint32_t RC24M
Definition: hpm_pcfg_regs.h:33
Definition: hpm_pcfg_drv.h:78