ESP8266/ESP32: inplace firmware upgrade using the image file stored on the file-system
In practice, it would be very useful to be able to upgrade firmware in place using the firmware image file on the file-system. In fact, all mobile devices (like smartphones), IoT devices (like routers, robot cleaners, smart fans and smart lights), can do firmware upgrade from the firmware image file that is downloaded from the cloud and stored on the file-system.
Thanks to @yaota8266, that ESP8266 MicroPython does have the OTA build, however, it is not very useful but very restrictive. In particular, it requires you:
- to press some button to start upgrade. So if the device is installed on the ceiling fan, ceiling light, or inside some big box appliance, it is very inconvenient to start firmware upgrade
- to set Wifi credentials into his system which should be handled by the software web server part, instead of the OTA module (quite a lot of redundancy)
- Moreover, it has to pre-allocate 2 big flash spaces for the firmware, where only 1 is active at a time. This wastes too much executable flash space (only the 1st 1MB). As MicroPython grows bigger with more functionalities, 1MB cannot fit 2 copies very soon.
Therefore, the most useful way of doing OTA is to do firmware upgrade from the internal flash storage file-system, triggered by calling a function or upon system reboot.
esp8266: New Flash map
Vendor SDK 2.0.0 requires another flash sector to store params, natural to extend 4-sector system area at the end of flash to 5 sectors. Taking need to move FS due to this, would be nice to plan ahead future needs for flash. We need extra flash:
- To accommodate firmware growth.
- To provide executable area for @native code storage.
- To leave few sectors for user usage.
Thus proposed: to start filesystem at 0x90000, up from 0x89000 used currently. That will allow to 0xe000 executable chunk, 32K of which could be reserved for @native later (that's not much, but well...), and remaining gives some buffer for firmware growth and user usage.