diff --git a/.gitignore b/.gitignore
index c327116cf..da62e65e2 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,6 @@
.DS_Store
tools/dist/
tools/xtensa-lx106-elf/
-tools/esptool/
tools/mkspiffs/
package/versions/
exclude.txt
diff --git a/.gitmodules b/.gitmodules
index 6ccf7f096..2b868527c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -7,3 +7,9 @@
[submodule "libraries/SoftwareSerial"]
path = libraries/SoftwareSerial
url = https://github.com/plerup/espsoftwareserial.git
+[submodule "tools/pyserial"]
+ path = tools/pyserial
+ url = https://github.com/pyserial/pyserial.git
+[submodule "tools/esptool"]
+ path = tools/esptool
+ url = https://github.com/espressif/esptool.git
diff --git a/boards.txt b/boards.txt
index b1acaa56e..34a852662 100644
--- a/boards.txt
+++ b/boards.txt
@@ -27,7 +27,7 @@ generic.build.board=ESP8266_GENERIC
generic.upload.tool=esptool
generic.upload.maximum_data_size=81920
generic.upload.wait_for_upload_port=true
-generic.upload.erase_cmd=
+generic.upload.erase_cmd=version
generic.serial.disableDTR=true
generic.serial.disableRTS=true
generic.build.mcu=esp8266
@@ -437,11 +437,11 @@ generic.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOO
generic.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
generic.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
generic.menu.wipe.none=Only Sketch
-generic.menu.wipe.none.upload.erase_cmd=
+generic.menu.wipe.none.upload.erase_cmd=version
generic.menu.wipe.sdk=Sketch + WiFi Settings
-generic.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+generic.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
generic.menu.wipe.all=All Flash Contents
-generic.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+generic.menu.wipe.all.upload.erase_cmd=erase_flash
generic.menu.baud.115200=115200
generic.menu.baud.115200.upload.speed=115200
generic.menu.baud.9600=9600
@@ -468,7 +468,7 @@ esp8285.build.variant=esp8285
esp8285.upload.tool=esptool
esp8285.upload.maximum_data_size=81920
esp8285.upload.wait_for_upload_port=true
-esp8285.upload.erase_cmd=
+esp8285.upload.erase_cmd=version
esp8285.serial.disableDTR=true
esp8285.serial.disableRTS=true
esp8285.build.mcu=esp8266
@@ -703,11 +703,11 @@ esp8285.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOO
esp8285.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
esp8285.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
esp8285.menu.wipe.none=Only Sketch
-esp8285.menu.wipe.none.upload.erase_cmd=
+esp8285.menu.wipe.none.upload.erase_cmd=version
esp8285.menu.wipe.sdk=Sketch + WiFi Settings
-esp8285.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+esp8285.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
esp8285.menu.wipe.all=All Flash Contents
-esp8285.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+esp8285.menu.wipe.all.upload.erase_cmd=erase_flash
esp8285.menu.baud.115200=115200
esp8285.menu.baud.115200.upload.speed=115200
esp8285.menu.baud.9600=9600
@@ -743,7 +743,7 @@ espduino.menu.UploadTool.espota.upload.tool=espota
espduino.upload.tool=esptool
espduino.upload.maximum_data_size=81920
espduino.upload.wait_for_upload_port=true
-espduino.upload.erase_cmd=
+espduino.upload.erase_cmd=version
espduino.serial.disableDTR=true
espduino.serial.disableRTS=true
espduino.build.mcu=esp8266
@@ -895,11 +895,11 @@ espduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAO
espduino.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
espduino.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
espduino.menu.wipe.none=Only Sketch
-espduino.menu.wipe.none.upload.erase_cmd=
+espduino.menu.wipe.none.upload.erase_cmd=version
espduino.menu.wipe.sdk=Sketch + WiFi Settings
-espduino.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+espduino.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
espduino.menu.wipe.all=All Flash Contents
-espduino.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+espduino.menu.wipe.all.upload.erase_cmd=erase_flash
espduino.menu.baud.115200=115200
espduino.menu.baud.115200.upload.speed=115200
espduino.menu.baud.9600=9600
@@ -926,7 +926,7 @@ huzzah.build.variant=adafruit
huzzah.upload.tool=esptool
huzzah.upload.maximum_data_size=81920
huzzah.upload.wait_for_upload_port=true
-huzzah.upload.erase_cmd=
+huzzah.upload.erase_cmd=version
huzzah.serial.disableDTR=true
huzzah.serial.disableRTS=true
huzzah.build.mcu=esp8266
@@ -1079,11 +1079,11 @@ huzzah.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM
huzzah.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
huzzah.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
huzzah.menu.wipe.none=Only Sketch
-huzzah.menu.wipe.none.upload.erase_cmd=
+huzzah.menu.wipe.none.upload.erase_cmd=version
huzzah.menu.wipe.sdk=Sketch + WiFi Settings
-huzzah.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+huzzah.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
huzzah.menu.wipe.all=All Flash Contents
-huzzah.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+huzzah.menu.wipe.all.upload.erase_cmd=erase_flash
huzzah.menu.baud.115200=115200
huzzah.menu.baud.115200.upload.speed=115200
huzzah.menu.baud.9600=9600
@@ -1110,7 +1110,7 @@ inventone.build.variant=inventone
inventone.upload.tool=esptool
inventone.upload.maximum_data_size=81920
inventone.upload.wait_for_upload_port=true
-inventone.upload.erase_cmd=
+inventone.upload.erase_cmd=version
inventone.serial.disableDTR=true
inventone.serial.disableRTS=true
inventone.build.mcu=esp8266
@@ -1263,11 +1263,11 @@ inventone.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA
inventone.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
inventone.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
inventone.menu.wipe.none=Only Sketch
-inventone.menu.wipe.none.upload.erase_cmd=
+inventone.menu.wipe.none.upload.erase_cmd=version
inventone.menu.wipe.sdk=Sketch + WiFi Settings
-inventone.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+inventone.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
inventone.menu.wipe.all=All Flash Contents
-inventone.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+inventone.menu.wipe.all.upload.erase_cmd=erase_flash
inventone.menu.baud.115200=115200
inventone.menu.baud.115200.upload.speed=115200
inventone.menu.baud.9600=9600
@@ -1294,7 +1294,7 @@ cw01.build.variant=xinabox
cw01.upload.tool=esptool
cw01.upload.maximum_data_size=81920
cw01.upload.wait_for_upload_port=true
-cw01.upload.erase_cmd=
+cw01.upload.erase_cmd=version
cw01.serial.disableDTR=true
cw01.serial.disableRTS=true
cw01.build.mcu=esp8266
@@ -1450,11 +1450,11 @@ cw01.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.b
cw01.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
cw01.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
cw01.menu.wipe.none=Only Sketch
-cw01.menu.wipe.none.upload.erase_cmd=
+cw01.menu.wipe.none.upload.erase_cmd=version
cw01.menu.wipe.sdk=Sketch + WiFi Settings
-cw01.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+cw01.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
cw01.menu.wipe.all=All Flash Contents
-cw01.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+cw01.menu.wipe.all.upload.erase_cmd=erase_flash
cw01.menu.baud.115200=115200
cw01.menu.baud.115200.upload.speed=115200
cw01.menu.baud.9600=9600
@@ -1481,7 +1481,7 @@ espresso_lite_v1.build.variant=espresso_lite_v1
espresso_lite_v1.upload.tool=esptool
espresso_lite_v1.upload.maximum_data_size=81920
espresso_lite_v1.upload.wait_for_upload_port=true
-espresso_lite_v1.upload.erase_cmd=
+espresso_lite_v1.upload.erase_cmd=version
espresso_lite_v1.serial.disableDTR=true
espresso_lite_v1.serial.disableRTS=true
espresso_lite_v1.build.mcu=esp8266
@@ -1637,11 +1637,11 @@ espresso_lite_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPD
espresso_lite_v1.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
espresso_lite_v1.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
espresso_lite_v1.menu.wipe.none=Only Sketch
-espresso_lite_v1.menu.wipe.none.upload.erase_cmd=
+espresso_lite_v1.menu.wipe.none.upload.erase_cmd=version
espresso_lite_v1.menu.wipe.sdk=Sketch + WiFi Settings
-espresso_lite_v1.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+espresso_lite_v1.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
espresso_lite_v1.menu.wipe.all=All Flash Contents
-espresso_lite_v1.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+espresso_lite_v1.menu.wipe.all.upload.erase_cmd=erase_flash
espresso_lite_v1.menu.baud.115200=115200
espresso_lite_v1.menu.baud.115200.upload.speed=115200
espresso_lite_v1.menu.baud.9600=9600
@@ -1668,7 +1668,7 @@ espresso_lite_v2.build.variant=espresso_lite_v2
espresso_lite_v2.upload.tool=esptool
espresso_lite_v2.upload.maximum_data_size=81920
espresso_lite_v2.upload.wait_for_upload_port=true
-espresso_lite_v2.upload.erase_cmd=
+espresso_lite_v2.upload.erase_cmd=version
espresso_lite_v2.serial.disableDTR=true
espresso_lite_v2.serial.disableRTS=true
espresso_lite_v2.build.mcu=esp8266
@@ -1824,11 +1824,11 @@ espresso_lite_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPD
espresso_lite_v2.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
espresso_lite_v2.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
espresso_lite_v2.menu.wipe.none=Only Sketch
-espresso_lite_v2.menu.wipe.none.upload.erase_cmd=
+espresso_lite_v2.menu.wipe.none.upload.erase_cmd=version
espresso_lite_v2.menu.wipe.sdk=Sketch + WiFi Settings
-espresso_lite_v2.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+espresso_lite_v2.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
espresso_lite_v2.menu.wipe.all=All Flash Contents
-espresso_lite_v2.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+espresso_lite_v2.menu.wipe.all.upload.erase_cmd=erase_flash
espresso_lite_v2.menu.baud.115200=115200
espresso_lite_v2.menu.baud.115200.upload.speed=115200
espresso_lite_v2.menu.baud.9600=9600
@@ -1855,7 +1855,7 @@ phoenix_v1.build.variant=phoenix_v1
phoenix_v1.upload.tool=esptool
phoenix_v1.upload.maximum_data_size=81920
phoenix_v1.upload.wait_for_upload_port=true
-phoenix_v1.upload.erase_cmd=
+phoenix_v1.upload.erase_cmd=version
phoenix_v1.serial.disableDTR=true
phoenix_v1.serial.disableRTS=true
phoenix_v1.build.mcu=esp8266
@@ -2011,11 +2011,11 @@ phoenix_v1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROT
phoenix_v1.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
phoenix_v1.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
phoenix_v1.menu.wipe.none=Only Sketch
-phoenix_v1.menu.wipe.none.upload.erase_cmd=
+phoenix_v1.menu.wipe.none.upload.erase_cmd=version
phoenix_v1.menu.wipe.sdk=Sketch + WiFi Settings
-phoenix_v1.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+phoenix_v1.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
phoenix_v1.menu.wipe.all=All Flash Contents
-phoenix_v1.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+phoenix_v1.menu.wipe.all.upload.erase_cmd=erase_flash
phoenix_v1.menu.baud.115200=115200
phoenix_v1.menu.baud.115200.upload.speed=115200
phoenix_v1.menu.baud.9600=9600
@@ -2042,7 +2042,7 @@ phoenix_v2.build.variant=phoenix_v2
phoenix_v2.upload.tool=esptool
phoenix_v2.upload.maximum_data_size=81920
phoenix_v2.upload.wait_for_upload_port=true
-phoenix_v2.upload.erase_cmd=
+phoenix_v2.upload.erase_cmd=version
phoenix_v2.serial.disableDTR=true
phoenix_v2.serial.disableRTS=true
phoenix_v2.build.mcu=esp8266
@@ -2198,11 +2198,11 @@ phoenix_v2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROT
phoenix_v2.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
phoenix_v2.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
phoenix_v2.menu.wipe.none=Only Sketch
-phoenix_v2.menu.wipe.none.upload.erase_cmd=
+phoenix_v2.menu.wipe.none.upload.erase_cmd=version
phoenix_v2.menu.wipe.sdk=Sketch + WiFi Settings
-phoenix_v2.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+phoenix_v2.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
phoenix_v2.menu.wipe.all=All Flash Contents
-phoenix_v2.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+phoenix_v2.menu.wipe.all.upload.erase_cmd=erase_flash
phoenix_v2.menu.baud.115200=115200
phoenix_v2.menu.baud.115200.upload.speed=115200
phoenix_v2.menu.baud.9600=9600
@@ -2229,7 +2229,7 @@ nodemcu.build.variant=nodemcu
nodemcu.upload.tool=esptool
nodemcu.upload.maximum_data_size=81920
nodemcu.upload.wait_for_upload_port=true
-nodemcu.upload.erase_cmd=
+nodemcu.upload.erase_cmd=version
nodemcu.serial.disableDTR=true
nodemcu.serial.disableRTS=true
nodemcu.build.mcu=esp8266
@@ -2382,11 +2382,11 @@ nodemcu.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOO
nodemcu.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
nodemcu.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
nodemcu.menu.wipe.none=Only Sketch
-nodemcu.menu.wipe.none.upload.erase_cmd=
+nodemcu.menu.wipe.none.upload.erase_cmd=version
nodemcu.menu.wipe.sdk=Sketch + WiFi Settings
-nodemcu.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+nodemcu.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
nodemcu.menu.wipe.all=All Flash Contents
-nodemcu.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+nodemcu.menu.wipe.all.upload.erase_cmd=erase_flash
nodemcu.menu.baud.115200=115200
nodemcu.menu.baud.115200.upload.speed=115200
nodemcu.menu.baud.9600=9600
@@ -2413,7 +2413,7 @@ nodemcuv2.build.variant=nodemcu
nodemcuv2.upload.tool=esptool
nodemcuv2.upload.maximum_data_size=81920
nodemcuv2.upload.wait_for_upload_port=true
-nodemcuv2.upload.erase_cmd=
+nodemcuv2.upload.erase_cmd=version
nodemcuv2.serial.disableDTR=true
nodemcuv2.serial.disableRTS=true
nodemcuv2.build.mcu=esp8266
@@ -2566,11 +2566,11 @@ nodemcuv2.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA
nodemcuv2.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
nodemcuv2.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
nodemcuv2.menu.wipe.none=Only Sketch
-nodemcuv2.menu.wipe.none.upload.erase_cmd=
+nodemcuv2.menu.wipe.none.upload.erase_cmd=version
nodemcuv2.menu.wipe.sdk=Sketch + WiFi Settings
-nodemcuv2.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+nodemcuv2.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
nodemcuv2.menu.wipe.all=All Flash Contents
-nodemcuv2.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+nodemcuv2.menu.wipe.all.upload.erase_cmd=erase_flash
nodemcuv2.menu.baud.115200=115200
nodemcuv2.menu.baud.115200.upload.speed=115200
nodemcuv2.menu.baud.9600=9600
@@ -2597,7 +2597,7 @@ modwifi.build.variant=modwifi
modwifi.upload.tool=esptool
modwifi.upload.maximum_data_size=81920
modwifi.upload.wait_for_upload_port=true
-modwifi.upload.erase_cmd=
+modwifi.upload.erase_cmd=version
modwifi.serial.disableDTR=true
modwifi.serial.disableRTS=true
modwifi.build.mcu=esp8266
@@ -2760,11 +2760,11 @@ modwifi.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOO
modwifi.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
modwifi.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
modwifi.menu.wipe.none=Only Sketch
-modwifi.menu.wipe.none.upload.erase_cmd=
+modwifi.menu.wipe.none.upload.erase_cmd=version
modwifi.menu.wipe.sdk=Sketch + WiFi Settings
-modwifi.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+modwifi.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
modwifi.menu.wipe.all=All Flash Contents
-modwifi.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+modwifi.menu.wipe.all.upload.erase_cmd=erase_flash
modwifi.menu.baud.115200=115200
modwifi.menu.baud.115200.upload.speed=115200
modwifi.menu.baud.9600=9600
@@ -2791,7 +2791,7 @@ thing.build.variant=thing
thing.upload.tool=esptool
thing.upload.maximum_data_size=81920
thing.upload.wait_for_upload_port=true
-thing.upload.erase_cmd=
+thing.upload.erase_cmd=version
thing.serial.disableDTR=true
thing.serial.disableRTS=true
thing.build.mcu=esp8266
@@ -2944,11 +2944,11 @@ thing.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.
thing.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
thing.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
thing.menu.wipe.none=Only Sketch
-thing.menu.wipe.none.upload.erase_cmd=
+thing.menu.wipe.none.upload.erase_cmd=version
thing.menu.wipe.sdk=Sketch + WiFi Settings
-thing.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+thing.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
thing.menu.wipe.all=All Flash Contents
-thing.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+thing.menu.wipe.all.upload.erase_cmd=erase_flash
thing.menu.baud.115200=115200
thing.menu.baud.115200.upload.speed=115200
thing.menu.baud.9600=9600
@@ -2975,7 +2975,7 @@ thingdev.build.variant=thing
thingdev.upload.tool=esptool
thingdev.upload.maximum_data_size=81920
thingdev.upload.wait_for_upload_port=true
-thingdev.upload.erase_cmd=
+thingdev.upload.erase_cmd=version
thingdev.serial.disableDTR=true
thingdev.serial.disableRTS=true
thingdev.build.mcu=esp8266
@@ -3128,11 +3128,11 @@ thingdev.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAO
thingdev.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
thingdev.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
thingdev.menu.wipe.none=Only Sketch
-thingdev.menu.wipe.none.upload.erase_cmd=
+thingdev.menu.wipe.none.upload.erase_cmd=version
thingdev.menu.wipe.sdk=Sketch + WiFi Settings
-thingdev.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+thingdev.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
thingdev.menu.wipe.all=All Flash Contents
-thingdev.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+thingdev.menu.wipe.all.upload.erase_cmd=erase_flash
thingdev.menu.baud.115200=115200
thingdev.menu.baud.115200.upload.speed=115200
thingdev.menu.baud.9600=9600
@@ -3158,7 +3158,7 @@ esp210.build.board=ESP8266_ESP210
esp210.upload.tool=esptool
esp210.upload.maximum_data_size=81920
esp210.upload.wait_for_upload_port=true
-esp210.upload.erase_cmd=
+esp210.upload.erase_cmd=version
esp210.serial.disableDTR=true
esp210.serial.disableRTS=true
esp210.build.mcu=esp8266
@@ -3312,11 +3312,11 @@ esp210.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM
esp210.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
esp210.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
esp210.menu.wipe.none=Only Sketch
-esp210.menu.wipe.none.upload.erase_cmd=
+esp210.menu.wipe.none.upload.erase_cmd=version
esp210.menu.wipe.sdk=Sketch + WiFi Settings
-esp210.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+esp210.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
esp210.menu.wipe.all=All Flash Contents
-esp210.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+esp210.menu.wipe.all.upload.erase_cmd=erase_flash
esp210.menu.baud.57600=57600
esp210.menu.baud.57600.upload.speed=57600
esp210.menu.baud.9600=9600
@@ -3343,7 +3343,7 @@ d1_mini.build.variant=d1_mini
d1_mini.upload.tool=esptool
d1_mini.upload.maximum_data_size=81920
d1_mini.upload.wait_for_upload_port=true
-d1_mini.upload.erase_cmd=
+d1_mini.upload.erase_cmd=version
d1_mini.serial.disableDTR=true
d1_mini.serial.disableRTS=true
d1_mini.build.mcu=esp8266
@@ -3496,11 +3496,11 @@ d1_mini.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOO
d1_mini.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
d1_mini.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
d1_mini.menu.wipe.none=Only Sketch
-d1_mini.menu.wipe.none.upload.erase_cmd=
+d1_mini.menu.wipe.none.upload.erase_cmd=version
d1_mini.menu.wipe.sdk=Sketch + WiFi Settings
-d1_mini.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+d1_mini.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
d1_mini.menu.wipe.all=All Flash Contents
-d1_mini.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+d1_mini.menu.wipe.all.upload.erase_cmd=erase_flash
d1_mini.menu.baud.921600=921600
d1_mini.menu.baud.921600.upload.speed=921600
d1_mini.menu.baud.9600=9600
@@ -3527,7 +3527,7 @@ d1_mini_pro.build.variant=d1_mini
d1_mini_pro.upload.tool=esptool
d1_mini_pro.upload.maximum_data_size=81920
d1_mini_pro.upload.wait_for_upload_port=true
-d1_mini_pro.upload.erase_cmd=
+d1_mini_pro.upload.erase_cmd=version
d1_mini_pro.serial.disableDTR=true
d1_mini_pro.serial.disableRTS=true
d1_mini_pro.build.mcu=esp8266
@@ -3663,11 +3663,11 @@ d1_mini_pro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATERO
d1_mini_pro.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
d1_mini_pro.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
d1_mini_pro.menu.wipe.none=Only Sketch
-d1_mini_pro.menu.wipe.none.upload.erase_cmd=
+d1_mini_pro.menu.wipe.none.upload.erase_cmd=version
d1_mini_pro.menu.wipe.sdk=Sketch + WiFi Settings
-d1_mini_pro.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+d1_mini_pro.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
d1_mini_pro.menu.wipe.all=All Flash Contents
-d1_mini_pro.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+d1_mini_pro.menu.wipe.all.upload.erase_cmd=erase_flash
d1_mini_pro.menu.baud.921600=921600
d1_mini_pro.menu.baud.921600.upload.speed=921600
d1_mini_pro.menu.baud.9600=9600
@@ -3694,7 +3694,7 @@ d1_mini_lite.build.variant=d1_mini
d1_mini_lite.upload.tool=esptool
d1_mini_lite.upload.maximum_data_size=81920
d1_mini_lite.upload.wait_for_upload_port=true
-d1_mini_lite.upload.erase_cmd=
+d1_mini_lite.upload.erase_cmd=version
d1_mini_lite.serial.disableDTR=true
d1_mini_lite.serial.disableRTS=true
d1_mini_lite.build.mcu=esp8266
@@ -3887,11 +3887,11 @@ d1_mini_lite.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATER
d1_mini_lite.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
d1_mini_lite.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
d1_mini_lite.menu.wipe.none=Only Sketch
-d1_mini_lite.menu.wipe.none.upload.erase_cmd=
+d1_mini_lite.menu.wipe.none.upload.erase_cmd=version
d1_mini_lite.menu.wipe.sdk=Sketch + WiFi Settings
-d1_mini_lite.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+d1_mini_lite.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
d1_mini_lite.menu.wipe.all=All Flash Contents
-d1_mini_lite.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+d1_mini_lite.menu.wipe.all.upload.erase_cmd=erase_flash
d1_mini_lite.menu.baud.921600=921600
d1_mini_lite.menu.baud.921600.upload.speed=921600
d1_mini_lite.menu.baud.9600=9600
@@ -3918,7 +3918,7 @@ d1.build.variant=d1
d1.upload.tool=esptool
d1.upload.maximum_data_size=81920
d1.upload.wait_for_upload_port=true
-d1.upload.erase_cmd=
+d1.upload.erase_cmd=version
d1.serial.disableDTR=true
d1.serial.disableRTS=true
d1.build.mcu=esp8266
@@ -4071,11 +4071,11 @@ d1.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.bui
d1.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
d1.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
d1.menu.wipe.none=Only Sketch
-d1.menu.wipe.none.upload.erase_cmd=
+d1.menu.wipe.none.upload.erase_cmd=version
d1.menu.wipe.sdk=Sketch + WiFi Settings
-d1.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+d1.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
d1.menu.wipe.all=All Flash Contents
-d1.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+d1.menu.wipe.all.upload.erase_cmd=erase_flash
d1.menu.baud.921600=921600
d1.menu.baud.921600.upload.speed=921600
d1.menu.baud.9600=9600
@@ -4102,7 +4102,7 @@ espino.build.variant=espino
espino.upload.tool=esptool
espino.upload.maximum_data_size=81920
espino.upload.wait_for_upload_port=true
-espino.upload.erase_cmd=
+espino.upload.erase_cmd=version
espino.serial.disableDTR=true
espino.serial.disableRTS=true
espino.build.mcu=esp8266
@@ -4258,11 +4258,11 @@ espino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM
espino.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
espino.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
espino.menu.wipe.none=Only Sketch
-espino.menu.wipe.none.upload.erase_cmd=
+espino.menu.wipe.none.upload.erase_cmd=version
espino.menu.wipe.sdk=Sketch + WiFi Settings
-espino.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+espino.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
espino.menu.wipe.all=All Flash Contents
-espino.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+espino.menu.wipe.all.upload.erase_cmd=erase_flash
espino.menu.baud.115200=115200
espino.menu.baud.115200.upload.speed=115200
espino.menu.baud.9600=9600
@@ -4289,7 +4289,7 @@ espinotee.build.variant=espinotee
espinotee.upload.tool=esptool
espinotee.upload.maximum_data_size=81920
espinotee.upload.wait_for_upload_port=true
-espinotee.upload.erase_cmd=
+espinotee.upload.erase_cmd=version
espinotee.serial.disableDTR=true
espinotee.serial.disableRTS=true
espinotee.build.mcu=esp8266
@@ -4442,11 +4442,11 @@ espinotee.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA
espinotee.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
espinotee.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
espinotee.menu.wipe.none=Only Sketch
-espinotee.menu.wipe.none.upload.erase_cmd=
+espinotee.menu.wipe.none.upload.erase_cmd=version
espinotee.menu.wipe.sdk=Sketch + WiFi Settings
-espinotee.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+espinotee.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
espinotee.menu.wipe.all=All Flash Contents
-espinotee.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+espinotee.menu.wipe.all.upload.erase_cmd=erase_flash
espinotee.menu.baud.115200=115200
espinotee.menu.baud.115200.upload.speed=115200
espinotee.menu.baud.9600=9600
@@ -4490,7 +4490,7 @@ wifinfo.menu.ESPModule.ESP07192.upload.maximum_size=827376
wifinfo.upload.tool=esptool
wifinfo.upload.maximum_data_size=81920
wifinfo.upload.wait_for_upload_port=true
-wifinfo.upload.erase_cmd=
+wifinfo.upload.erase_cmd=version
wifinfo.serial.disableDTR=true
wifinfo.serial.disableRTS=true
wifinfo.build.mcu=esp8266
@@ -4686,11 +4686,11 @@ wifinfo.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOO
wifinfo.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
wifinfo.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
wifinfo.menu.wipe.none=Only Sketch
-wifinfo.menu.wipe.none.upload.erase_cmd=
+wifinfo.menu.wipe.none.upload.erase_cmd=version
wifinfo.menu.wipe.sdk=Sketch + WiFi Settings
-wifinfo.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+wifinfo.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
wifinfo.menu.wipe.all=All Flash Contents
-wifinfo.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+wifinfo.menu.wipe.all.upload.erase_cmd=erase_flash
wifinfo.menu.baud.115200=115200
wifinfo.menu.baud.115200.upload.speed=115200
wifinfo.menu.baud.9600=9600
@@ -4728,7 +4728,7 @@ arduino-esp8266.menu.BoardModel.unowifideved=Uno WiFi
arduino-esp8266.upload.tool=esptool
arduino-esp8266.upload.maximum_data_size=81920
arduino-esp8266.upload.wait_for_upload_port=true
-arduino-esp8266.upload.erase_cmd=
+arduino-esp8266.upload.erase_cmd=version
arduino-esp8266.serial.disableDTR=true
arduino-esp8266.serial.disableRTS=true
arduino-esp8266.build.mcu=esp8266
@@ -4882,11 +4882,11 @@ arduino-esp8266.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDA
arduino-esp8266.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
arduino-esp8266.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
arduino-esp8266.menu.wipe.none=Only Sketch
-arduino-esp8266.menu.wipe.none.upload.erase_cmd=
+arduino-esp8266.menu.wipe.none.upload.erase_cmd=version
arduino-esp8266.menu.wipe.sdk=Sketch + WiFi Settings
-arduino-esp8266.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+arduino-esp8266.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
arduino-esp8266.menu.wipe.all=All Flash Contents
-arduino-esp8266.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+arduino-esp8266.menu.wipe.all.upload.erase_cmd=erase_flash
arduino-esp8266.menu.baud.115200=115200
arduino-esp8266.menu.baud.115200.upload.speed=115200
arduino-esp8266.menu.baud.9600=9600
@@ -4914,7 +4914,7 @@ gen4iod.build.variant=generic
gen4iod.upload.tool=esptool
gen4iod.upload.maximum_data_size=81920
gen4iod.upload.wait_for_upload_port=true
-gen4iod.upload.erase_cmd=
+gen4iod.upload.erase_cmd=version
gen4iod.serial.disableDTR=true
gen4iod.serial.disableRTS=true
gen4iod.build.mcu=esp8266
@@ -5067,11 +5067,11 @@ gen4iod.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOO
gen4iod.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
gen4iod.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
gen4iod.menu.wipe.none=Only Sketch
-gen4iod.menu.wipe.none.upload.erase_cmd=
+gen4iod.menu.wipe.none.upload.erase_cmd=version
gen4iod.menu.wipe.sdk=Sketch + WiFi Settings
-gen4iod.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+gen4iod.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
gen4iod.menu.wipe.all=All Flash Contents
-gen4iod.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+gen4iod.menu.wipe.all.upload.erase_cmd=erase_flash
gen4iod.menu.baud.115200=115200
gen4iod.menu.baud.115200.upload.speed=115200
gen4iod.menu.baud.9600=9600
@@ -5099,7 +5099,7 @@ oak.upload.maximum_size=1040368
oak.upload.tool=esptool
oak.upload.maximum_data_size=81920
oak.upload.wait_for_upload_port=true
-oak.upload.erase_cmd=
+oak.upload.erase_cmd=version
oak.serial.disableDTR=true
oak.serial.disableRTS=true
oak.build.mcu=esp8266
@@ -5252,11 +5252,11 @@ oak.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOOM.bu
oak.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
oak.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
oak.menu.wipe.none=Only Sketch
-oak.menu.wipe.none.upload.erase_cmd=
+oak.menu.wipe.none.upload.erase_cmd=version
oak.menu.wipe.sdk=Sketch + WiFi Settings
-oak.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+oak.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
oak.menu.wipe.all=All Flash Contents
-oak.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+oak.menu.wipe.all.upload.erase_cmd=erase_flash
oak.menu.baud.921600=921600
oak.menu.baud.921600.upload.speed=921600
oak.menu.baud.9600=9600
@@ -5283,7 +5283,7 @@ wifiduino.build.variant=wifiduino
wifiduino.upload.tool=esptool
wifiduino.upload.maximum_data_size=81920
wifiduino.upload.wait_for_upload_port=true
-wifiduino.upload.erase_cmd=
+wifiduino.upload.erase_cmd=version
wifiduino.serial.disableDTR=true
wifiduino.serial.disableRTS=true
wifiduino.build.mcu=esp8266
@@ -5436,11 +5436,11 @@ wifiduino.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA
wifiduino.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
wifiduino.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
wifiduino.menu.wipe.none=Only Sketch
-wifiduino.menu.wipe.none.upload.erase_cmd=
+wifiduino.menu.wipe.none.upload.erase_cmd=version
wifiduino.menu.wipe.sdk=Sketch + WiFi Settings
-wifiduino.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+wifiduino.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
wifiduino.menu.wipe.all=All Flash Contents
-wifiduino.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+wifiduino.menu.wipe.all.upload.erase_cmd=erase_flash
wifiduino.menu.baud.921600=921600
wifiduino.menu.baud.921600.upload.speed=921600
wifiduino.menu.baud.9600=9600
@@ -5467,7 +5467,7 @@ wifi_slot.build.variant=wifi_slot
wifi_slot.upload.tool=esptool
wifi_slot.upload.maximum_data_size=81920
wifi_slot.upload.wait_for_upload_port=true
-wifi_slot.upload.erase_cmd=
+wifi_slot.upload.erase_cmd=version
wifi_slot.serial.disableDTR=true
wifi_slot.serial.disableRTS=true
wifi_slot.build.mcu=esp8266
@@ -5720,11 +5720,11 @@ wifi_slot.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTA
wifi_slot.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
wifi_slot.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
wifi_slot.menu.wipe.none=Only Sketch
-wifi_slot.menu.wipe.none.upload.erase_cmd=
+wifi_slot.menu.wipe.none.upload.erase_cmd=version
wifi_slot.menu.wipe.sdk=Sketch + WiFi Settings
-wifi_slot.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+wifi_slot.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
wifi_slot.menu.wipe.all=All Flash Contents
-wifi_slot.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+wifi_slot.menu.wipe.all.upload.erase_cmd=erase_flash
wifi_slot.menu.baud.115200=115200
wifi_slot.menu.baud.115200.upload.speed=115200
wifi_slot.menu.baud.9600=9600
@@ -5751,7 +5751,7 @@ wiolink.build.variant=wiolink
wiolink.upload.tool=esptool
wiolink.upload.maximum_data_size=81920
wiolink.upload.wait_for_upload_port=true
-wiolink.upload.erase_cmd=
+wiolink.upload.erase_cmd=version
wiolink.serial.disableDTR=true
wiolink.serial.disableRTS=true
wiolink.build.mcu=esp8266
@@ -5904,11 +5904,11 @@ wiolink.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAOO
wiolink.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
wiolink.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
wiolink.menu.wipe.none=Only Sketch
-wiolink.menu.wipe.none.upload.erase_cmd=
+wiolink.menu.wipe.none.upload.erase_cmd=version
wiolink.menu.wipe.sdk=Sketch + WiFi Settings
-wiolink.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+wiolink.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
wiolink.menu.wipe.all=All Flash Contents
-wiolink.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+wiolink.menu.wipe.all.upload.erase_cmd=erase_flash
wiolink.menu.baud.115200=115200
wiolink.menu.baud.115200.upload.speed=115200
wiolink.menu.baud.9600=9600
@@ -5935,7 +5935,7 @@ espectro.build.variant=espectro
espectro.upload.tool=esptool
espectro.upload.maximum_data_size=81920
espectro.upload.wait_for_upload_port=true
-espectro.upload.erase_cmd=
+espectro.upload.erase_cmd=version
espectro.serial.disableDTR=true
espectro.serial.disableRTS=true
espectro.build.mcu=esp8266
@@ -6088,11 +6088,11 @@ espectro.menu.lvl.SSLTLS_MEMHTTP_CLIENTHTTP_SERVERCOREWIFIHTTP_UPDATEUPDATEROTAO
espectro.menu.lvl.NoAssert-NDEBUG=NoAssert-NDEBUG
espectro.menu.lvl.NoAssert-NDEBUG.build.debug_level= -DNDEBUG
espectro.menu.wipe.none=Only Sketch
-espectro.menu.wipe.none.upload.erase_cmd=
+espectro.menu.wipe.none.upload.erase_cmd=version
espectro.menu.wipe.sdk=Sketch + WiFi Settings
-espectro.menu.wipe.sdk.upload.erase_cmd=-ca "{build.rfcal_addr}" -cz 0x4000
+espectro.menu.wipe.sdk.upload.erase_cmd=erase_region "{build.rfcal_addr}" 0x4000
espectro.menu.wipe.all=All Flash Contents
-espectro.menu.wipe.all.upload.erase_cmd=-ca 0x0 -cz "{build.flash_size_bytes}"
+espectro.menu.wipe.all.upload.erase_cmd=erase_flash
espectro.menu.baud.115200=115200
espectro.menu.baud.115200.upload.speed=115200
espectro.menu.baud.9600=9600
diff --git a/package/build_boards_manager_package.sh b/package/build_boards_manager_package.sh
index 8ac60d7a1..f7c84e2bc 100755
--- a/package/build_boards_manager_package.sh
+++ b/package/build_boards_manager_package.sh
@@ -78,7 +78,6 @@ $SED 's/runtime.tools.esptool.path={runtime.platform.path}\/tools\/esptool//g' |
$SED 's/tools.esptool.path={runtime.platform.path}\/tools\/esptool/tools.esptool.path=\{runtime.tools.esptool.path\}/g' | \
$SED 's/tools.mkspiffs.path={runtime.platform.path}\/tools\/mkspiffs/tools.mkspiffs.path=\{runtime.tools.mkspiffs.path\}/g' |\
$SED 's/recipe.hooks.core.prebuild.2.pattern.*//g' |\
-$SED 's/recipe.hooks.core.prebuild.3.pattern.*//g' |\
$SED "s/version=.*/version=$ver/g" |\
$SED -E "s/name=([a-zA-Z0-9\ -]+).*/name=\1($ver)/g"\
> $outdir/platform.txt
diff --git a/package/package_esp8266com_index.template.json b/package/package_esp8266com_index.template.json
index 39125bb3f..56dbf1335 100644
--- a/package/package_esp8266com_index.template.json
+++ b/package/package_esp8266com_index.template.json
@@ -1,11 +1,13 @@
{
"packages": [
{
+ "name": "esp8266",
"maintainer": "ESP8266 Community",
+ "websiteURL": "https://github.com/esp8266/Arduino",
+ "email": "ivan@esp8266.com",
"help": {
"online": "http://esp8266.com/arduino"
},
- "websiteURL": "https://github.com/esp8266/Arduino",
"platforms": [
{
"category": "ESP8266",
@@ -107,11 +109,6 @@
}
],
"toolsDependencies": [
- {
- "packager": "esp8266",
- "version": "2.5.0-3-20ed2b9",
- "name": "esptool"
- },
{
"packager": "esp8266",
"version": "2.5.0-3-20ed2b9",
@@ -121,6 +118,11 @@
"packager": "esp8266",
"version": "2.5.0-3-20ed2b9",
"name": "mkspiffs"
+ },
+ {
+ "packager": "esp8266",
+ "version": "3.7.2-post1",
+ "name": "python"
}
],
"help": {
@@ -130,57 +132,22 @@
],
"tools": [
{
- "version": "2.5.0-3-20ed2b9",
- "name": "esptool",
+ "version": "3.7.2-post1",
+ "name": "python",
"systems": [
{
- "host": "aarch64-linux-gnu",
- "url": "https://github.com/earlephilhower/esp-quick-toolchain/releases/download/2.5.0-3/aarch64-linux-gnu.esptool-f80ae31.tar.gz",
- "archiveFileName": "aarch64-linux-gnu.esptool-f80ae31.tar.gz",
- "checksum": "SHA-256:888425ff1e33a97ea155b6f128de6b578c34468895ba9b4acd1e4f28608d917a",
- "size": "14681"
- },
- {
- "host": "arm-linux-gnueabihf",
- "url": "https://github.com/earlephilhower/esp-quick-toolchain/releases/download/2.5.0-3/arm-linux-gnueabihf.esptool-f80ae31.tar.gz",
- "archiveFileName": "arm-linux-gnueabihf.esptool-f80ae31.tar.gz",
- "checksum": "SHA-256:71c878ac6a21ee69dcd615cd28f2dccd29a87079e0b3069eba625089d89e5058",
- "size": "13873"
+ "host": "x86_64-mingw32",
+ "url": "https://www.python.org/ftp/python/3.7.2/python-3.7.2.post1-embed-win32.zip",
+ "archiveFileName": "python-3.7.2.post1-embed-win32.zip",
+ "checksum": "SHA-256:ceb06a5244e93e7e7523e26e1354447b79a9e6fd8c45891d81df9c7da1e02d05",
+ "size": "6533256"
},
{
"host": "i686-mingw32",
- "url": "https://github.com/earlephilhower/esp-quick-toolchain/releases/download/2.5.0-3/i686-w64-mingw32.esptool-f80ae31.zip",
- "archiveFileName": "i686-w64-mingw32.esptool-f80ae31.zip",
- "checksum": "SHA-256:e30f25a19a78635000401b083b479e111d591bac20cfd89b1bfdf36a60e9ee20",
- "size": "16466"
- },
- {
- "host": "i686-pc-linux-gnu",
- "url": "https://github.com/earlephilhower/esp-quick-toolchain/releases/download/2.5.0-3/i686-linux-gnu.esptool-f80ae31.tar.gz",
- "archiveFileName": "i686-linux-gnu.esptool-f80ae31.tar.gz",
- "checksum": "SHA-256:fe632f4602d02b6a9425c5bf95074095cb6d3c57912168a0f6b796fddd8ce991",
- "size": "16543"
- },
- {
- "host": "x86_64-apple-darwin",
- "url": "https://github.com/earlephilhower/esp-quick-toolchain/releases/download/2.5.0-3/x86_64-apple-darwin14.esptool-f80ae31.tar.gz",
- "archiveFileName": "x86_64-apple-darwin14.esptool-f80ae31.tar.gz",
- "checksum": "SHA-256:0f51e487706a476b0b87299a769282ad65623774770655168a79d1748d2506e7",
- "size": "15003"
- },
- {
- "host": "x86_64-pc-linux-gnu",
- "url": "https://github.com/earlephilhower/esp-quick-toolchain/releases/download/2.5.0-3/x86_64-linux-gnu.esptool-f80ae31.tar.gz",
- "archiveFileName": "x86_64-linux-gnu.esptool-f80ae31.tar.gz",
- "checksum": "SHA-256:bded1dca953377838b6086a9bcd40a1dc5286ba5f69f2372c22a1d1819baad24",
- "size": "16526"
- },
- {
- "host": "x86_64-mingw32",
- "url": "https://github.com/earlephilhower/esp-quick-toolchain/releases/download/2.5.0-3/x86_64-w64-mingw32.esptool-f80ae31.zip",
- "archiveFileName": "x86_64-w64-mingw32.esptool-f80ae31.zip",
- "checksum": "SHA-256:d6d5976fde82d07e93d5a01f38bbb4f84a7796187ff0541ee62650041791d0e8",
- "size": "19724"
+ "url": "https://www.python.org/ftp/python/3.7.2/python-3.7.2.post1-embed-win32.zip",
+ "archiveFileName": "python-3.7.2.post1-embed-win32.zip",
+ "checksum": "SHA-256:ceb06a5244e93e7e7523e26e1354447b79a9e6fd8c45891d81df9c7da1e02d05",
+ "size": "6533256"
}
]
},
@@ -294,9 +261,7 @@
}
]
}
- ],
- "email": "ivan@esp8266.com",
- "name": "esp8266"
+ ]
}
]
}
\ No newline at end of file
diff --git a/platform.txt b/platform.txt
index 001ed72b4..e989553d4 100644
--- a/platform.txt
+++ b/platform.txt
@@ -11,6 +11,11 @@ version=2.6.0-dev
runtime.tools.xtensa-lx106-elf-gcc.path={runtime.platform.path}/tools/xtensa-lx106-elf
runtime.tools.esptool.path={runtime.platform.path}/tools/esptool
runtime.tools.signing={runtime.platform.path}/tools/signing.py
+runtime.tools.elf2bin={runtime.platform.path}/tools/elf2bin.py
+runtime.tools.makecorever={runtime.platform.path}/tools/makecorever.py
+runtime.tools.eboot={runtime.platform.path}/bootloaders/eboot/eboot.elf
+runtime.tools.python=python
+runtime.tools.python.windows={runtime.platform.path}/tools/python/python.exe
compiler.warning_flags=-w
compiler.warning_flags.none=-w
@@ -76,14 +81,8 @@ compiler.elf2hex.extra_flags=
## generate file with git version number
## needs bash, git, and echo
-recipe.hooks.core.prebuild.1.pattern=python "{runtime.tools.signing}" --mode header --publickey "{build.source.path}/public.key" --out "{build.path}/core/Updater_Signing.h"
-recipe.hooks.core.prebuild.2.pattern=bash -c "mkdir -p {build.path}/core && echo \#define ARDUINO_ESP8266_GIT_VER 0x`git --git-dir {runtime.platform.path}/.git rev-parse --short=8 HEAD 2>/dev/null || echo ffffffff` >{build.path}/core/core_version.h"
-recipe.hooks.core.prebuild.3.pattern=bash -c "mkdir -p {build.path}/core && echo \#define ARDUINO_ESP8266_GIT_DESC `cd "{runtime.platform.path}"; git describe --tags 2>/dev/null || echo unix-{version}` >>{build.path}/core/core_version.h"
-
-## windows-compatible version without git
-recipe.hooks.core.prebuild.1.pattern.windows=cmd.exe /c rem cannot sign on windows
-recipe.hooks.core.prebuild.2.pattern.windows=cmd.exe /c mkdir {build.path}\core & (echo #define ARDUINO_ESP8266_GIT_VER 0x00000000 & echo #define ARDUINO_ESP8266_GIT_DESC win-{version} ) > {build.path}\core\core_version.h
-recipe.hooks.core.prebuild.3.pattern.windows=cmd.exe /c if exist {build.source.path}\public.key echo #error Cannot automatically build signed binaries on Windows > {build.path}\core\Updater_Signing.h
+recipe.hooks.core.prebuild.1.pattern="{runtime.tools.python}" "{runtime.tools.signing}" --mode header --publickey "{build.source.path}/public.key" --out "{build.path}/core/Updater_Signing.h"
+recipe.hooks.core.prebuild.2.pattern="{runtime.tools.python}" "{runtime.tools.makecorever}" --build_path "{build.path}' --platform_path "{runtime.platform.path}" --version "unix-{version}"
## Build the app.ld linker file
recipe.hooks.linking.prelink.1.pattern="{compiler.path}{compiler.c.cmd}" -CC -E -P {build.vtable_flags} "{runtime.platform.path}/tools/sdk/ld/eagle.app.v6.common.ld.h" -o "{build.path}/local.eagle.app.v6.common.ld"
@@ -107,14 +106,8 @@ recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {build.exception_
recipe.objcopy.eep.pattern=
## Create hex
-#recipe.objcopy.hex.pattern="{compiler.path}{compiler.elf2hex.cmd}" {compiler.elf2hex.flags} {compiler.elf2hex.extra_flags} "{build.path}/{build.project_name}.elf" "{build.path}/{build.project_name}.hex"
-
-recipe.objcopy.hex.1.pattern="{runtime.tools.esptool.path}/{compiler.esptool.cmd}" -eo "{runtime.platform.path}/bootloaders/eboot/eboot.elf" -bo "{build.path}/{build.project_name}.bin" -bm {build.flash_mode} -bf {build.flash_freq} -bz {build.flash_size} -bs .text -bp 4096 -ec -eo "{build.path}/{build.project_name}.elf" -bs .irom0.text -bs .text -bs .data -bs .rodata -bc -ec
-recipe.objcopy.hex.2.pattern=python "{runtime.tools.signing}" --mode sign --privatekey "{build.source.path}/private.key" --bin "{build.path}/{build.project_name}.bin" --out "{build.path}/{build.project_name}.bin.signed"
-
-# No signing on Windows
-recipe.objcopy.hex.1.pattern.windows="{runtime.tools.esptool.path}/{compiler.esptool.cmd}" -eo "{runtime.platform.path}/bootloaders/eboot/eboot.elf" -bo "{build.path}/{build.project_name}.bin" -bm {build.flash_mode} -bf {build.flash_freq} -bz {build.flash_size} -bs .text -bp 4096 -ec -eo "{build.path}/{build.project_name}.elf" -bs .irom0.text -bs .text -bs .data -bs .rodata -bc -ec
-recipe.objcopy.hex.2.pattern.windows=
+recipe.objcopy.hex.1.pattern="{runtime.tools.python}" "{runtime.tools.elf2bin}" --eboot "{runtime.tools.eboot}" --app "{build.path}/{build.project_name}.elf" --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size {build.flash_size} --path "{runtime.tools.xtensa-lx106-elf-gcc.path}/bin" --out "{build.path}/{build.project_name}.bin"
+recipe.objcopy.hex.2.pattern="{runtime.tools.python}" "{runtime.tools.signing}" --mode sign --privatekey "{build.source.path}/private.key" --bin "{build.path}/{build.project_name}.bin" --out "{build.path}/{build.project_name}.bin.signed"
## Save hex
recipe.output.tmp_file={build.project_name}.bin
@@ -128,16 +121,23 @@ recipe.size.regex.data=^(?:\.data|\.rodata|\.bss)\s+([0-9]+).*
# ------------------------------
-tools.esptool.cmd=esptool
-tools.esptool.cmd.windows=esptool.exe
-tools.esptool.path={runtime.platform.path}/tools/esptool
+# Need to duplicate the python path because Arduino does not replace properly in this stage
+tools.esptool.cmd=python
+tools.esptool.cmd.windows={runtime.platform.path}/tools/python/python.exe
+tools.esptool.path=
tools.esptool.network_cmd=python
-tools.esptool.network_cmd.windows=python.exe
+tools.esptool.network_cmd.windows={runtime.platform.path}/tools/python/python.exe
tools.esptool.upload.protocol=esp
-tools.esptool.upload.params.verbose=-vv
+tools.esptool.upload.params.verbose=--trace
tools.esptool.upload.params.quiet=
-tools.esptool.upload.pattern="{path}/{cmd}" {upload.verbose} -cd {upload.resetmethod} -cb {upload.speed} -cp "{serial.port}" {upload.erase_cmd} -ca 0x00000 -cf "{build.path}/{build.project_name}.bin"
+
+# First, potentially perform an erase or nothing
+# Next, do the binary upload
+# Combined in one rule because Arduino doesn't suport upload.1.pattern/upload.3.pattern
+tools.esptool.upload.pattern="{cmd}" "{runtime.platform.path}/tools/upload.py" "{runtime.platform.path}/tools/pyserial" "{runtime.platform.path}/tools/esptool/esptool.py" --chip esp8266 --port "{serial.port}" --baud "{upload.speed}" "{upload.verbose}" {upload.erase_cmd} --end --chip esp8266 --port "{serial.port}" --baud "{upload.speed}" "{upload.verbose}" write_flash 0x0 "{build.path}/{build.project_name}.bin" --end
+
+
tools.esptool.upload.network_pattern="{network_cmd}" "{runtime.platform.path}/tools/espota.py" -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin"
tools.mkspiffs.cmd=mkspiffs
diff --git a/tools/boards.txt.py b/tools/boards.txt.py
index 1ff9be674..b6512a53f 100755
--- a/tools/boards.txt.py
+++ b/tools/boards.txt.py
@@ -851,7 +851,7 @@ macros = {
( '.upload.tool', 'esptool' ),
( '.upload.maximum_data_size', '81920' ),
( '.upload.wait_for_upload_port', 'true' ),
- ( '.upload.erase_cmd', ''),
+ ( '.upload.erase_cmd', 'version'),
( '.serial.disableDTR', 'true' ),
( '.serial.disableRTS', 'true' ),
( '.build.mcu', 'esp8266' ),
@@ -1066,11 +1066,11 @@ macros = {
'flash_erase_menu': collections.OrderedDict([
( '.menu.wipe.none', 'Only Sketch' ),
- ( '.menu.wipe.none.upload.erase_cmd', '' ),
+ ( '.menu.wipe.none.upload.erase_cmd', 'version' ),
( '.menu.wipe.sdk', 'Sketch + WiFi Settings' ),
- ( '.menu.wipe.sdk.upload.erase_cmd', '-ca "{build.rfcal_addr}" -cz 0x4000' ),
+ ( '.menu.wipe.sdk.upload.erase_cmd', 'erase_region "{build.rfcal_addr}" 0x4000' ),
( '.menu.wipe.all', 'All Flash Contents' ),
- ( '.menu.wipe.all.upload.erase_cmd', '-ca 0x0 -cz "{build.flash_size_bytes}"' ),
+ ( '.menu.wipe.all.upload.erase_cmd', 'erase_flash' ),
]),
}
diff --git a/tools/elf2bin.py b/tools/elf2bin.py
new file mode 100755
index 000000000..0d3c8b3be
--- /dev/null
+++ b/tools/elf2bin.py
@@ -0,0 +1,119 @@
+#!/usr/bin/env python
+
+# Generate an Arduino compatible BIN file from bootloader and sketch ELF
+# Replaces esptool-ck.exe and emulates its behavior.
+#
+# Copyright (C) 2019 - Earle F. Philhower, III
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+import argparse
+import re
+import os
+import subprocess
+import sys
+import tempfile
+
+fmodeb = { 'dout': 3, 'dio': 2, 'quot': 1, 'qio': 0 }
+ffreqb = { '40': 0, '26': 1, '20': 2, '80': 15 }
+fsizeb = { '512K': 0, '256K': 1, '1M': 2, '2M': 3, '4M': 4, '8M': 8, '16M': 9 }
+
+def get_elf_entry(elf, path):
+ p = subprocess.Popen([path + "/xtensa-lx106-elf-readelf", '-h', elf], stdout=subprocess.PIPE, universal_newlines=True )
+ lines = p.stdout.readlines()
+ for line in lines:
+ if 'Entry point address' in line:
+ words = re.split('\s+', line)
+ entry_point = words[-2]
+ return int(entry_point, 16)
+ raise Exception('Unable to find entry point in file "' + elf + '"')
+
+def get_segment_size_addr(elf, segment, path):
+ p = subprocess.Popen([path + '/xtensa-lx106-elf-objdump', '-h', '-j', segment, elf], stdout=subprocess.PIPE, universal_newlines=True )
+ lines = p.stdout.readlines()
+ for line in lines:
+ if segment in line:
+ words = re.split('\s+', line)
+ size = int(words[3], 16)
+ addr = int(words[4], 16)
+ return [ size, addr ]
+ raise Exception('Unable to find size and start point in file "' + elf + '" for "' + segment + '"')
+
+def read_segment(elf, segment, path):
+ tmpfile, dumpfile = tempfile.mkstemp()
+ os.close(tmpfile)
+ p = subprocess.check_call([path + "/xtensa-lx106-elf-objcopy", '-O', 'binary', '--only-section=' + segment, elf, dumpfile], stdout=subprocess.PIPE)
+ binfile = open(dumpfile, "rb")
+ raw = binfile.read()
+ binfile.close()
+ return raw
+
+def write_bin(out, elf, segments, to_addr, flash_mode, flash_size, flash_freq, path):
+ entry = int(get_elf_entry( elf, path ))
+ header = [ 0xe9, len(segments), fmodeb[flash_mode], ffreqb[flash_freq] + 16 * fsizeb[flash_size],
+ entry & 255, (entry>>8) & 255, (entry>>16) & 255, (entry>>24) & 255 ]
+ out.write(bytearray(header))
+ total_size = 8
+ checksum = 0xef
+ for segment in segments:
+ [size, addr] = get_segment_size_addr(elf, segment, path)
+ seghdr = [ addr & 255, (addr>>8) & 255, (addr>>16) & 255, (addr>>24) & 255,
+ size & 255, (size>>8) & 255, (size>>16) & 255, (size>>24) & 255]
+ out.write(bytearray(seghdr));
+ total_size += 8;
+ raw = read_segment(elf, segment, path)
+ if len(raw) != size:
+ raise Exception('Segment size doesn\'t match read data for "' + segment + '" in "' + elf + '"')
+ out.write(raw)
+ total_size += len(raw)
+ try:
+ for data in raw:
+ checksum = checksum ^ ord(data)
+ except:
+ for data in raw:
+ checksum = checksum ^ data
+ total_size += 1
+ while total_size & 15:
+ total_size += 1
+ out.write(bytearray([0]))
+ out.write(bytearray([checksum]))
+ if to_addr != 0:
+ while total_size < to_addr:
+ out.write(bytearray([0xaa]))
+ total_size += 1
+
+def main():
+ parser = argparse.ArgumentParser(description='Create a BIN file from eboot.elf and Arduino sketch.elf for upload by esptool.py')
+ parser.add_argument('-e', '--eboot', action='store', required=True, help='Path to the Arduino eboot.elf bootloader')
+ parser.add_argument('-a', '--app', action='store', required=True, help='Path to the Arduino sketch ELF')
+ parser.add_argument('-m', '--flash_mode', action='store', required=True, choices=['dout', 'dio', 'qout', 'qio'], help='SPI flash mode')
+ parser.add_argument('-f', '--flash_freq', action='store', required=True, choices=['20', '26', '40', '80'], help='SPI flash speed')
+ parser.add_argument('-s', '--flash_size', action='store', required=True, choices=['256K', '512K', '1M', '2M', '4M', '8M', '16M'], help='SPI flash size')
+ parser.add_argument('-o', '--out', action='store', required=True, help='Output BIN filename')
+ parser.add_argument('-p', '--path', action='store', required=True, help='Path to Xtensa toolchain binaries')
+
+ args = parser.parse_args()
+
+ print('Creating BIN file "' + args.out + '" using "' + args.app + '"')
+
+ out = open(args.out, "wb")
+ write_bin(out, args.eboot, ['.text'], 4096, args.flash_mode, args.flash_size, args.flash_freq, args.path)
+ write_bin(out, args.app, ['.irom0.text', '.text', '.data', '.rodata'], 0, args.flash_mode, args.flash_size, args.flash_freq, args.path)
+ out.close()
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/tools/esptool b/tools/esptool
new file mode 160000
index 000000000..9ad444a6e
--- /dev/null
+++ b/tools/esptool
@@ -0,0 +1 @@
+Subproject commit 9ad444a6e06e58833d5e6044c1d5f3eb3dd56023
diff --git a/tools/makecorever.py b/tools/makecorever.py
new file mode 100755
index 000000000..fd5556630
--- /dev/null
+++ b/tools/makecorever.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python
+
+# Generate the core_version.h header per-build
+#
+# Copyright (C) 2019 - Earle F. Philhower, III
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+
+import argparse
+import os
+import subprocess
+
+parser = argparse.ArgumentParser(description='Generate core_version.h')
+parser.add_argument('-b', '--build_path', action='store', required=True, help='build.path variable')
+parser.add_argument('-p', '--platform_path', action='store', required=True, help='platform.path variable')
+parser.add_argument('-v', '--version', action='store', required=True, help='version variable')
+
+args = parser.parse_args()
+
+core = args.build_path + '/core'
+try:
+ os.makedirs(core)
+except:
+ pass
+
+out = open(core + '/core_version.h', "w")
+
+try:
+ p = subprocess.Popen(['git', '--git-dir', args.platform_path + '/.git', 'rev-parse', '--short=8', 'HEAD'], stdout = subprocess.PIPE )
+ git_ver = '0x' + p.stdout.readlines()[0].strip()
+ p = subprocess.Popen(['git', '--git-dir', args.platform_path + '/.git', 'describe', '--tags'], stdout = subprocess.PIPE )
+ git_desc = p.stdout.readlines()[0].strip()
+except:
+ git_ver = '0xffffffff'
+ git_desc = args.version
+
+out.write('#define ARDUINO_ESP8266_GIT_VER ' + git_ver + '\n')
+out.write('#define ARDUINO_ESP8266_GIT_DESC ' + git_desc + '\n')
+
+out.close()
diff --git a/tools/pyserial b/tools/pyserial
new file mode 160000
index 000000000..c54c81d93
--- /dev/null
+++ b/tools/pyserial
@@ -0,0 +1 @@
+Subproject commit c54c81d933b847458d465cd77e96cd702ff2e7be
diff --git a/tools/upload.py b/tools/upload.py
new file mode 100755
index 000000000..0897c5be0
--- /dev/null
+++ b/tools/upload.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+
+# Wrapper for Arduino core / others that can call esptool.py possibly multiple times
+# Adds pyserial to sys.path automatically based on the path of the current file
+
+# First patameter is pyserial path, then a series of command arguments separated with --end
+# i.e. upload.py tools/pyserial tools/esptool/esptool.py erase_flash --end write_flash file 0x0 --end
+
+import inspect
+import os
+import sys
+
+sys.argv.pop(0) # Remove executable name
+try:
+ sys.path.append(sys.argv.pop(0).replace('\\', '/')) # Add pyserial dir to search path, in UNIX format
+ esptool = sys.argv.pop(0).replace('\\', '/') # Full path to esptool.py, in UNIX format
+except:
+ sys.stderr.write("Error in command line, need pyserial path as 1st arg and esptool path as 2nd.\n")
+ sys.exit(1)
+
+fakeargs = [];
+while len(sys.argv):
+ if sys.argv[0] == '--end':
+ pid = os.fork()
+ if pid == 0:
+ sys.argv = ['esptool.py'] + fakeargs
+ sys.stderr.write("Running: " + " ".join(sys.argv) + "\n")
+ exec(open(esptool).read())
+ sys.exit(0)
+ else:
+ os.waitpid(pid, 0)
+ sys.argv.pop(0) # Remove --end
+ fakeargs = []
+ else:
+ # We silently replace the 921kbaud setting with 460k to enable backward
+ # compatibility with the old esptool-ck.exe. Esptool.py doesn't seem
+ # work reliably at 921k, but is still significantly faster at 460kbaud.
+ thisarg = sys.argv.pop(0)
+ if thisarg == "921600":
+ thisarg = "460800"
+ fakeargs = fakeargs + [thisarg]