| 
									
										
										
										
											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
										 |  |  | } |