From 0e3006c46f0918b57865776cb9440d2f9f3eb30d Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 8 Jun 2021 20:31:01 +0200 Subject: [PATCH] Add preliminary support for Esp32C3 - RiscV based --- CHANGELOG.md | 1 + tasmota/support.ino | 19 ++++++++++ tasmota/support_command.ino | 3 ++ tasmota/support_tasmota.ino | 8 ++++ tasmota/tasmota_template.h | 70 +++++++++++++++++++++++++++++++++++ tasmota/xdrv_01_webserver.ino | 12 +++++- 6 files changed, 112 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c79f47664..fe282c6e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Allow longer MQTT response messages by removing fixed memory buffer with size 1040 to heap allocated buffer - Command ``Timers`` layout of JSON message changed to single line - Command ``Gpio`` layout of JSON message changed to single line +- Add preliminary support for Esp32C3 - RiscV based ## [9.4.0.4] ### Added diff --git a/tasmota/support.ino b/tasmota/support.ino index 170f7f819..d438bd6fc 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -985,6 +985,7 @@ String GetSerialConfig(void) { } uint32_t GetSerialBaudrate(void) { + // Serial.printf(">> GetSerialBaudrate baudrate = %d\n", Serial.baudRate()); return (Serial.baudRate() / 300) * 300; // Fix ESP32 strange results like 115201 } @@ -1018,7 +1019,9 @@ void SetSerialBaudrate(uint32_t baudrate) { TasmotaGlobal.baudrate = baudrate; Settings.baudrate = TasmotaGlobal.baudrate / 300; if (GetSerialBaudrate() != TasmotaGlobal.baudrate) { +#if defined(CONFIG_IDF_TARGET_ESP32C3) && !CONFIG_IDF_TARGET_ESP32C3 // crashes on ESP32C3 - TODO SetSerialBegin(); +#endif } } @@ -1574,8 +1577,11 @@ void TemplateGpios(myio *gp) uint32_t j = 0; for (uint32_t i = 0; i < nitems(Settings.user_template.gp.io); i++) { +#if defined(ESP32) && CONFIG_IDF_TARGET_ESP32C3 +#else if (6 == i) { j = 9; } if (8 == i) { j = 12; } +#endif dest[j] = src[i]; j++; } @@ -1628,7 +1634,20 @@ void SetModuleType(void) bool FlashPin(uint32_t pin) { +#if defined(ESP32) && CONFIG_IDF_TARGET_ESP32C3 + return (pin > 10) && (pin < 18); // ESP32C3 has GPIOs 11-17 reserved for Flash +#else // ESP32 and ESP8266 return (((pin > 5) && (pin < 9)) || (11 == pin)); +#endif +} + +bool RedPin(uint32_t pin) // pin may be dangerous to change, display in RED in template console +{ +#if defined(ESP32) && CONFIG_IDF_TARGET_ESP32C3 + return false; // no red pin on ESP32C3 +#else // ESP32 and ESP8266 + return (9==pin)||(10==pin); +#endif } uint32_t ValidPin(uint32_t pin, uint32_t gpio) { diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 9d7636e2c..53762ca1e 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -1404,8 +1404,11 @@ void CmndTemplate(void) SettingsUpdateText(SET_TEMPLATE_NAME, PSTR("Merged")); uint32_t j = 0; for (uint32_t i = 0; i < nitems(Settings.user_template.gp.io); i++) { +#if defined(ESP32) && CONFIG_IDF_TARGET_ESP32C3 +#else if (6 == i) { j = 9; } if (8 == i) { j = 12; } +#endif if (TasmotaGlobal.my_module.io[j] > GPIO_NONE) { Settings.user_template.gp.io[i] = TasmotaGlobal.my_module.io[j]; } diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index d48878b39..15e0f60e4 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1815,11 +1815,19 @@ void GpioInit(void) } // Set any non-used GPIO to INPUT - Related to resetPins() in support_legacy_cores.ino // Doing it here solves relay toggles at restart. +#if CONFIG_IDF_TARGET_ESP32C3 + else if (((i < 11) || (i > 17)) && (GPIO_NONE == mpin)) { // Skip SPI flash interface + if (!((20 == i) || (21 == i))) { // Skip serial + pinMode(i, INPUT); + } + } +#else // CONFIG_IDF_TARGET_ESP32C3 else if (((i < 6) || (i > 11)) && (GPIO_NONE == mpin)) { // Skip SPI flash interface if (!((1 == i) || (3 == i))) { // Skip serial pinMode(i, INPUT); } } +#endif // CONFIG_IDF_TARGET_ESP32C3 } // Digital input diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index ba5f18d61..b3cc2d0fc 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -977,6 +977,17 @@ typedef struct MYTMPLT8266 { #endif // ESP8266 #ifdef ESP32 +#if CONFIG_IDF_TARGET_ESP32C3 + +#define MAX_GPIO_PIN 22 // Number of supported GPIO +#define MIN_FLASH_PINS 0 // Number of flash chip pins unusable for configuration (GPIO6, 7, 8 and 11) +#define MAX_USER_PINS 22 // MAX_GPIO_PIN - MIN_FLASH_PINS +#define WEMOS_MODULE 0 // Wemos module + +// 0 1 2 3 4 5 6 7 8 9101112131415161718192021 +const char PINS_WEMOS[] PROGMEM = "AOAOAOAOAOAOIOIOIOIOIOFLFLFLFLFLFLFLIOIORXTX"; + +#else // v CONFIG_IDF_TARGET_ESP32C3 v #define MAX_GPIO_PIN 40 // Number of supported GPIO #define MIN_FLASH_PINS 4 // Number of flash chip pins unusable for configuration (GPIO6, 7, 8 and 11) @@ -986,6 +997,7 @@ typedef struct MYTMPLT8266 { // 0 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839 const char PINS_WEMOS[] PROGMEM = "IOTXIORXIOIOflashcFLFLolIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOAOAOIAIAIAIAIAIA"; +#endif // CONFIG_IDF_TARGET_ESP32C3 #endif // ESP32 //******************************************************************************************** @@ -2443,6 +2455,63 @@ const mytmplt8285 kModules8285[TMP_MAXMODULE_8266 - TMP_WEMOS] PROGMEM = { #endif // ESP8266 #ifdef ESP32 +#if CONFIG_IDF_TARGET_ESP32C3 +/********************************************************************************************\ + * ESP32 Module templates +\********************************************************************************************/ + +#define USER_MODULE 255 + +// Supported hardware modules +enum SupportedModules { + WEMOS, + MAXMODULE }; + +// Default module settings +const uint8_t kModuleNiceList[] PROGMEM = { + WEMOS, +}; + +// !!! Update this list in the same order as kModuleNiceList !!! +const char kModuleNames[] PROGMEM = + "ESP32C3|" + ; + +// !!! Update this list in the same order as SupportedModules !!! +const mytmplt kModules[] PROGMEM = { + { // Generic ESP32C3 device + AGPIO(GPIO_USER), // 0 IO GPIO0, ADC1_CH0, XTAL_32K_P + AGPIO(GPIO_USER), // 1 IO GPIO1, ADC1_CH1, XTAL_32K_N + AGPIO(GPIO_USER), // 2 IO GPIO2, ADC1_CH2, FSPIQ + AGPIO(GPIO_USER), // 3 IO GPIO3, ADC1_CH3 + AGPIO(GPIO_USER), // 4 IO GPIO4, ADC1_CH4, FSPIHD, MTMS + AGPIO(GPIO_USER), // 5 IO GPIO5, ADC2_CH0, FSPIWP, MTDI + AGPIO(GPIO_USER), // 6 IO GPIO6, FSPICLK, MTCK + AGPIO(GPIO_USER), // 7 IO GPIO7, FSPID, MTDO + AGPIO(GPIO_USER), // 8 IO GPIO8 + AGPIO(GPIO_USER), // 9 IO GPIO9 + AGPIO(GPIO_USER), // 10 IO GPIO10 + 0, // 11 IO GPIO11, output power supply for flash + 0, // 12 IO GPIO12, SPIHD + 0, // 13 IO GPIO13, SPIWP + 0, // 14 IO GPIO14, SPICS0 + 0, // 15 IO GPIO15, SPICLK + 0, // 16 IO GPIO16, SPID + 0, // 17 IO GPIO17, SPIQ + AGPIO(GPIO_USER), // 18 IO GPIO18, USB_D + AGPIO(GPIO_USER), // 19 IO GPIO19, USB_D+ + AGPIO(GPIO_USER), // 20 IO RXD0 GPIO20, U0RXD + AGPIO(GPIO_USER), // 21 IO TXD0 GPIO21, U0TXD + }, +}; + +/*********************************************************************************************\ + Known templates + + +\*********************************************************************************************/ + +#else // CONFIG_IDF_TARGET_ESP32C3 - now ESP32 /********************************************************************************************\ * ESP32 Module templates \********************************************************************************************/ @@ -2757,6 +2826,7 @@ const mytmplt kModules[] PROGMEM = { \*********************************************************************************************/ +#endif // CONFIG_IDF_TARGET_ESP32C3 #endif // ESP32 #endif // _TASMOTA_TEMPLATE_H_ diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 52f4cb72e..f9228171b 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -146,6 +146,15 @@ const char HTTP_MODULE_TEMPLATE_REPLACE_NO_INDEX[] PROGMEM = #include "./html_uncompressed/HTTP_SCRIPT_TEMPLATE.h" #endif +#if defined(ESP32) && CONFIG_IDF_TARGET_ESP32C3 +const char HTTP_SCRIPT_TEMPLATE2[] PROGMEM = + "j=0;" + "for(i=0;i<" STR(MAX_USER_PINS) ";i++){" // Skip GPIO 11-17 + "if(11==i){j=18;}" + "sk(g[i],j);" // Set GPIO + "j++;" + "}"; +#else // Now ESP32 and ESP8266 const char HTTP_SCRIPT_TEMPLATE2[] PROGMEM = "j=0;" "for(i=0;i<" STR(MAX_USER_PINS) ";i++){" // Supports 13 GPIOs @@ -154,6 +163,7 @@ const char HTTP_SCRIPT_TEMPLATE2[] PROGMEM = "sk(g[i],j);" // Set GPIO "j++;" "}"; +#endif const char HTTP_SCRIPT_TEMPLATE3[] PROGMEM = "\";" "sk(g[13]," STR(ADC0_PIN) ");"; // Set ADC0 @@ -1583,7 +1593,7 @@ void HandleTemplateConfiguration(void) { for (uint32_t i = 0; i < MAX_GPIO_PIN; i++) { if (!FlashPin(i)) { WSContentSend_P(PSTR("" D_GPIO "%d"), - ((9==i)||(10==i)) ? WebColor(COL_TEXT_WARNING) : WebColor(COL_TEXT), i, (0==i) ? PSTR(" style='width:146px'") : "", i, i); + RedPin(i) ? WebColor(COL_TEXT_WARNING) : WebColor(COL_TEXT), i, (0==i) ? PSTR(" style='width:146px'") : "", i, i); WSContentSend_P(PSTR(""), i); } }