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
This commit is contained in:
Frank
2022-09-02 21:29:05 +02:00
parent 66d3802f0f
commit 4162d8fdfa
5 changed files with 112 additions and 12 deletions

View File

@@ -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);"));

View File

@@ -13,6 +13,11 @@
//#include <driver/i2s_pdm.h>
//#include <driver/gpio.h>
// 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
}
};

View File

@@ -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