@@ -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