Add example to update ESP32 via SD card (#628)

* Add example to update ESP32 via SD card

* Delete update.bin from sd upon finishing update

* remove precompiled binary from example

* Check whether update.bin is a file
This commit is contained in:
Frederik 2017-09-29 15:16:30 +02:00 committed by Me No Dev
parent e72895b722
commit 10ff1def6d

View File

@ -0,0 +1,112 @@
/*
Name: SD_Update.ino
Created: 12.09.2017 15:07:17
Author: Frederik Merz <frederik.merz@novalight.de>
Purpose: Update firmware from SD card
Steps:
1. Flash this image to the ESP32 an run it
2. Copy update.bin to a SD-Card, you can basically
compile this or any other example
then copy and rename the app binary to the sd card root
3. Connect SD-Card as shown in SD_MMC example,
this can also be adapted for SPI
3. After successfull update and reboot, ESP32 shall start the new app
*/
#include <Update.h>
#include <FS.h>
#include <SD_MMC.h>
// perform the actual update from a given stream
void performUpdate(Stream &updateSource, size_t updateSize) {
if (Update.begin(updateSize)) {
size_t written = Update.writeStream(updateSource);
if (written == updateSize) {
Serial.println("Written : " + String(written) + " successfully");
}
else {
Serial.println("Written only : " + String(written) + "/" + String(updateSize) + ". Retry?");
}
if (Update.end()) {
Serial.println("OTA done!");
if (Update.isFinished()) {
Serial.println("Update successfully completed. Rebooting.");
}
else {
Serial.println("Update not finished? Something went wrong!");
}
}
else {
Serial.println("Error Occurred. Error #: " + String(Update.getError()));
}
}
else
{
Serial.println("Not enough space to begin OTA");
}
}
// check given FS for valid update.bin and perform update if available
void updateFromFS(fs::FS &fs) {
File updateBin = fs.open("/update.bin");
if (updateBin) {
if(updateBin.isDirectory()){
Serial.println("Error, update.bin is not a file");
updateBin.close();
return;
}
size_t updateSize = updateBin.size();
if (updateSize > 0) {
Serial.println("Try to start update");
performUpdate(updateBin, updateSize);
}
else {
Serial.println("Error, file is empty");
}
updateBin.close();
// whe finished remove the binary from sd card to indicate end of the process
fs.remove("/update.bin");
}
else {
Serial.println("Could not load update.bin from sd root");
}
}
void setup() {
uint8_t cardType;
Serial.begin(115200);
Serial.println("Welcome to the SD-Update example!");
// You can uncomment this and build again
// Serial.println("Update successfull");
//first init and check SD card
if (!SD_MMC.begin()) {
Serial.println("Card Mount Failed");
goto end;
}
cardType = SD_MMC.cardType();
if (cardType == CARD_NONE) {
Serial.println("No SD_MMC card attached");
goto end;
}
updateFromFS(SD_MMC);
end:
delay(1000);
ESP.restart();
}
//will not be reached
void loop() {
}