Skip to content

Commit d4a821a

Browse files
yanzihan@espressif.comIcarus113
authored andcommitted
feat(clk): add 100m/200m/400m cpu freq & change clk cal & change blk version
1 parent 3655d4c commit d4a821a

File tree

8 files changed

+67
-9
lines changed

8 files changed

+67
-9
lines changed

components/bootloader/Kconfig.projbuild

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ menu "Bootloader config"
4343
int
4444
default 64 if IDF_TARGET_ESP32H2
4545
default 48 if IDF_TARGET_ESP32H21 || IDF_TARGET_ESP32H4
46-
default 90 if IDF_TARGET_ESP32P4
46+
default 90 if IDF_TARGET_ESP32P4 && ESP32P4_SELECTS_REV_LESS_V2
47+
default 100 if IDF_TARGET_ESP32P4 && !ESP32P4_SELECTS_REV_LESS_V2
4748
default 80
4849
help
4950
The CPU clock frequency to be at least raised to in 2nd bootloader. Invisible for users.

components/esp_hw_support/port/esp32p4/pmu_param.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,7 @@ uint32_t get_act_hp_dbias(void)
336336
uint32_t hp_cali_dbias = HP_CALI_ACTIVE_DBIAS_DEFAULT;
337337
uint32_t blk_version = efuse_hal_blk_version();
338338
uint32_t hp_cali_dbias_efuse = 0;
339-
if (blk_version >= 2) {
339+
if (blk_version >= 2 && blk_version < 100) {
340340
hp_cali_dbias_efuse = efuse_ll_get_active_hp_dbias();
341341
}
342342
if (hp_cali_dbias_efuse > 0) {
@@ -357,7 +357,7 @@ uint32_t get_act_lp_dbias(void)
357357
uint32_t lp_cali_dbias = LP_CALI_ACTIVE_DBIAS_DEFAULT;
358358
uint32_t blk_version = efuse_hal_blk_version();
359359
uint32_t lp_cali_dbias_efuse = 0;
360-
if (blk_version >= 2) {
360+
if (blk_version >= 2 && blk_version < 100) {
361361
lp_cali_dbias_efuse = efuse_ll_get_active_lp_dbias();
362362
}
363363
if (lp_cali_dbias_efuse > 0) {

components/esp_hw_support/port/esp32p4/pmu_pvt.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static uint8_t get_lp_hp_gap(void)
3333
int8_t lp_hp_gap = 0;
3434
uint32_t blk_version = efuse_hal_blk_version();
3535
uint8_t lp_hp_gap_efuse = 0;
36-
if (blk_version >= 2) {
36+
if (blk_version >= 2 && blk_version < 100) {
3737
lp_hp_gap_efuse = efuse_ll_get_dbias_vol_gap();
3838
bool gap_flag = lp_hp_gap_efuse >> 4;
3939
uint8_t gap_abs_value = lp_hp_gap_efuse & 0xf;
@@ -77,7 +77,7 @@ static uint32_t pvt_get_lp_dbias(void)
7777
void pvt_auto_dbias_init(void)
7878
{
7979
uint32_t blk_version = efuse_hal_blk_version();
80-
if (blk_version >= 2) {
80+
if (blk_version >= 2 && blk_version < 100) {
8181
SET_PERI_REG_MASK(HP_SYS_CLKRST_REF_CLK_CTRL2_REG, HP_SYS_CLKRST_REG_REF_160M_CLK_EN);
8282
SET_PERI_REG_MASK(HP_SYS_CLKRST_SOC_CLK_CTRL1_REG, HP_SYS_CLKRST_REG_PVT_SYS_CLK_EN);
8383
/*config for dbias func*/
@@ -120,7 +120,7 @@ void pvt_auto_dbias_init(void)
120120
void pvt_func_enable(bool enable)
121121
{
122122
uint32_t blk_version = efuse_hal_blk_version();
123-
if (blk_version >= 2){
123+
if (blk_version >= 2 && blk_version < 100){
124124

125125
if (enable) {
126126
SET_PERI_REG_MASK(HP_SYS_CLKRST_REF_CLK_CTRL2_REG, HP_SYS_CLKRST_REG_REF_160M_CLK_EN);

components/esp_hw_support/port/esp32p4/rtc_clk.c

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ static void rtc_clk_cpu_freq_to_cpll_mhz(int cpu_freq_mhz, hal_utils_clk_div_t *
224224
uint32_t mem_divider = 1;
225225
uint32_t sys_divider = 1; // We are not going to change this
226226
uint32_t apb_divider = 1;
227+
#if CONFIG_ESP32P4_SELECTS_REV_LESS_V2
227228
switch (cpu_freq_mhz) {
228229
case 360:
229230
mem_divider = 2;
@@ -244,6 +245,28 @@ static void rtc_clk_cpu_freq_to_cpll_mhz(int cpu_freq_mhz, hal_utils_clk_div_t *
244245
// To avoid such case, we will strictly do abort here.
245246
abort();
246247
}
248+
#else
249+
switch (cpu_freq_mhz) {
250+
case 400:
251+
mem_divider = 2;
252+
apb_divider = 2;
253+
break;
254+
case 200:
255+
mem_divider = 1;
256+
apb_divider = 2;
257+
break;
258+
case 100:
259+
mem_divider = 1;
260+
apb_divider = 1;
261+
break;
262+
default:
263+
// Unsupported configuration
264+
// This is dangerous to modify dividers. Hardware could automatically correct the divider, and it won't be
265+
// reflected to the registers. Therefore, you won't even be able to calculate out the real mem_clk, apb_clk freq.
266+
// To avoid such case, we will strictly do abort here.
267+
abort();
268+
}
269+
#endif
247270

248271
// If it's upscaling, the divider of MEM/SYS/APB needs to be increased, to avoid illegal intermediate states,
249272
// the clock divider should be updated in the order from the APB_CLK to CPU_CLK.
@@ -289,14 +312,14 @@ bool rtc_clk_cpu_freq_mhz_to_config(uint32_t freq_mhz, rtc_cpu_freq_config_t *ou
289312

290313
// Keep default CPLL at 360MHz
291314
uint32_t xtal_freq = (uint32_t)rtc_clk_xtal_freq_get();
315+
#if CONFIG_ESP32P4_SELECTS_REV_LESS_V2
292316
if (freq_mhz <= xtal_freq && freq_mhz != 0) {
293317
divider.integer = xtal_freq / freq_mhz;
294318
real_freq_mhz = (xtal_freq + divider.integer / 2) / divider.integer; /* round */
295319
if (real_freq_mhz != freq_mhz) {
296320
// no suitable divider
297321
return false;
298322
}
299-
300323
source_freq_mhz = xtal_freq;
301324
source = SOC_CPU_CLK_SRC_XTAL;
302325
} else if (freq_mhz == 90) {
@@ -314,6 +337,30 @@ bool rtc_clk_cpu_freq_mhz_to_config(uint32_t freq_mhz, rtc_cpu_freq_config_t *ou
314337
source = SOC_CPU_CLK_SRC_CPLL;
315338
source_freq_mhz = CLK_LL_PLL_360M_FREQ_MHZ;
316339
divider.integer = 1;
340+
} else {
341+
// unsupported frequency
342+
return false;
343+
}
344+
#else
345+
if (freq_mhz <= xtal_freq && freq_mhz != 0) {
346+
divider.integer = xtal_freq / freq_mhz;
347+
real_freq_mhz = (xtal_freq + divider.integer / 2) / divider.integer; /* round */
348+
if (real_freq_mhz != freq_mhz) {
349+
// no suitable divider
350+
return false;
351+
}
352+
source_freq_mhz = xtal_freq;
353+
source = SOC_CPU_CLK_SRC_XTAL;
354+
} else if (freq_mhz == 100) {
355+
real_freq_mhz = freq_mhz;
356+
source = SOC_CPU_CLK_SRC_CPLL;
357+
source_freq_mhz = CLK_LL_PLL_400M_FREQ_MHZ;
358+
divider.integer = 4;
359+
} else if (freq_mhz == 200) {
360+
real_freq_mhz = freq_mhz;
361+
source = SOC_CPU_CLK_SRC_CPLL;
362+
source_freq_mhz = CLK_LL_PLL_400M_FREQ_MHZ;
363+
divider.integer = 2;
317364
} else if (freq_mhz == 400) {
318365
// If CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ selects 400MHz, then at app startup stage will need a CPLL calibration to raise its freq from 360MHz to 400MHz
319366
real_freq_mhz = freq_mhz;
@@ -324,6 +371,7 @@ bool rtc_clk_cpu_freq_mhz_to_config(uint32_t freq_mhz, rtc_cpu_freq_config_t *ou
324371
// unsupported frequency
325372
return false;
326373
}
374+
#endif
327375
*out_config = (rtc_cpu_freq_config_t) {
328376
.source = source,
329377
.div = divider,

components/esp_hw_support/port/esp32p4/rtc_time.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ static bool rtc_clk_cal_32k_valid(uint32_t xtal_freq, uint32_t slowclk_cycles, u
182182

183183
uint32_t rtc_clk_cal(soc_clk_freq_calculation_src_t cal_clk_sel, uint32_t slowclk_cycles)
184184
{
185-
slowclk_cycles /= (cal_clk_sel == CLK_CAL_RTC_SLOW) ? 1 : CLK_CAL_DIV_VAL(cal_clk_sel);
185+
// slowclk_cycles /= (cal_clk_sel == CLK_CAL_RTC_SLOW) ? 1 : CLK_CAL_DIV_VAL(cal_clk_sel);
186186
assert(slowclk_cycles);
187187
soc_xtal_freq_t xtal_freq = rtc_clk_xtal_freq_get();
188188
uint64_t xtal_cycles = rtc_clk_cal_internal(cal_clk_sel, slowclk_cycles);
Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
choice ESP_DEFAULT_CPU_FREQ_MHZ
22
prompt "CPU frequency"
33
default ESP_DEFAULT_CPU_FREQ_MHZ_40 if IDF_ENV_FPGA || ESP_BRINGUP_BYPASS_CPU_CLK_SETTING
4-
default ESP_DEFAULT_CPU_FREQ_MHZ_360
4+
default ESP_DEFAULT_CPU_FREQ_MHZ_360 if ESP32P4_SELECTS_REV_LESS_V2
5+
default ESP_DEFAULT_CPU_FREQ_MHZ_400
56
help
67
CPU frequency to be set on application startup.
78

@@ -10,9 +11,13 @@ choice ESP_DEFAULT_CPU_FREQ_MHZ
1011
depends on IDF_ENV_FPGA || ESP_BRINGUP_BYPASS_CPU_CLK_SETTING
1112
config ESP_DEFAULT_CPU_FREQ_MHZ_360
1213
bool "360 MHz"
14+
depends on ESP32P4_SELECTS_REV_LESS_V2
15+
config ESP_DEFAULT_CPU_FREQ_MHZ_400
16+
bool "400 MHz"
1317
endchoice
1418

1519
config ESP_DEFAULT_CPU_FREQ_MHZ
1620
int
1721
default 40 if ESP_DEFAULT_CPU_FREQ_MHZ_40
1822
default 360 if ESP_DEFAULT_CPU_FREQ_MHZ_360
23+
default 400 if ESP_DEFAULT_CPU_FREQ_MHZ_400

components/hal/esp32p4/include/hal/clk_tree_ll.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -771,6 +771,9 @@ static inline __attribute__((always_inline)) void clk_ll_freq_calulation_set_tar
771771
case CLK_CAL_LP_PLL:
772772
timg_cali_clk_sel = 11;
773773
break;
774+
case CLK_CAL_DSI_DPHY:
775+
timg_cali_clk_sel = 12;
776+
break;
774777
default:
775778
// Unsupported CLK_CAL mux input
776779
abort();

components/soc/esp32p4/include/soc/clk_tree_defs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -801,6 +801,7 @@ typedef enum {
801801
CLK_CAL_RC32K, /*!< Select to calculate frequency of RC32K_CLK */
802802
CLK_CAL_32K_XTAL, /*!< Select to calculate frequency of XTAL32K_CLK */
803803
CLK_CAL_LP_PLL, /*!< Select to calculate frequency of LP_PLL_CLK */
804+
CLK_CAL_DSI_DPHY, /*!< Select to calculate frequency of DSI_DPHY_lanebyteclk */
804805
} soc_clk_freq_calculation_src_t;
805806

806807
#ifdef __cplusplus

0 commit comments

Comments
 (0)