From ff93a85fa61f4f7a5b1ed194ce0aaecc1f7f8294 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Thu, 29 Jan 2026 13:40:55 -0500 Subject: [PATCH 1/4] Always allow serial console on S3/C3/C6/etc --- wled00/wled.cpp | 20 +++++++++++++++----- wled00/wled_serial.cpp | 4 ++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/wled00/wled.cpp b/wled00/wled.cpp index f3f61bc238..8c7e272224 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -466,13 +466,23 @@ void WLED::setup() #ifdef WLED_BOOTUPDELAY delay(WLED_BOOTUPDELAY); // delay to let voltage stabilize, helps with boot issues on some setups #endif + + #if ARDUINO_USB_CDC_ON_BOOT && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)) + // Just to be very sure nothing else grabs serial... + portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED; + portENTER_CRITICAL(&mux); + Serial.begin(115200); // WLEDMM avoid "hung devices" when USB_CDC is enabled; see https://github.com/espressif/arduino-esp32/issues/9043 + Serial.setTxTimeoutMs(0); // potential side-effect: incomplete debug output, with missing characters whenever TX buffer is full. + portEXIT_CRITICAL(&mux); + #else Serial.begin(115200); + #endif -#if !defined(WLEDMM_NO_SERIAL_WAIT) || defined(WLED_DEBUG) + #if !defined(WLEDMM_NO_SERIAL_WAIT) || defined(WLED_DEBUG) if (!Serial) delay(1000); // WLEDMM make sure that Serial has initalized -#else + #else if (!Serial) delay(300); // just a tiny wait to avoid problems later when acessing serial -#endif + #endif init_math(); // WLEDMM: pre-calculate some lookup tables @@ -496,8 +506,8 @@ void WLED::setup() #endif #if ARDUINO_USB_CDC_ON_BOOT || ARDUINO_USB_MODE #if ARDUINO_USB_CDC_ON_BOOT && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)) - // WLEDMM avoid "hung devices" when USB_CDC is enabled; see https://github.com/espressif/arduino-esp32/issues/9043 - Serial.setTxTimeoutMs(0); // potential side-effect: incomplete debug output, with missing characters whenever TX buffer is full. + + Serial.setTxTimeoutMs(0); #endif #if !defined(WLEDMM_NO_SERIAL_WAIT) || defined(WLED_DEBUG) if (!Serial) delay(2500); // WLEDMM: always allow CDC USB serial to initialise diff --git a/wled00/wled_serial.cpp b/wled00/wled_serial.cpp index d152ab02f7..fe83fc4326 100644 --- a/wled00/wled_serial.cpp +++ b/wled00/wled_serial.cpp @@ -76,8 +76,8 @@ void sendBytes(){ } bool canUseSerial(void) { // WLEDMM returns true if Serial can be used for debug output (i.e. not configured for other purpose) - #if defined(CONFIG_IDF_TARGET_ESP32C3) && ARDUINO_USB_CDC_ON_BOOT && !defined(WLED_DEBUG_HOST) - // on -C3, USB CDC blocks if disconnected! so check if Serial is active before printing to it. + #if ARDUINO_USB_CDC_ON_BOOT && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)) && !defined(WLED_DEBUG_HOST) + // on S3/C3/C6, USB CDC blocks if disconnected! so check if Serial is active before printing to it. if (!Serial) return false; #endif if (pinManager.isPinAllocated(hardwareTX) && (pinManager.getPinOwner(hardwareTX) != PinOwner::DebugOut)) From 05147002cd206c415c09642eaa7ca9e85a913a42 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Thu, 29 Jan 2026 13:57:17 -0500 Subject: [PATCH 2/4] The rabbit said I was being too careful. Tested and works. --- wled00/wled.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 8c7e272224..0609ac1339 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -468,12 +468,8 @@ void WLED::setup() #endif #if ARDUINO_USB_CDC_ON_BOOT && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)) - // Just to be very sure nothing else grabs serial... - portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED; - portENTER_CRITICAL(&mux); Serial.begin(115200); // WLEDMM avoid "hung devices" when USB_CDC is enabled; see https://github.com/espressif/arduino-esp32/issues/9043 Serial.setTxTimeoutMs(0); // potential side-effect: incomplete debug output, with missing characters whenever TX buffer is full. - portEXIT_CRITICAL(&mux); #else Serial.begin(115200); #endif From ce0a55670d98f3f0994bd2bf4af3b345ba3fb656 Mon Sep 17 00:00:00 2001 From: Troy <5659019+troyhacks@users.noreply.github.com> Date: Thu, 29 Jan 2026 14:12:21 -0500 Subject: [PATCH 3/4] Not from my PR but I'll fix it for the rabbit. --- wled00/wled.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 0609ac1339..9fe74d5ca6 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -26,31 +26,37 @@ #if defined(ESP8266) || defined(ARDUINO_ARCH_ESP8266) #error please fix your build environment. ESP32 and ESP8266 are both defined. #endif - // only one of ARDUINO_ARCH_ESP32S2, ARDUINO_ARCH_ESP32S3, ARDUINO_ARCH_ESP32C3 allowed - #if defined(ARDUINO_ARCH_ESP32S3) && ( defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32C3) ) - #error please fix your build environment. only one of ARDUINO_ARCH_ESP32S3, ARDUINO_ARCH_ESP32S2, ARDUINO_ARCH_ESP32C3 may be defined + // only one of ARDUINO_ARCH_ESP32S2, ARDUINO_ARCH_ESP32S3, ARDUINO_ARCH_ESP32C3, ARDUINO_ARCH_ESP32C6 allowed + #if defined(ARDUINO_ARCH_ESP32S3) && ( defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32C6) ) + #error please fix your build environment. only one of ARDUINO_ARCH_ESP32S3, ARDUINO_ARCH_ESP32S2, ARDUINO_ARCH_ESP32C3, ARDUINO_ARCH_ESP32C6 may be defined #endif - #if defined(ARDUINO_ARCH_ESP32S2) && ( defined(ARDUINO_ARCH_ESP32S3) || defined(ARDUINO_ARCH_ESP32C3) ) - #error please fix your build environment. only one of ARDUINO_ARCH_ESP32S3, ARDUINO_ARCH_ESP32S2, ARDUINO_ARCH_ESP32C3 may be defined + #if defined(ARDUINO_ARCH_ESP32S2) && ( defined(ARDUINO_ARCH_ESP32S3) || defined(ARDUINO_ARCH_ESP32C3) || defined(ARDUINO_ARCH_ESP32C6) ) + #error please fix your build environment. only one of ARDUINO_ARCH_ESP32S3, ARDUINO_ARCH_ESP32S2, ARDUINO_ARCH_ESP32C3, ARDUINO_ARCH_ESP32C6 may be defined #endif - #if defined(CONFIG_IDF_TARGET_ESP32) && ( defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3)) + #if defined(ARDUINO_ARCH_ESP32C6) && ( defined(ARDUINO_ARCH_ESP32S3) || defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32C3) ) + #error please fix your build environment. only one of ARDUINO_ARCH_ESP32S3, ARDUINO_ARCH_ESP32S2, ARDUINO_ARCH_ESP32C3, ARDUINO_ARCH_ESP32C6 may be defined + #endif + #if defined(CONFIG_IDF_TARGET_ESP32) && ( defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)) #error please fix your build environment. only one CONFIG_IDF_TARGET may be defined #endif // make sure we have a supported CONFIG_IDF_TARGET_ - #if !defined(CONFIG_IDF_TARGET_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) + #if !defined(CONFIG_IDF_TARGET_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32C6) #error please fix your build environment. No supported CONFIG_IDF_TARGET was defined #endif #if CONFIG_IDF_TARGET_ESP32_SOLO || CONFIG_IDF_TARGET_ESP32SOLO #warning ESP32 SOLO (single core) is not supported. #endif - // only one of CONFIG_IDF_TARGET_ESP32, CONFIG_IDF_TARGET_ESP32S2, CONFIG_IDF_TARGET_ESP32S3, CONFIG_IDF_TARGET_ESP32C3 is allowed - #if defined(CONFIG_IDF_TARGET_ESP32) && ( defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3)) + // only one of CONFIG_IDF_TARGET_ESP32, CONFIG_IDF_TARGET_ESP32S2, CONFIG_IDF_TARGET_ESP32S3, CONFIG_IDF_TARGET_ESP32C3, CONFIG_IDF_TARGET_ESP32C6 is allowed + #if defined(CONFIG_IDF_TARGET_ESP32) && ( defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)) + #error please fix your build environment. only one CONFIG_IDF_TARGET may be defined + #endif + #if defined(CONFIG_IDF_TARGET_ESP32S3) && ( defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)) #error please fix your build environment. only one CONFIG_IDF_TARGET may be defined #endif - #if defined(CONFIG_IDF_TARGET_ESP32S3) && ( defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3)) + #if defined(CONFIG_IDF_TARGET_ESP32C3) && ( defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C6)) #error please fix your build environment. only one CONFIG_IDF_TARGET may be defined #endif - #if defined(CONFIG_IDF_TARGET_ESP32C3) && ( defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32S2)) + #if defined(CONFIG_IDF_TARGET_ESP32C6) && ( defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3)) #error please fix your build environment. only one CONFIG_IDF_TARGET may be defined #endif From a5c6740d9654edb21ee865b1070e2c6ce3a09b62 Mon Sep 17 00:00:00 2001 From: Frank <91616163+softhack007@users.noreply.github.com> Date: Fri, 6 Feb 2026 19:00:48 +0100 Subject: [PATCH 4/4] add P4, bring back lost comment minor updates - added ESP32-P4 to USB-CDC whitelist - restored lost comment --- wled00/wled.cpp | 6 +++--- wled00/wled_serial.cpp | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 9fe74d5ca6..abee0ebcc7 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -473,7 +473,7 @@ void WLED::setup() delay(WLED_BOOTUPDELAY); // delay to let voltage stabilize, helps with boot issues on some setups #endif - #if ARDUINO_USB_CDC_ON_BOOT && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)) + #if ARDUINO_USB_CDC_ON_BOOT && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32P4)) Serial.begin(115200); // WLEDMM avoid "hung devices" when USB_CDC is enabled; see https://github.com/espressif/arduino-esp32/issues/9043 Serial.setTxTimeoutMs(0); // potential side-effect: incomplete debug output, with missing characters whenever TX buffer is full. #else @@ -507,8 +507,8 @@ void WLED::setup() if (!Serial) delay(2500); // WLEDMM allow CDC USB serial to initialise (WLED_DEBUG only) #endif #if ARDUINO_USB_CDC_ON_BOOT || ARDUINO_USB_MODE - #if ARDUINO_USB_CDC_ON_BOOT && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)) - + #if ARDUINO_USB_CDC_ON_BOOT && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32P4)) + // WLEDMM avoid "hung devices" when USB_CDC is enabled; see https://github.com/espressif/arduino-esp32/issues/9043 Serial.setTxTimeoutMs(0); #endif #if !defined(WLEDMM_NO_SERIAL_WAIT) || defined(WLED_DEBUG) diff --git a/wled00/wled_serial.cpp b/wled00/wled_serial.cpp index fe83fc4326..4d5f1f22ef 100644 --- a/wled00/wled_serial.cpp +++ b/wled00/wled_serial.cpp @@ -76,8 +76,8 @@ void sendBytes(){ } bool canUseSerial(void) { // WLEDMM returns true if Serial can be used for debug output (i.e. not configured for other purpose) - #if ARDUINO_USB_CDC_ON_BOOT && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)) && !defined(WLED_DEBUG_HOST) - // on S3/C3/C6, USB CDC blocks if disconnected! so check if Serial is active before printing to it. + #if ARDUINO_USB_CDC_ON_BOOT && (defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) || defined(CONFIG_IDF_TARGET_ESP32P4)) && !defined(WLED_DEBUG_HOST) + // on S3/C3/C6/P4, USB CDC blocks if disconnected! so check if Serial is active before printing to it. if (!Serial) return false; #endif if (pinManager.isPinAllocated(hardwareTX) && (pinManager.getPinOwner(hardwareTX) != PinOwner::DebugOut))