Skip to content

Commit cf963c6

Browse files
committed
[Sysinfo] Fix determining flash mode on ESP32-S2
See discussion here: espressif/arduino-esp32#7140 (comment)
1 parent dfe7a53 commit cf963c6

File tree

1 file changed

+49
-26
lines changed

1 file changed

+49
-26
lines changed

src/src/Helpers/Hardware.cpp

Lines changed: 49 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -631,21 +631,13 @@ uint32_t getFlashChipSpeed() {
631631
#ifdef ESP8266
632632
return ESP.getFlashChipSpeed();
633633
#else // ifdef ESP8266
634-
const uint32_t spi_clock = REG_READ(SPI_CLOCK_REG(0));
634+
const uint32_t spi_clock = REG_READ(SPI_CLOCK_REG(1));
635635

636636
if (spi_clock & BIT(31)) {
637637
// spi_clk is equal to system clock
638638
return getApbFrequency();
639639
}
640-
641-
/* SPI_CLKCNT_N : R/W ;bitpos:[17:12] ;default: 6'h3 ; */
642-
643-
// description: In the master mode it is the divider of spi_clk.
644-
// So spi_clk frequencyis system/(spi_clkdiv_pre+1)/(spi_clkcnt_N+1)
645-
const uint32_t spi_clkdiv_pre = (spi_clock >> 18) & 0x1FFF;
646-
const uint32_t spi_clkcnt_n = (spi_clock >> 12) & 0x3F;
647-
648-
return (getApbFrequency() / (spi_clkdiv_pre + 1)) / (spi_clkcnt_n + 1);
640+
return spiClockDivToFrequency(spi_clock);
649641
#endif // ifdef ESP8266
650642
}
651643

@@ -662,23 +654,54 @@ const __FlashStringHelper* getFlashChipMode() {
662654
#else // ifdef ESP8266
663655

664656
// Source: https://github.com/letscontrolit/ESPEasy/pull/4200#issuecomment-1221607332
665-
const uint32_t spi_ctrl = REG_READ(SPI_CTRL_REG(0));
666-
667-
/* Not all of the following constants are already defined in older versions of spi_reg.h, so do it manually for now*/
668-
if (spi_ctrl & BIT(24)) { // SPI_FREAD_QIO
669-
return F("QIO");
670-
} else if (spi_ctrl & BIT(20)) { // SPI_FREAD_QUAD
671-
return F("QOUT");
672-
} else if (spi_ctrl & BIT(23)) { // SPI_FREAD_DIO
673-
return F("DIO");
674-
} else if (spi_ctrl & BIT(14)) { // SPI_FREAD_DUAL
675-
return F("DOUT");
676-
} else if (spi_ctrl & BIT(13)) { // SPI_FASTRD_MODE
677-
return F("Fast");
678-
} else {
657+
// + discussion: https://github.com/espressif/arduino-esp32/issues/7140#issuecomment-1222274417
658+
const uint32_t spi_ctrl = REG_READ(PERIPHS_SPI_FLASH_CTRL);
659+
660+
# if ESP_IDF_VERSION_MAJOR > 3 // IDF 4+
661+
# if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4
662+
if (spi_ctrl & SPI_FREAD_QIO) {
663+
return F("QIO");
664+
} else if (spi_ctrl & SPI_FREAD_QUAD) {
665+
return F("QOUT");
666+
} else if (spi_ctrl & SPI_FREAD_DIO) {
667+
return F("DIO");
668+
} else if (spi_ctrl & SPI_FREAD_DUAL) {
669+
return F("DOUT");
670+
} else if (spi_ctrl & SPI_FASTRD_MODE) {
671+
return F("Fast");
672+
}
673+
return F("Slow");
674+
# elif CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2
675+
if (spi_ctrl & SPI_FREAD_OCT) {
676+
return F("OCT");
677+
} else if (spi_ctrl & SPI_FREAD_QUAD) {
678+
return F("QIO");
679+
} else if (spi_ctrl & SPI_FREAD_DUAL) {
680+
return F("DIO");
681+
}
682+
return F("DOUT");
683+
# elif CONFIG_IDF_TARGET_ESP32C3 // ESP32-C3
684+
if (spi_ctrl & SPI_FREAD_QUAD) {
685+
return F("QIO");
686+
} else if (spi_ctrl & SPI_FREAD_DUAL) {
687+
return F("DIO");
688+
}
689+
return F("DOUT");
690+
# endif // if CONFIG_IDF_TARGET_ESP32
691+
# else // ESP32 Before IDF 4.0
692+
if (spi_ctrl & (BIT(24))) {
693+
return F("QIO");
694+
} else if (spi_ctrl & (BIT(20))) {
695+
return F("QOUT");
696+
} else if (spi_ctrl & (BIT(23))) {
697+
return F("DIO");
698+
} else if (spi_ctrl & (BIT(14))) {
699+
return F("DOUT");
700+
} else if (spi_ctrl & (BIT(13))) {
701+
return F("Fast");
702+
}
679703
return F("Slow");
680-
}
681-
return F("DOUT");
704+
# endif // if ESP_IDF_VERSION_MAJOR > 3
682705
#endif // ifdef ESP8266
683706
}
684707

0 commit comments

Comments
 (0)