espressif / arduino-esp32

Arduino core for the ESP32
GNU Lesser General Public License v2.1
13.31k stars 7.35k forks source link

esp32-s2-solo OTA not working #6678

Closed nilber closed 2 years ago

nilber commented 2 years ago

Board

esp32-s2-solo

Device Description

Makerfabs-ESP32-S2-Parallel-TFT-with-Touch

Hardware Configuration

[env:develope] platform = espressif32 board = featheresp32-s2 framework = arduino

Version

v2.0.1

IDE Name

PlatformIO

Operating System

macOS

Flash frequency

240MHz

PSRAM enabled

yes

Upload speed

115200

Description

I've tried several tutorials, in several different ways, Amazon S3, HttpUpload, SD Card, in all the same error: "Flash Read Failed"

I located the origin in

Update.h (#define UPDATE_ERROR_READ(3)

Update.cpp return("Flash Read Failed");)

In this line of code the error:

line 242 Update.cpp

if(!_enablePartition(_partition) || !_partitionIsBootable(_partition)) {
             _abort(UPDATE_ERROR_READ);
             return false;
         }

I've tried all versions arduino-esp32

2.0.0 2.0.1 2.0.2 2.0.3-RC1

There is another strange thing, sometimes, right after erasing the flash and uploading a new file system with OTA, it displays the error message, but when resetting the ESP32-S2 it is up to date.

But from here on, new OTA updates don't work. Uploading via USB doesn't work either, I have to do the disk erase again.

# Name,   Type, SubType,  Offset,   Size,  Flags
nvs,      data, nvs,      0x9000,  0x4000
otadata,  data, ota,      0xd000,  0x2000
phy_init, data, phy,      0xf000,  0x1000
factory,  app,  factory,  0x10000,  1M
ota_0,    app,  ota_0,    ,         1M
ota_1,    app,  ota_1,    ,         1M
spiffs,  data, spiffs, ,        0x1000

Sketch

/*  Programa para ESP32 antes da atualização OTA */
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <ESPmDNS.h>
#include <Update.h>

/* Constantes - conexão wi-fi e webserver */
const char* host = "esp32";
const char* ssid = ""; /* coloque aqui o nome da rede wi-fi que o ESP32 deve se conectar */
const char* password = ""; /* coloque aqui a senha da rede wi-fi que o ESP32 deve se conectar */

/* Variáveis globais */
int contador_ms = 0;

/* Webserver para se comunicar via browser com ESP32  */
WebServer server(80);

/* Códigos da página que será aberta no browser 
   (quando comunicar via browser com o ESP32) 
   Esta página exigirá um login e senha, de modo que somente 
   quem tenha estas informações consiga atualizar o firmware
   do ESP32 de forma OTA */
const char* loginIndex = 
 "<form name='loginForm'>"
    "<table width='20%' bgcolor='A09F9F' align='center'>"
        "<tr>"
            "<td colspan=2>"
                "<center><font size=4><b>ESP32 - identifique-se</b></font></center>"
                "<br>"
            "</td>"
            "<br>"
            "<br>"
        "</tr>"
        "<td>Login:</td>"
        "<td><input type='text' size=25 name='userid'><br></td>"
        "</tr>"
        "<br>"
        "<br>"
        "<tr>"
            "<td>Senha:</td>"
            "<td><input type='Password' size=25 name='pwd'><br></td>"
            "<br>"
            "<br>"
        "</tr>"
        "<tr>"
            "<td><input type='submit' onclick='check(this.form)' value='Identificar'></td>"
        "</tr>"
    "</table>"
"</form>"
"<script>"
    "function check(form)"
    "{"
    "if(form.userid.value=='admin' && form.pwd.value=='admin')"
    "{"
    "window.open('/serverIndex')"
    "}"
    "else"
    "{"
    " alert('Login ou senha inválidos')"
    "}"
    "}"
"</script>";

const char* serverIndex = 
"<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js'></script>"
"<form method='POST' action='#' enctype='multipart/form-data' id='upload_form'>"
   "<input type='file' name='update'>"
        "<input type='submit' value='Update'>"
    "</form>"
 "<div id='prg'>Progresso: 0%</div>"
 "<script>"
  "$('form').submit(function(e){"
  "e.preventDefault();"
  "var form = $('#upload_form')[0];"
  "var data = new FormData(form);"
  " $.ajax({"
  "url: '/update',"
  "type: 'POST',"
  "data: data,"
  "contentType: false,"
  "processData:false,"
  "xhr: function() {"
  "var xhr = new window.XMLHttpRequest();"
  "xhr.upload.addEventListener('progress', function(evt) {"
  "if (evt.lengthComputable) {"
  "var per = evt.loaded / evt.total;"
  "$('#prg').html('Progresso: ' + Math.round(per*100) + '%');"
  "}"
  "}, false);"
  "return xhr;"
  "},"
  "success:function(d, s) {"
  "console.log('Sucesso!')"
 "},"
 "error: function (a, b, c) {"
 "}"
 "});"
 "});"
 "</script>";

void setup(void) 
{
    Serial.begin(115200);

    /* Conecta-se a rede wi-fi */
    WiFi.begin(ssid, password);
    Serial.println("");

    while (WiFi.status() != WL_CONNECTED) 
    {
        delay(500);
        Serial.print(".");
    }

    Serial.println("");
    Serial.print("Conectado a rede wi-fi ");
    Serial.println(ssid);
    Serial.print("IP obtido: ");
    Serial.println(WiFi.localIP());

    /* Usa MDNS para resolver o DNS */
    if (!MDNS.begin(host)) 
    { 
        //http://esp32.local
        Serial.println("Erro ao configurar mDNS. O ESP32 vai reiniciar em 1s...");
        delay(1000);
        ESP.restart();        
    }

    Serial.println("mDNS configurado e inicializado;");

    /* Configfura as páginas de login e upload de firmware OTA */
    server.on("/", HTTP_GET, []() 
    {
        server.sendHeader("Connection", "close");
        server.send(200, "text/html", loginIndex);
    });

    server.on("/serverIndex", HTTP_GET, []() 
    {
        server.sendHeader("Connection", "close");
        server.send(200, "text/html", serverIndex);
    });

    /* Define tratamentos do update de firmware OTA */
    server.on("/update", HTTP_POST, []() 
    {
        server.sendHeader("Connection", "close");
        server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
        ESP.restart();
    }, []() {
        HTTPUpload& upload = server.upload();

        if (upload.status == UPLOAD_FILE_START) 
        {
            /* Inicio do upload de firmware OTA */
            Serial.printf("Update: %s\n", upload.filename.c_str());
            if (!Update.begin(UPDATE_SIZE_UNKNOWN)) 
                Update.printError(Serial);
        } 
        else if (upload.status == UPLOAD_FILE_WRITE) 
        {
            /* Escrevendo firmware enviado na flash do ESP32 */
            if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) 
                Update.printError(Serial);      
        } 
        else if (upload.status == UPLOAD_FILE_END) 
        {
            /* Final de upload */
            if (Update.end(true))             
                Serial.printf("Sucesso no update de firmware: %u\nReiniciando ESP32...\n", upload.totalSize);
            else
                Update.printError(Serial);
        }   
    });
    server.begin();
}

void loop() 
{
    server.handleClient();
    delay(1);

    contador_ms++;

    if (contador_ms >= 1000)
    {    
        Serial.println("Programa V2");
        contador_ms = 0;
    }
}

Debug Message

Programa V2
Programa V2
Update: v3.bin
Flash Read Failed

Other Steps to Reproduce

No response

I have checked existing issues, online documentation and the Troubleshooting Guide

Jason2866 commented 2 years ago

OTA did not work for our Project with all single ESP32 mcu. We found a solution and opened the PR #5426 which fixed the issue for us. You can try with

platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.3rc1/platform-espressif32-2.0.3new.zip
nilber commented 2 years ago

I was 24 hours without sleep looking for a solution, I found this and now everything works :)

Hope it can help more people


[env:development]
platform = espressif32
platform_packages =
    platformio/framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#2.0.1
    tool-esptoolpy@ ~1.30100.210531
    tool-mkspiffs@ ~2.230.0
    toolchain-esp32s2ulp@ ~1.22851.191205     
; platform = https://github.com/platformio/platform-espressif32.git
; platform_packages = framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32/releases/download/2.0.3-RC1/esp32-2.0.3-RC1.zip

; board = featheresp32-s2
framework = arduino

board = esp32dev
build_flags = -D  CONFIG_FREERTOS_UNICORE -D CONFIG_ESP32_DEFAULT_CPU_FREQ_80
board_build.mcu = esp32s2
; board_build.partitions = huge_app.csv
board_build.partitions = partition_ota.csv
board_build.variant = esp32s2
board_build.f_cpu = 240000000L
board_build.f_flash = 80000000L
board_build.flash_mode = qio
board_build.arduino.ldscript = esp32s2_out.ld