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:
parent
e72895b722
commit
10ff1def6d
112
libraries/Update/examples/SD_Update/SD_Update.ino
Normal file
112
libraries/Update/examples/SD_Update/SD_Update.ino
Normal 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() {
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user