@@ -365,7 +365,8 @@ void WLED::loop()
365365 DEBUG_PRINT (F (" Avail heap: " )); DEBUG_PRINTLN (ESP.getMaxAllocHeap ());
366366 DEBUG_PRINTF (" %s min free stack %d\n " , pcTaskGetTaskName (NULL ), uxTaskGetStackHighWaterMark (NULL )); // WLEDMM
367367 #endif
368- #if defined(ARDUINO_ARCH_ESP32) && defined(BOARD_HAS_PSRAM)
368+ #if defined(ARDUINO_ARCH_ESP32)
369+ #if defined(BOARD_HAS_PSRAM) || (ESP_IDF_VERSION_MAJOR > 3) // V4 can auto-detect PSRAM
369370 if (psramFound ()) {
370371 // DEBUG_PRINT(F("Total PSRAM: ")); DEBUG_PRINT(ESP.getPsramSize()/1024); DEBUG_PRINTLN("kB");
371372 DEBUG_PRINT (F (" Free PSRAM : " )); DEBUG_PRINT (ESP.getFreePsram ()/1024 ); DEBUG_PRINTLN (" kB" );
@@ -376,6 +377,7 @@ void WLED::loop()
376377 // DEBUG_PRINTLN(F("No PSRAM"));
377378 }
378379 #endif
380+ #endif
379381 DEBUG_PRINT (F (" Wifi state: " )); DEBUG_PRINTLN (WiFi.status ());
380382
381383 if (WiFi.status () != lastWifiState) {
@@ -666,7 +668,7 @@ void WLED::setup()
666668 // C3: reserve GPIO 12-17 for PSRAM (may fail due to isPinOk() but that will also prevent other allocation)
667669 // managed_pin_type pins[] = { {12, true}, {13, true}, {14, true}, {15, true}, {16, true}, {17, true} };
668670 // pinManager.allocateMultiplePins(pins, sizeof(pins)/sizeof(managed_pin_type), PinOwner::SPI_RAM);
669- #else
671+ #elif defined(CONFIG_IDF_TARGET_ESP32)
670672 // GPIO16/GPIO17 reserved for SPI RAM
671673 if (strncmp_P (PSTR (" ESP32-D0WDR2-V3" ), ESP.getChipModel (), 15 ) == 0 ) {
672674 // ESP32-D0WDR2-V3 keeps gpio17 available
@@ -678,7 +680,7 @@ void WLED::setup()
678680 }
679681
680682 #endif
681- #if defined(BOARD_HAS_PSRAM) && (defined(WLED_USE_PSRAM) || defined(WLED_USE_PSRAM_JSON)) // WLEDMM
683+ #if ( defined(BOARD_HAS_PSRAM) || (ESP_IDF_VERSION_MAJOR > 3) ) && (defined(WLED_USE_PSRAM) || defined(WLED_USE_PSRAM_JSON)) // WLEDMM
682684 if (psramFound ()) {
683685 DEBUG_PRINT (F (" Total PSRAM: " )); DEBUG_PRINT (ESP.getPsramSize ()/1024 ); DEBUG_PRINTLN (" kB" );
684686 DEBUG_PRINT (F (" Free PSRAM : " )); DEBUG_PRINT (ESP.getFreePsram ()/1024 ); DEBUG_PRINTLN (" kB" );
@@ -690,11 +692,19 @@ void WLED::setup()
690692#if defined(ARDUINO_ARCH_ESP32)
691693 if ((strncmp (" ESP32-PICO" , ESP.getChipModel (), 10 ) == 0 ) || (strncmp (" ESP32-U4WDH" , ESP.getChipModel (), 11 ) == 0 ))
692694 { // WLEDMM detect pico board and esp32-mini1 board at runtime
693- // special handling for PICO-D4: gpio16+17 are in use for onboard SPI FLASH (not PSRAM)
695+ // PICO-D4: gpio16+17 are in use for onboard SPI FLASH (not PSRAM)
696+ // U4WDH / PICO-D2 / PICO-V3 / PICO-V3-02 : GPIO 16 and 17 are either used for PSRAM, or not connected
694697 managed_pin_type pins[] = { {16 , true }, {17 , true } };
695698 pinManager.allocateMultiplePins (pins, sizeof (pins)/sizeof (managed_pin_type), PinOwner::SPI_RAM);
696699 }
697- #endif
700+ #if !defined(BOARD_HAS_PSRAM)
701+ if (strncmp_P (PSTR (" ESP32-D0WDR2-V3" ), ESP.getChipModel (), 15 ) == 0 ) {
702+ // runtime detect ESP32-D0WDR2-V3: needs gpio16 for PSRAM, but keeps gpio17 available
703+ managed_pin_type pins[] = { {16 , true } };
704+ pinManager.allocateMultiplePins (pins, sizeof (pins)/sizeof (managed_pin_type), PinOwner::SPI_RAM);
705+ }
706+ #endif
707+ #endif
698708
699709 // DEBUG_PRINT(F("LEDs inited. heap usage ~"));
700710 // DEBUG_PRINTLN(heapPreAlloc - ESP.getFreeHeap());
@@ -706,7 +716,7 @@ void WLED::setup()
706716 pinManager.allocatePin (2 , true , PinOwner::DMX);
707717#endif
708718
709- #if defined(ALL_JSON_TO_PSRAM) && defined(BOARD_HAS_PSRAM) && (defined(WLED_USE_PSRAM_JSON) || defined(WLED_USE_PSRAM))
719+ #if defined(ALL_JSON_TO_PSRAM) && ( defined(BOARD_HAS_PSRAM) || (ESP_IDF_VERSION_MAJOR > 3) ) && (defined(WLED_USE_PSRAM_JSON) || defined(WLED_USE_PSRAM))
710720 if (psramFound ()) {
711721 DEBUG_PRINT (F (" \n free heap " )); DEBUG_PRINTLN (ESP.getFreeHeap ());
712722 USER_PRINTLN (F (" JSON garbage collection (initial)." ));
0 commit comments