@@ -631,21 +631,13 @@ uint32_t getFlashChipSpeed() {
631
631
#ifdef ESP8266
632
632
return ESP.getFlashChipSpeed ();
633
633
#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 ));
635
635
636
636
if (spi_clock & BIT (31 )) {
637
637
// spi_clk is equal to system clock
638
638
return getApbFrequency ();
639
639
}
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);
649
641
#endif // ifdef ESP8266
650
642
}
651
643
@@ -662,23 +654,54 @@ const __FlashStringHelper* getFlashChipMode() {
662
654
#else // ifdef ESP8266
663
655
664
656
// 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
+ }
679
703
return F (" Slow" );
680
- }
681
- return F (" DOUT" );
704
+ # endif // if ESP_IDF_VERSION_MAJOR > 3
682
705
#endif // ifdef ESP8266
683
706
}
684
707
0 commit comments