Forum: Mikrocontroller und Digitale Elektronik ESP32 OTA Partitionen


von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Warum 3 Partitionen für OTA?

I (122) boot:  3 factory          factory app      00 00 00010000 
00100000
I (129) boot:  4 ota_0            OTA app          00 10 00110000 
00100000
I (137) boot:  5 ota_1            OTA app          00 11 00210000 
00100000

Ich brauche doch nur die aktuelle (Boot)Partition, wo mein Programm 
läuft
und dann lade ich das Update in die ota_0, prüfe, mache, tue.
Wenns passt, ändert sich das Bootflag und die neue Version geht an den 
Start. Beim nächsten Update, gleiches Spiel.

Ich frage, weil ich den Platz brauche.

esp_image: Image length 1112544 doesn't fit in partition length 1048576

von Michael U. (amiga)


Lesenswert?

Hallo,

ich habe mit mit der Partitiontable des ESP32 nicht im Detail 
auseinandergesetzt, einfach weil ich es bisher nicht mußte.
Die Arduino IDE bietet mir zumindest als Partition an:
Minimal SPIFFS (1.9MB APP with OTA/190kB SPIFFS).
Sind dann 1966080 Bytes für die App und das hat mir bisher immer 
gereicht.

Gruß aus Berlin
Michael

von Max (Gast)


Lesenswert?

Das erste ist die Factory Partition. Die anderen beiden sind die OTAs. 
Factory Partition wird durch ein OTA nie überschrieben. Siehe hier: 
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/partition-tables.html#subtype

von John Doe (Gast)


Lesenswert?


von Michael U. (amiga)


Lesenswert?

Hallo,

Danke für die Ergänzung.
Man kann sich ja auch in der ArduinoIDE gern noch eigene Partitiontable 
anlegen, in ..\packages\esp32\hardware\esp32\1.0.4\tools\partitions 
liegen die Tabellen, die boards.txt muß man dann noch anpassen/ergänzen.

Gruß aus Berlin
Michael

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Hmm egal, es klappt.
1
I (63) boot: ## Label            Usage          Type ST Offset   Length
2
I (71) boot:  0 nvs              WiFi data        01 02 00009000 00004000
3
I (78) boot:  1 otadata          OTA data         01 00 0000d000 00002000
4
I (85) boot:  2 phy_init         RF data          01 01 0000f000 00001000
5
I (93) boot:  3 ota_0            OTA app          00 10 00100000 00180000
6
I (100) boot:  4 ota_1            OTA app          00 11 00280000 00180000
7
I (108) boot: End of partition table
8
I (112) boot: No factory image, trying OTA 0
1
I (5212) esp_https_ota: Writing to partition subtype 17 at offset 0x280000
2
I (5302) advanced_https_ota_example: Running firmware version: 1
3
W (5302) advanced_https_ota_example: Current running version is the same as a new. We will not continue the update.

von Gerfried (Gast)


Lesenswert?

Halo, ich wäre sehr an einer näheren Beschreibung der Prozedur des OTA 
interessiert. Mit dem RPi lade ich beim Booten den Python Code vom 
Server und starte diesen dann. Wäre das mit dem EPS32 möglich, ohne die 
Partitionen anzugreifen?

von Welle 🧐 S. (w3llschmidt)


Lesenswert?

Ahmm, der/die/das OTA des ESP32 ist nichts weiter als ein Programm, dass
auf dem ESP laeuft und beim Booten sich von einem Webserver eine neue
Firmware downloadet. Die vergle9cht der ESP dann mit der aktuellen 
laufenden und switch dann, wenn ok.

Was willst Du genau machen?

von Planloser (Gast)


Lesenswert?

W3ll S. schrieb:
> Ahmm, der/die/das OTA des ESP32 ist nichts weiter als ein
> Programm, dass
> auf dem ESP laeuft und beim Booten sich von einem Webserver eine neue
> Firmware downloadet. Die vergle9cht der ESP dann mit der aktuellen
> laufenden und switch dann, wenn ok.


Das ist falsch. Der Download für das Update läßt sich jederzeit 
anstossen und läuft im Hintergrund. Gespeichert wird auf die gerade 
nicht aktive OTA-Partition.
Nach dem manuell durchgeführten Restart wird das neue Image aktiv.

Wenn man (natürlich nur zum Testen!) http erlaubt ist das ganz simpel 
ein
1
  const esp_http_client_config_t config = {
2
    .url = "http://updateserver/update.bin",
3
  };
4
  esp_err_t err = esp_https_ota(&config);
5
  if(err != ESP_OK){
6
    ESP_LOGE(TAG, "OTA fehlgeschlagen. Error:0x%x", err);
7
  }else{
8
    ESP_LOGI(TAG, "OTA erfolgreich.");
9
    esp_restart();
10
  }

Trivialer geht es nicht.
Bei HTTPS muss man natürlich noch ein Zertifikat reinfummeln.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.