Tasmota Core 2.0.5

* Flash real size is now in core
* Flash chip magic size now in Tasmota `ESP_getFlashChipMagicSize`
* Tasmota Core 2.0.5
This commit is contained in:
Jason2866 2022-09-17 15:53:58 +02:00 committed by GitHub
parent 195ba01eaf
commit 452c6fabb0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 68 additions and 50 deletions

View File

@ -7,7 +7,7 @@
- [ ] Only relevant files were touched - [ ] Only relevant files were touched
- [ ] Only one feature/fix was added per PR and the code change compiles without warnings - [ ] Only one feature/fix was added per PR and the code change compiles without warnings
- [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.4.9 - [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.4.9
- [ ] The code change is tested and works with Tasmota core ESP32 V.2.0.4.1 - [ ] The code change is tested and works with Tasmota core ESP32 V.2.0.5
- [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla). - [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla).
_NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_ _NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_

View File

@ -9,6 +9,12 @@
"f_cpu": "240000000L", "f_cpu": "240000000L",
"f_flash": "80000000L", "f_flash": "80000000L",
"flash_mode": "qio", "flash_mode": "qio",
"hwids": [
[
"0x303A",
"0x1001"
]
],
"mcu": "esp32s3", "mcu": "esp32s3",
"variant": "esp32s3", "variant": "esp32s3",
"partitions": "partitions/esp32_partition_app2944k_fs10M.csv" "partitions": "partitions/esp32_partition_app2944k_fs10M.csv"
@ -19,13 +25,17 @@
"ethernet" "ethernet"
], ],
"debug": { "debug": {
"default_tool": "esp-builtin",
"onboard_tools": [
"esp-builtin"
],
"openocd_target": "esp32s3.cfg" "openocd_target": "esp32s3.cfg"
}, },
"frameworks": [ "frameworks": [
"espidf", "espidf",
"arduino" "arduino"
], ],
"name": "LilyGo T-SIMCAM ESP32-S3 16M Flash 8MB PSRAM, Tasmota 2944k Code/OTA, 10M FS", "name": "LilyGo T-SIMCAM ESP32-S3 16M Flash 8MB OPI PSRAM, Tasmota 2944k Code/OTA, 10M FS",
"upload": { "upload": {
"flash_size": "16MB", "flash_size": "16MB",
"maximum_ram_size": 327680, "maximum_ram_size": 327680,

View File

@ -40,20 +40,20 @@ extra_scripts = pre:pio-tools/add_c_flags.py
${esp_defaults.extra_scripts} ${esp_defaults.extra_scripts}
[core32] [core32]
platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.4.1/platform-espressif32-2.0.4.1.zip platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.5/platform-espressif32-2.0.5.zip
platform_packages = platform_packages =
build_unflags = ${esp32_defaults.build_unflags} build_unflags = ${esp32_defaults.build_unflags}
build_flags = ${esp32_defaults.build_flags} build_flags = ${esp32_defaults.build_flags}
[core32solo1] [core32solo1]
platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.4.1/platform-espressif32-solo1-2.0.4.1.zip platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.5/platform-espressif32-solo1-2.0.5.zip
platform_packages = platform_packages =
build_unflags = ${esp32_defaults.build_unflags} build_unflags = ${esp32_defaults.build_unflags}
build_flags = ${esp32_defaults.build_flags} build_flags = ${esp32_defaults.build_flags}
[core32itead] [core32itead]
platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.4.1/platform-espressif32-ITEAD-2.0.4.1.zip platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.5/platform-espressif32-ITEAD-2.0.5.zip
platform_packages = platform_packages =
build_unflags = ${esp32_defaults.build_unflags} build_unflags = ${esp32_defaults.build_unflags}
build_flags = ${esp32_defaults.build_flags} build_flags = ${esp32_defaults.build_flags}

View File

@ -749,7 +749,7 @@ uint32_t CfgTime(void) {
void SettingsErase(uint8_t type) { void SettingsErase(uint8_t type) {
/* /*
For Arduino core and SDK: For Arduino core and SDK:
Erase only works from flash start address to SDK recognized flash end address (flashchip->chip_size = ESP.getFlashChipSize). Erase only works from flash start address to SDK recognized flash end address (flashchip->chip_size = ESP_getFlashChipSize).
Addresses above SDK recognized size (up to ESP.getFlashChipRealSize) are not accessable. Addresses above SDK recognized size (up to ESP.getFlashChipRealSize) are not accessable.
For Esptool: For Esptool:
The only way to erase whole flash is esptool which uses direct SPI writes to flash. The only way to erase whole flash is esptool which uses direct SPI writes to flash.
@ -779,7 +779,7 @@ void SettingsErase(uint8_t type) {
*/ */
EsptoolErase(_sectorStart, FLASH_FS_START); EsptoolErase(_sectorStart, FLASH_FS_START);
_sectorStart = EEPROM_LOCATION; _sectorStart = EEPROM_LOCATION;
_sectorEnd = ESP.getFlashChipSize() / SPI_FLASH_SEC_SIZE; // Flash size as seen by SDK _sectorEnd = ESP_getFlashChipSize() / SPI_FLASH_SEC_SIZE; // Flash size as seen by SDK
} }
else if (3 == type) { // QPC Reached = QPC and Tasmota and SDK parameter area (0x0F3xxx - 0x0FFFFF) else if (3 == type) { // QPC Reached = QPC and Tasmota and SDK parameter area (0x0F3xxx - 0x0FFFFF)
#ifdef USE_UFILESYS #ifdef USE_UFILESYS

View File

@ -774,8 +774,11 @@ void CmndStatus(void)
ESP_getSketchSize()/1024, ESP_getFreeSketchSpace()/1024, ESP_getFreeHeap1024(), ESP_getSketchSize()/1024, ESP_getFreeSketchSpace()/1024, ESP_getFreeHeap1024(),
#ifdef ESP32 #ifdef ESP32
uxTaskGetStackHighWaterMark(nullptr) / 1024, ESP.getPsramSize()/1024, ESP.getFreePsram()/1024, uxTaskGetStackHighWaterMark(nullptr) / 1024, ESP.getPsramSize()/1024, ESP.getFreePsram()/1024,
ESP_getFlashChipMagicSize()/1024, ESP.getFlashChipSize()/1024
#endif // ESP32 #endif // ESP32
ESP.getFlashChipSize()/1024, ESP_getFlashChipRealSize()/1024 #ifdef ESP8266
ESP_getFlashChipSize()/1024, ESP.getFlashChipRealSize()/1024
#endif // ESP8266
, ESP_getFlashChipId() , ESP_getFlashChipId()
, ESP.getFlashChipSpeed()/1000000, ESP_getFlashChipMode().c_str()); , ESP.getFlashChipSpeed()/1000000, ESP_getFlashChipMode().c_str());
ResponseAppendFeatures(); ResponseAppendFeatures();

View File

@ -65,6 +65,10 @@ uint32_t ESP_getFlashChipRealSize(void) {
return ESP.getFlashChipRealSize(); return ESP.getFlashChipRealSize();
} }
uint32_t ESP_getFlashChipSize(void) {
return ESP.getFlashChipSize();
}
void ESP_Restart(void) { void ESP_Restart(void) {
// ESP.restart(); // This results in exception 3 on restarts on core 2.3.0 // ESP.restart(); // This results in exception 3 on restarts on core 2.3.0
ESP.reset(); ESP.reset();
@ -312,17 +316,22 @@ extern "C" {
#if ESP_IDF_VERSION_MAJOR > 3 // IDF 4+ #if ESP_IDF_VERSION_MAJOR > 3 // IDF 4+
#if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4 #if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4
#include "esp32/rom/spi_flash.h" #include "esp32/rom/spi_flash.h"
#define ESP_FLASH_IMAGE_BASE 0x1000 // Flash offset containing magic flash size and spi mode
#elif CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2 #elif CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2
#include "esp32s2/rom/spi_flash.h" #include "esp32s2/rom/spi_flash.h"
#define ESP_FLASH_IMAGE_BASE 0x1000 // Flash offset containing magic flash size and spi mode
#elif CONFIG_IDF_TARGET_ESP32S3 // ESP32-S3 #elif CONFIG_IDF_TARGET_ESP32S3 // ESP32-S3
#include "esp32s3/rom/spi_flash.h" #include "esp32s3/rom/spi_flash.h"
#define ESP_FLASH_IMAGE_BASE 0x0000 // Esp32s3 is located at 0x0000
#elif CONFIG_IDF_TARGET_ESP32C3 // ESP32-C3 #elif CONFIG_IDF_TARGET_ESP32C3 // ESP32-C3
#include "esp32c3/rom/spi_flash.h" #include "esp32c3/rom/spi_flash.h"
#define ESP_FLASH_IMAGE_BASE 0x0000 // Esp32c3 is located at 0x0000
#else #else
#error Target CONFIG_IDF_TARGET is not supported #error Target CONFIG_IDF_TARGET is not supported
#endif #endif
#else // ESP32 Before IDF 4.0 #else // ESP32 Before IDF 4.0
#include "rom/spi_flash.h" #include "rom/spi_flash.h"
#define ESP_FLASH_IMAGE_BASE 0x1000
#endif #endif
uint32_t EspProgramSize(const char *label) { uint32_t EspProgramSize(const char *label) {
@ -520,6 +529,33 @@ uint32_t ESP_getChipId(void) {
return id; return id;
} }
uint32_t ESP_getFlashChipMagicSize(void)
{
esp_image_header_t fhdr;
if(ESP.flashRead(ESP_FLASH_IMAGE_BASE, (uint32_t*)&fhdr, sizeof(esp_image_header_t)) && fhdr.magic != ESP_IMAGE_HEADER_MAGIC) {
return 0;
}
return ESP_magicFlashChipSize(fhdr.spi_size);
}
uint32_t ESP_magicFlashChipSize(uint8_t byte)
{
switch(byte & 0x0F) {
case 0x0: // 8 MBit (1MB)
return 1048576;
case 0x1: // 16 MBit (2MB)
return 2097152;
case 0x2: // 32 MBit (4MB)
return 4194304;
case 0x3: // 64 MBit (8MB)
return 8388608;
case 0x4: // 128 MBit (16MB)
return 16777216;
default: // fail?
return 0;
}
}
uint32_t ESP_getSketchSize(void) { uint32_t ESP_getSketchSize(void) {
static uint32_t sketchsize = 0; static uint32_t sketchsize = 0;
@ -558,20 +594,6 @@ int32_t ESP_getHeapFragmentation(void) {
return free_maxmem; return free_maxmem;
} }
uint32_t ESP_getFlashChipId(void)
{
// uint32_t id = bootloader_read_flash_id();
uint32_t id = g_rom_flashchip.device_id;
id = ((id & 0xff) << 16) | ((id >> 16) & 0xff) | (id & 0xff00);
return id;
}
uint32_t ESP_getFlashChipRealSize(void)
{
uint32_t id = (ESP_getFlashChipId() >> 16) & 0xFF;
return 2 << (id - 1);
}
void ESP_Restart(void) { void ESP_Restart(void) {
ESP.restart(); ESP.restart();
} }
@ -983,30 +1005,7 @@ typedef enum {
} FlashMode_t; } FlashMode_t;
*/ */
String ESP_getFlashChipMode(void) { String ESP_getFlashChipMode(void) {
#if ESP8266
uint32_t flash_mode = ESP.getFlashChipMode(); uint32_t flash_mode = ESP.getFlashChipMode();
#else
#if CONFIG_IDF_TARGET_ESP32S2
const uint32_t spi_ctrl = REG_READ(PERIPHS_SPI_FLASH_CTRL);
#else
const uint32_t spi_ctrl = REG_READ(SPI_CTRL_REG(0));
#endif
uint32_t flash_mode;
/* Not all of the following constants are already defined in older versions of spi_reg.h, so do it manually for now*/
if (spi_ctrl & BIT(24)) { //SPI_FREAD_QIO
flash_mode = 0;
} else if (spi_ctrl & BIT(20)) { //SPI_FREAD_QUAD
flash_mode = 1;
} else if (spi_ctrl & BIT(23)) { //SPI_FREAD_DIO
flash_mode = 2;
} else if (spi_ctrl & BIT(14)) { // SPI_FREAD_DUAL
flash_mode = 3;
} else if (spi_ctrl & BIT(13)) { //SPI_FASTRD_MODE
flash_mode = 4;
} else {
flash_mode = 5;
}
#endif
if (flash_mode > 5) { flash_mode = 3; } if (flash_mode > 5) { flash_mode = 3; }
char stemp[6]; char stemp[6];
return GetTextIndexed(stemp, sizeof(stemp), flash_mode, kFlashModes); return GetTextIndexed(stemp, sizeof(stemp), flash_mode, kFlashModes);
@ -1035,4 +1034,4 @@ uint32_t HwRandom(void) {
last_ccount = ccount; last_ccount = ccount;
return result ^ *(volatile uint32_t *)_RAND_ADDR; return result ^ *(volatile uint32_t *)_RAND_ADDR;
#undef _RAND_ADDR #undef _RAND_ADDR
} }

View File

@ -2445,8 +2445,14 @@ void HandleInformation(void)
WSContentSend_P(PSTR("}1}2&nbsp;")); // Empty line WSContentSend_P(PSTR("}1}2&nbsp;")); // Empty line
WSContentSend_P(PSTR("}1" D_ESP_CHIP_ID "}2%d (%s)"), ESP_getChipId(), GetDeviceHardwareRevision().c_str()); WSContentSend_P(PSTR("}1" D_ESP_CHIP_ID "}2%d (%s)"), ESP_getChipId(), GetDeviceHardwareRevision().c_str());
WSContentSend_P(PSTR("}1" D_FLASH_CHIP_ID "}20x%06X (%s)"), ESP_getFlashChipId(), ESP_getFlashChipMode().c_str()); WSContentSend_P(PSTR("}1" D_FLASH_CHIP_ID "}20x%06X (%s)"), ESP_getFlashChipId(), ESP_getFlashChipMode().c_str());
WSContentSend_P(PSTR("}1" D_FLASH_CHIP_SIZE "}2%d KB"), ESP_getFlashChipRealSize() / 1024); #ifdef ESP32
WSContentSend_P(PSTR("}1" D_PROGRAM_FLASH_SIZE "}2%d KB"), ESP.getFlashChipSize() / 1024); WSContentSend_P(PSTR("}1" D_FLASH_CHIP_SIZE "}2%d KB"), ESP.getFlashChipSize() / 1024);
WSContentSend_P(PSTR("}1" D_PROGRAM_FLASH_SIZE "}2%d KB"), ESP_getFlashChipMagicSize() / 1024);
#endif // ESP32
#ifdef ESP8266
WSContentSend_P(PSTR("}1" D_FLASH_CHIP_SIZE "}2%d KB"), ESP.getFlashChipRealSize() / 1024);
WSContentSend_P(PSTR("}1" D_PROGRAM_FLASH_SIZE "}2%d KB"), ESP_getFlashChipSize() / 1024);
#endif // ESP8266
WSContentSend_P(PSTR("}1" D_PROGRAM_SIZE "}2%d KB"), ESP_getSketchSize() / 1024); WSContentSend_P(PSTR("}1" D_PROGRAM_SIZE "}2%d KB"), ESP_getSketchSize() / 1024);
WSContentSend_P(PSTR("}1" D_FREE_PROGRAM_SPACE "}2%d KB"), ESP_getFreeSketchSpace() / 1024); WSContentSend_P(PSTR("}1" D_FREE_PROGRAM_SPACE "}2%d KB"), ESP_getFreeSketchSpace() / 1024);
#ifdef ESP32 #ifdef ESP32

View File

@ -182,8 +182,8 @@ extern "C" {
int32_t top = be_top(vm); // Get the number of arguments int32_t top = be_top(vm); // Get the number of arguments
if (top == 1) { // no argument (instance only) if (top == 1) { // no argument (instance only)
be_newobject(vm, "map"); be_newobject(vm, "map");
be_map_insert_int(vm, "flash", ESP.getFlashChipSize() / 1024); be_map_insert_int(vm, "flash", ESP_getFlashChipMagicSize() / 1024);
be_map_insert_int(vm, "flash_real", ESP_getFlashChipRealSize() / 1024); be_map_insert_int(vm, "flash_real", ESP.getFlashChipSize() / 1024);
be_map_insert_int(vm, "program", ESP_getSketchSize() / 1024); be_map_insert_int(vm, "program", ESP_getSketchSize() / 1024);
be_map_insert_int(vm, "program_free", ESP_getFreeSketchSpace() / 1024); be_map_insert_int(vm, "program_free", ESP_getFreeSketchSpace() / 1024);
be_map_insert_int(vm, "heap_free", ESP_getFreeHeap() / 1024); be_map_insert_int(vm, "heap_free", ESP_getFreeHeap() / 1024);