From 4162d8fdfa739884e5ad3faef8350c271217c5ae Mon Sep 17 00:00:00 2001 From: Frank Date: Fri, 2 Sep 2022 21:29:05 +0200 Subject: [PATCH] compilation support for IDF4.4.3, plus compiling for ESP32-S3 - Updated ESP32 targets to use IDF 4.4.3 (thanks tasmota!) - Fixed a compilation problem in ARTI (WLED_FS instead of LITTLEFS) - Initial compilation support for ESP32-S3. Warning: there are still many problems to be solved before -S3 becomes usable! - audioreactive: added #ifdef for features not yet supported on ESP32-S3 --- platformio.ini | 65 ++++++++++++++++++++++--- usermods/audioreactive/audio_reactive.h | 19 ++++++++ usermods/audioreactive/audio_source.h | 20 ++++++++ usermods/customeffects/arti.h | 10 ++-- wled00/bus_wrapper.h | 10 ++++ 5 files changed, 112 insertions(+), 12 deletions(-) diff --git a/platformio.ini b/platformio.ini index 696426a8..1af512ab 100644 --- a/platformio.ini +++ b/platformio.ini @@ -115,6 +115,7 @@ build_flags = -D DECODE_SONY=true -D DECODE_SAMSUNG=true -D DECODE_LG=true + -D DECODE_RC5=true -DWLED_USE_MY_CONFIG ; -D USERMOD_SENSORSTOMQTT @@ -129,6 +130,7 @@ build_flags_all_features = build_flags_esp8266 = ${common.build_flags} ${esp8266.build_flags} build_flags_esp32 = ${common.build_flags} ${esp32.build_flags} +build_flags_esp32s3 = ${common.build_flags} ${esp32s3.build_flags} ldscript_1m128k = eagle.flash.1m128.ld ldscript_2m512k = eagle.flash.2m512.ld @@ -208,25 +210,30 @@ lib_deps = makuna/NeoPixelBus @ 2.6.9 [esp32] -#platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.2.3/platform-espressif32-2.0.2.3.zip -platform = espressif32@3.5.0 +#platform = espressif32@3.5.0 +#platform_packages = framework-arduinoespressif32 @ https://github.com/Aircoookie/arduino-esp32.git#1.0.6.4 -platform_packages = framework-arduinoespressif32 @ https://github.com/Aircoookie/arduino-esp32.git#1.0.6.4 +;; use latest tasmota framework, including IDF v4.4.3 and arduino-esp32 v2.0.4 +framework = arduino +platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.4.1/platform-espressif32-2.0.4.1.zip +platform_packages = build_flags = -g -DARDUINO_ARCH_ESP32 - #-DCONFIG_LITTLEFS_FOR_IDF_3_2 + ; -DCONFIG_LITTLEFS_FOR_IDF_3_2 + -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D CONFIG_LITTLEFS_SPIFFS_COMPAT=1 -D CONFIG_LITTLEFS_CACHE_SIZE=512 + -D WLED_WATCHDOG_TIMEOUT=0 -D CONFIG_ASYNC_TCP_USE_WDT=0 #use LITTLEFS library by lorol in ESP32 core 1.x.x instead of built-in in 2.x.x - -D LOROL_LITTLEFS + ; -D LOROL_LITTLEFS default_partitions = tools/WLED_ESP32_4MB_1MB_FS.csv lib_deps = ${env.lib_deps} ; https://github.com/lorol/LITTLEFS.git - ; WLEDSR specific: use patched version of lorol LittleFS - https://github.com/softhack007/LITTLEFS-threadsafe.git#master + ; WLEDSR specific: use patched version of lorol LittleFS - unless using IDF v4 + ; https://github.com/softhack007/LITTLEFS-threadsafe.git#master makuna/NeoPixelBus @ 2.6.9 https://github.com/pbolduc/AsyncTCP.git @ 1.2.0 @@ -236,6 +243,7 @@ build_flags = -g -DARDUINO_ARCH_ESP32S2 -DCONFIG_IDF_TARGET_ESP32S2 -D CONFIG_ASYNC_TCP_USE_WDT=0 + -D WLED_NO_I2S1_BUS -DCO lib_deps = @@ -243,12 +251,35 @@ lib_deps = makuna/NeoPixelBus @ 2.6.9 https://github.com/pbolduc/AsyncTCP.git @ 1.2.0 + +[esp32s3] +build_flags = -g + -DESP32 + -DARDUINO_ARCH_ESP32 + -DARDUINO_ARCH_ESP32S3 + -DCONFIG_IDF_TARGET_ESP32S3 + -D CONFIG_ASYNC_TCP_USE_WDT=0 + -D CONFIG_LITTLEFS_FOR_IDF_3_2 -D CONFIG_LITTLEFS_SPIFFS_COMPAT=1 -D CONFIG_LITTLEFS_CACHE_SIZE=512 + -D WLED_NO_I2S0_BUS + -D WLED_NO_I2S1_BUS + -D WLED_RELEASE_NAME=ESP32S3 -D WLED_DISABLE_BROWNOUT_DET -D WLED_WATCHDOG_TIMEOUT=0 + -D ARDUINO_USB_MODE=1 -D ARDUINO_USB_CDC_ON_BOOT=0 -D ARDUINO_USB_MSC_ON_BOOT=0 + -DCO + +lib_deps = + ${env.lib_deps} + https://github.com/Makuna/NeoPixelBus.git#master @ 2.7.0 + https://github.com/pbolduc/AsyncTCP.git @ 1.2.0 + + [esp32c3] build_flags = -g -DARDUINO_ARCH_ESP32 -DARDUINO_ARCH_ESP32C3 -DCONFIG_IDF_TARGET_ESP32C3 -D CONFIG_ASYNC_TCP_USE_WDT=0 + -D WLED_NO_I2S0_BUS + -D WLED_NO_I2S1_BUS -DCO lib_deps = @@ -444,6 +475,26 @@ lib_deps = ${esp8266.lib_deps} # ------------------------------------------------------------------------------ # custom board configurations # ------------------------------------------------------------------------------ +[env:esp32s3-mdev] +board = esp32-s3-devkitc-1 +platform = ${esp32.platform} +upload_speed = 460800 ; or 921600 +platform_packages = ${esp32.platform_packages} +build_unflags = ${common.build_unflags} + +build_flags = ${common.build_flags_esp32s3} + -D WLED_RELEASE_NAME=ESP32S3 #-D WLED_DISABLE_BLYNK #-D WLED_DISABLE_BROWNOUT_DET + -D USERMOD_AUDIOREACTIVE + -D UM_AUDIOREACTIVE_USE_NEW_FFT + -D USERMOD_CUSTOMEFFECTS + +lib_deps = ${esp32s3.lib_deps} + ; https://github.com/blazoncek/arduinoFFT.git ; arduinoFFT @ 1.5.6 + https://github.com/kosme/arduinoFFT#develop @ 1.9.2 + +board_build.partitions = tools/WLED_ESP32_8MB.csv +board_build.f_flash = 80000000L +board_build.flash_mode = dio [env:esp32mdev] board = esp32dev diff --git a/usermods/audioreactive/audio_reactive.h b/usermods/audioreactive/audio_reactive.h index bd3b6ec1..84466da8 100644 --- a/usermods/audioreactive/audio_reactive.h +++ b/usermods/audioreactive/audio_reactive.h @@ -917,6 +917,12 @@ class AudioReactive : public Usermod { delay(100); // Give that poor microphone some time to setup. switch (dmType) { +#if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3) + // stub cases for not-yet-supported I2S modes on other ESP32 chips + case 0: //ADC analog + case 3: //MCLK + case 4: //SPH0645 +#endif case 1: DEBUGSR_PRINT(F("AR: Generic I2S Microphone - ")); DEBUGSR_PRINTLN(F(I2S_MIC_CHANNEL_TEXT)); audioSource = new I2SSource(SAMPLE_RATE, BLOCK_SIZE); @@ -929,24 +935,32 @@ class AudioReactive : public Usermod { delay(100); if (audioSource) audioSource->initialize(sdaPin, sclPin, i2swsPin, i2ssdPin, i2sckPin, mclkPin); break; +#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) + // SPH0645 is currently only possible on "classic" ESP32 case 3: DEBUGSR_PRINT(F("AR: SPH0645 Microphone - ")); DEBUGSR_PRINTLN(F(I2S_MIC_CHANNEL_TEXT)); audioSource = new SPH0654(SAMPLE_RATE, BLOCK_SIZE); delay(100); audioSource->initialize(i2swsPin, i2ssdPin, i2sckPin); break; +#endif +#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) + // MCLK routing currently only works on "classic" ESP32 case 4: DEBUGSR_PRINT(F("AR: Generic I2S Microphone with Master Clock - ")); DEBUGSR_PRINTLN(F(I2S_MIC_CHANNEL_TEXT)); audioSource = new I2SSource(SAMPLE_RATE, BLOCK_SIZE); delay(100); if (audioSource) audioSource->initialize(i2swsPin, i2ssdPin, i2sckPin, mclkPin); break; +#endif case 5: DEBUGSR_PRINT(F("AR: I2S PDM Microphone - ")); DEBUGSR_PRINTLN(F(I2S_MIC_CHANNEL_TEXT)); audioSource = new I2SSource(SAMPLE_RATE, BLOCK_SIZE); delay(100); if (audioSource) audioSource->initialize(i2swsPin, i2ssdPin); break; +#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) + // ADC over I2S is only possible on "classic" ESP32 case 0: default: DEBUGSR_PRINTLN(F("AR: Analog Microphone (left channel only).")); @@ -954,6 +968,7 @@ class AudioReactive : public Usermod { delay(100); if (audioSource) audioSource->initialize(audioPin); break; +#endif } delay(250); // give microphone enough time to initialise @@ -1481,11 +1496,15 @@ class AudioReactive : public Usermod { void appendConfigData() { oappend(SET_F("dd=addDropdown('AudioReactive','digitalmic:type');")); +#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) oappend(SET_F("addOption(dd,'Generic Analog',0);")); +#endif oappend(SET_F("addOption(dd,'Generic I2S',1);")); oappend(SET_F("addOption(dd,'ES7243',2);")); +#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) oappend(SET_F("addOption(dd,'SPH0654',3);")); oappend(SET_F("addOption(dd,'Generic I2S with Mclk',4);")); +#endif oappend(SET_F("addOption(dd,'Generic I2S PDM',5);")); oappend(SET_F("dd=addDropdown('AudioReactive','cfg:AGC');")); oappend(SET_F("addOption(dd,'Off',0);")); diff --git a/usermods/audioreactive/audio_source.h b/usermods/audioreactive/audio_source.h index 090b46e6..b1bce2bf 100644 --- a/usermods/audioreactive/audio_source.h +++ b/usermods/audioreactive/audio_source.h @@ -13,6 +13,11 @@ //#include //#include +// see https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/chip-series-comparison.html#related-documents +// and https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-reference/peripherals/i2s.html#overview-of-all-modes +#if defined(CONFIG_IDF_TARGET_ESP32C2) || defined(CONFIG_IDF_TARGET_ESP32S2) + #error This audio reactive usermod does not support the ESP32-C2 or ESP32-S2, because the device has too limited I2S capabilities +#endif /* ToDo: remove. ES7243 is controlled via compiler defines Until this configuration is moved to the webinterface @@ -222,6 +227,9 @@ class I2SSource : public AudioSource { protected: void _routeMclk(int8_t mclkPin) { +#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) + // this way of MCLK routing only works on "classic" ESP32 + /* Enable the mclk routing depending on the selected mclk pin Only I2S_NUM_0 is supported */ @@ -235,6 +243,9 @@ class I2SSource : public AudioSource { PIN_FUNC_SELECT(PERIPHS_IO_MUX_U0RXD_U, FUNC_U0RXD_CLK_OUT2); WRITE_PERI_REG(PIN_CTRL, 0xFF00); } +#else +#warning FIX ME! +#endif } i2s_config_t _config; @@ -307,6 +318,9 @@ public: int8_t pin_ES7243_SCL; }; +#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) +// ADC over I2S is only availeable in "claasic" ESP32 + /* ADC over I2S Microphone This microphone is an ADC pin sampled via the I2S interval This allows to use the I2S API to obtain ADC samples with high sample rates @@ -489,6 +503,7 @@ class I2SAdcSource : public I2SSource { int8_t _audioPin; int8_t _myADCchannel = 0x0F; // current ADC channel for analog input. 0x0F means "undefined" }; +#endif /* SPH0645 Microphone This is an I2S microphone with some timing quirks that need @@ -502,7 +517,12 @@ class SPH0654 : public I2SSource { void initialize(uint8_t i2swsPin, uint8_t i2ssdPin, uint8_t i2sckPin, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE, int8_t = I2S_PIN_NO_CHANGE) { I2SSource::initialize(i2swsPin, i2ssdPin, i2sckPin); +#if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S3) +// these registers are only existing in "claasic" ESP32 REG_SET_BIT(I2S_TIMING_REG(I2S_NUM_0), BIT(9)); REG_SET_BIT(I2S_CONF_REG(I2S_NUM_0), I2S_RX_MSB_SHIFT); +#else + #warning FIX ME! Please. +#endif } }; diff --git a/usermods/customeffects/arti.h b/usermods/customeffects/arti.h index c7ccc3aa..c70aa86f 100644 --- a/usermods/customeffects/arti.h +++ b/usermods/customeffects/arti.h @@ -2450,7 +2450,7 @@ public: strcat(logFileName, ".log"); #if ARTI_PLATFORM == ARTI_ARDUINO - logFile = LITTLEFS.open(logFileName,"w"); + logFile = WLED_FS.open(logFileName,"w"); #else logFile = fopen (logFileName,"w"); #endif @@ -2463,7 +2463,7 @@ public: #if ARTI_PLATFORM == ARTI_ARDUINO File definitionFile; - definitionFile = LITTLEFS.open(definitionName, "r"); + definitionFile = WLED_FS.open(definitionName, "r"); #else std::fstream definitionFile; definitionFile.open(definitionName, std::ios::in); @@ -2517,7 +2517,7 @@ public: #if ARTI_PLATFORM == ARTI_ARDUINO File programFile; - programFile = LITTLEFS.open(programName, "r"); + programFile = WLED_FS.open(programName, "r"); #else std::fstream programFile; programFile.open(programName, std::ios::in); @@ -2564,7 +2564,7 @@ public: #ifdef ARTI_DEBUG // only read write file if debug is on #if ARTI_PLATFORM == ARTI_ARDUINO File parseTreeFile; - parseTreeFile = LITTLEFS.open(parseTreeName, loadParseTreeFile?"r":"w"); + parseTreeFile = WLED_FS.open(parseTreeName, loadParseTreeFile?"r":"w"); #else std::fstream parseTreeFile; parseTreeFile.open(parseTreeName, loadParseTreeFile?std::ios::in:std::ios::out); @@ -2711,7 +2711,7 @@ public: closeLog(); #if ARTI_PLATFORM == ARTI_ARDUINO - LITTLEFS.remove(logFileName); //cleanup the /edit folder a bit + WLED_FS.remove(logFileName); //cleanup the /edit folder a bit #endif } }; //ARTI \ No newline at end of file diff --git a/wled00/bus_wrapper.h b/wled00/bus_wrapper.h index e2783236..7a539c5c 100644 --- a/wled00/bus_wrapper.h +++ b/wled00/bus_wrapper.h @@ -113,6 +113,11 @@ #define B_8266_BB_TM2_4 NeoPixelBrightnessBus #endif +// dirty HACK +#if defined(WLED_NO_I2S1_BUS) && defined(WLED_NO_I2S0_BUS) && defined(CONFIG_IDF_TARGET_ESP32S3) +#define CONFIG_IDF_TARGET_ESP32C3 +#endif + /*** ESP32 Neopixel methods ***/ #ifdef ARDUINO_ARCH_ESP32 //RGB @@ -891,3 +896,8 @@ class PolyBus { }; #endif + +// dirty HACK +#if defined(WLED_NO_I2S1_BUS) && defined(WLED_NO_I2S0_BUS) && defined(CONFIG_IDF_TARGET_ESP32S3) +#undef CONFIG_IDF_TARGET_ESP32C3 +#endif