diff --git a/libraries/Update/examples/SD_Update/SD_Update.ino b/libraries/Update/examples/SD_Update/SD_Update.ino new file mode 100644 index 00000000..2a8e879f --- /dev/null +++ b/libraries/Update/examples/SD_Update/SD_Update.ino @@ -0,0 +1,112 @@ +/* + Name: SD_Update.ino + Created: 12.09.2017 15:07:17 + Author: Frederik Merz + 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 +#include +#include + +// 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() { + +}