diff --git a/boards/esp32p4_ev.json b/boards/esp32p4_ev.json new file mode 100644 index 000000000..2e8337b05 --- /dev/null +++ b/boards/esp32p4_ev.json @@ -0,0 +1,46 @@ +{ + "build": { + "core": "esp32", + "extra_flags": [ + "-DARDUINO_TASMOTA -DESP32P4 -DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DUSE_USB_CDC_CONSOLE" + ], + "f_cpu": "360000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "mcu": "esp32p4", + "variant": "esp32p4", + "partitions": "partitions/esp32_partition_app3904k_fs3392k.csv" + }, + "connectivity": [ + "wifi", + "bluetooth", + "openthread", + "ethernet" + ], + "debug": { + "openocd_target": "esp32p4.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Espressif ESP32-P4 Function EV Board", + "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x10000", + "tasmota32p4-safeboot.bin" + ] + ] + }, + "flash_size": "16MB", + "maximum_ram_size": 768000, + "maximum_size": 16777216, + "require_upload_port": true, + "speed": 1500000 + }, + "url": "https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32p4/esp32-p4-function-ev-board/index.html", + "vendor": "Espressif" +} + diff --git a/include/esp32x_fixes.h b/include/esp32x_fixes.h index 7713a6e05..675a480ef 100644 --- a/include/esp32x_fixes.h +++ b/include/esp32x_fixes.h @@ -61,7 +61,7 @@ // SPI_MOSI_DLEN_REG is not defined anymore in esp32s3 #define SPI_MOSI_DLEN_REG(x) SPI_MS_DLEN_REG(x) -#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 +#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32P4 #define SPI_HOST SPI1_HOST #define HSPI_HOST SPI2_HOST #define VSPI_HOST SPI2_HOST /* No SPI3_host on C2/C6 */ diff --git a/lib/default/WiFiHelper/src/WiFiHelper_ESP32.cpp b/lib/default/WiFiHelper/src/WiFiHelper_ESP32.cpp index 4dcd4fd88..8c66211d6 100644 --- a/lib/default/WiFiHelper/src/WiFiHelper_ESP32.cpp +++ b/lib/default/WiFiHelper/src/WiFiHelper_ESP32.cpp @@ -166,6 +166,10 @@ int WiFiHelper::getPhyMode() { WIFI_PHY_MODE_HE20, // PHY mode for Bandwidth HE20 (11ax) } wifi_phy_mode_t; */ + #ifndef SOC_WIFI_SUPPORTED + // ESP32-P4 does not support PHY modes, return 0 + return 0; +#else int phy_mode = 0; // "low rate|11b|11g|HT20|HT40|HE20" wifi_phy_mode_t WiFiMode; if (esp_wifi_sta_get_negotiated_phymode(&WiFiMode) == ESP_OK) { @@ -175,9 +179,13 @@ int WiFiHelper::getPhyMode() { } } return phy_mode; +# endif } bool WiFiHelper::setPhyMode(WiFiPhyMode_t mode) { +# ifndef SOC_WIFI_SUPPORTED + return false; // ESP32-P4 does not support PHY modes +# else uint8_t protocol_bitmap = WIFI_PROTOCOL_11B; // 1 switch (mode) { #if ESP_IDF_VERSION_MAJOR >= 5 @@ -187,6 +195,7 @@ bool WiFiHelper::setPhyMode(WiFiPhyMode_t mode) { case 2: protocol_bitmap |= WIFI_PROTOCOL_11G; // 2 } return (ESP_OK == esp_wifi_set_protocol(WIFI_IF_STA, protocol_bitmap)); +#endif // CONFIG_IDF_TARGET_ESP32P4 } void WiFiHelper::setOutputPower(int n) { @@ -370,8 +379,11 @@ String WiFiHelper::macAddress(void) { #else uint8_t mac[6] = {0,0,0,0,0,0}; char macStr[18] = { 0 }; - +#ifdef CONFIG_SOC_HAS_WIFI esp_read_mac(mac, ESP_MAC_WIFI_STA); +#else + esp_read_mac(mac, ESP_MAC_BASE); +#endif // CONFIG_SOC_HAS_WIFI snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); return String(macStr); #endif diff --git a/lib/lib_basic/TasmotaOneWire-2.3.3/OneWire.cpp b/lib/lib_basic/TasmotaOneWire-2.3.3/OneWire.cpp index 2ef1a3102..d44584540 100644 --- a/lib/lib_basic/TasmotaOneWire-2.3.3/OneWire.cpp +++ b/lib/lib_basic/TasmotaOneWire-2.3.3/OneWire.cpp @@ -235,7 +235,7 @@ bool directRead(IO_REG_TYPE mask) static inline __attribute__((always_inline)) IO_REG_TYPE directRead(IO_REG_TYPE pin) { -#if SOC_GPIO_PIN_COUNT <= 32 +#if SOC_GPIO_PIN_COUNT <= 32 || CONFIG_IDF_TARGET_ESP32P4 return (GPIO.in.val >> pin) & 0x1; #else // ESP32 with over 32 gpios if ( pin < 32 ) @@ -250,7 +250,7 @@ IO_REG_TYPE directRead(IO_REG_TYPE pin) static inline __attribute__((always_inline)) void directWriteLow(IO_REG_TYPE pin) { -#if SOC_GPIO_PIN_COUNT <= 32 +#if SOC_GPIO_PIN_COUNT <= 32 || CONFIG_IDF_TARGET_ESP32P4 GPIO.out_w1tc.val = ((uint32_t)1 << pin); #else // ESP32 with over 32 gpios if ( pin < 32 ) @@ -263,7 +263,7 @@ void directWriteLow(IO_REG_TYPE pin) static inline __attribute__((always_inline)) void directWriteHigh(IO_REG_TYPE pin) { -#if SOC_GPIO_PIN_COUNT <= 32 +#if SOC_GPIO_PIN_COUNT <= 32 || CONFIG_IDF_TARGET_ESP32P4 GPIO.out_w1ts.val = ((uint32_t)1 << pin); #else // ESP32 with over 32 gpios if ( pin < 32 ) @@ -280,7 +280,7 @@ void directModeInput(IO_REG_TYPE pin) if ( digitalPinIsValid(pin) ) { // Input -#if SOC_GPIO_PIN_COUNT <= 32 +#if SOC_GPIO_PIN_COUNT <= 32 || CONFIG_IDF_TARGET_ESP32P4 GPIO.enable_w1tc.val = ((uint32_t)1 << (pin)); #else // ESP32 with over 32 gpios if ( pin < 32 ) @@ -298,7 +298,7 @@ void directModeOutput(IO_REG_TYPE pin) if ( digitalPinCanOutput(pin) ) { // Output -#if SOC_GPIO_PIN_COUNT <= 32 +#if SOC_GPIO_PIN_COUNT <= 32 || CONFIG_IDF_TARGET_ESP32P4 GPIO.enable_w1ts.val = ((uint32_t)1 << (pin)); #else // ESP32 with over 32 gpios if ( pin < 32 ) diff --git a/lib/lib_display/UDisplay/uDisplay.h b/lib/lib_display/UDisplay/uDisplay.h index 64afbaebd..dad98b49f 100755 --- a/lib/lib_display/UDisplay/uDisplay.h +++ b/lib/lib_display/UDisplay/uDisplay.h @@ -112,7 +112,7 @@ enum uColorType { uCOLOR_BW, uCOLOR_COLOR }; #undef GPIO_SET_SLOW #undef GPIO_CLR_SLOW -#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 +#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32P4 #define GPIO_CLR(A) GPIO.out_w1tc.val = (1 << A) #define GPIO_SET(A) GPIO.out_w1ts.val = (1 << A) #else // plain ESP32 diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index afbf82f92..189e805bc 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -160,6 +160,16 @@ build_flags = ${env:tasmota32_base.build_flags} lib_extra_dirs = lib/lib_ssl, lib/libesp32 lib_ignore = ${safeboot_flags.lib_ignore} +[env:tasmota32p4-safeboot] +extends = env:tasmota32_base +board = esp32p4_ev +board_build.app_partition_name = safeboot +build_flags = ${env:tasmota32_base.build_flags} + -DFIRMWARE_SAFEBOOT + -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32p4-safeboot.bin"' +lib_extra_dirs = lib/lib_ssl, lib/libesp32 +lib_ignore = ${safeboot_flags.lib_ignore} + [env:tasmota32] extends = env:tasmota32_base build_flags = ${env:tasmota32_base.build_flags} @@ -234,6 +244,15 @@ build_flags = ${env:tasmota32_base.build_flags} lib_ignore = ${env:tasmota32_base.lib_ignore} Micro-RTSP +[env:tasmota32p4] +extends = env:tasmota32_base +board = esp32p4_ev +build_flags = ${env:tasmota32_base.build_flags} + -DFIRMWARE_TASMOTA32 + -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32p4.bin"' +lib_ignore = ${env:tasmota32_base.lib_ignore} + Micro-RTSP + [env:tasmota32s3] extends = env:tasmota32_base board = esp32s3-qio_qspi diff --git a/tasmota/include/tasmota_template.h b/tasmota/include/tasmota_template.h index 5bd6f9667..2532eebb1 100644 --- a/tasmota/include/tasmota_template.h +++ b/tasmota/include/tasmota_template.h @@ -1454,6 +1454,20 @@ const char PINS_WEMOS[] PROGMEM = "IOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOIO- // 0 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748 const char PINS_WEMOS[] PROGMEM = "IOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOIO--------FLFLFLFLFLFLFLIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIO"; +#elif CONFIG_IDF_TARGET_ESP32P4 +/* **************************************** + * ESP32P4 + * GPIOs 0..54 + * - 34..38 strapping pins + * ****************************************/ +#define MAX_GPIO_PIN 55 // Number of supported GPIO, 0..55 +#define MIN_FLASH_PINS 00 // Number of flash chip pins unusable for configuration (22-25 don't exist, 26-32 for SPI) +#define MAX_USER_PINS 55 // MAX_GPIO_PIN - MIN_FLASH_PINS +#define WEMOS_MODULE 0 // Wemos module + +// 0 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 +const char PINS_WEMOS[] PROGMEM = "IOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOAOAOAOAOAOAOAOAOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOAOAOAOAOAOAO"; + #else // not CONFIG_IDF_TARGET_ESP32C2/C3/C6 nor CONFIG_IDF_TARGET_ESP32S2 - ESP32 /* **************************************** @@ -1485,7 +1499,7 @@ const char PINS_WEMOS[] PROGMEM = "IOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOIO- // 0 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839 const char PINS_WEMOS[] PROGMEM = "IOTXIORXIOIOFLFLFLFLFLFLIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIO--------AOAOIAIAIAIAIAIA"; -#endif // ESP32/S2/C2/C3/C6 selection +#endif // ESP32/S2/C2/C3/C6/P4 selection #endif // ESP32 /********************************************************************************************\ @@ -3114,6 +3128,95 @@ const mytmplt kModules[] PROGMEM = { }, }; +/*********************************************************************************************\ + Known templates +\*********************************************************************************************/ +#elif CONFIG_IDF_TARGET_ESP32P4 +/********************************************************************************************\ + * ESP32-P4 Module templates +\********************************************************************************************/ + +#define USER_MODULE 255 + +#define WT32_ETH01 4 //TODO: Why needed? + +// Supported hardware modules +enum SupportedModulesESP32P4 { + WEMOS, // not really correct, a placeholder for now + MAXMODULE }; + +// Default module settings +const uint8_t kModuleNiceList[] PROGMEM = { + WEMOS, +}; + +// !!! Update this list in the same order as kModuleNiceList !!! +const char kModuleNames[] PROGMEM = + "ESP32P4|" + ; + +// !!! Update this list in the same order as SupportedModulesESP32P4 !!! +const mytmplt kModules[] PROGMEM = { + { // Generic ESP32P4 device + AGPIO(GPIO_USER), // 0 IO GPIO0, LP_GPIO0 + AGPIO(GPIO_USER), // 1 IO GPIO1, LP_GPIO1 + AGPIO(GPIO_USER), // 2 IO GPIO2, TOUCH0, LP_GPIO2 + AGPIO(GPIO_USER), // 3 IO GPIO3, TOUCH1, LP_GPIO3 + AGPIO(GPIO_USER), // 4 IO GPIO4, TOUCH2, LP_GPIO4 + AGPIO(GPIO_USER), // 5 IO GPIO5, TOUCH3, LP_GPIO5 + AGPIO(GPIO_USER), // 6 IO GPIO6, TOUCH4, LP_GPIO6 + AGPIO(GPIO_USER), // 7 IO GPIO7, TOUCH5, LP_GPIO7 + AGPIO(GPIO_USER), // 8 IO GPIO8, TOUCH6, LP_GPIO8 + AGPIO(GPIO_USER), // 9 IO GPIO9, TOUCH7, LP_GPIO9 + AGPIO(GPIO_USER), // 10 IO GPIO10, TOUCH8, LP_GPIO10 + AGPIO(GPIO_USER), // 11 IO GPIO11, TOUCH9, LP_GPIO11 + AGPIO(GPIO_USER), // 12 IO GPIO12, TOUCH10, LP_GPIO12 + AGPIO(GPIO_USER), // 13 IO GPIO13, TOUCH11, LP_GPIO13 + AGPIO(GPIO_USER), // 14 IO GPIO14, TOUCH12, LP_GPIO14 + AGPIO(GPIO_USER), // 15 IO GPIO15, TOUCH13, LP_GPIO15 + AGPIO(GPIO_USER), // 16 IO GPIO16, ADC1_CH0 + AGPIO(GPIO_USER), // 17 IO GPIO17, ADC1_CH1 + AGPIO(GPIO_USER), // 18 IO GPIO18, ADC1_CH2 + AGPIO(GPIO_USER), // 19 IO GPIO19, ADC1_CH3 + AGPIO(GPIO_USER), // 20 IO GPIO20, ADC1_CH4 + AGPIO(GPIO_USER), // 21 IO GPIO21, ADC1_CH5 + AGPIO(GPIO_USER), // 22 IO GPIO22, ADC1_CH6 + AGPIO(GPIO_USER), // 23 IO GPIO23, ADC1_CH7 + AGPIO(GPIO_USER), // 24 IO GPIO24 + AGPIO(GPIO_USER), // 25 IO GPIO25 + AGPIO(GPIO_USER), // 26 IO GPIO26 + AGPIO(GPIO_USER), // 27 IO GPIO27 + AGPIO(GPIO_USER), // 28 IO GPIO28 + AGPIO(GPIO_USER), // 29 IO GPIO29 + AGPIO(GPIO_USER), // 30 IO GPIO30 + AGPIO(GPIO_USER), // 31 IO GPIO31 + AGPIO(GPIO_USER), // 32 IO GPIO32 + AGPIO(GPIO_USER), // 33 IO GPIO33 + AGPIO(GPIO_USER), // 34 IO GPIO34, Strapping pin + AGPIO(GPIO_USER), // 35 IO GPIO35, Strapping pin + AGPIO(GPIO_USER), // 36 IO GPIO36, Strapping pin + AGPIO(GPIO_USER), // 37 IO GPIO37, Strapping pin + AGPIO(GPIO_USER), // 38 IO GPIO38, Strapping pin + AGPIO(GPIO_USER), // 39 IO GPIO39 + AGPIO(GPIO_USER), // 40 IO GPIO40 + AGPIO(GPIO_USER), // 41 IO GPIO41 + AGPIO(GPIO_USER), // 42 IO GPIO42 + AGPIO(GPIO_USER), // 43 IO GPIO43 + AGPIO(GPIO_USER), // 44 IO GPIO44 + AGPIO(GPIO_USER), // 45 IO GPIO45 + AGPIO(GPIO_USER), // 46 IO GPIO46 + AGPIO(GPIO_USER), // 47 IO GPIO47 + AGPIO(GPIO_USER), // 48 IO GPIO48 + AGPIO(GPIO_USER), // 49 IO GPIO49, ADC1_CH8 + AGPIO(GPIO_USER), // 50 IO GPIO50, ADC1_CH9 + AGPIO(GPIO_USER), // 51 IO GPIO51, ADC1_CH10, ANA_CMPR_CH0 reference voltage + AGPIO(GPIO_USER), // 52 IO GPIO52, ADC1_CH11, ANA_CMPR_CH0 input (non-inverting) + AGPIO(GPIO_USER), // 53 IO GPIO53, ADC1_CH12, ANA_CMPR_CH1 reference voltage + AGPIO(GPIO_USER), // 54 IO GPIO54, ADC1_CH13, ANA_CMPR_CH1 input (non-inverting) + 0 // Flag + }, +}; + /*********************************************************************************************\ Known templates \*********************************************************************************************/ diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 586612497..c3c464c86 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -212,7 +212,7 @@ WiFiUDP PortUdp; // UDP Syslog and Alexa CONFIG_IDF_TARGET_ESP32S2 || // support USB via USBCDC CONFIG_IDF_TARGET_ESP32S3 // support USB via HWCDC using JTAG interface or USBCDC */ -#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 +#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4 //#if CONFIG_TINYUSB_CDC_ENABLED // This define is not recognized here so use USE_USB_CDC_CONSOLE #ifdef USE_USB_CDC_CONSOLE @@ -493,7 +493,7 @@ void setup(void) { } #ifdef ESP32 -#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 +#if CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32P4 #ifdef USE_USB_CDC_CONSOLE bool is_connected_to_USB = false; diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index 3c2b7c36c..0118f67b9 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -1714,7 +1714,7 @@ void TemplateGpios(myio *gp) j++; #endif // ESP8266 #ifdef ESP32 -#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 +#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32P4 dest[i] = src[i]; #elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 if (22 == i) { j = 33; } // skip 22-32 @@ -1790,6 +1790,8 @@ bool FlashPin(uint32_t pin) { return ((pin == 24) || (pin == 25) || (pin == 27) || (pin == 29) || (pin == 30)); // ESP32C6 has GPIOs 24-30 reserved for Flash, with some boards GPIOs 26 28 are useable #elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 return (pin > 21) && (pin < 33); // ESP32S2 skip 22-32 +#elif CONFIG_IDF_TARGET_ESP32P4 + return false; // ESP32P4 has no flash pins, but GPIOs 34-38 are strapping pins #else return (pin >= 28) && (pin <= 31); // ESP32 skip 28-31 #endif // ESP32C2/C3/C6 and S2/S3 @@ -1809,6 +1811,8 @@ bool RedPin(uint32_t pin) { // Pin may be dangerous to change, displa return (26 == pin) || (28 == pin); // ESP32C6: GPIOs 26 28 are usually used for Flash (mode QIO/QOUT) #elif CONFIG_IDF_TARGET_ESP32S2 return false; // No red pin on ESP32S3 +#elif CONFIG_IDF_TARGET_ESP32P4 + return (34 >= pin) && (38 <= pin); // strapping pins on ESP32P4 #elif CONFIG_IDF_TARGET_ESP32S3 return (33 <= pin) && (37 >= pin); // ESP32S3: GPIOs 33..37 are usually used for PSRAM #else // ESP32 red pins are 6-11 for original ESP32, other models like PICO are not impacted if flash pins are condfigured diff --git a/tasmota/tasmota_support/support_crash_recorder.ino b/tasmota/tasmota_support/support_crash_recorder.ino index ab894e1ee..0723edff4 100644 --- a/tasmota/tasmota_support/support_crash_recorder.ino +++ b/tasmota/tasmota_support/support_crash_recorder.ino @@ -261,7 +261,7 @@ void CrashDump(void) } ResponseJsonEnd(); } -#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 +#elif CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32P4 extern "C" { // esp-idf 3.x diff --git a/tasmota/tasmota_support/support_esp32.ino b/tasmota/tasmota_support/support_esp32.ino index 3ce402119..9adf361a5 100644 --- a/tasmota/tasmota_support/support_esp32.ino +++ b/tasmota/tasmota_support/support_esp32.ino @@ -35,6 +35,8 @@ const static char kWifiPhyMode[] PROGMEM = "low rate|11b|11g|HT20|HT40|HE20"; // #define ESP32_ARCH "esp32c6" #elif CONFIG_IDF_TARGET_ESP32H2 #define ESP32_ARCH "esp32h2" +#elif CONFIG_IDF_TARGET_ESP32P4 + #define ESP32_ARCH "esp32p4" #else #define ESP32_ARCH "" #endif @@ -55,6 +57,8 @@ const static char kWifiPhyMode[] PROGMEM = "low rate|11b|11g|HT20|HT40|HE20"; // #include "esp32c6/rom/rtc.h" #elif CONFIG_IDF_TARGET_ESP32H2 // ESP32-H2 #include "esp32h2/rom/rtc.h" +#elif CONFIG_IDF_TARGET_ESP32P4 // ESP32-P4 + #include "esp32p4/rom/rtc.h" #else #error Target CONFIG_IDF_TARGET is not supported #endif @@ -64,7 +68,9 @@ size_t getArduinoLoopTaskStackSize(void) { return SET_ESP32_STACK_SIZE; } +#ifndef CONFIG_IDF_TARGET_ESP32P4 #include +#endif // Handle 20k of NVM @@ -139,9 +145,11 @@ void SettingsErase(uint8_t type) { break; case 1: // Reset 3 = SDK parameter area case 4: // WIFI_FORCE_RF_CAL_ERASE = SDK parameter area +#ifdef SOC_SUPPORTS_WIFI r1 = esp_phy_erase_cal_data_in_nvs(); // r1 = NvmErase("cal_data"); AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_ERASE " PHY data (%d)"), r1); +#endif //SOC_SUPPORTS_WIFI break; case 3: // QPC Reached = QPC, Tasmota and SDK parameter area (0x0F3xxx - 0x0FFFFF) // nvs_flash_erase(); // Erase RTC, PHY, sta.mac, ap.sndchan, ap.mac, Tasmota etc. @@ -246,6 +254,9 @@ extern "C" { #elif CONFIG_IDF_TARGET_ESP32H2 // ESP32-H2 #include "esp32h2/rom/spi_flash.h" #define ESP_FLASH_IMAGE_BASE 0x0000 // Esp32h2 is located at 0x0000 +#elif CONFIG_IDF_TARGET_ESP32P4 // ESP32-P4 + #include "esp32p4/rom/spi_flash.h" + #define ESP_FLASH_IMAGE_BASE 0x2000 // Esp32p4 is located at 0x2000 #else #error Target CONFIG_IDF_TARGET is not supported #endif @@ -587,6 +598,8 @@ extern "C" { bool FoundPSRAM(void) { #if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || DISABLE_PSRAMCHECK || CORE32SOLO1 return psramFound(); +#elif CONFIG_IDF_TARGET_ESP32P4 + return ESP.getPsramSize() > 0; #else return psramFound() && esp_psram_is_initialized(); #endif @@ -903,11 +916,6 @@ typedef struct { return F("ESP32-H2"); } case 18: { // ESP32-P4 -#ifdef CONFIG_IDF_TARGET_ESP32P4 - switch (pkg_version) { - case 0: return F("ESP32-P4"); - } -#endif // CONFIG_IDF_TARGET_ESP32P4 return F("ESP32-P4"); } } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index 38da52601..ba05d0e59 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -154,7 +154,7 @@ const char HTTP_SCRIPT_TEMPLATE2[] PROGMEM = "}"; #endif // ESP8266 #ifdef ESP32 -#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 +#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32P4 const char HTTP_SCRIPT_TEMPLATE2[] PROGMEM = "for(i=0;i<" STR(MAX_USER_PINS) ";i++){" "sk(g[i],i);" // Set GPIO @@ -2178,7 +2178,7 @@ void HandleTemplateConfiguration(void) { WSContentBegin(200, CT_PLAIN); WSContentSend_P(PSTR("%s}1"), AnyModuleName(module).c_str()); // NAME: Generic for (uint32_t i = 0; i < nitems(template_gp.io); i++) { // 17,148,29,149,7,255,255,255,138,255,139,255,255 -#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 +#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32C6 // ESP32C2/C3/C6 we always send all GPIOs, Flash are just hidden WSContentSend_P(PSTR("%s%d"), (i>0)?",":"", template_gp.io[i]); #else @@ -2226,7 +2226,7 @@ void HandleTemplateConfiguration(void) { "
")); WSContentSend_P(HTTP_TABLE100); // "" for (uint32_t i = 0; i < MAX_GPIO_PIN; i++) { -#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 +#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 // ESP32C2/C3/C6 all gpios are in the template, flash are hidden bool hidden = FlashPin(i); WSContentSend_P(PSTR(""), @@ -2304,7 +2304,7 @@ void TemplateSaveSettings(void) { j++; #endif // ESP8266 #ifdef ESP32 -#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 +#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || CONFIG_IDF_TARGET_ESP32P4 snprintf_P(command, sizeof(command), PSTR("%s%s%d"), command, (i>0)?",":"", WebGetGpioArg(i)); #elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 if (22 == i) { j = 33; } // skip 22-32 diff --git a/tasmota/tasmota_xdrv_driver/xdrv_121_gpioviewer.ino b/tasmota/tasmota_xdrv_driver/xdrv_121_gpioviewer.ino index b3280ba38..457dd3c1b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_121_gpioviewer.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_121_gpioviewer.ino @@ -346,9 +346,10 @@ void GVHandleEspInfo(void) { jsonResponse += "\",\"cycle_count\":" + String(ESP.getCycleCount()); jsonResponse += ",\"mac\":\"" + ESP_getEfuseMac(); +#ifndef CONFIG_IDF_TARGET_ESP32P4 const FlashMode_t flashMode = ESP.getFlashChipMode(); // enum jsonResponse += "\",\"flash_mode\":" + String(flashMode); - +#endif // CONFIG_IDF_TARGET_ESP32P4 #ifdef ESP8266 jsonResponse += ",\"flash_chip_size\":" + String(ESP.getFlashChipRealSize()); #else // ESP32 diff --git a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio_idf51.ino b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio_idf51.ino index 20b328d53..37a337972 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio_idf51.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_42_0_i2s_audio_idf51.ino @@ -597,6 +597,7 @@ void I2sInit(void) { bool init_tx_ok = false; bool init_rx_ok = false; + exclusive = true; //TODO: try fix full dupleyx mode if (tx && rx && exclusive) { i2s->setExclusive(true); audio_i2s.Settings->sys.exclusive = exclusive; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_wire.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_wire.ino index 5f5c8c77c..8a5b1b9e0 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_wire.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_wire.ino @@ -24,7 +24,40 @@ #include #include -#include +// #include + +#ifndef __bswap_16 +#ifdef __GNUC__ +# define __bswap_16(x) \ + (__extension__ \ + ({ unsigned short int __bsx = (x); \ + ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)); })) +#else +static INLINE unsigned short int +__bswap_16 (unsigned short int __bsx) +{ + return ((((__bsx) >> 8) & 0xff) | (((__bsx) & 0xff) << 8)); +} +#endif +#endif // __bswap_16 + +/* Swap bytes in 32 bit value. */ +#ifndef __bswap_32 +#ifdef __GNUC__ +# define __bswap_32(x) \ + (__extension__ \ + ({ unsigned int __bsx = (x); \ + ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | \ + (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); })) +#else +static INLINE unsigned int +__bswap_32 (unsigned int __bsx) +{ + return ((((__bsx) & 0xff000000) >> 24) | (((__bsx) & 0x00ff0000) >> 8) | + (((__bsx) & 0x0000ff00) << 8) | (((__bsx) & 0x000000ff) << 24)); +} +#endif +#endif // __bswap_32 // read the `bus` attribute and return `Wire` or `Wire1` // Can return nullptr reference if the bus is not initialized diff --git a/tasmota/tasmota_xdrv_driver/xdrv_82_esp32_ethernet.ino b/tasmota/tasmota_xdrv_driver/xdrv_82_esp32_ethernet.ino index 5fb4712c5..b4ec8914b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_82_esp32_ethernet.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_82_esp32_ethernet.ino @@ -273,7 +273,11 @@ void EthernetInit(void) { bool init_ok = false; if (!eth_uses_spi) { #if CONFIG_ETH_USE_ESP32_EMAC - init_ok = (ETH.begin((eth_phy_type_t)eth_type, Settings->eth_address, eth_mdc, eth_mdio, eth_power, (eth_clock_mode_t)Settings->eth_clk_mode)); + #ifdef CONFIG_IDF_TARGET_ESP32P4 + init_ok = (ETH.begin((eth_phy_type_t)eth_type, Settings->eth_address, eth_mdc, eth_mdio, eth_power, EMAC_CLK_EXT_IN)); + #else + init_ok = (ETH.begin((eth_phy_type_t)eth_type, Settings->eth_address, eth_mdc, eth_mdio, eth_power, (eth_clock_mode_t)Settings->eth_clk_mode)); + #endif //CONFIG_IDF_TARGET_ESP32P4 #endif // CONFIG_ETH_USE_ESP32_EMAC } else { // ETH_SPI_SUPPORTS_CUSTOM @@ -282,7 +286,7 @@ void EthernetInit(void) { init_ok = (ETH.begin((eth_phy_type_t)eth_type, Settings->eth_address, eth_mdc, eth_mdio, eth_power, SPI, ETH_PHY_SPI_FREQ_MHZ)); } if (!init_ok) { - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ETH "Bad EthType or init error")); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ETH "Bad EthType %i or init error"),eth_type); return; }; @@ -377,7 +381,7 @@ void CmndEthernet(void) { } void CmndEthAddress(void) { - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 31)) { + if ((XdrvMailbox.payload >= -1) && (XdrvMailbox.payload <= 31)) { Settings->eth_address = XdrvMailbox.payload; TasmotaGlobal.restart_flag = 2; }
" D_GPIO "%d