From a99d7b2998e29d1727a8b1cf00c10750df5ccbb3 Mon Sep 17 00:00:00 2001 From: Raileanu Cosmin Date: Sat, 29 Mar 2025 20:54:15 +0200 Subject: [PATCH 1/9] Update FastLED to 3.9.14 --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index a7485244cd..a98c13639a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -137,7 +137,7 @@ upload_speed = 115200 # ------------------------------------------------------------------------------ lib_compat_mode = strict lib_deps = - fastled/FastLED @ 3.6.0 + fastled/FastLED @ 3.9.14 IRremoteESP8266 @ 2.8.2 makuna/NeoPixelBus @ 2.8.3 #https://github.com/makuna/NeoPixelBus.git#CoreShaderBeta From 9ae1714560004c8a06477270a7d5707a3b95ad74 Mon Sep 17 00:00:00 2001 From: Raileanu Cosmin Date: Sat, 29 Mar 2025 20:55:09 +0200 Subject: [PATCH 2/9] Add C6 Defintions to platformio.ini --- platformio.ini | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index a98c13639a..4538f434bc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -10,7 +10,7 @@ # ------------------------------------------------------------------------------ # CI/release binaries -default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, nodemcuv2_160, esp8266_2m_160, esp01_1m_full_160, nodemcuv2_compat, esp8266_2m_compat, esp01_1m_full_compat, esp32dev, esp32dev_V4, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_16MB_opi, esp32s3dev_8MB_opi, esp32s3_4M_qspi, esp32_wrover, usermods +default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, nodemcuv2_160, esp8266_2m_160, esp01_1m_full_160, nodemcuv2_compat, esp8266_2m_compat, esp01_1m_full_compat, esp32dev, esp32dev_V4, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_16MB_opi, esp32s3dev_8MB_opi, esp32s3_4M_qspi, esp32-c6-devkitc-1, esp32_wrover, usermods src_dir = ./wled00 data_dir = ./wled00/data @@ -329,6 +329,34 @@ lib_deps = board_build.partitions = ${esp32.default_partitions} ;; default partioning for 4MB Flash - can be overridden in build envs board_build.flash_mode = qio +[env:esp32-c6-devkitc-1] +platform = https://github.com/tasmota/platform-espressif32/releases/download/2025.03.30/platform-espressif32.zip +platform_packages = +framework = arduino +board = esp32-c6-devkitc-1 + +build_unflags = ${common.build_unflags} +build_flags = ${common.build_flags} -g -D WLED_RELEASE_NAME=\"ESP32-C6_8MB\" + -DARDUINO_ARCH_ESP32 + -DARDUINO_ARCH_ESP32C6 + -DCONFIG_IDF_TARGET_ESP32C6=1 + -D CONFIG_ASYNC_TCP_USE_WDT=0 + -DCO + -DARDUINO_USB_MODE=1 + -D WLED_WATCHDOG_TIMEOUT=0 + -DARDUINO_USB_CDC_ON_BOOT=0 + -D WLED_DISABLE_INFRARED + +upload_speed = 921600 +lib_deps = ${env.lib_deps} +lib_ignore = + IRremoteESP8266 + +board_build.partitions = ${esp32.large_partitions} +board_build.f_flash = 80000000L +board_build.flash_mode = dio +monitor_filters = esp32_exception_decoder + [esp32s3] ;; generic definitions for all ESP32-S3 boards platform = ${esp32_idf_V4.platform} From 9cf7cb3a8bfba8e92480aedfbce08305ad450744 Mon Sep 17 00:00:00 2001 From: Raileanu Cosmin Date: Sat, 29 Mar 2025 20:57:51 +0200 Subject: [PATCH 3/9] Fix network conflict for C6 --- wled00/src/dependencies/e131/ESPAsyncE131.cpp | 4 ++++ wled00/src/dependencies/network/Network.cpp | 6 +++++- wled00/src/dependencies/network/Network.h | 5 ++++- wled00/wled.h | 3 +++ 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/wled00/src/dependencies/e131/ESPAsyncE131.cpp b/wled00/src/dependencies/e131/ESPAsyncE131.cpp index 75d6b8dc29..46c481561f 100644 --- a/wled00/src/dependencies/e131/ESPAsyncE131.cpp +++ b/wled00/src/dependencies/e131/ESPAsyncE131.cpp @@ -21,6 +21,10 @@ #include "../network/Network.h" #include +#if defined(CONFIG_IDF_TARGET_ESP32C6) +#define Network Network_C6 +#endif + // E1.17 ACN Packet Identifier const byte ESPAsyncE131::ACN_ID[12] = { 0x41, 0x53, 0x43, 0x2d, 0x45, 0x31, 0x2e, 0x31, 0x37, 0x00, 0x00, 0x00 }; diff --git a/wled00/src/dependencies/network/Network.cpp b/wled00/src/dependencies/network/Network.cpp index d86bf127fd..0eb279bd76 100644 --- a/wled00/src/dependencies/network/Network.cpp +++ b/wled00/src/dependencies/network/Network.cpp @@ -88,4 +88,8 @@ bool NetworkClass::isEthernet() return false; } -NetworkClass Network; \ No newline at end of file +#if defined(CONFIG_IDF_TARGET_ESP32C6) +NetworkClass Network_C6; +#else +NetworkClass Network; +#endif \ No newline at end of file diff --git a/wled00/src/dependencies/network/Network.h b/wled00/src/dependencies/network/Network.h index 9201d514ea..c318798a65 100644 --- a/wled00/src/dependencies/network/Network.h +++ b/wled00/src/dependencies/network/Network.h @@ -19,6 +19,9 @@ class NetworkClass bool isEthernet(); }; +#if defined(CONFIG_IDF_TARGET_ESP32C6) +extern NetworkClass Network_C6; +#else extern NetworkClass Network; - +#endif #endif \ No newline at end of file diff --git a/wled00/wled.h b/wled00/wled.h index ea40c5dfe2..7778156400 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -107,6 +107,9 @@ #include #include "src/dependencies/network/Network.h" +#if defined(CONFIG_IDF_TARGET_ESP32C6) +#define Network Network_C6 +#endif #ifdef WLED_USE_MY_CONFIG #include "my_config.h" From 08c67ec71d3e43b278fc83cbfc96c969a99f9e1f Mon Sep 17 00:00:00 2001 From: Raileanu Cosmin Date: Sat, 29 Mar 2025 20:58:14 +0200 Subject: [PATCH 4/9] Disable SparkFunDMX for C6 --- wled00/src/dependencies/dmx/SparkFunDMX.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/src/dependencies/dmx/SparkFunDMX.cpp b/wled00/src/dependencies/dmx/SparkFunDMX.cpp index 064b9ff620..be2d58fc9a 100644 --- a/wled00/src/dependencies/dmx/SparkFunDMX.cpp +++ b/wled00/src/dependencies/dmx/SparkFunDMX.cpp @@ -17,7 +17,7 @@ Distributed as-is; no warranty is given. #if defined(ARDUINO_ARCH_ESP32) #include -#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2) +#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32C6) #include "SparkFunDMX.h" #include From 8651add6f71b5adf862f70072d688d3465baee6c Mon Sep 17 00:00:00 2001 From: Raileanu Cosmin Date: Sat, 29 Mar 2025 20:59:25 +0200 Subject: [PATCH 5/9] Use bitBang on Esp32 C6 --- wled00/bus_manager.cpp | 6 +- wled00/bus_wrapper.h | 132 ++++++++++++++++++++++++++++++++++++++--- 2 files changed, 126 insertions(+), 12 deletions(-) diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index cee34c2ea2..211f0fc32f 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -7,7 +7,7 @@ #ifdef ARDUINO_ARCH_ESP32 #include "driver/ledc.h" #include "soc/ledc_struct.h" - #if !(defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)) + #if !(defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6)) #define LEDC_MUTEX_LOCK() do {} while (xSemaphoreTake(_ledc_sys_lock, portMAX_DELAY) != pdPASS) #define LEDC_MUTEX_UNLOCK() xSemaphoreGive(_ledc_sys_lock) extern xSemaphoreHandle _ledc_sys_lock; @@ -478,7 +478,7 @@ BusPwm::BusPwm(const BusConfig &bc) _pins[i] = bc.pins[i]; // store only after allocateMultiplePins() succeeded #ifdef ESP8266 pinMode(_pins[i], OUTPUT); - #else + #elif !defined(CONFIG_IDF_TARGET_ESP32C6) unsigned channel = _ledcStart + i; ledcSetup(channel, _frequency, _depth - (dithering*4)); // with dithering _frequency doesn't really matter as resolution is 8 bit ledcAttachPin(_pins[i], channel); @@ -646,7 +646,7 @@ void BusPwm::deallocatePins() { if (!PinManager::isPinOk(_pins[i])) continue; #ifdef ESP8266 digitalWrite(_pins[i], LOW); //turn off PWM interrupt - #else + #elif !defined(CONFIG_IDF_TARGET_ESP32C6) if (_ledcStart < WLED_MAX_ANALOG_CHANNELS) ledcDetachPin(_pins[i]); #endif } diff --git a/wled00/bus_wrapper.h b/wled00/bus_wrapper.h index 577aaeb826..ac03f6a466 100644 --- a/wled00/bus_wrapper.h +++ b/wled00/bus_wrapper.h @@ -231,6 +231,17 @@ typedef NeoEsp32I2s0Apa106Method X1Apa106Method; typedef NeoEsp32I2s0Ws2805Method X1Ws2805Method; typedef NeoEsp32I2s0Tm1914Method X1Tm1914Method; +#elif defined(CONFIG_IDF_TARGET_ESP32C6) + // C6: no I2S or RMT, fallback to bit-bang if NeoPixelBus supports it + typedef NeoEsp32BitBangWs2812xMethod X1Ws2812xMethod; + typedef NeoEsp32BitBangSk6812Method X1Sk6812Method; + typedef NeoEsp32BitBang400KbpsMethod X1400KbpsMethod; + typedef NeoEsp32BitBang800KbpsMethod X1800KbpsMethod; + typedef NeoEsp32BitBangTm1814Method X1Tm1814Method; + typedef NeoEsp32BitBangTm1829Method X1Tm1829Method; + typedef NeoEsp32BitBangApa106Method X1Apa106Method; + typedef NeoEsp32BitBangWs2805Method X1Ws2805Method; + typedef NeoEsp32BitBangTm1914Method X1Tm1914Method; #elif !defined(CONFIG_IDF_TARGET_ESP32C3) // regular ESP32 will use I2S1 typedef NeoEsp32I2s1Ws2812xMethod X1Ws2812xMethod; @@ -244,6 +255,17 @@ typedef NeoEsp32I2s1Tm1914Method X1Tm1914Method; #endif +#if defined(CONFIG_IDF_TARGET_ESP32C6) +// ESP32-C6: Bit-bang based bus macros +#define B_32_C6_NEO_3 NeoPixelBusLg +#define B_32_C6_NEO_4 NeoPixelBusLg +#define B_32_C6_400_3 NeoPixelBusLg +#define B_32_C6_TM1_4 NeoPixelBusLg +#define B_32_C6_TM2_3 NeoPixelBusLg +#define B_32_C6_APA106_3 NeoPixelBusLg +#define B_32_C6_2805_5 NeoPixelBusLg +#define B_32_C6_TM1914_3 NeoPixelBusLg +#else //RGB #define B_32_RN_NEO_3 NeoPixelBusLg // ESP32, S2, S3, C3 //#define B_32_IN_NEO_3 NeoPixelBusLg // ESP32 (dynamic I2S selection) @@ -294,6 +316,7 @@ #define B_32_I2_SM16825_5 NeoPixelBusLg #define B_32_IP_SM16825_5 NeoPixelBusLg // parallel I2S #endif +#endif //APA102 #ifdef WLED_USE_ETHERNET @@ -424,7 +447,7 @@ class PolyBus { case I_8266_DM_SM16825_5: (static_cast(busPtr))->Begin(); break; case I_8266_BB_SM16825_5: (static_cast(busPtr))->Begin(); break; #endif - #ifdef ARDUINO_ARCH_ESP32 + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C6) // RMT buses case I_32_RN_NEO_3: (static_cast(busPtr))->Begin(); break; case I_32_RN_NEO_4: (static_cast(busPtr))->Begin(); break; @@ -459,6 +482,16 @@ class PolyBus { case I_HS_LPO_3: beginDotStar(busPtr, pins[1], -1, pins[0], -1, clock_kHz); break; case I_HS_WS1_3: beginDotStar(busPtr, pins[1], -1, pins[0], -1, clock_kHz); break; case I_HS_P98_3: beginDotStar(busPtr, pins[1], -1, pins[0], -1, clock_kHz); break; + #endif + #ifdef CONFIG_IDF_TARGET_ESP32C6 + case I_32_I2_NEO_3: (static_cast(busPtr))->Begin(); break; + case I_32_I2_NEO_4: (static_cast(busPtr))->Begin(); break; + case I_32_I2_400_3: (static_cast(busPtr))->Begin(); break; + case I_32_I2_TM1_4: beginTM1814(busPtr); break; + case I_32_I2_TM2_3: (static_cast(busPtr))->Begin(); break; + case I_32_I2_APA106_3: (static_cast(busPtr))->Begin(); break; + case I_32_I2_2805_5: (static_cast(busPtr))->Begin(); break; + case I_32_I2_TM1914_3: beginTM1914(busPtr); break; #endif case I_SS_DOT_3: (static_cast(busPtr))->Begin(); break; case I_SS_LPD_3: (static_cast(busPtr))->Begin(); break; @@ -528,7 +561,7 @@ class PolyBus { case I_8266_DM_SM16825_5: busPtr = new B_8266_DM_SM16825_5(len, pins[0]); break; case I_8266_BB_SM16825_5: busPtr = new B_8266_BB_SM16825_5(len, pins[0]); break; #endif - #ifdef ARDUINO_ARCH_ESP32 + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C6) // RMT buses case I_32_RN_NEO_3: busPtr = new B_32_RN_NEO_3(len, pins[0], (NeoBusChannel)channel); break; case I_32_RN_NEO_4: busPtr = new B_32_RN_NEO_4(len, pins[0], (NeoBusChannel)channel); break; @@ -557,6 +590,16 @@ class PolyBus { case I_32_I2_TM1914_3: if (_useParallelI2S) busPtr = new B_32_IP_TM1914_3(len, pins[0]); else busPtr = new B_32_I2_TM1914_3(len, pins[0]); break; case I_32_I2_SM16825_5: if (_useParallelI2S) busPtr = new B_32_IP_SM16825_5(len, pins[0]); else busPtr = new B_32_I2_SM16825_5(len, pins[0]); break; #endif + #endif + #ifdef CONFIG_IDF_TARGET_ESP32C6 + case I_32_I2_NEO_3: busPtr = new B_32_C6_NEO_3(len, pins[0]); break; + case I_32_I2_NEO_4: busPtr = new B_32_C6_NEO_4(len, pins[0]); break; + case I_32_I2_400_3: busPtr = new B_32_C6_400_3(len, pins[0]); break; + case I_32_I2_TM1_4: busPtr = new B_32_C6_TM1_4(len, pins[0]); break; + case I_32_I2_TM2_3: busPtr = new B_32_C6_TM2_3(len, pins[0]); break; + case I_32_I2_APA106_3: busPtr = new B_32_C6_APA106_3(len, pins[0]); break; + case I_32_I2_2805_5: busPtr = new B_32_C6_2805_5(len, pins[0]); break; + case I_32_I2_TM1914_3: busPtr = new B_32_C6_TM1914_3(len, pins[0]); break; #endif // for 2-wire: pins[1] is clk, pins[0] is dat. begin expects (len, clk, dat) case I_HS_DOT_3: busPtr = new B_HS_DOT_3(len, pins[1], pins[0]); break; @@ -627,7 +670,7 @@ class PolyBus { case I_8266_DM_SM16825_5: (static_cast(busPtr))->Show(consistent); break; case I_8266_BB_SM16825_5: (static_cast(busPtr))->Show(consistent); break; #endif - #ifdef ARDUINO_ARCH_ESP32 + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C6) // RMT buses case I_32_RN_NEO_3: (static_cast(busPtr))->Show(consistent); break; case I_32_RN_NEO_4: (static_cast(busPtr))->Show(consistent); break; @@ -656,6 +699,16 @@ class PolyBus { case I_32_I2_TM1914_3: if (_useParallelI2S) (static_cast(busPtr))->Show(consistent); else (static_cast(busPtr))->Show(consistent); break; case I_32_I2_SM16825_5: if (_useParallelI2S) (static_cast(busPtr))->Show(consistent); else (static_cast(busPtr))->Show(consistent); break; #endif + #endif + #ifdef CONFIG_IDF_TARGET_ESP32C6 + case I_32_I2_NEO_3: (static_cast(busPtr))->Show(consistent); break; + case I_32_I2_NEO_4: (static_cast(busPtr))->Show(consistent); break; + case I_32_I2_400_3: (static_cast(busPtr))->Show(consistent); break; + case I_32_I2_TM1_4: (static_cast(busPtr))->Show(consistent); break; + case I_32_I2_TM2_3: (static_cast(busPtr))->Show(consistent); break; + case I_32_I2_APA106_3: (static_cast(busPtr))->Show(consistent); break; + case I_32_I2_2805_5: (static_cast(busPtr))->Show(consistent); break; + case I_32_I2_TM1914_3: (static_cast(busPtr))->Show(consistent); break; #endif case I_HS_DOT_3: (static_cast(busPtr))->Show(consistent); break; case I_SS_DOT_3: (static_cast(busPtr))->Show(consistent); break; @@ -723,7 +776,7 @@ class PolyBus { case I_8266_DM_SM16825_5: return (static_cast(busPtr))->CanShow(); break; case I_8266_BB_SM16825_5: return (static_cast(busPtr))->CanShow(); break; #endif - #ifdef ARDUINO_ARCH_ESP32 + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C6) // RMT buses case I_32_RN_NEO_3: return (static_cast(busPtr))->CanShow(); break; case I_32_RN_NEO_4: return (static_cast(busPtr))->CanShow(); break; @@ -752,6 +805,16 @@ class PolyBus { case I_32_I2_TM1914_3: if (_useParallelI2S) return (static_cast(busPtr))->CanShow(); else return (static_cast(busPtr))->CanShow(); break; case I_32_I2_SM16825_5: if (_useParallelI2S) return (static_cast(busPtr))->CanShow(); else return (static_cast(busPtr))->CanShow(); break; #endif + #endif + #ifdef CONFIG_IDF_TARGET_ESP32C6 + case I_32_I2_NEO_3: return (static_cast(busPtr))->CanShow(); break; + case I_32_I2_NEO_4: return (static_cast(busPtr))->CanShow(); break; + case I_32_I2_400_3: return (static_cast(busPtr))->CanShow(); break; + case I_32_I2_TM1_4: return (static_cast(busPtr))->CanShow(); break; + case I_32_I2_TM2_3: return (static_cast(busPtr))->CanShow(); break; + case I_32_I2_APA106_3: return (static_cast(busPtr))->CanShow(); break; + case I_32_I2_2805_5: return (static_cast(busPtr))->CanShow(); break; + case I_32_I2_TM1914_3: return (static_cast(busPtr))->CanShow(); break; #endif case I_HS_DOT_3: return (static_cast(busPtr))->CanShow(); break; case I_SS_DOT_3: return (static_cast(busPtr))->CanShow(); break; @@ -845,7 +908,7 @@ class PolyBus { case I_8266_DM_SM16825_5: (static_cast(busPtr))->SetPixelColor(pix, Rgbww80Color(col.R*257, col.G*257, col.B*257, cctWW*257, cctCW*257)); break; case I_8266_BB_SM16825_5: (static_cast(busPtr))->SetPixelColor(pix, Rgbww80Color(col.R*257, col.G*257, col.B*257, cctWW*257, cctCW*257)); break; #endif - #ifdef ARDUINO_ARCH_ESP32 + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C6) // RMT buses case I_32_RN_NEO_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; case I_32_RN_NEO_4: (static_cast(busPtr))->SetPixelColor(pix, col); break; @@ -874,6 +937,16 @@ class PolyBus { case I_32_I2_TM1914_3: if (_useParallelI2S) (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); else (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; case I_32_I2_SM16825_5: if (_useParallelI2S) (static_cast(busPtr))->SetPixelColor(pix, Rgbww80Color(col.R*257, col.G*257, col.B*257, cctWW*257, cctCW*257)); else (static_cast(busPtr))->SetPixelColor(pix, Rgbww80Color(col.R*257, col.G*257, col.B*257, cctWW*257, cctCW*257)); break; #endif + #endif + #ifdef CONFIG_IDF_TARGET_ESP32C6 + case I_32_I2_NEO_3: ((B_32_C6_NEO_3 *)busPtr)->SetPixelColor(pix, RgbColor(col)); break; + case I_32_I2_NEO_4: ((B_32_C6_NEO_4 *)busPtr)->SetPixelColor(pix, col); break; + case I_32_I2_400_3: ((B_32_C6_400_3 *)busPtr)->SetPixelColor(pix, RgbColor(col)); break; + case I_32_I2_TM1_4: ((B_32_C6_TM1_4 *)busPtr)->SetPixelColor(pix, col); break; + case I_32_I2_TM2_3: ((B_32_C6_TM2_3 *)busPtr)->SetPixelColor(pix, RgbColor(col)); break; + case I_32_I2_APA106_3: ((B_32_C6_APA106_3 *)busPtr)->SetPixelColor(pix, RgbColor(col)); break; + case I_32_I2_2805_5: ((B_32_C6_2805_5 *)busPtr)->SetPixelColor(pix, RgbwwColor(col.R, col.G, col.B, cctWW, cctCW)); break; + case I_32_I2_TM1914_3: ((B_32_C6_TM1914_3 *)busPtr)->SetPixelColor(pix, RgbColor(col)); break; #endif case I_HS_DOT_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; case I_SS_DOT_3: (static_cast(busPtr))->SetPixelColor(pix, RgbColor(col)); break; @@ -941,7 +1014,7 @@ class PolyBus { case I_8266_DM_SM16825_5: (static_cast(busPtr))->SetLuminance(b); break; case I_8266_BB_SM16825_5: (static_cast(busPtr))->SetLuminance(b); break; #endif - #ifdef ARDUINO_ARCH_ESP32 + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C6) // RMT buses case I_32_RN_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; case I_32_RN_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; @@ -970,6 +1043,17 @@ class PolyBus { case I_32_I2_TM1914_3: if (_useParallelI2S) (static_cast(busPtr))->SetLuminance(b); else (static_cast(busPtr))->SetLuminance(b); break; case I_32_I2_SM16825_5: if (_useParallelI2S) (static_cast(busPtr))->SetLuminance(b); else (static_cast(busPtr))->SetLuminance(b); break; #endif + #endif + #ifdef CONFIG_IDF_TARGET_ESP32C6 + // Add setBrightness logic (updated to SetLuminance) + case I_32_I2_NEO_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_I2_NEO_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_I2_400_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_I2_TM1_4: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_I2_TM2_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_I2_APA106_3: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_I2_2805_5: (static_cast(busPtr))->SetLuminance(b); break; + case I_32_I2_TM1914_3: (static_cast(busPtr))->SetLuminance(b); break; #endif case I_HS_DOT_3: (static_cast(busPtr))->SetLuminance(b); break; case I_SS_DOT_3: (static_cast(busPtr))->SetLuminance(b); break; @@ -1038,7 +1122,7 @@ class PolyBus { case I_8266_DM_SM16825_5: { Rgbww80Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W case I_8266_BB_SM16825_5: { Rgbww80Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R,c.G,c.B,max(c.WW,c.CW)); } break; // will not return original W #endif - #ifdef ARDUINO_ARCH_ESP32 + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C6) // RMT buses case I_32_RN_NEO_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_32_RN_NEO_4: col = (static_cast(busPtr))->GetPixelColor(pix); break; @@ -1068,6 +1152,16 @@ class PolyBus { case I_32_I2_SM16825_5: { Rgbww80Color c = (_useParallelI2S) ? (static_cast(busPtr))->GetPixelColor(pix) : (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R/257,c.G/257,c.B/257,max(c.WW,c.CW)/257); } break; // will not return original W #endif #endif + #ifdef CONFIG_IDF_TARGET_ESP32C6 + case I_32_I2_NEO_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; + case I_32_I2_NEO_4: col = (static_cast(busPtr))->GetPixelColor(pix); break; + case I_32_I2_400_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; + case I_32_I2_TM1_4: { Rgbw64Color c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R / 257, c.G / 257, c.B / 257, c.W / 257); } break; + case I_32_I2_TM2_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; + case I_32_I2_APA106_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; + case I_32_I2_2805_5: { RgbwwColor c = (static_cast(busPtr))->GetPixelColor(pix); col = RGBW32(c.R, c.G, c.B, max(c.WW, c.CW)); } break; + case I_32_I2_TM1914_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; +#endif case I_HS_DOT_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_SS_DOT_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; case I_HS_LPD_3: col = (static_cast(busPtr))->GetPixelColor(pix); break; @@ -1153,7 +1247,7 @@ class PolyBus { case I_8266_DM_SM16825_5: delete (static_cast(busPtr)); break; case I_8266_BB_SM16825_5: delete (static_cast(busPtr)); break; #endif - #ifdef ARDUINO_ARCH_ESP32 + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C6) // RMT buses case I_32_RN_NEO_3: delete (static_cast(busPtr)); break; case I_32_RN_NEO_4: delete (static_cast(busPtr)); break; @@ -1183,6 +1277,16 @@ class PolyBus { case I_32_I2_SM16825_5: if (_useParallelI2S) delete (static_cast(busPtr)); else delete (static_cast(busPtr)); break; #endif #endif + #ifdef CONFIG_IDF_TARGET_ESP32C6 + case I_32_I2_NEO_3: delete (static_cast(busPtr)); break; + case I_32_I2_NEO_4: delete (static_cast(busPtr)); break; + case I_32_I2_400_3: delete (static_cast(busPtr)); break; + case I_32_I2_TM1_4: delete (static_cast(busPtr)); break; + case I_32_I2_TM2_3: delete (static_cast(busPtr)); break; + case I_32_I2_APA106_3: delete (static_cast(busPtr)); break; + case I_32_I2_2805_5: delete (static_cast(busPtr)); break; + case I_32_I2_TM1914_3: delete (static_cast(busPtr)); break; +#endif case I_HS_DOT_3: delete (static_cast(busPtr)); break; case I_SS_DOT_3: delete (static_cast(busPtr)); break; case I_HS_LPD_3: delete (static_cast(busPtr)); break; @@ -1250,7 +1354,7 @@ class PolyBus { case I_8266_DM_SM16825_5: size = (static_cast(busPtr))->PixelsSize()*5; break; case I_8266_BB_SM16825_5: size = (static_cast(busPtr))->PixelsSize()*2; break; #endif - #ifdef ARDUINO_ARCH_ESP32 + #if defined(ARDUINO_ARCH_ESP32) && !defined(CONFIG_IDF_TARGET_ESP32C6) // RMT buses (front + back + small system managed RMT) case I_32_RN_NEO_3: size = (static_cast(busPtr))->PixelsSize()*2; break; case I_32_RN_NEO_4: size = (static_cast(busPtr))->PixelsSize()*2; break; @@ -1280,6 +1384,16 @@ class PolyBus { case I_32_I2_SM16825_5: size = (_useParallelI2S) ? (static_cast(busPtr))->PixelsSize()*4 : (static_cast(busPtr))->PixelsSize()*4; break; #endif #endif + #ifdef CONFIG_IDF_TARGET_ESP32C6 + case I_32_I2_NEO_3: size = (static_cast(busPtr))->PixelsSize(); break; + case I_32_I2_NEO_4: size = (static_cast(busPtr))->PixelsSize(); break; + case I_32_I2_400_3: size = (static_cast(busPtr))->PixelsSize(); break; + case I_32_I2_TM1_4: size = (static_cast(busPtr))->PixelsSize(); break; + case I_32_I2_TM2_3: size = (static_cast(busPtr))->PixelsSize(); break; + case I_32_I2_APA106_3: size = (static_cast(busPtr))->PixelsSize(); break; + case I_32_I2_2805_5: size = (static_cast(busPtr))->PixelsSize(); break; + case I_32_I2_TM1914_3: size = (static_cast(busPtr))->PixelsSize(); break; +#endif case I_HS_DOT_3: size = (static_cast(busPtr))->PixelsSize()*2; break; case I_SS_DOT_3: size = (static_cast(busPtr))->PixelsSize()*2; break; case I_HS_LPD_3: size = (static_cast(busPtr))->PixelsSize()*2; break; From 1ed438782c77cb08e94ae2946a14506e35550b04 Mon Sep 17 00:00:00 2001 From: Raileanu Cosmin Date: Sat, 29 Mar 2025 21:00:18 +0200 Subject: [PATCH 6/9] GPIO pins C6 --- wled00/pin_manager.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/wled00/pin_manager.cpp b/wled00/pin_manager.cpp index 6f16523010..faedd2f6cb 100644 --- a/wled00/pin_manager.cpp +++ b/wled00/pin_manager.cpp @@ -18,7 +18,7 @@ static uint32_t pinAlloc = 0UL; // 1 bit per pin, we use first 17bits #else static uint64_t pinAlloc = 0ULL; // 1 bit per pin, we use 50 bits on ESP32-S3 -static uint16_t ledcAlloc = 0; // up to 16 LEDC channels (WLED_MAX_ANALOG_CHANNELS) +static uint16_t ledcAlloc = 0; // up to 16 LEDC channels (WLED_MAX_ANALOG_CHANNELS) #endif static uint8_t i2cAllocCount = 0; // allow multiple allocation of I2C bus pins but keep track of allocations static uint8_t spiAllocCount = 0; // allow multiple allocation of SPI bus pins but keep track of allocations @@ -207,6 +207,10 @@ bool PinManager::isPinOk(byte gpio, bool output) #if ARDUINO_USB_CDC_ON_BOOT == 1 || ARDUINO_USB_DFU_ON_BOOT == 1 if (gpio > 17 && gpio < 20) return false; // 18-19 USB-JTAG #endif + #elif defined(CONFIG_IDF_TARGET_ESP32C6) + // strapping pins: 4, 5, 8, 9 + if (gpio > 11 && gpio < 14) return false; // 12-13 USB-JTAG + if (gpio > 23 && gpio < 31) return false; // 24-30 SPI FLASH #elif defined(CONFIG_IDF_TARGET_ESP32S3) // 00 to 18 are for general use. Be careful about straping pins GPIO0 and GPIO3 - these may be pulled-up or pulled-down on your board. #if ARDUINO_USB_CDC_ON_BOOT == 1 || ARDUINO_USB_DFU_ON_BOOT == 1 From 7896146fb068b8f123cf409f124f36b1794d09e8 Mon Sep 17 00:00:00 2001 From: Raileanu Cosmin Date: Sat, 29 Mar 2025 21:00:29 +0200 Subject: [PATCH 7/9] General fixes for C6 --- wled00/NodeStruct.h | 1 + wled00/button.cpp | 2 ++ wled00/improv.cpp | 2 +- wled00/presets.cpp | 2 +- .../async-mqtt-client/AsyncMqttClient.hpp | 2 +- wled00/udp.cpp | 2 ++ wled00/wled.cpp | 14 +++++++------- wled00/wled.h | 2 +- 8 files changed, 16 insertions(+), 11 deletions(-) diff --git a/wled00/NodeStruct.h b/wled00/NodeStruct.h index 34f73ab418..cd31bd359f 100644 --- a/wled00/NodeStruct.h +++ b/wled00/NodeStruct.h @@ -14,6 +14,7 @@ #define NODE_TYPE_ID_ESP32S2 33 // etc #define NODE_TYPE_ID_ESP32S3 34 #define NODE_TYPE_ID_ESP32C3 35 +#define NODE_TYPE_ID_ESP32C6 36 /*********************************************************************************************\ * NodeStruct diff --git a/wled00/button.cpp b/wled00/button.cpp index cf8fabe42e..40766d0414 100644 --- a/wled00/button.cpp +++ b/wled00/button.cpp @@ -113,8 +113,10 @@ bool isButtonPressed(uint8_t b) #ifdef SOC_TOUCH_VERSION_2 //ESP32 S2 and S3 provide a function to check touch state (state is updated in interrupt) if (touchInterruptGetLastStatus(pin)) return true; #else + #if !defined(CONFIG_IDF_TARGET_ESP32C6) if (digitalPinToTouchChannel(btnPin[b]) >= 0 && touchRead(pin) <= touchThreshold) return true; #endif + #endif #endif break; } diff --git a/wled00/improv.cpp b/wled00/improv.cpp index 197148b2bf..7195d67839 100644 --- a/wled00/improv.cpp +++ b/wled00/improv.cpp @@ -10,7 +10,7 @@ #define DIMPROV_PRINTF(x...) #endif -#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3) +#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C6) #undef WLED_DISABLE_IMPROV_WIFISCAN #define WLED_DISABLE_IMPROV_WIFISCAN #endif diff --git a/wled00/presets.cpp b/wled00/presets.cpp index 54f052637b..8ad1b1c318 100644 --- a/wled00/presets.cpp +++ b/wled00/presets.cpp @@ -168,7 +168,7 @@ void handlePresets() DEBUG_PRINTF_P(PSTR("Applying preset: %u\n"), (unsigned)tmpPreset); - #if defined(ARDUINO_ARCH_ESP32S3) || defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32C3) + #if defined(ARDUINO_ARCH_ESP32S3) || defined(ARDUINO_ARCH_ESP32S2) || defined(ARDUINO_ARCH_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) unsigned long start = millis(); while (strip.isUpdating() && millis() - start < FRAMETIME_FIXED) yield(); // wait for strip to finish updating, accessing FS during sendout causes glitches #endif diff --git a/wled00/src/dependencies/async-mqtt-client/AsyncMqttClient.hpp b/wled00/src/dependencies/async-mqtt-client/AsyncMqttClient.hpp index af8332b24e..b8a98dd6a7 100644 --- a/wled00/src/dependencies/async-mqtt-client/AsyncMqttClient.hpp +++ b/wled00/src/dependencies/async-mqtt-client/AsyncMqttClient.hpp @@ -38,7 +38,7 @@ #include "AsyncMqttClient/Packets/PubRecPacket.hpp" #include "AsyncMqttClient/Packets/PubCompPacket.hpp" -#if ESP32 +#if ESP32 || defined(CONFIG_IDF_TARGET_ESP32C6) #define SEMAPHORE_TAKE(X) if (xSemaphoreTake(_xSemaphore, 1000 / portTICK_PERIOD_MS) != pdTRUE) { return X; } // Waits max 1000ms #define SEMAPHORE_GIVE() xSemaphoreGive(_xSemaphore); #elif defined(ESP8266) diff --git a/wled00/udp.cpp b/wled00/udp.cpp index 4395b285d0..b7eae3b5ef 100644 --- a/wled00/udp.cpp +++ b/wled00/udp.cpp @@ -754,6 +754,8 @@ void sendSysInfoUDP() data[38] = NODE_TYPE_ID_ESP32S3; #elif defined(CONFIG_IDF_TARGET_ESP32S2) data[38] = NODE_TYPE_ID_ESP32S2; + #elif defined(CONFIG_IDF_TARGET_ESP32C6) + data[38] = NODE_TYPE_ID_ESP32C6; #elif defined(ARDUINO_ARCH_ESP32) data[38] = NODE_TYPE_ID_ESP32; #else diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 7e2095838d..2ed1e751c8 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -326,7 +326,7 @@ void WLED::setup() Serial.setTimeout(50); // this causes troubles on new MCUs that have a "virtual" USB Serial (HWCDC) #else #endif - #if defined(WLED_DEBUG) && defined(ARDUINO_ARCH_ESP32) && (defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || ARDUINO_USB_CDC_ON_BOOT) + #if defined(WLED_DEBUG) && defined(ARDUINO_ARCH_ESP32) && (defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C3) || ARDUINO_USB_CDC_ON_BOOT || defined(CONFIG_IDF_TARGET_ESP32C6)) delay(2500); // allow CDC USB serial to initialise #endif #if !defined(WLED_DEBUG) && defined(ARDUINO_ARCH_ESP32) && !defined(WLED_DEBUG_HOST) && ARDUINO_USB_CDC_ON_BOOT @@ -370,7 +370,7 @@ void WLED::setup() #if defined(ARDUINO_ARCH_ESP32) // BOARD_HAS_PSRAM also means that a compiler flag "-mfix-esp32-psram-cache-issue" was used and so PSRAM is safe to use on rev.1 ESP32 - #if !defined(BOARD_HAS_PSRAM) && !(defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3)) + #if !defined(BOARD_HAS_PSRAM) && !(defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6)) if (psramFound() && ESP.getChipRevision() < 3) psramSafe = false; if (!psramSafe) DEBUG_PRINTLN(F("Not using PSRAM.")); #endif @@ -624,11 +624,11 @@ void WLED::initConnection() WiFi.setPhyMode(force802_3g ? WIFI_PHY_MODE_11G : WIFI_PHY_MODE_11N); #endif - if (multiWiFi[selectedWiFi].staticIP != 0U && multiWiFi[selectedWiFi].staticGW != 0U) { - WiFi.config(multiWiFi[selectedWiFi].staticIP, multiWiFi[selectedWiFi].staticGW, multiWiFi[selectedWiFi].staticSN, dnsAddress); - } else { - WiFi.config(IPAddress((uint32_t)0), IPAddress((uint32_t)0), IPAddress((uint32_t)0)); - } +if (multiWiFi[selectedWiFi].staticIP != IPAddress() && multiWiFi[selectedWiFi].staticGW != IPAddress()) { + WiFi.config(multiWiFi[selectedWiFi].staticIP, multiWiFi[selectedWiFi].staticGW, multiWiFi[selectedWiFi].staticSN, dnsAddress); +} else { + WiFi.config(IPAddress(), IPAddress(), IPAddress()); +} lastReconnectAttempt = millis(); diff --git a/wled00/wled.h b/wled00/wled.h index 7778156400..c7683b4abe 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -321,7 +321,7 @@ WLED_GLOBAL bool rlyOpenDrain _INIT(RLYODRAIN); #define IRTYPE 0 #endif -#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2) || (defined(RX) && defined(TX)) +#if defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32C6) || (defined(RX) && defined(TX)) // use RX/TX as set by the framework - these boards do _not_ have RX=3 and TX=1 constexpr uint8_t hardwareRX = RX; constexpr uint8_t hardwareTX = TX; From 10c8dbce6a58fc0ea6fdd3551b936b2ae78cea92 Mon Sep 17 00:00:00 2001 From: Raileanu Cosmin Date: Sat, 29 Mar 2025 21:27:22 +0200 Subject: [PATCH 8/9] Remove extra spaces Derp --- wled00/pin_manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/pin_manager.cpp b/wled00/pin_manager.cpp index faedd2f6cb..bdbb5f0f59 100644 --- a/wled00/pin_manager.cpp +++ b/wled00/pin_manager.cpp @@ -18,7 +18,7 @@ static uint32_t pinAlloc = 0UL; // 1 bit per pin, we use first 17bits #else static uint64_t pinAlloc = 0ULL; // 1 bit per pin, we use 50 bits on ESP32-S3 -static uint16_t ledcAlloc = 0; // up to 16 LEDC channels (WLED_MAX_ANALOG_CHANNELS) +static uint16_t ledcAlloc = 0; // up to 16 LEDC channels (WLED_MAX_ANALOG_CHANNELS) #endif static uint8_t i2cAllocCount = 0; // allow multiple allocation of I2C bus pins but keep track of allocations static uint8_t spiAllocCount = 0; // allow multiple allocation of SPI bus pins but keep track of allocations From be0cdfbfe8ceb6aeab87adcda53d2dcfcd874be7 Mon Sep 17 00:00:00 2001 From: Raileanu Cosmin Date: Sat, 29 Mar 2025 21:35:33 +0200 Subject: [PATCH 9/9] Add comment to IPAdress check change --- wled00/wled.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 2ed1e751c8..63c6cf8f76 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -624,6 +624,8 @@ void WLED::initConnection() WiFi.setPhyMode(force802_3g ? WIFI_PHY_MODE_11G : WIFI_PHY_MODE_11N); #endif +// Check if static IP and gateway are set by comparing against default-constructed IPAddress() +// This is safer and more portable than using 0U, which may not work reliably across all platforms (e.g., ESP32-C6) if (multiWiFi[selectedWiFi].staticIP != IPAddress() && multiWiFi[selectedWiFi].staticGW != IPAddress()) { WiFi.config(multiWiFi[selectedWiFi].staticIP, multiWiFi[selectedWiFi].staticGW, multiWiFi[selectedWiFi].staticSN, dnsAddress); } else {