From 9dbe71cf7e35999d914b2a6ffbc0fb09e8acf517 Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Sun, 14 Jun 2026 08:47:53 -0700 Subject: [PATCH 01/15] Adjust SPI configuration for ESP32-S3 support Added support for ESP32-S3 --- usermods/sd_card/sd_card.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index 4e68b97a34..2352b5db8a 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -14,8 +14,16 @@ #endif #ifdef WLED_USE_SD_MMC + // SD_MMC configuration handled elsewhere #elif defined(WLED_USE_SD_SPI) - SPIClass spiPort = SPIClass(VSPI); + #if defined(CONFIG_IDF_TARGET_ESP32S3) + // ESP32-S3 default hardware SPI bus is typically FSPI (or HSPI) + SPIClass spiPort = SPIClass(HSPI); + #else + // Classic ESP32 defaults (VSPI is default/safest for SD cards on standard pins) + SPIClass spiPort = SPIClass(VSPI); + // Alternative for classic ESP32 if needed: SPIClass spiPort = SPIClass(HSPI); + #endif #endif void listDir( const char * dirname, uint8_t levels); @@ -241,4 +249,4 @@ void listDir( const char * dirname, uint8_t levels){ #endif static UsermodSdCard sd_card; -REGISTER_USERMOD(sd_card); \ No newline at end of file +REGISTER_USERMOD(sd_card); From 11e3e9e1eb90cdaa30930ac5741788b5609e0711 Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Sun, 14 Jun 2026 18:38:35 -0700 Subject: [PATCH 02/15] Make SD card pin configuration customizable Added support to use build flags to configure SD card pins --- usermods/sd_card/sd_card.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index 2352b5db8a..e0c297d347 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -33,10 +33,26 @@ class UsermodSdCard : public Usermod { bool sdInitDone = false; #ifdef WLED_USE_SD_SPI - int8_t configPinSourceSelect = 16; - int8_t configPinSourceClock = 14; - int8_t configPinPoci = 36; // confusing names? Then have a look :) - int8_t configPinPico = 15; // https://www.oshwa.org/a-resolution-to-redefine-spi-signal-names/ + #if defined(UM_SD_SELECT) + int8_t configPinSourceSelect = UM_SD_SELECT; + #else + int8_t configPinSourceSelect = 16; + #endif + #if defined(UM_SD_CLOCK) + int8_t configPinSourceClock = UM_SD_CLOCK; + #else + int8_t configPinSourceClock = 14; + #endif + #if defined(UM_SD_POCI) + int8_t configPinPoci = UM_SD_POCI; + #else + int8_t configPinPoci = 36; + #endif + #if defined(UM_SD_PICO) + int8_t configPinPico = UM_SD_PICO; + #else + int8_t configPinPico = 15; + #endif //acquired and initialize the SPI port void init_SD_SPI() From 80490a663c70be9dcb29f87dc91cec5b53b0d2f7 Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Sun, 14 Jun 2026 18:44:13 -0700 Subject: [PATCH 03/15] Update readme with SD card pin customization Added instructions for customizing SD card pins in readme. --- usermods/sd_card/readme.md | 1 + 1 file changed, 1 insertion(+) diff --git a/usermods/sd_card/readme.md b/usermods/sd_card/readme.md index 96390c05ac..9c502f33d2 100644 --- a/usermods/sd_card/readme.md +++ b/usermods/sd_card/readme.md @@ -5,6 +5,7 @@ - choose the way your SD is connected 1. via `-D WLED_USE_SD_MMC` when connected via MMC 2. via `-D WLED_USE_SD_SPI` when connected via SPI (use usermod page to setup SPI pins) + 3. Customize pins with the following `-D UM_SD_SELECT=16 -D UM_SD_CLOCK=14 -D UM_SD_POCI=36 -D UM_SD_PICO=15` ### Test - enable `-D SD_PRINT_HOME_DIR` and `-D WLED_DEBUG` From d38fd092d07521d95d5ec3ecdb5bfbfb4f33f06b Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Sun, 14 Jun 2026 19:05:31 -0700 Subject: [PATCH 04/15] Improve formatting of SD card configuration code Refactor preprocessor directives for SD card pin configuration. --- usermods/sd_card/sd_card.cpp | 42 ++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index e0c297d347..cf62475948 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -32,27 +32,27 @@ class UsermodSdCard : public Usermod { private: bool sdInitDone = false; - #ifdef WLED_USE_SD_SPI - #if defined(UM_SD_SELECT) - int8_t configPinSourceSelect = UM_SD_SELECT; - #else - int8_t configPinSourceSelect = 16; - #endif - #if defined(UM_SD_CLOCK) - int8_t configPinSourceClock = UM_SD_CLOCK; - #else - int8_t configPinSourceClock = 14; - #endif - #if defined(UM_SD_POCI) - int8_t configPinPoci = UM_SD_POCI; - #else - int8_t configPinPoci = 36; - #endif - #if defined(UM_SD_PICO) - int8_t configPinPico = UM_SD_PICO; - #else - int8_t configPinPico = 15; - #endif +#ifdef WLED_USE_SD_SPI + #if defined(UM_SD_SELECT) + int8_t configPinSourceSelect = UM_SD_SELECT; + #else + int8_t configPinSourceSelect = 16; + #endif + #if defined(UM_SD_CLOCK) + int8_t configPinSourceClock = UM_SD_CLOCK; + #else + int8_t configPinSourceClock = 14; + #endif + #if defined(UM_SD_POCI) + int8_t configPinPoci = UM_SD_POCI; + #else + int8_t configPinPoci = 36; + #endif + #if defined(UM_SD_PICO) + int8_t configPinPico = UM_SD_PICO; + #else + int8_t configPinPico = 15; + #endif //acquired and initialize the SPI port void init_SD_SPI() From 96f21c1253448e117b78bed41f3171baeaf1398a Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Sun, 14 Jun 2026 19:24:48 -0700 Subject: [PATCH 05/15] Added original comments back Added original comments back --- usermods/sd_card/sd_card.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index cf62475948..0903df661f 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -32,6 +32,8 @@ class UsermodSdCard : public Usermod { private: bool sdInitDone = false; +// confusing names? Then have a look +// https://oshwa.org/resources/a-resolution-to-redefine-spi-signal-names/ #ifdef WLED_USE_SD_SPI #if defined(UM_SD_SELECT) int8_t configPinSourceSelect = UM_SD_SELECT; From 4920af213803db86364953cd8dc4f57a4010aa8e Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Sun, 14 Jun 2026 19:37:54 -0700 Subject: [PATCH 06/15] Change SPI port from HSPI to FSPI for ESP32-S3 --- usermods/sd_card/sd_card.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index 0903df661f..e0bcb533eb 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -18,7 +18,7 @@ #elif defined(WLED_USE_SD_SPI) #if defined(CONFIG_IDF_TARGET_ESP32S3) // ESP32-S3 default hardware SPI bus is typically FSPI (or HSPI) - SPIClass spiPort = SPIClass(HSPI); + SPIClass spiPort = SPIClass(FSPI); #else // Classic ESP32 defaults (VSPI is default/safest for SD cards on standard pins) SPIClass spiPort = SPIClass(VSPI); From c5d03af60ef4fef25026e496a29e46b86d072449 Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Mon, 15 Jun 2026 09:15:37 -0700 Subject: [PATCH 07/15] Change pin configuration types from int8_t to uint8_t --- usermods/sd_card/sd_card.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index e0bcb533eb..8ce52860be 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -36,24 +36,24 @@ class UsermodSdCard : public Usermod { // https://oshwa.org/resources/a-resolution-to-redefine-spi-signal-names/ #ifdef WLED_USE_SD_SPI #if defined(UM_SD_SELECT) - int8_t configPinSourceSelect = UM_SD_SELECT; + uint8_t configPinSourceSelect = UM_SD_SELECT; #else - int8_t configPinSourceSelect = 16; + uint8_t configPinSourceSelect = 16; #endif #if defined(UM_SD_CLOCK) - int8_t configPinSourceClock = UM_SD_CLOCK; + uint8_t configPinSourceClock = UM_SD_CLOCK; #else - int8_t configPinSourceClock = 14; + uint8_t configPinSourceClock = 14; #endif #if defined(UM_SD_POCI) - int8_t configPinPoci = UM_SD_POCI; + uint8_t configPinPoci = UM_SD_POCI; #else - int8_t configPinPoci = 36; + uint8_t configPinPoci = 36; #endif #if defined(UM_SD_PICO) - int8_t configPinPico = UM_SD_PICO; + uint8_t configPinPico = UM_SD_PICO; #else - int8_t configPinPico = 15; + uint8_t configPinPico = 15; #endif //acquired and initialize the SPI port From f6567cc4acd156aed72762b63055674dc2755f2c Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Mon, 15 Jun 2026 10:26:22 -0700 Subject: [PATCH 08/15] Update usermods/sd_card/sd_card.cpp Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- usermods/sd_card/sd_card.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index 8ce52860be..0e329a231e 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -41,7 +41,7 @@ class UsermodSdCard : public Usermod { uint8_t configPinSourceSelect = 16; #endif #if defined(UM_SD_CLOCK) - uint8_t configPinSourceClock = UM_SD_CLOCK; + uint8_t configPinSourceClock = UM_SD_CLOCK; #else uint8_t configPinSourceClock = 14; #endif From 9a9ab8bb3a774147e1625537ba171f8fd4039c33 Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Wed, 17 Jun 2026 19:14:56 -0700 Subject: [PATCH 09/15] Change SPI port from FSPI to HSPI for ESP32-S3 --- usermods/sd_card/sd_card.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index 0e329a231e..f0de02968b 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -18,7 +18,7 @@ #elif defined(WLED_USE_SD_SPI) #if defined(CONFIG_IDF_TARGET_ESP32S3) // ESP32-S3 default hardware SPI bus is typically FSPI (or HSPI) - SPIClass spiPort = SPIClass(FSPI); + SPIClass spiPort = SPIClass(HSPI); #else // Classic ESP32 defaults (VSPI is default/safest for SD cards on standard pins) SPIClass spiPort = SPIClass(VSPI); From 4e17ff4617880eb1e0959c16fdeb443196b3cf5d Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Fri, 19 Jun 2026 20:56:27 -0700 Subject: [PATCH 10/15] Change pin configuration types from uint8_t to int8_t --- usermods/sd_card/sd_card.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index f0de02968b..620808e050 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -36,24 +36,24 @@ class UsermodSdCard : public Usermod { // https://oshwa.org/resources/a-resolution-to-redefine-spi-signal-names/ #ifdef WLED_USE_SD_SPI #if defined(UM_SD_SELECT) - uint8_t configPinSourceSelect = UM_SD_SELECT; + int8_t configPinSourceSelect = UM_SD_SELECT; #else - uint8_t configPinSourceSelect = 16; + int8_t configPinSourceSelect = 16; #endif #if defined(UM_SD_CLOCK) - uint8_t configPinSourceClock = UM_SD_CLOCK; + int8_t configPinSourceClock = UM_SD_CLOCK; #else - uint8_t configPinSourceClock = 14; + int8_t configPinSourceClock = 14; #endif #if defined(UM_SD_POCI) - uint8_t configPinPoci = UM_SD_POCI; + int8_t configPinPoci = UM_SD_POCI; #else - uint8_t configPinPoci = 36; + int8_t configPinPoci = 36; #endif #if defined(UM_SD_PICO) - uint8_t configPinPico = UM_SD_PICO; + int8_t configPinPico = UM_SD_PICO; #else - uint8_t configPinPico = 15; + int8_t configPinPico = 15; #endif //acquired and initialize the SPI port From 9684c95317f1b245f0e3ef78408a177a89dd2425 Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Fri, 19 Jun 2026 21:12:47 -0700 Subject: [PATCH 11/15] Update SPI configuration for SD card support --- usermods/sd_card/sd_card.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index 620808e050..34065c96e6 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -17,12 +17,14 @@ // SD_MMC configuration handled elsewhere #elif defined(WLED_USE_SD_SPI) #if defined(CONFIG_IDF_TARGET_ESP32S3) - // ESP32-S3 default hardware SPI bus is typically FSPI (or HSPI) - SPIClass spiPort = SPIClass(HSPI); + // FSPI (SPI2) is the global SPI used by dotstar/2-pin LED drivers; use HSPI (SPI3) for SD + SPIClass spiPort = SPIClass(HSPI); + #elif defined(WLED_USE_ETHERNET) + // Ethernet builds: dotstar uses HSPI (SPI2), so SD uses VSPI (SPI3) + SPIClass spiPort = SPIClass(VSPI); #else - // Classic ESP32 defaults (VSPI is default/safest for SD cards on standard pins) - SPIClass spiPort = SPIClass(VSPI); - // Alternative for classic ESP32 if needed: SPIClass spiPort = SPIClass(HSPI); + // Non-Ethernet classic ESP32: dotstar uses global SPI (VSPI/SPI3), so SD uses HSPI (SPI2) + SPIClass spiPort = SPIClass(HSPI); #endif #endif From 951f36227c61a45fb5387233ac6347477ffbe70f Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Sat, 20 Jun 2026 06:21:22 -0700 Subject: [PATCH 12/15] Define SD card configuration pins if not defined --- usermods/sd_card/sd_card.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index 34065c96e6..c001912394 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -13,6 +13,20 @@ #include "SPI.h" #endif +#ifndef UM_SD_SELECT + #define configPinSourceSelect = 16; +#endif +#ifndef UM_SD_CLOCK + #define configPinSourceClock = 14; +#endif +#ifndef UM_SD_POCI + #define configPinPoci = 36; +#endif +#ifndef UM_SD_PICO + #define configPinPico = 15; +#endif + + #ifdef WLED_USE_SD_MMC // SD_MMC configuration handled elsewhere #elif defined(WLED_USE_SD_SPI) From 9dc89db13dbac88bfb3d58f32db4df1f0d538705 Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Sat, 20 Jun 2026 06:24:20 -0700 Subject: [PATCH 13/15] Refactor SD card pin configuration logic Removed default pin assignments for SD card configuration. --- usermods/sd_card/sd_card.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index c001912394..3948dbbfbf 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -53,23 +53,15 @@ class UsermodSdCard : public Usermod { #ifdef WLED_USE_SD_SPI #if defined(UM_SD_SELECT) int8_t configPinSourceSelect = UM_SD_SELECT; - #else - int8_t configPinSourceSelect = 16; #endif #if defined(UM_SD_CLOCK) int8_t configPinSourceClock = UM_SD_CLOCK; - #else - int8_t configPinSourceClock = 14; #endif #if defined(UM_SD_POCI) int8_t configPinPoci = UM_SD_POCI; - #else - int8_t configPinPoci = 36; #endif #if defined(UM_SD_PICO) int8_t configPinPico = UM_SD_PICO; - #else - int8_t configPinPico = 15; #endif //acquired and initialize the SPI port From 3db59afaeb482f80ee6fa3c0a88f748f2bc9a496 Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Sat, 20 Jun 2026 15:34:43 -0700 Subject: [PATCH 14/15] Fix macro definitions for SD card pin configurations --- usermods/sd_card/sd_card.cpp | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index 3948dbbfbf..c3c54ec90d 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -14,16 +14,16 @@ #endif #ifndef UM_SD_SELECT - #define configPinSourceSelect = 16; + #define UM_SD_SELECT 16; #endif #ifndef UM_SD_CLOCK - #define configPinSourceClock = 14; + #define UM_SD_CLOCK 14; #endif #ifndef UM_SD_POCI - #define configPinPoci = 36; + #define UM_SD_POCI 36; #endif #ifndef UM_SD_PICO - #define configPinPico = 15; + #define UM_SD_PICO 15; #endif @@ -51,16 +51,9 @@ class UsermodSdCard : public Usermod { // confusing names? Then have a look // https://oshwa.org/resources/a-resolution-to-redefine-spi-signal-names/ #ifdef WLED_USE_SD_SPI - #if defined(UM_SD_SELECT) int8_t configPinSourceSelect = UM_SD_SELECT; - #endif - #if defined(UM_SD_CLOCK) int8_t configPinSourceClock = UM_SD_CLOCK; - #endif - #if defined(UM_SD_POCI) int8_t configPinPoci = UM_SD_POCI; - #endif - #if defined(UM_SD_PICO) int8_t configPinPico = UM_SD_PICO; #endif From e67f030cd87af9988a99e5d699696be89e6de2b8 Mon Sep 17 00:00:00 2001 From: Will <71540407+Will-wastelander@users.noreply.github.com> Date: Sat, 20 Jun 2026 18:34:21 -0700 Subject: [PATCH 15/15] Add warning for SD card and Ethernet conflicts Added a warning about potential conflicts between SD card and Ethernet. --- usermods/sd_card/sd_card.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/usermods/sd_card/sd_card.cpp b/usermods/sd_card/sd_card.cpp index c3c54ec90d..2e47accd01 100644 --- a/usermods/sd_card/sd_card.cpp +++ b/usermods/sd_card/sd_card.cpp @@ -34,6 +34,7 @@ // FSPI (SPI2) is the global SPI used by dotstar/2-pin LED drivers; use HSPI (SPI3) for SD SPIClass spiPort = SPIClass(HSPI); #elif defined(WLED_USE_ETHERNET) + #warning "SD card may have conflicts with ethernet." // Ethernet builds: dotstar uses HSPI (SPI2), so SD uses VSPI (SPI3) SPIClass spiPort = SPIClass(VSPI); #else