2017-09-29 15:16:30 +02:00
|
|
|
/*
|
|
|
|
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()) {
|
2017-10-10 21:41:10 +02:00
|
|
|
rebootEspWithReason("Card Mount Failed");
|
2017-09-29 15:16:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
cardType = SD_MMC.cardType();
|
|
|
|
|
|
|
|
if (cardType == CARD_NONE) {
|
2017-10-10 21:41:10 +02:00
|
|
|
rebootEspWithReason("No SD_MMC card attached");
|
|
|
|
}else{
|
|
|
|
updateFromFS(SD_MMC);
|
|
|
|
}
|
|
|
|
}
|
2017-09-29 15:16:30 +02:00
|
|
|
|
2017-10-10 21:41:10 +02:00
|
|
|
void rebootEspWithReason(String reason){
|
|
|
|
Serial.println(reason);
|
|
|
|
delay(1000);
|
|
|
|
ESP.restart();
|
2017-09-29 15:16:30 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
//will not be reached
|
|
|
|
void loop() {
|
|
|
|
|
2017-10-10 21:41:10 +02:00
|
|
|
}
|