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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user