Skip to content

Commit fa41e76

Browse files
committed
Merge branch 'feature/support_chip912_pvt_auto_dbias_360m' into 'master'
feat(p4): support chip912 pvt auto dbias 360m Closes PM-357, PM-355, and IDF-8142 See merge request espressif/esp-idf!36615
2 parents 561f53c + 5aa1a5f commit fa41e76

File tree

23 files changed

+399
-31
lines changed

23 files changed

+399
-31
lines changed

components/esp_hw_support/Kconfig

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,15 @@ menu "Hardware Settings"
296296
RC32K (it cannot operate below -40 degrees Celsius),
297297
please avoid using it whenever possible
298298

299+
config ESP_ENABLE_PVT
300+
bool "Auto adjust hp & lp voltage using pvt function (MUST ENABLE FOR MP)"
301+
depends on SOC_PMU_PVT_SUPPORTED
302+
default y
303+
help
304+
If enabled, hp & lp voltage can be auto adjust by PVT characteristic.
305+
Otherwise, internal voltage will be set to fix dbias.
306+
This is a must for stable mass production. Disable for debugging only.
307+
299308
config ESP_INTR_IN_IRAM
300309
bool "Place esp_intr_alloc functions in IRAM" if SPI_FLASH_AUTO_SUSPEND
301310
default y

components/esp_hw_support/linker.lf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ entries:
4343
elif PM_SLP_IRAM_OPT = y && IDF_TARGET_ESP32P4 != y:
4444
pmu_param:get_act_hp_dbias (noflash)
4545
pmu_param:get_act_lp_dbias (noflash)
46+
if SOC_PMU_PVT_SUPPORTED = y:
47+
pmu_pvt (noflash)
4648
if PM_SLP_IRAM_OPT = y && SOC_USB_SERIAL_JTAG_SUPPORTED = y:
4749
sleep_console (noflash)
4850
if PM_SLP_IRAM_OPT = y && SOC_USB_OTG_SUPPORTED && SOC_PM_SUPPORT_CNNT_PD = y:

components/esp_hw_support/port/esp32p4/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ if(NOT BOOTLOADER_BUILD)
1313
list(APPEND srcs "sar_periph_ctrl.c")
1414
endif()
1515

16+
if(NOT BOOTLOADER_BUILD AND CONFIG_ESP_ENABLE_PVT)
17+
list(APPEND srcs "pmu_pvt.c")
18+
endif()
19+
1620
add_prefix(srcs "${CMAKE_CURRENT_LIST_DIR}/" "${srcs}")
1721

1822
target_sources(${COMPONENT_LIB} PRIVATE "${srcs}")

components/esp_hw_support/port/esp32p4/include/soc/rtc.h

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2022-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2022-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -95,6 +95,36 @@ set sleep_init default param
9595
#define RTC_CNTL_PD_CUR_SLEEP_DEFAULT 1
9696
#define RTC_CNTL_DG_VDD_DRV_B_SLP_DEFAULT 254
9797

98+
#if CONFIG_ESP_ENABLE_PVT
99+
100+
#define PVT_CHANNEL0_SEL 49
101+
#define PVT_CHANNEL1_SEL 53
102+
#define PVT_CHANNEL0_CFG 0x13e80
103+
#define PVT_CHANNEL1_CFG 0x13e80
104+
#define PVT_CHANNEL2_CFG 0x10000
105+
#define PVT_CMD0 0x24
106+
#define PVT_CMD1 0x5
107+
#define PVT_CMD2 0x427
108+
#define PVT_TARGET 0x7d00
109+
#define PVT_CLK_DIV 1
110+
#define PVT_EDG_MODE 1
111+
#define PVT_DELAY_NUM_HIGH 164
112+
#define PVT_DELAY_NUM_LOW 157
113+
114+
/**
115+
* @brief Initialize PVT related parameters
116+
*/
117+
void pvt_auto_dbias_init(void);
118+
119+
/**
120+
* @brief Enable or disable PVT functions
121+
*
122+
* @param enable true to enable, false to disable
123+
*/
124+
void pvt_func_enable(bool enable);
125+
126+
#endif //#if CONFIG_ESP_ENABLE_PVT
127+
98128
/*
99129
The follow value is used to get a reasonable rtc voltage dbias value according to digital dbias & some other value
100130
storing in efuse (based on ATE 5k ECO3 chips)

components/esp_hw_support/port/esp32p4/pmu_init.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -18,6 +18,8 @@
1818
#include "esp_private/esp_pmu.h"
1919
#include "soc/regi2c_dig_reg.h"
2020
#include "regi2c_ctrl.h"
21+
#include "esp_rom_sys.h"
22+
#include "soc/rtc.h"
2123

2224
static __attribute__((unused)) const char *TAG = "pmu_init";
2325

@@ -194,4 +196,10 @@ void pmu_init(void)
194196
pmu_hp_system_init_default(PMU_instance());
195197
pmu_lp_system_init_default(PMU_instance());
196198
pmu_power_domain_force_default(PMU_instance());
199+
#if CONFIG_ESP_ENABLE_PVT
200+
pvt_auto_dbias_init();
201+
pvt_func_enable(true);
202+
// For PVT func taking effect, need delay.
203+
esp_rom_delay_us(1000);
204+
#endif
197205
}

components/esp_hw_support/port/esp32p4/pmu_param.c

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -13,6 +13,11 @@
1313
#include "soc/pmu_icg_mapping.h"
1414
#include "esp_private/esp_pmu.h"
1515
#include "soc/clk_tree_defs.h"
16+
#include "hal/efuse_ll.h"
17+
#include "hal/efuse_hal.h"
18+
#include "esp_hw_log.h"
19+
20+
static __attribute__((unused)) const char *TAG = "pmu_param";
1621

1722
#ifndef ARRAY_SIZE
1823
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
@@ -323,3 +328,46 @@ const pmu_lp_system_analog_param_t * pmu_lp_system_analog_param_default(pmu_lp_m
323328
assert(mode < ARRAY_SIZE(lp_analog));
324329
return &lp_analog[mode];
325330
}
331+
332+
uint32_t get_act_hp_dbias(void)
333+
{
334+
/* hp_cali_dbias is read from efuse to ensure that the hp_active_voltage is close to 1.15V
335+
*/
336+
uint32_t hp_cali_dbias = HP_CALI_ACTIVE_DBIAS_DEFAULT;
337+
uint32_t blk_version = efuse_hal_blk_version();
338+
uint32_t hp_cali_dbias_efuse = 0;
339+
if (blk_version >= 2) {
340+
hp_cali_dbias_efuse = efuse_ll_get_active_hp_dbias();
341+
}
342+
if (hp_cali_dbias_efuse > 0) {
343+
hp_cali_dbias = hp_cali_dbias_efuse + 16;
344+
if (hp_cali_dbias > 31) {
345+
hp_cali_dbias = 31;
346+
}
347+
} else {
348+
ESP_HW_LOGW(TAG, "hp_cali_dbias not burnt in efuse, use default.");
349+
}
350+
return hp_cali_dbias;
351+
}
352+
353+
uint32_t get_act_lp_dbias(void)
354+
{
355+
/* lp_cali_dbias is read from efuse to ensure that the lp_active_voltage is close to 1.15V
356+
*/
357+
uint32_t lp_cali_dbias = LP_CALI_ACTIVE_DBIAS_DEFAULT;
358+
uint32_t blk_version = efuse_hal_blk_version();
359+
uint32_t lp_cali_dbias_efuse = 0;
360+
if (blk_version >= 2) {
361+
lp_cali_dbias_efuse = efuse_ll_get_active_lp_dbias();
362+
}
363+
if (lp_cali_dbias_efuse > 0) {
364+
//efuse dbias need to add 4 to near to dcdc voltage
365+
lp_cali_dbias = lp_cali_dbias_efuse + 16 + 4;
366+
if (lp_cali_dbias > 31) {
367+
lp_cali_dbias = 31;
368+
}
369+
} else {
370+
ESP_HW_LOGW(TAG, "lp_cali_dbias not burnt in efuse, use default.");
371+
}
372+
return lp_cali_dbias;
373+
}
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
/*
2+
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <stdint.h>
8+
#include <stdlib.h>
9+
#include <esp_types.h>
10+
#include "sdkconfig.h"
11+
#include "esp_attr.h"
12+
#include "soc/soc.h"
13+
#include "soc/pmu_struct.h"
14+
#include "soc/pvt_reg.h"
15+
#include "soc/pmu_reg.h"
16+
#include "hal/pmu_hal.h"
17+
#include "pmu_param.h"
18+
#include "esp_rom_sys.h"
19+
#include "esp_private/esp_pmu.h"
20+
#include "soc/regi2c_dig_reg.h"
21+
#include "regi2c_ctrl.h"
22+
#include "soc/rtc.h"
23+
#include "hal/efuse_ll.h"
24+
#include "hal/efuse_hal.h"
25+
#include "esp_hw_log.h"
26+
27+
static __attribute__((unused)) const char *TAG = "pmu_pvt";
28+
29+
#if CONFIG_ESP_ENABLE_PVT
30+
31+
static uint8_t get_lp_hp_gap(void)
32+
{
33+
int8_t lp_hp_gap = 0;
34+
uint32_t blk_version = efuse_hal_blk_version();
35+
uint8_t lp_hp_gap_efuse = 0;
36+
if (blk_version >= 2) {
37+
lp_hp_gap_efuse = efuse_ll_get_dbias_vol_gap();
38+
bool gap_flag = lp_hp_gap_efuse >> 4;
39+
uint8_t gap_abs_value = lp_hp_gap_efuse & 0xf;
40+
if (gap_flag) {
41+
lp_hp_gap = -1 * gap_abs_value;
42+
} else {
43+
lp_hp_gap = gap_abs_value;
44+
}
45+
lp_hp_gap = lp_hp_gap - 8;
46+
assert((lp_hp_gap >= -15) && (lp_hp_gap <= 7));
47+
if (lp_hp_gap < 0 ) {
48+
lp_hp_gap = 16 - lp_hp_gap;
49+
}
50+
}
51+
return lp_hp_gap;
52+
}
53+
54+
static void set_pvt_hp_lp_gap(uint8_t value)
55+
{
56+
bool flag = value >> 4;
57+
uint8_t abs_value = value & 0xf;
58+
59+
SET_PERI_REG_BITS(PVT_DBIAS_CMD0_REG, PVT_DBIAS_CMD0_OFFSET_FLAG, flag, PVT_DBIAS_CMD0_OFFSET_FLAG_S);
60+
SET_PERI_REG_BITS(PVT_DBIAS_CMD0_REG, PVT_DBIAS_CMD0_OFFSET_VALUE, abs_value, PVT_DBIAS_CMD0_OFFSET_VALUE_S);
61+
SET_PERI_REG_BITS(PVT_DBIAS_CMD1_REG, PVT_DBIAS_CMD1_OFFSET_FLAG, flag, PVT_DBIAS_CMD1_OFFSET_FLAG_S);
62+
SET_PERI_REG_BITS(PVT_DBIAS_CMD1_REG, PVT_DBIAS_CMD1_OFFSET_VALUE, abs_value, PVT_DBIAS_CMD1_OFFSET_VALUE_S);
63+
SET_PERI_REG_BITS(PVT_DBIAS_CMD2_REG, PVT_DBIAS_CMD2_OFFSET_FLAG, flag, PVT_DBIAS_CMD2_OFFSET_FLAG_S);
64+
SET_PERI_REG_BITS(PVT_DBIAS_CMD2_REG, PVT_DBIAS_CMD2_OFFSET_VALUE, abs_value, PVT_DBIAS_CMD2_OFFSET_VALUE_S);
65+
}
66+
67+
static uint32_t pvt_get_dcmvset(void)
68+
{
69+
return GET_PERI_REG_BITS2(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_HP_DBIAS_VOL_V, PMU_HP_DBIAS_VOL_S);
70+
}
71+
72+
static uint32_t pvt_get_lp_dbias(void)
73+
{
74+
return GET_PERI_REG_BITS2(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_LP_DBIAS_VOL_V, PMU_LP_DBIAS_VOL_S);
75+
}
76+
77+
void pvt_auto_dbias_init(void)
78+
{
79+
uint32_t blk_version = efuse_hal_blk_version();
80+
if (blk_version >= 2) {
81+
SET_PERI_REG_MASK(HP_SYS_CLKRST_REF_CLK_CTRL2_REG, HP_SYS_CLKRST_REG_REF_160M_CLK_EN);
82+
SET_PERI_REG_MASK(HP_SYS_CLKRST_SOC_CLK_CTRL1_REG, HP_SYS_CLKRST_REG_PVT_SYS_CLK_EN);
83+
/*config for dbias func*/
84+
CLEAR_PERI_REG_MASK(PVT_DBIAS_TIMER_REG, PVT_TIMER_EN);
85+
esp_rom_delay_us(100);
86+
SET_PERI_REG_BITS(PVT_DBIAS_CHANNEL_SEL0_REG, PVT_DBIAS_CHANNEL0_SEL, PVT_CHANNEL0_SEL, PVT_DBIAS_CHANNEL0_SEL_S);
87+
SET_PERI_REG_BITS(PVT_DBIAS_CHANNEL_SEL0_REG, PVT_DBIAS_CHANNEL1_SEL, PVT_CHANNEL1_SEL, PVT_DBIAS_CHANNEL1_SEL_S); // Select monitor cell, which used to monitor PVT situation
88+
SET_PERI_REG_BITS(PVT_DBIAS_CHANNEL0_SEL_REG, PVT_DBIAS_CHANNEL0_CFG, PVT_CHANNEL0_CFG, PVT_DBIAS_CHANNEL0_CFG_S);
89+
SET_PERI_REG_BITS(PVT_DBIAS_CHANNEL1_SEL_REG, PVT_DBIAS_CHANNEL1_CFG, PVT_CHANNEL1_CFG, PVT_DBIAS_CHANNEL1_CFG_S);
90+
SET_PERI_REG_BITS(PVT_DBIAS_CHANNEL2_SEL_REG, PVT_DBIAS_CHANNEL2_CFG, PVT_CHANNEL2_CFG, PVT_DBIAS_CHANNEL2_CFG_S); // Configure filter threshold for avoiding auto-dbias overly sensitive regulation
91+
SET_PERI_REG_BITS(PVT_DBIAS_CMD0_REG, PVT_DBIAS_CMD0_PVT, PVT_CMD0, PVT_DBIAS_CMD0_PVT_S);
92+
SET_PERI_REG_BITS(PVT_DBIAS_CMD1_REG, PVT_DBIAS_CMD1_PVT, PVT_CMD1, PVT_DBIAS_CMD1_PVT_S);
93+
SET_PERI_REG_BITS(PVT_DBIAS_CMD2_REG, PVT_DBIAS_CMD2_PVT, PVT_CMD2, PVT_DBIAS_CMD2_PVT_S); // Configure auto-dbias adjust property, such as adjusting step
94+
SET_PERI_REG_MASK(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_DIG_DBIAS_INIT); // Start calibration @HP_CALI_DBIAS_DEFAULT
95+
SET_PERI_REG_BITS(PVT_DBIAS_TIMER_REG, PVT_TIMER_TARGET, PVT_TARGET, PVT_TIMER_TARGET_S); // Configure auto-dbias voltage regulation cycle
96+
97+
SET_PERI_REG_BITS(HP_SYS_CLKRST_PERI_CLK_CTRL24_REG, HP_SYS_CLKRST_REG_PVT_CLK_DIV_NUM, PVT_CLK_DIV, HP_SYS_CLKRST_REG_PVT_CLK_DIV_NUM_S); // PVT function clock divider number
98+
SET_PERI_REG_BITS(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP_CLK_DIV_NUM, PVT_CLK_DIV, HP_SYS_CLKRST_REG_PVT_PERI_GROUP_CLK_DIV_NUM_S); // PVT function clock divider number
99+
SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL24_REG, HP_SYS_CLKRST_REG_PVT_CLK_EN);
100+
SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP1_CLK_EN);
101+
SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP2_CLK_EN);
102+
SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP3_CLK_EN);
103+
SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP4_CLK_EN);
104+
105+
/*config for pvt cell: unit0; site3; vt1*/
106+
SET_PERI_REG_MASK(PVT_CLK_CFG_REG, PVT_MONITOR_CLK_PVT_EN); // Once enable cannot be closed
107+
esp_rom_delay_us(100);
108+
SET_PERI_REG_BITS(PVT_COMB_PD_SITE3_UNIT0_VT1_CONF2_REG, PVT_MONITOR_EDG_MOD_VT1_PD_SITE3_UNIT0, PVT_EDG_MODE, PVT_MONITOR_EDG_MOD_VT1_PD_SITE3_UNIT0_S); // Select edge_mode
109+
SET_PERI_REG_BITS(PVT_COMB_PD_SITE3_UNIT0_VT1_CONF1_REG, PVT_DELAY_LIMIT_VT1_PD_SITE3_UNIT0, PVT_DELAY_NUM_HIGH, PVT_DELAY_LIMIT_VT1_PD_SITE3_UNIT0_S); // The threshold for determining whether the voltage is too high
110+
SET_PERI_REG_BITS(PVT_COMB_PD_SITE3_UNIT1_VT1_CONF1_REG, PVT_DELAY_LIMIT_VT1_PD_SITE3_UNIT1, PVT_DELAY_NUM_LOW, PVT_DELAY_LIMIT_VT1_PD_SITE3_UNIT1_S); // The threshold for determining whether the voltage is too low
111+
112+
/*config lp offset for pvt func*/
113+
uint8_t lp_hp_gap = get_lp_hp_gap();
114+
set_pvt_hp_lp_gap(lp_hp_gap);
115+
} else {
116+
ESP_HW_LOGW(TAG, "blk_version is less than 2, pvt auto dbias init not supported in efuse.");
117+
}
118+
}
119+
120+
void pvt_func_enable(bool enable)
121+
{
122+
uint32_t blk_version = efuse_hal_blk_version();
123+
if (blk_version >= 2){
124+
125+
if (enable) {
126+
SET_PERI_REG_MASK(HP_SYS_CLKRST_REF_CLK_CTRL2_REG, HP_SYS_CLKRST_REG_REF_160M_CLK_EN);
127+
SET_PERI_REG_MASK(HP_SYS_CLKRST_SOC_CLK_CTRL1_REG, HP_SYS_CLKRST_REG_PVT_SYS_CLK_EN);
128+
SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL24_REG, HP_SYS_CLKRST_REG_PVT_CLK_EN);
129+
SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP1_CLK_EN);
130+
SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP2_CLK_EN);
131+
SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP3_CLK_EN);
132+
SET_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL25_REG, HP_SYS_CLKRST_REG_PVT_PERI_GROUP4_CLK_EN);
133+
SET_PERI_REG_MASK(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_DIG_DBIAS_INIT); // Start calibration @HP_CALI_DBIAS_DEFAULT
134+
SET_PERI_REG_MASK(PVT_CLK_CFG_REG, PVT_MONITOR_CLK_PVT_EN); // Once enable cannot be closed
135+
SET_PERI_REG_MASK(PVT_COMB_PD_SITE3_UNIT0_VT1_CONF1_REG, PVT_MONITOR_EN_VT1_PD_SITE3_UNIT0); // Enable pvt clk
136+
esp_rom_delay_us(1000);
137+
CLEAR_PERI_REG_MASK(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_DIG_REGULATOR0_DBIAS_SEL); // Hand over control of dbias to pvt
138+
CLEAR_PERI_REG_MASK(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_DIG_DBIAS_INIT); // Must clear @HP_CALI_DBIAS_DEFAULT
139+
SET_PERI_REG_MASK(PVT_DBIAS_TIMER_REG, PVT_TIMER_EN); // Enable auto dbias
140+
} else {
141+
uint32_t pvt_dcmvset = pvt_get_dcmvset();
142+
uint32_t pvt_lpdbias = pvt_get_lp_dbias(); // Update pvt_cali_dbias
143+
SET_PERI_REG_BITS(PMU_HP_ACTIVE_BIAS_REG, PMU_HP_ACTIVE_DCM_VSET, pvt_dcmvset, PMU_HP_ACTIVE_DCM_VSET_S);
144+
SET_PERI_REG_BITS(PMU_HP_SLEEP_LP_REGULATOR0_REG, PMU_HP_SLEEP_LP_REGULATOR_DBIAS, pvt_lpdbias, PMU_HP_SLEEP_LP_REGULATOR_DBIAS_S);
145+
SET_PERI_REG_MASK(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_DIG_REGULATOR0_DBIAS_SEL); // Hand over control of dbias to pmu
146+
CLEAR_PERI_REG_MASK(HP_SYS_CLKRST_PERI_CLK_CTRL24_REG, HP_SYS_CLKRST_REG_PVT_CLK_EN);
147+
}
148+
} else {
149+
ESP_HW_LOGD(TAG, "blk_version is less than 2, pvt function not supported in efuse.");
150+
}
151+
}
152+
153+
#endif

components/esp_hw_support/port/esp32p4/pmu_sleep.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ const pmu_sleep_config_t* pmu_sleep_config_default(
201201
analog_default.lp_sys[LP(SLEEP)].analog.bias_sleep = PMU_BIASSLP_SLEEP_ON;
202202
analog_default.lp_sys[LP(SLEEP)].analog.dbg_atten = PMU_DBG_ATTEN_ACTIVE_DEFAULT;
203203
#if !CONFIG_ESP_SLEEP_KEEP_DCDC_ALWAYS_ON
204-
analog_default.lp_sys[LP(SLEEP)].analog.dbias = LP_CALI_DBIAS;
204+
analog_default.lp_sys[LP(SLEEP)].analog.dbias = LP_CALI_ACTIVE_DBIAS_DEFAULT;
205205
#endif
206206
}
207207

components/esp_hw_support/port/esp32p4/private_include/pmu_param.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2023-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -18,7 +18,7 @@ extern "C" {
1818

1919
#define HP_CALI_ACTIVE_DCM_VSET_DEFAULT 27 // For DCDC, about 1.25v
2020
#define HP_CALI_ACTIVE_DBIAS_DEFAULT 24 // For HP regulator
21-
#define LP_CALI_DBIAS 29 // For LP regulator
21+
#define LP_CALI_ACTIVE_DBIAS_DEFAULT 29 // For LP regulator
2222

2323
// FOR XTAL FORCE PU IN SLEEP
2424
#define PMU_PD_CUR_SLEEP_ON 0
@@ -53,6 +53,9 @@ extern "C" {
5353
#define PMU_DBG_ATTEN_DEEPSLEEP_DEFAULT 12
5454
#define PMU_LP_DBIAS_DEEPSLEEP_0V7 23
5555

56+
uint32_t get_act_hp_dbias(void);
57+
uint32_t get_act_lp_dbias(void);
58+
5659
typedef struct {
5760
pmu_hp_dig_power_reg_t dig_power;
5861
pmu_hp_clk_power_reg_t clk_power;

components/esp_hw_support/port/esp32p4/rtc_clk_init.c

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,22 @@ void rtc_clk_init(rtc_clk_config_t cfg)
5353
REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_FORCE_XPD_IPH, 0);
5454
REGI2C_WRITE_MASK(I2C_BIAS, I2C_BIAS_OR_FORCE_XPD_VGATE_BUF, 0);
5555

56-
pmu_ll_lp_set_regulator_dbias(&PMU, PMU_MODE_LP_ACTIVE, LP_CALI_DBIAS);
56+
uint32_t hp_dbias = get_act_hp_dbias();
57+
uint32_t lp_dbias = get_act_lp_dbias();
58+
pmu_ll_hp_set_regulator_xpd(&PMU, PMU_MODE_HP_ACTIVE, true);
59+
pmu_ll_hp_set_regulator_dbias(&PMU, PMU_MODE_HP_ACTIVE, hp_dbias);
60+
pmu_ll_lp_set_regulator_dbias(&PMU, PMU_MODE_LP_ACTIVE, lp_dbias);
61+
62+
uint32_t pvt_hp_dcmvset = GET_PERI_REG_BITS2(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_HP_DBIAS_VOL_V, PMU_HP_DBIAS_VOL_S);
63+
uint32_t hp_dcmvset = HP_CALI_ACTIVE_DCM_VSET_DEFAULT;
64+
if (pvt_hp_dcmvset > hp_dcmvset) {
65+
hp_dcmvset = pvt_hp_dcmvset;
66+
}
5767
// Switch to DCDC
5868
pmu_ll_set_dcdc_en(&PMU, true);
5969
pmu_ll_set_dcdc_switch_force_power_down(&PMU, false);
60-
pmu_ll_hp_set_dcm_vset(&PMU, PMU_MODE_HP_ACTIVE, HP_CALI_ACTIVE_DCM_VSET_DEFAULT);
70+
pmu_ll_hp_set_dcm_vset(&PMU, PMU_MODE_HP_ACTIVE, hp_dcmvset);
71+
SET_PERI_REG_MASK(PMU_HP_ACTIVE_HP_REGULATOR0_REG, PMU_DIG_REGULATOR0_DBIAS_SEL); // Hand over control of dbias to pmu
6172
esp_rom_delay_us(1000);
6273
pmu_ll_hp_set_regulator_xpd(&PMU, PMU_MODE_HP_ACTIVE, false);
6374

0 commit comments

Comments
 (0)