basic P4 support (#23663)

This commit is contained in:
Jason2866 2025-07-10 16:47:30 +02:00 committed by GitHub
parent c909e20fb1
commit 9e25fc0f30
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
16 changed files with 258 additions and 27 deletions

46
boards/esp32p4_ev.json Normal file
View File

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

View File

@ -61,7 +61,7 @@
// SPI_MOSI_DLEN_REG is not defined anymore in esp32s3 // SPI_MOSI_DLEN_REG is not defined anymore in esp32s3
#define SPI_MOSI_DLEN_REG(x) SPI_MS_DLEN_REG(x) #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 SPI_HOST SPI1_HOST
#define HSPI_HOST SPI2_HOST #define HSPI_HOST SPI2_HOST
#define VSPI_HOST SPI2_HOST /* No SPI3_host on C2/C6 */ #define VSPI_HOST SPI2_HOST /* No SPI3_host on C2/C6 */

View File

@ -166,6 +166,10 @@ int WiFiHelper::getPhyMode() {
WIFI_PHY_MODE_HE20, // PHY mode for Bandwidth HE20 (11ax) WIFI_PHY_MODE_HE20, // PHY mode for Bandwidth HE20 (11ax)
} wifi_phy_mode_t; } 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" int phy_mode = 0; // "low rate|11b|11g|HT20|HT40|HE20"
wifi_phy_mode_t WiFiMode; wifi_phy_mode_t WiFiMode;
if (esp_wifi_sta_get_negotiated_phymode(&WiFiMode) == ESP_OK) { if (esp_wifi_sta_get_negotiated_phymode(&WiFiMode) == ESP_OK) {
@ -175,9 +179,13 @@ int WiFiHelper::getPhyMode() {
} }
} }
return phy_mode; return phy_mode;
# endif
} }
bool WiFiHelper::setPhyMode(WiFiPhyMode_t mode) { 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 uint8_t protocol_bitmap = WIFI_PROTOCOL_11B; // 1
switch (mode) { switch (mode) {
#if ESP_IDF_VERSION_MAJOR >= 5 #if ESP_IDF_VERSION_MAJOR >= 5
@ -187,6 +195,7 @@ bool WiFiHelper::setPhyMode(WiFiPhyMode_t mode) {
case 2: protocol_bitmap |= WIFI_PROTOCOL_11G; // 2 case 2: protocol_bitmap |= WIFI_PROTOCOL_11G; // 2
} }
return (ESP_OK == esp_wifi_set_protocol(WIFI_IF_STA, protocol_bitmap)); return (ESP_OK == esp_wifi_set_protocol(WIFI_IF_STA, protocol_bitmap));
#endif // CONFIG_IDF_TARGET_ESP32P4
} }
void WiFiHelper::setOutputPower(int n) { void WiFiHelper::setOutputPower(int n) {
@ -370,8 +379,11 @@ String WiFiHelper::macAddress(void) {
#else #else
uint8_t mac[6] = {0,0,0,0,0,0}; uint8_t mac[6] = {0,0,0,0,0,0};
char macStr[18] = { 0 }; char macStr[18] = { 0 };
#ifdef CONFIG_SOC_HAS_WIFI
esp_read_mac(mac, ESP_MAC_WIFI_STA); 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]); 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); return String(macStr);
#endif #endif

View File

@ -235,7 +235,7 @@ bool directRead(IO_REG_TYPE mask)
static inline __attribute__((always_inline)) static inline __attribute__((always_inline))
IO_REG_TYPE directRead(IO_REG_TYPE pin) 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; return (GPIO.in.val >> pin) & 0x1;
#else // ESP32 with over 32 gpios #else // ESP32 with over 32 gpios
if ( pin < 32 ) if ( pin < 32 )
@ -250,7 +250,7 @@ IO_REG_TYPE directRead(IO_REG_TYPE pin)
static inline __attribute__((always_inline)) static inline __attribute__((always_inline))
void directWriteLow(IO_REG_TYPE pin) 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); GPIO.out_w1tc.val = ((uint32_t)1 << pin);
#else // ESP32 with over 32 gpios #else // ESP32 with over 32 gpios
if ( pin < 32 ) if ( pin < 32 )
@ -263,7 +263,7 @@ void directWriteLow(IO_REG_TYPE pin)
static inline __attribute__((always_inline)) static inline __attribute__((always_inline))
void directWriteHigh(IO_REG_TYPE pin) 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); GPIO.out_w1ts.val = ((uint32_t)1 << pin);
#else // ESP32 with over 32 gpios #else // ESP32 with over 32 gpios
if ( pin < 32 ) if ( pin < 32 )
@ -280,7 +280,7 @@ void directModeInput(IO_REG_TYPE pin)
if ( digitalPinIsValid(pin) ) if ( digitalPinIsValid(pin) )
{ {
// Input // 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)); GPIO.enable_w1tc.val = ((uint32_t)1 << (pin));
#else // ESP32 with over 32 gpios #else // ESP32 with over 32 gpios
if ( pin < 32 ) if ( pin < 32 )
@ -298,7 +298,7 @@ void directModeOutput(IO_REG_TYPE pin)
if ( digitalPinCanOutput(pin) ) if ( digitalPinCanOutput(pin) )
{ {
// Output // 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)); GPIO.enable_w1ts.val = ((uint32_t)1 << (pin));
#else // ESP32 with over 32 gpios #else // ESP32 with over 32 gpios
if ( pin < 32 ) if ( pin < 32 )

View File

@ -112,7 +112,7 @@ enum uColorType { uCOLOR_BW, uCOLOR_COLOR };
#undef GPIO_SET_SLOW #undef GPIO_SET_SLOW
#undef GPIO_CLR_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_CLR(A) GPIO.out_w1tc.val = (1 << A)
#define GPIO_SET(A) GPIO.out_w1ts.val = (1 << A) #define GPIO_SET(A) GPIO.out_w1ts.val = (1 << A)
#else // plain ESP32 #else // plain ESP32

View File

@ -160,6 +160,16 @@ build_flags = ${env:tasmota32_base.build_flags}
lib_extra_dirs = lib/lib_ssl, lib/libesp32 lib_extra_dirs = lib/lib_ssl, lib/libesp32
lib_ignore = ${safeboot_flags.lib_ignore} 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] [env:tasmota32]
extends = env:tasmota32_base extends = env:tasmota32_base
build_flags = ${env:tasmota32_base.build_flags} 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} lib_ignore = ${env:tasmota32_base.lib_ignore}
Micro-RTSP 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] [env:tasmota32s3]
extends = env:tasmota32_base extends = env:tasmota32_base
board = esp32s3-qio_qspi board = esp32s3-qio_qspi

View File

@ -1454,6 +1454,20 @@ const char PINS_WEMOS[] PROGMEM = "IOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOIO-
// 0 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748 // 0 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839404142434445464748
const char PINS_WEMOS[] PROGMEM = "IOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOAOIO--------FLFLFLFLFLFLFLIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIO"; 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 #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 // 0 1 2 3 4 5 6 7 8 9101112131415161718192021222324252627282930313233343536373839
const char PINS_WEMOS[] PROGMEM = "IOTXIORXIOIOFLFLFLFLFLFLIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIO--------AOAOIAIAIAIAIAIA"; const char PINS_WEMOS[] PROGMEM = "IOTXIORXIOIOFLFLFLFLFLFLIOIOIOIOIOIOIOIOIOIOIOIOIOIOIOIO--------AOAOIAIAIAIAIAIA";
#endif // ESP32/S2/C2/C3/C6 selection #endif // ESP32/S2/C2/C3/C6/P4 selection
#endif // ESP32 #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 Known templates
\*********************************************************************************************/ \*********************************************************************************************/

View File

@ -212,7 +212,7 @@ WiFiUDP PortUdp; // UDP Syslog and Alexa
CONFIG_IDF_TARGET_ESP32S2 || // support USB via USBCDC CONFIG_IDF_TARGET_ESP32S2 || // support USB via USBCDC
CONFIG_IDF_TARGET_ESP32S3 // support USB via HWCDC using JTAG interface or 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 //#if CONFIG_TINYUSB_CDC_ENABLED // This define is not recognized here so use USE_USB_CDC_CONSOLE
#ifdef USE_USB_CDC_CONSOLE #ifdef USE_USB_CDC_CONSOLE
@ -493,7 +493,7 @@ void setup(void) {
} }
#ifdef ESP32 #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 #ifdef USE_USB_CDC_CONSOLE
bool is_connected_to_USB = false; bool is_connected_to_USB = false;

View File

@ -1714,7 +1714,7 @@ void TemplateGpios(myio *gp)
j++; j++;
#endif // ESP8266 #endif // ESP8266
#ifdef ESP32 #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]; dest[i] = src[i];
#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 #elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
if (22 == i) { j = 33; } // skip 22-32 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 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 #elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
return (pin > 21) && (pin < 33); // ESP32S2 skip 22-32 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 #else
return (pin >= 28) && (pin <= 31); // ESP32 skip 28-31 return (pin >= 28) && (pin <= 31); // ESP32 skip 28-31
#endif // ESP32C2/C3/C6 and S2/S3 #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) return (26 == pin) || (28 == pin); // ESP32C6: GPIOs 26 28 are usually used for Flash (mode QIO/QOUT)
#elif CONFIG_IDF_TARGET_ESP32S2 #elif CONFIG_IDF_TARGET_ESP32S2
return false; // No red pin on ESP32S3 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 #elif CONFIG_IDF_TARGET_ESP32S3
return (33 <= pin) && (37 >= pin); // ESP32S3: GPIOs 33..37 are usually used for PSRAM 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 #else // ESP32 red pins are 6-11 for original ESP32, other models like PICO are not impacted if flash pins are condfigured

View File

@ -261,7 +261,7 @@ void CrashDump(void)
} }
ResponseJsonEnd(); 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" { extern "C" {
// esp-idf 3.x // esp-idf 3.x

View File

@ -35,6 +35,8 @@ const static char kWifiPhyMode[] PROGMEM = "low rate|11b|11g|HT20|HT40|HE20"; //
#define ESP32_ARCH "esp32c6" #define ESP32_ARCH "esp32c6"
#elif CONFIG_IDF_TARGET_ESP32H2 #elif CONFIG_IDF_TARGET_ESP32H2
#define ESP32_ARCH "esp32h2" #define ESP32_ARCH "esp32h2"
#elif CONFIG_IDF_TARGET_ESP32P4
#define ESP32_ARCH "esp32p4"
#else #else
#define ESP32_ARCH "" #define ESP32_ARCH ""
#endif #endif
@ -55,6 +57,8 @@ const static char kWifiPhyMode[] PROGMEM = "low rate|11b|11g|HT20|HT40|HE20"; //
#include "esp32c6/rom/rtc.h" #include "esp32c6/rom/rtc.h"
#elif CONFIG_IDF_TARGET_ESP32H2 // ESP32-H2 #elif CONFIG_IDF_TARGET_ESP32H2 // ESP32-H2
#include "esp32h2/rom/rtc.h" #include "esp32h2/rom/rtc.h"
#elif CONFIG_IDF_TARGET_ESP32P4 // ESP32-P4
#include "esp32p4/rom/rtc.h"
#else #else
#error Target CONFIG_IDF_TARGET is not supported #error Target CONFIG_IDF_TARGET is not supported
#endif #endif
@ -64,7 +68,9 @@ size_t getArduinoLoopTaskStackSize(void) {
return SET_ESP32_STACK_SIZE; return SET_ESP32_STACK_SIZE;
} }
#ifndef CONFIG_IDF_TARGET_ESP32P4
#include <esp_phy_init.h> #include <esp_phy_init.h>
#endif
// Handle 20k of NVM // Handle 20k of NVM
@ -139,9 +145,11 @@ void SettingsErase(uint8_t type) {
break; break;
case 1: // Reset 3 = SDK parameter area case 1: // Reset 3 = SDK parameter area
case 4: // WIFI_FORCE_RF_CAL_ERASE = 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 = esp_phy_erase_cal_data_in_nvs();
// r1 = NvmErase("cal_data"); // r1 = NvmErase("cal_data");
AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_ERASE " PHY data (%d)"), r1); AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_ERASE " PHY data (%d)"), r1);
#endif //SOC_SUPPORTS_WIFI
break; break;
case 3: // QPC Reached = QPC, Tasmota and SDK parameter area (0x0F3xxx - 0x0FFFFF) 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. // 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 #elif CONFIG_IDF_TARGET_ESP32H2 // ESP32-H2
#include "esp32h2/rom/spi_flash.h" #include "esp32h2/rom/spi_flash.h"
#define ESP_FLASH_IMAGE_BASE 0x0000 // Esp32h2 is located at 0x0000 #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 #else
#error Target CONFIG_IDF_TARGET is not supported #error Target CONFIG_IDF_TARGET is not supported
#endif #endif
@ -587,6 +598,8 @@ extern "C" {
bool FoundPSRAM(void) { bool FoundPSRAM(void) {
#if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || DISABLE_PSRAMCHECK || CORE32SOLO1 #if CONFIG_IDF_TARGET_ESP32C2 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6 || DISABLE_PSRAMCHECK || CORE32SOLO1
return psramFound(); return psramFound();
#elif CONFIG_IDF_TARGET_ESP32P4
return ESP.getPsramSize() > 0;
#else #else
return psramFound() && esp_psram_is_initialized(); return psramFound() && esp_psram_is_initialized();
#endif #endif
@ -903,11 +916,6 @@ typedef struct {
return F("ESP32-H2"); return F("ESP32-H2");
} }
case 18: { // ESP32-P4 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"); return F("ESP32-P4");
} }
} }

View File

@ -154,7 +154,7 @@ const char HTTP_SCRIPT_TEMPLATE2[] PROGMEM =
"}"; "}";
#endif // ESP8266 #endif // ESP8266
#ifdef ESP32 #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 = const char HTTP_SCRIPT_TEMPLATE2[] PROGMEM =
"for(i=0;i<" STR(MAX_USER_PINS) ";i++){" "for(i=0;i<" STR(MAX_USER_PINS) ";i++){"
"sk(g[i],i);" // Set GPIO "sk(g[i],i);" // Set GPIO
@ -2178,7 +2178,7 @@ void HandleTemplateConfiguration(void) {
WSContentBegin(200, CT_PLAIN); WSContentBegin(200, CT_PLAIN);
WSContentSend_P(PSTR("%s}1"), AnyModuleName(module).c_str()); // NAME: Generic 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 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 // ESP32C2/C3/C6 we always send all GPIOs, Flash are just hidden
WSContentSend_P(PSTR("%s%d"), (i>0)?",":"", template_gp.io[i]); WSContentSend_P(PSTR("%s%d"), (i>0)?",":"", template_gp.io[i]);
#else #else
@ -2226,7 +2226,7 @@ void HandleTemplateConfiguration(void) {
"<hr/>")); "<hr/>"));
WSContentSend_P(HTTP_TABLE100); // "<table style='width:100%%'>" WSContentSend_P(HTTP_TABLE100); // "<table style='width:100%%'>"
for (uint32_t i = 0; i < MAX_GPIO_PIN; i++) { 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 // ESP32C2/C3/C6 all gpios are in the template, flash are hidden
bool hidden = FlashPin(i); bool hidden = FlashPin(i);
WSContentSend_P(PSTR("<tr%s><td><b><font color='#%06x'>" D_GPIO "%d</font></b></td><td%s><select id='g%d' onchange='ot(%d,this.value)'></select></td>"), WSContentSend_P(PSTR("<tr%s><td><b><font color='#%06x'>" D_GPIO "%d</font></b></td><td%s><select id='g%d' onchange='ot(%d,this.value)'></select></td>"),
@ -2304,7 +2304,7 @@ void TemplateSaveSettings(void) {
j++; j++;
#endif // ESP8266 #endif // ESP8266
#ifdef ESP32 #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)); snprintf_P(command, sizeof(command), PSTR("%s%s%d"), command, (i>0)?",":"", WebGetGpioArg(i));
#elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3 #elif CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
if (22 == i) { j = 33; } // skip 22-32 if (22 == i) { j = 33; } // skip 22-32

View File

@ -346,9 +346,10 @@ void GVHandleEspInfo(void) {
jsonResponse += "\",\"cycle_count\":" + String(ESP.getCycleCount()); jsonResponse += "\",\"cycle_count\":" + String(ESP.getCycleCount());
jsonResponse += ",\"mac\":\"" + ESP_getEfuseMac(); jsonResponse += ",\"mac\":\"" + ESP_getEfuseMac();
#ifndef CONFIG_IDF_TARGET_ESP32P4
const FlashMode_t flashMode = ESP.getFlashChipMode(); // enum const FlashMode_t flashMode = ESP.getFlashChipMode(); // enum
jsonResponse += "\",\"flash_mode\":" + String(flashMode); jsonResponse += "\",\"flash_mode\":" + String(flashMode);
#endif // CONFIG_IDF_TARGET_ESP32P4
#ifdef ESP8266 #ifdef ESP8266
jsonResponse += ",\"flash_chip_size\":" + String(ESP.getFlashChipRealSize()); jsonResponse += ",\"flash_chip_size\":" + String(ESP.getFlashChipRealSize());
#else // ESP32 #else // ESP32

View File

@ -597,6 +597,7 @@ void I2sInit(void) {
bool init_tx_ok = false; bool init_tx_ok = false;
bool init_rx_ok = false; bool init_rx_ok = false;
exclusive = true; //TODO: try fix full dupleyx mode
if (tx && rx && exclusive) { if (tx && rx && exclusive) {
i2s->setExclusive(true); i2s->setExclusive(true);
audio_i2s.Settings->sys.exclusive = exclusive; audio_i2s.Settings->sys.exclusive = exclusive;

View File

@ -24,7 +24,40 @@
#include <berry.h> #include <berry.h>
#include <Wire.h> #include <Wire.h>
#include <byteswap.h> // #include <byteswap.h>
#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` // read the `bus` attribute and return `Wire` or `Wire1`
// Can return nullptr reference if the bus is not initialized // Can return nullptr reference if the bus is not initialized

View File

@ -273,7 +273,11 @@ void EthernetInit(void) {
bool init_ok = false; bool init_ok = false;
if (!eth_uses_spi) { if (!eth_uses_spi) {
#if CONFIG_ETH_USE_ESP32_EMAC #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 #endif // CONFIG_ETH_USE_ESP32_EMAC
} else { } else {
// ETH_SPI_SUPPORTS_CUSTOM // 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)); 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) { 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; return;
}; };
@ -377,7 +381,7 @@ void CmndEthernet(void) {
} }
void CmndEthAddress(void) { void CmndEthAddress(void) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 31)) { if ((XdrvMailbox.payload >= -1) && (XdrvMailbox.payload <= 31)) {
Settings->eth_address = XdrvMailbox.payload; Settings->eth_address = XdrvMailbox.payload;
TasmotaGlobal.restart_flag = 2; TasmotaGlobal.restart_flag = 2;
} }