Skip to content

Commit 8b1277c

Browse files
committed
efuse/add cpu freq rating
This commit adds support for CPU max freqeuency rating bits in CPU. Bootloader will now print an error if attempting to 160MHz rated ESP32 at 240MHz. EFUSE_CHIP_VER_RESERVE has been replaced by the frequency rating bits. Dependancies on EFUSE_CHIP_VER_RESERVE have been changed to use EFUSE_CHIP_VER_PKG
1 parent 6acb38a commit 8b1277c

File tree

3 files changed

+49
-22
lines changed

3 files changed

+49
-22
lines changed

components/bootloader/subproject/main/bootloader_start.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,14 @@ void bootloader_main()
447447
{
448448
vddsdio_configure();
449449
flash_gpio_configure();
450+
#if (CONFIG_ESP32_DEFAULT_CPU_FREQ_MHZ == 240)
451+
//Check if ESP32 is rated for a CPU frequency of 160MHz only
452+
if (REG_GET_BIT(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_CPU_FREQ_RATED) &&
453+
REG_GET_BIT(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_CPU_FREQ_LOW)) {
454+
ESP_LOGE(TAG, "Chip CPU frequency rated for 160MHz. Modify CPU frequency in menuconfig");
455+
return;
456+
}
457+
#endif
450458
bootloader_clock_configure();
451459
uart_console_configure();
452460
wdt_reset_check();

components/bootloader/subproject/main/flash_qio_mode.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -174,13 +174,15 @@ static esp_err_t enable_qio_mode(read_status_fn_t read_status_fn,
174174
// spiconfig specifies a custom efuse pin configuration. This config defines all pins -except- WP,
175175
// which is compiled into the bootloader instead.
176176
//
177-
// Most commonly an overriden pin mapping means ESP32-D2WD. Warn if chip is ESP32-D2WD
178-
// but someone has changed the WP pin assignment from that chip's WP pin.
179-
uint32_t chip_ver = REG_GET_FIELD(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_VER_RESERVE);
180-
uint32_t pkg_ver = chip_ver & 0x7;
181-
const int PKG_VER_ESP32_D2WD = 2; // TODO: use chip detection API once available
182-
if (pkg_ver == PKG_VER_ESP32_D2WD && CONFIG_BOOTLOADER_SPI_WP_PIN != ESP32_D2WD_WP_GPIO) {
183-
ESP_LOGW(TAG, "Chip is ESP32-D2WD but flash WP pin is different value to internal flash");
177+
// Most commonly an overriden pin mapping means ESP32-D2WD or ESP32-PICOD4.
178+
//Warn if chip is ESP32-D2WD/ESP32-PICOD4 but someone has changed the WP pin
179+
//assignment from that chip's WP pin.
180+
uint32_t pkg_ver = REG_GET_FIELD(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_VER_PKG);
181+
if (CONFIG_BOOTLOADER_SPI_WP_PIN != ESP32_D2WD_WP_GPIO &&
182+
(pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32D2WDQ5 ||
183+
pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD2 ||
184+
pkg_ver == EFUSE_RD_CHIP_VER_PKG_ESP32PICOD4)) {
185+
ESP_LOGW(TAG, "Chip is ESP32-D2WD/ESP32-PICOD4 but flash WP pin is different value to internal flash");
184186
}
185187
}
186188

components/soc/esp32/include/soc/efuse_reg.h

Lines changed: 32 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,21 @@
9191
#define EFUSE_RD_BLK3_PART_RESERVE_M ((EFUSE_RD_BLK3_PART_RESERVE_V)<<(EFUSE_RD_BLK3_PART_RESERVE_S))
9292
#define EFUSE_RD_BLK3_PART_RESERVE_V 0x1
9393
#define EFUSE_RD_BLK3_PART_RESERVE_S 14
94-
/* EFUSE_RD_CHIP_VER_RESERVE : R/W ;bitpos:[13:12] ;default: 2'b0 ; */
95-
/*description: */
96-
#define EFUSE_RD_CHIP_VER_RESERVE 0x00000003
97-
#define EFUSE_RD_CHIP_VER_RESERVE_M ((EFUSE_RD_CHIP_VER_RESERVE_V)<<(EFUSE_RD_CHIP_VER_RESERVE_S))
98-
#define EFUSE_RD_CHIP_VER_RESERVE_V 0x3
99-
#define EFUSE_RD_CHIP_VER_RESERVE_S 12
100-
/* EFUSE_RD_CHIP_VER : R/W ;bitpos:[11:9] ;default: 3'b0 ; */
94+
/* EFUSE_RD_CHIP_CPU_FREQ_RATED : R/W ;bitpos:[13] ;default: 1'b0 ; */
95+
/*description: If set, the ESP32's maximum CPU frequency has been rated*/
96+
#define EFUSE_RD_CHIP_CPU_FREQ_RATED (BIT(13))
97+
#define EFUSE_RD_CHIP_CPU_FREQ_RATED_M ((EFUSE_RD_CHIP_CPU_FREQ_RATED_V)<<(EFUSE_RD_CHIP_CPU_FREQ_RATED_S))
98+
#define EFUSE_RD_CHIP_CPU_FREQ_RATED_V 0x1
99+
#define EFUSE_RD_CHIP_CPU_FREQ_RATED_S 13
100+
/* EFUSE_RD_CHIP_CPU_FREQ_LOW : R/W ;bitpos:[12] ;default: 1'b0 ; */
101+
/*description: If set alongside EFUSE_RD_CHIP_CPU_FREQ_RATED, the ESP32's max CPU frequency is rated for 160MHz. 240MHz otherwise*/
102+
#define EFUSE_RD_CHIP_CPU_FREQ_LOW (BIT(12))
103+
#define EFUSE_RD_CHIP_CPU_FREQ_LOW_M ((EFUSE_RD_CHIP_CPU_FREQ_LOW_V)<<(EFUSE_RD_CHIP_CPU_FREQ_LOW_S))
104+
#define EFUSE_RD_CHIP_CPU_FREQ_LOW_V 0x1
105+
#define EFUSE_RD_CHIP_CPU_FREQ_LOW_S 12
106+
/* EFUSE_RD_CHIP_VER_PKG : R/W ;bitpos:[11:9] ;default: 3'b0 ; */
101107
/*description: chip package */
102-
#define EFUSE_RD_CHIP_VER 0x00000007
108+
#define EFUSE_RD_CHIP_VER_PKG 0x00000007
103109
#define EFUSE_RD_CHIP_VER_PKG_M ((EFUSE_RD_CHIP_VER_PKG_V)<<(EFUSE_RD_CHIP_VER_PKG_S))
104110
#define EFUSE_RD_CHIP_VER_PKG_V 0x7
105111
#define EFUSE_RD_CHIP_VER_PKG_S 9
@@ -341,18 +347,29 @@
341347
#define EFUSE_BLK3_PART_RESERVE_M ((EFUSE_BLK3_PART_RESERVE_V)<<(EFUSE_BLK3_PART_RESERVE_S))
342348
#define EFUSE_BLK3_PART_RESERVE_V 0x1
343349
#define EFUSE_BLK3_PART_RESERVE_S 14
344-
/* EFUSE_CHIP_VER_RESERVE : R/W ;bitpos:[13:12] ;default: 2'b0 ; */
345-
/*description: */
346-
#define EFUSE_CHIP_VER_RESERVE 0x00000003
347-
#define EFUSE_CHIP_VER_RESERVE_M ((EFUSE_CHIP_VER_RESERVE_V)<<(EFUSE_CHIP_VER_RESERVE_S))
348-
#define EFUSE_CHIP_VER_RESERVE_V 0x3
349-
#define EFUSE_CHIP_VER_RESERVE_S 12
350-
/* EFUSE_CHIP_VER : R/W ;bitpos:[11:9] ;default: 3'b0 ; */
350+
/* EFUSE_CHIP_CPU_FREQ_RATED : R/W ;bitpos:[13] ;default: 1'b0 ; */
351+
/*description: If set, the ESP32's maximum CPU frequency has been rated*/
352+
#define EFUSE_CHIP_CPU_FREQ_RATED (BIT(13))
353+
#define EFUSE_CHIP_CPU_FREQ_RATED_M ((EFUSE_CHIP_CPU_FREQ_RATED_V)<<(EFUSE_CHIP_CPU_FREQ_RATED_S))
354+
#define EFUSE_CHIP_CPU_FREQ_RATED_V 0x1
355+
#define EFUSE_CHIP_CPU_FREQ_RATED_S 13
356+
/* EFUSE_CHIP_CPU_FREQ_LOW : R/W ;bitpos:[12] ;default: 1'b0 ; */
357+
/*description: If set alongside EFUSE_CHIP_CPU_FREQ_RATED, the ESP32's max CPU frequency is rated for 160MHz. 240MHz otherwise*/
358+
#define EFUSE_CHIP_CPU_FREQ_LOW (BIT(12))
359+
#define EFUSE_CHIP_CPU_FREQ_LOW_M ((EFUSE_CHIP_CPU_FREQ_LOW_V)<<(EFUSE_CHIP_CPU_FREQ_LOW_S))
360+
#define EFUSE_CHIP_CPU_FREQ_LOW_V 0x1
361+
#define EFUSE_CHIP_CPU_FREQ_LOW_S 12
362+
/* EFUSE_CHIP_VER_PKG : R/W ;bitpos:[11:9] ;default: 3'b0 ; */
351363
/*description: */
352364
#define EFUSE_CHIP_VER_PKG 0x00000007
353365
#define EFUSE_CHIP_VER_PKG_M ((EFUSE_CHIP_VER_PKG_V)<<(EFUSE_CHIP_VER_PKG_S))
354366
#define EFUSE_CHIP_VER_PKG_V 0x7
355367
#define EFUSE_CHIP_VER_PKG_S 9
368+
#define EFUSE_CHIP_VER_PKG_ESP32D0WDQ6 0
369+
#define EFUSE_CHIP_VER_PKG_ESP32D0WDQ5 1
370+
#define EFUSE_CHIP_VER_PKG_ESP32D2WDQ5 2
371+
#define EFUSE_CHIP_VER_PKG_ESP32PICOD2 4
372+
#define EFUSE_CHIP_VER_PKG_ESP32PICOD4 5
356373
/* EFUSE_SPI_PAD_CONFIG_HD : R/W ;bitpos:[8:4] ;default: 5'b0 ; */
357374
/*description: program for SPI_pad_config_hd*/
358375
#define EFUSE_SPI_PAD_CONFIG_HD 0x0000001F

0 commit comments

Comments
 (0)