From 80f34efb0c9620174733a77b9557e97fbcb291c7 Mon Sep 17 00:00:00 2001
From: me-no-dev <hristo@espressif.com>
Date: Sat, 15 Dec 2018 22:01:19 +0100
Subject: [PATCH] Update build tools

---
 boards.txt                                |  96 +++++++++++-----------
 package/package_esp32_index.template.json |  48 +++++------
 platform.txt                              |  28 +++----
 tools/build-release.sh                    |   2 +-
 tools/gen_esp32part.exe                   | Bin 3339887 -> 3340130 bytes
 5 files changed, 87 insertions(+), 87 deletions(-)

diff --git a/boards.txt b/boards.txt
index a31f995cb2b..ea64d3b26f1 100644
--- a/boards.txt
+++ b/boards.txt
@@ -10,7 +10,7 @@ menu.PSRAM=PSRAM
 
 esp32.name=ESP32 Dev Module
 
-esp32.upload.tool=esptool
+esp32.upload.tool=esptool_py
 esp32.upload.maximum_size=1310720
 esp32.upload.maximum_data_size=327680
 esp32.upload.wait_for_upload_port=true
@@ -108,7 +108,7 @@ esp32.menu.DebugLevel.verbose.build.code_debug=5
 
 esp32wrover.name=ESP32 Wrover Module
 
-esp32wrover.upload.tool=esptool
+esp32wrover.upload.tool=esptool_py
 esp32wrover.upload.maximum_size=1310720
 esp32wrover.upload.maximum_data_size=327680
 esp32wrover.upload.wait_for_upload_port=true
@@ -190,7 +190,7 @@ esp32wrover.menu.DebugLevel.verbose.build.code_debug=5
 
 pico32.name=ESP32 Pico Kit
 
-pico32.upload.tool=esptool
+pico32.upload.tool=esptool_py
 pico32.upload.maximum_size=1310720
 pico32.upload.maximum_data_size=327680
 pico32.upload.wait_for_upload_port=true
@@ -243,7 +243,7 @@ pico32.menu.DebugLevel.verbose.build.code_debug=5
 
 ttgo-lora32-v1.name=TTGO LoRa32-OLED V1
 
-ttgo-lora32-v1.upload.tool=esptool
+ttgo-lora32-v1.upload.tool=esptool_py
 ttgo-lora32-v1.upload.maximum_size=1310720
 ttgo-lora32-v1.upload.maximum_data_size=294912
 ttgo-lora32-v1.upload.wait_for_upload_port=true
@@ -299,7 +299,7 @@ ttgo-lora32-v1.menu.DebugLevel.verbose.build.code_debug=5
 
 cw02.name=XinaBox CW02
 
-cw02.upload.tool=esptool
+cw02.upload.tool=esptool_py
 cw02.upload.maximum_size=1310720
 cw02.upload.maximum_data_size=294912
 cw02.upload.wait_for_upload_port=true
@@ -375,7 +375,7 @@ cw02.menu.DebugLevel.verbose.build.code_debug=5
 
 esp32thing.name=SparkFun ESP32 Thing
 
-esp32thing.upload.tool=esptool
+esp32thing.upload.tool=esptool_py
 esp32thing.upload.maximum_size=1310720
 esp32thing.upload.maximum_data_size=327680
 esp32thing.upload.wait_for_upload_port=true
@@ -442,7 +442,7 @@ esp32thing.menu.DebugLevel.verbose.build.code_debug=5
 
 nina_w10.name=u-blox NINA-W10 series (ESP32)
 
-nina_w10.upload.tool=esptool
+nina_w10.upload.tool=esptool_py
 nina_w10.upload.maximum_size=1310720
 nina_w10.upload.maximum_data_size=327680
 nina_w10.upload.wait_for_upload_port=true
@@ -481,7 +481,7 @@ nina_w10.menu.UploadSpeed.512000.upload.speed=512000
 
 widora-air.name=Widora AIR
 
-widora-air.upload.tool=esptool
+widora-air.upload.tool=esptool_py
 widora-air.upload.maximum_size=1310720
 widora-air.upload.maximum_data_size=327680
 widora-air.upload.wait_for_upload_port=true
@@ -525,7 +525,7 @@ widora-air.menu.UploadSpeed.512000.upload.speed=512000
 
 esp320.name=Electronic SweetPeas - ESP320
 
-esp320.upload.tool=esptool
+esp320.upload.tool=esptool_py
 esp320.upload.maximum_size=1310720
 esp320.upload.maximum_data_size=327680
 esp320.upload.wait_for_upload_port=true
@@ -569,7 +569,7 @@ esp320.menu.UploadSpeed.512000.upload.speed=512000
 
 nano32.name=Nano32
 
-nano32.upload.tool=esptool
+nano32.upload.tool=esptool_py
 nano32.upload.maximum_size=1310720
 nano32.upload.maximum_data_size=327680
 nano32.upload.wait_for_upload_port=true
@@ -613,7 +613,7 @@ nano32.menu.UploadSpeed.512000.upload.speed=512000
 
 d32.name=LOLIN D32
 
-d32.upload.tool=esptool
+d32.upload.tool=esptool_py
 d32.upload.maximum_size=1310720
 d32.upload.maximum_data_size=327680
 d32.upload.wait_for_upload_port=true
@@ -686,7 +686,7 @@ d32.menu.DebugLevel.verbose.build.code_debug=5
 
 d32_pro.name=LOLIN D32 PRO
 
-d32_pro.upload.tool=esptool
+d32_pro.upload.tool=esptool_py
 d32_pro.upload.maximum_size=1310720
 d32_pro.upload.maximum_data_size=327680
 d32_pro.upload.wait_for_upload_port=true
@@ -764,7 +764,7 @@ d32_pro.menu.DebugLevel.verbose.build.code_debug=5
 
 lolin32.name=WEMOS LOLIN32
 
-lolin32.upload.tool=esptool
+lolin32.upload.tool=esptool_py
 lolin32.upload.maximum_size=1310720
 lolin32.upload.maximum_data_size=327680
 lolin32.upload.wait_for_upload_port=true
@@ -817,7 +817,7 @@ lolin32.menu.UploadSpeed.512000.upload.speed=512000
 
 pocket_32.name=Dongsen Tech Pocket 32
 
-pocket_32.upload.tool=esptool
+pocket_32.upload.tool=esptool_py
 pocket_32.upload.maximum_size=1310720
 pocket_32.upload.maximum_data_size=327680
 pocket_32.upload.wait_for_upload_port=true
@@ -861,7 +861,7 @@ pocket_32.menu.UploadSpeed.512000.upload.speed=512000
 
 WeMosBat.name="WeMos" WiFi&Bluetooth Battery
 
-WeMosBat.upload.tool=esptool
+WeMosBat.upload.tool=esptool_py
 WeMosBat.upload.maximum_size=1310720
 WeMosBat.upload.maximum_data_size=327680
 WeMosBat.upload.wait_for_upload_port=true
@@ -918,7 +918,7 @@ WeMosBat.menu.DebugLevel.verbose.build.code_debug=5
 
 espea32.name=ESPea32
 
-espea32.upload.tool=esptool
+espea32.upload.tool=esptool_py
 espea32.upload.maximum_size=1310720
 espea32.upload.maximum_data_size=327680
 espea32.upload.wait_for_upload_port=true
@@ -962,7 +962,7 @@ espea32.menu.UploadSpeed.512000.upload.speed=512000
 
 quantum.name=Noduino Quantum
 
-quantum.upload.tool=esptool
+quantum.upload.tool=esptool_py
 quantum.upload.maximum_size=1310720
 quantum.upload.maximum_data_size=327680
 quantum.upload.wait_for_upload_port=true
@@ -1006,7 +1006,7 @@ quantum.menu.UploadSpeed.512000.upload.speed=512000
 
 node32s.name=Node32s
 
-node32s.upload.tool=esptool
+node32s.upload.tool=esptool_py
 node32s.upload.maximum_size=1310720
 node32s.upload.maximum_data_size=327680
 node32s.upload.wait_for_upload_port=true
@@ -1050,7 +1050,7 @@ node32s.menu.UploadSpeed.512000.upload.speed=512000
 
 hornbill32dev.name=Hornbill ESP32 Dev
 
-hornbill32dev.upload.tool=esptool
+hornbill32dev.upload.tool=esptool_py
 hornbill32dev.upload.maximum_size=1310720
 hornbill32dev.upload.maximum_data_size=327680
 hornbill32dev.upload.wait_for_upload_port=true
@@ -1094,7 +1094,7 @@ hornbill32dev.menu.UploadSpeed.512000.upload.speed=512000
 
 hornbill32minima.name=Hornbill ESP32 Minima
 
-hornbill32minima.upload.tool=esptool
+hornbill32minima.upload.tool=esptool_py
 hornbill32minima.upload.maximum_size=1310720
 hornbill32minima.upload.maximum_data_size=327680
 hornbill32minima.upload.wait_for_upload_port=true
@@ -1137,7 +1137,7 @@ hornbill32minima.menu.UploadSpeed.512000.upload.speed=512000
 
 firebeetle32.name=FireBeetle-ESP32
 
-firebeetle32.upload.tool=esptool
+firebeetle32.upload.tool=esptool_py
 firebeetle32.upload.maximum_size=1310720
 firebeetle32.upload.maximum_data_size=327680
 firebeetle32.upload.wait_for_upload_port=true
@@ -1181,7 +1181,7 @@ firebeetle32.menu.UploadSpeed.512000.upload.speed=512000
 
 intorobot-fig.name=IntoRobot Fig
 
-intorobot-fig.upload.tool=esptool
+intorobot-fig.upload.tool=esptool_py
 intorobot-fig.upload.maximum_size=1310720
 intorobot-fig.upload.maximum_data_size=327680
 intorobot-fig.upload.wait_for_upload_port=true
@@ -1225,7 +1225,7 @@ intorobot-fig.menu.UploadSpeed.512000.upload.speed=512000
 
 onehorse32dev.name=Onehorse ESP32 Dev Module
 
-onehorse32dev.upload.tool=esptool
+onehorse32dev.upload.tool=esptool_py
 onehorse32dev.upload.maximum_size=1310720
 onehorse32dev.upload.maximum_data_size=327680
 onehorse32dev.upload.wait_for_upload_port=true
@@ -1269,7 +1269,7 @@ onehorse32dev.menu.UploadSpeed.512000.upload.speed=512000
 
 featheresp32.name=Adafruit ESP32 Feather
 
-featheresp32.upload.tool=esptool
+featheresp32.upload.tool=esptool_py
 featheresp32.upload.maximum_size=1310720
 featheresp32.upload.maximum_data_size=327680
 featheresp32.upload.wait_for_upload_port=true
@@ -1326,7 +1326,7 @@ featheresp32.menu.DebugLevel.verbose.build.code_debug=5
 
 nodemcu-32s.name=NodeMCU-32S
 
-nodemcu-32s.upload.tool=esptool
+nodemcu-32s.upload.tool=esptool_py
 nodemcu-32s.upload.maximum_size=1310720
 nodemcu-32s.upload.maximum_data_size=327680
 nodemcu-32s.upload.wait_for_upload_port=true
@@ -1370,7 +1370,7 @@ nodemcu-32s.menu.UploadSpeed.512000.upload.speed=512000
 
 mhetesp32devkit.name=MH ET LIVE ESP32DevKIT
 
-mhetesp32devkit.upload.tool=esptool
+mhetesp32devkit.upload.tool=esptool_py
 mhetesp32devkit.upload.maximum_size=1310720
 mhetesp32devkit.upload.maximum_data_size=327680
 mhetesp32devkit.upload.wait_for_upload_port=true
@@ -1436,7 +1436,7 @@ mhetesp32devkit.menu.DebugLevel.verbose.build.code_debug=5
 
 mhetesp32minikit.name=MH ET LIVE ESP32MiniKit
 
-mhetesp32minikit.upload.tool=esptool
+mhetesp32minikit.upload.tool=esptool_py
 mhetesp32minikit.upload.maximum_size=1310720
 mhetesp32minikit.upload.maximum_data_size=327680
 mhetesp32minikit.upload.wait_for_upload_port=true
@@ -1502,7 +1502,7 @@ mhetesp32minikit.menu.DebugLevel.verbose.build.code_debug=5
 
 esp32vn-iot-uno.name=ESP32vn IoT Uno
 
-esp32vn-iot-uno.upload.tool=esptool
+esp32vn-iot-uno.upload.tool=esptool_py
 esp32vn-iot-uno.upload.maximum_size=1310720
 esp32vn-iot-uno.upload.maximum_data_size=327680
 esp32vn-iot-uno.upload.wait_for_upload_port=true
@@ -1546,7 +1546,7 @@ esp32vn-iot-uno.menu.UploadSpeed.512000.upload.speed=512000
 
 esp32doit-devkit-v1.name=DOIT ESP32 DEVKIT V1
 
-esp32doit-devkit-v1.upload.tool=esptool
+esp32doit-devkit-v1.upload.tool=esptool_py
 esp32doit-devkit-v1.upload.maximum_size=1310720
 esp32doit-devkit-v1.upload.maximum_data_size=327680
 esp32doit-devkit-v1.upload.wait_for_upload_port=true
@@ -1601,7 +1601,7 @@ esp32doit-devkit-v1.menu.DebugLevel.debug.build.code_debug=4
 
 esp32-evb.name=OLIMEX ESP32-EVB
 
-esp32-evb.upload.tool=esptool
+esp32-evb.upload.tool=esptool_py
 esp32-evb.upload.maximum_size=1310720
 esp32-evb.upload.maximum_data_size=327680
 esp32-evb.upload.wait_for_upload_port=true
@@ -1634,7 +1634,7 @@ esp32-evb.menu.UploadSpeed.115200.upload.speed=115200
 
 esp32-gateway.name=OLIMEX ESP32-GATEWAY
 
-esp32-gateway.upload.tool=esptool
+esp32-gateway.upload.tool=esptool_py
 esp32-gateway.upload.maximum_size=1310720
 esp32-gateway.upload.maximum_data_size=327680
 esp32-gateway.upload.wait_for_upload_port=true
@@ -1667,7 +1667,7 @@ esp32-gateway.menu.UploadSpeed.115200.upload.speed=115200
 
 esp32-poe.name=OLIMEX ESP32-PoE
 
-esp32-poe.upload.tool=esptool
+esp32-poe.upload.tool=esptool_py
 esp32-poe.upload.maximum_size=1310720
 esp32-poe.upload.maximum_data_size=327680
 esp32-poe.upload.wait_for_upload_port=true
@@ -1700,7 +1700,7 @@ esp32-poe.menu.UploadSpeed.115200.upload.speed=115200
 
 espino32.name=ThaiEasyElec's ESPino32
 
-espino32.upload.tool=esptool
+espino32.upload.tool=esptool_py
 espino32.upload.maximum_size=1310720
 espino32.upload.maximum_data_size=327680
 espino32.upload.wait_for_upload_port=true
@@ -1744,7 +1744,7 @@ espino32.menu.UploadSpeed.512000.upload.speed=512000
 
 m5stack-core-esp32.name=M5Stack-Core-ESP32
 
-m5stack-core-esp32.upload.tool=esptool
+m5stack-core-esp32.upload.tool=esptool_py
 m5stack-core-esp32.upload.maximum_size=1310720
 m5stack-core-esp32.upload.maximum_data_size=327680
 m5stack-core-esp32.upload.wait_for_upload_port=true
@@ -1823,7 +1823,7 @@ m5stack-core-esp32.menu.DebugLevel.verbose.build.code_debug=5
 
 m5stack-fire.name=M5Stack-FIRE
 
-m5stack-fire.upload.tool=esptool
+m5stack-fire.upload.tool=esptool_py
 m5stack-fire.upload.maximum_size=6553600
 m5stack-fire.upload.maximum_data_size=4521984
 m5stack-fire.upload.wait_for_upload_port=true
@@ -1887,7 +1887,7 @@ m5stack-fire.menu.DebugLevel.verbose.build.code_debug=5
 
 odroid_esp32.name=ODROID ESP32
 
-odroid_esp32.upload.tool=esptool
+odroid_esp32.upload.tool=esptool_py
 odroid_esp32.upload.maximum_size=1310720
 odroid_esp32.upload.maximum_data_size=327680
 odroid_esp32.upload.wait_for_upload_port=true
@@ -1966,7 +1966,7 @@ odroid_esp32.menu.DebugLevel.verbose.build.code_debug=5
 
 heltec_wifi_kit_32.name=Heltec_WIFI_Kit_32
 
-heltec_wifi_kit_32.upload.tool=esptool
+heltec_wifi_kit_32.upload.tool=esptool_py
 heltec_wifi_kit_32.upload.maximum_size=1310720
 heltec_wifi_kit_32.upload.maximum_data_size=327680
 heltec_wifi_kit_32.upload.wait_for_upload_port=true
@@ -2010,7 +2010,7 @@ heltec_wifi_kit_32.menu.UploadSpeed.512000.upload.speed=512000
 
 heltec_wifi_lora_32.name=Heltec_WIFI_LoRa_32
 
-heltec_wifi_lora_32.upload.tool=esptool
+heltec_wifi_lora_32.upload.tool=esptool_py
 heltec_wifi_lora_32.upload.maximum_size=1310720
 heltec_wifi_lora_32.upload.maximum_data_size=327680
 heltec_wifi_lora_32.upload.wait_for_upload_port=true
@@ -2054,7 +2054,7 @@ heltec_wifi_lora_32.menu.UploadSpeed.512000.upload.speed=512000
 
 espectro32.name=ESPectro32
 
-espectro32.upload.tool=esptool
+espectro32.upload.tool=esptool_py
 espectro32.upload.maximum_size=1310720
 espectro32.upload.maximum_data_size=327680
 espectro32.upload.wait_for_upload_port=true
@@ -2130,7 +2130,7 @@ espectro32.menu.DebugLevel.verbose.build.code_debug=5
 ##############################################################
 CoreESP32.name=Microduino-CoreESP32
 
-CoreESP32.upload.tool=esptool
+CoreESP32.upload.tool=esptool_py
 CoreESP32.upload.maximum_size=1310720
 CoreESP32.upload.maximum_data_size=327680
 CoreESP32.upload.wait_for_upload_port=true
@@ -2175,7 +2175,7 @@ CoreESP32.menu.UploadSpeed.512000.upload.speed=512000
 
 alksesp32.name=ALKS ESP32
 
-alksesp32.upload.tool=esptool
+alksesp32.upload.tool=esptool_py
 alksesp32.upload.maximum_size=1310720
 alksesp32.upload.maximum_data_size=327680
 alksesp32.upload.wait_for_upload_port=true
@@ -2264,7 +2264,7 @@ alksesp32.menu.DebugLevel.verbose.build.code_debug=5
 
 wipy3.name=WiPy 3.0
 
-wipy3.upload.tool=esptool
+wipy3.upload.tool=esptool_py
 wipy3.upload.maximum_size=1310720
 wipy3.upload.maximum_data_size=294912
 wipy3.upload.wait_for_upload_port=true
@@ -2321,7 +2321,7 @@ wipy3.menu.DebugLevel.verbose.build.code_debug=5
 
 bpi-bit.name=BPI-BIT
 
-bpi-bit.upload.tool=esptool
+bpi-bit.upload.tool=esptool_py
 bpi-bit.upload.maximum_size=1310720
 bpi-bit.upload.maximum_data_size=294912
 bpi-bit.upload.wait_for_upload_port=true
@@ -2364,7 +2364,7 @@ bpi-bit.menu.UploadSpeed.512000.upload.speed=512000
 
 wesp32.name=Silicognition wESP32
 
-wesp32.upload.tool=esptool
+wesp32.upload.tool=esptool_py
 wesp32.upload.maximum_size=1310720
 wesp32.upload.maximum_data_size=327680
 wesp32.upload.wait_for_upload_port=true
@@ -2421,7 +2421,7 @@ wesp32.menu.DebugLevel.verbose.build.code_debug=5
 
 t-beam.name=T-Beam
 
-t-beam.upload.tool=esptool
+t-beam.upload.tool=esptool_py
 t-beam.upload.maximum_size=1310720
 t-beam.upload.maximum_data_size=327680
 t-beam.upload.wait_for_upload_port=true
@@ -2482,7 +2482,7 @@ t-beam.menu.DebugLevel.verbose.build.code_debug=5
 
 d-duino-32.name=D-duino-32
 
-d-duino-32.upload.tool=esptool
+d-duino-32.upload.tool=esptool_py
 d-duino-32.upload.maximum_size=1310720
 d-duino-32.upload.maximum_data_size=327680
 d-duino-32.upload.wait_for_upload_port=true
@@ -2553,7 +2553,7 @@ d-duino-32.menu.DebugLevel.verbose.build.code_debug=5
 
 lopy.name=LoPy
 
-lopy.upload.tool=esptool
+lopy.upload.tool=esptool_py
 lopy.upload.maximum_size=1310720
 lopy.upload.maximum_data_size=327680
 lopy.upload.wait_for_upload_port=true
@@ -2609,7 +2609,7 @@ lopy.menu.DebugLevel.verbose.build.code_debug=5
 
 lopy4.name=LoPy4
 
-lopy4.upload.tool=esptool
+lopy4.upload.tool=esptool_py
 lopy4.upload.maximum_size=1310720
 lopy4.upload.maximum_data_size=327680
 lopy4.upload.wait_for_upload_port=true
diff --git a/package/package_esp32_index.template.json b/package/package_esp32_index.template.json
index 791dc307ca8..ec5bdfbbf66 100644
--- a/package/package_esp32_index.template.json
+++ b/package/package_esp32_index.template.json
@@ -37,8 +37,8 @@
             },
             {
               "packager": "esp32",
-              "name": "esptool",
-              "version": "2.5.0"
+              "name": "esptool_py",
+              "version": "2.6.0"
             },
             {
               "packager": "esp32",
@@ -84,43 +84,43 @@
           ]
         },
         {
-          "name": "esptool",
-          "version": "2.5.0",
+          "name": "esptool_py",
+          "version": "2.6.0",
           "systems": [
             {
               "host": "i686-mingw32",
-              "url": "https://dl.espressif.com/dl/esptool-2.5.0-windows.zip",
-              "archiveFileName": "esptool-2.5.0-windows.zip",
-              "checksum": "SHA-256:576b8068b577cae0e6e937566a9d32a08ff7ff82963fb60400eacb6691f2fbfb",
-              "size": "3420959"
+              "url": "https://dl.espressif.com/dl/esptool-2.6.0-windows.zip",
+              "archiveFileName": "esptool-2.6.0-windows.zip",
+              "checksum": "SHA-256:a73f4cf68db240d7f1d250c5c7f2dfcb53c17a37483729f1bf71f8f43d79a799",
+              "size": "3421208"
             },
             {
               "host": "x86_64-apple-darwin",
-              "url": "https://dl.espressif.com/dl/esptool-2.5.0-macos.tar.gz",
-              "archiveFileName": "esptool-2.5.0-macos.tar.gz",
-              "checksum": "SHA-256:2da8ba3b83d99b5d808cab955a077e3e0738ec640b51de932d047cad7fac1157",
-              "size": "3835397"
+              "url": "https://dl.espressif.com/dl/esptool-2.6.0-macos.tar.gz",
+              "archiveFileName": "esptool-2.6.0-macos.tar.gz",
+              "checksum": "SHA-256:0a881b91547c840fab8c72ae3d031069384278b8c2e5241647e8c8292c5e4a4b",
+              "size": "3835660"
             },
             {
               "host": "x86_64-pc-linux-gnu",
-              "url": "https://dl.espressif.com/dl/esptool-2.5.0-linux.tar.gz",
-              "archiveFileName": "esptool-2.5.0-linux.tar.gz",
-              "checksum": "SHA-256:34d63b9a0bf2acb9b6fdac15f91a8756f4e722065de031e8fbce4e4abc369e54",
-              "size": "43468"
+              "url": "https://dl.espressif.com/dl/esptool-2.6.0-linux.tar.gz",
+              "archiveFileName": "esptool-2.6.0-linux.tar.gz",
+              "checksum": "SHA-256:6d162f70f395ca31f5008829dd7e833e729f044a9c7355d5be8ce333a054e110",
+              "size": "43535"
             },
             {
               "host": "i686-pc-linux-gnu",
-              "url": "https://dl.espressif.com/dl/esptool-2.5.0-linux.tar.gz",
-              "archiveFileName": "esptool-2.5.0-linux.tar.gz",
-              "checksum": "SHA-256:34d63b9a0bf2acb9b6fdac15f91a8756f4e722065de031e8fbce4e4abc369e54",
-              "size": "43468"
+              "url": "https://dl.espressif.com/dl/esptool-2.6.0-linux.tar.gz",
+              "archiveFileName": "esptool-2.6.0-linux.tar.gz",
+              "checksum": "SHA-256:6d162f70f395ca31f5008829dd7e833e729f044a9c7355d5be8ce333a054e110",
+              "size": "43535"
             },
             {
               "host": "arm-linux-gnueabihf",
-              "url": "https://dl.espressif.com/dl/esptool-2.5.0-linux.tar.gz",
-              "archiveFileName": "esptool-2.5.0-linux.tar.gz",
-              "checksum": "SHA-256:34d63b9a0bf2acb9b6fdac15f91a8756f4e722065de031e8fbce4e4abc369e54",
-              "size": "43468"
+              "url": "https://dl.espressif.com/dl/esptool-2.6.0-linux.tar.gz",
+              "archiveFileName": "esptool-2.6.0-linux.tar.gz",
+              "checksum": "SHA-256:6d162f70f395ca31f5008829dd7e833e729f044a9c7355d5be8ce333a054e110",
+              "size": "43535"
             }
           ]
         },
diff --git a/platform.txt b/platform.txt
index 8401a7abe22..f351df79711 100644
--- a/platform.txt
+++ b/platform.txt
@@ -3,13 +3,13 @@ version=0.0.1
 
 runtime.tools.xtensa-esp32-elf-gcc.path={runtime.platform.path}/tools/xtensa-esp32-elf
 
-tools.esptool.path={runtime.platform.path}/tools/esptool
-tools.esptool.cmd=esptool
-tools.esptool.cmd.linux=esptool.py
-tools.esptool.cmd.windows=esptool.exe
+tools.esptool_py.path={runtime.platform.path}/tools/esptool
+tools.esptool_py.cmd=esptool
+tools.esptool_py.cmd.linux=esptool.py
+tools.esptool_py.cmd.windows=esptool.exe
 
-tools.esptool.network_cmd=python "{runtime.platform.path}/tools/espota.py"
-tools.esptool.network_cmd.windows="{runtime.platform.path}/tools/espota.exe"
+tools.esptool_py.network_cmd=python "{runtime.platform.path}/tools/espota.py"
+tools.esptool_py.network_cmd.windows="{runtime.platform.path}/tools/espota.exe"
 
 tools.gen_esp32part.cmd=python "{runtime.platform.path}/tools/gen_esp32part.py"
 tools.gen_esp32part.cmd.windows="{runtime.platform.path}/tools/gen_esp32part.exe"
@@ -80,8 +80,8 @@ recipe.c.combine.pattern="{compiler.path}{compiler.c.elf.cmd}" {compiler.c.elf.f
 recipe.objcopy.eep.pattern={tools.gen_esp32part.cmd} -q "{runtime.platform.path}/tools/partitions/{build.partitions}.csv" "{build.path}/{build.project_name}.partitions.bin"
 
 ## Create hex
-recipe.objcopy.hex.pattern="{tools.esptool.path}/{tools.esptool.cmd}" --chip esp32 elf2image --flash_mode "{build.flash_mode}" --flash_freq "{build.flash_freq}" --flash_size "{build.flash_size}" -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf"
-recipe.objcopy.hex.pattern.linux=python "{tools.esptool.path}/{tools.esptool.cmd}" --chip esp32 elf2image --flash_mode "{build.flash_mode}" --flash_freq "{build.flash_freq}" --flash_size "{build.flash_size}" -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf"
+recipe.objcopy.hex.pattern="{tools.esptool_py.path}/{tools.esptool_py.cmd}" --chip esp32 elf2image --flash_mode "{build.flash_mode}" --flash_freq "{build.flash_freq}" --flash_size "{build.flash_size}" -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf"
+recipe.objcopy.hex.pattern.linux=python "{tools.esptool_py.path}/{tools.esptool_py.cmd}" --chip esp32 elf2image --flash_mode "{build.flash_mode}" --flash_freq "{build.flash_freq}" --flash_size "{build.flash_size}" -o "{build.path}/{build.project_name}.bin" "{build.path}/{build.project_name}.elf"
 
 ## Save hex
 recipe.output.tmp_file={build.project_name}.bin
@@ -94,9 +94,9 @@ recipe.size.regex.data=^(?:\.dram0\.data|\.dram0\.bss|\.noinit)\s+([0-9]+).*
 
 # ------------------------------
 
-tools.esptool.upload.protocol=esp32
-tools.esptool.upload.params.verbose=
-tools.esptool.upload.params.quiet=
-tools.esptool.upload.pattern="{path}/{cmd}" --chip esp32 --port "{serial.port}" --baud {upload.speed}  --before default_reset --after hard_reset write_flash -z --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size detect 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x1000 "{runtime.platform.path}/tools/sdk/bin/bootloader_{build.boot}_{build.flash_freq}.bin" 0x10000 "{build.path}/{build.project_name}.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin"
-tools.esptool.upload.pattern.linux=python "{path}/{cmd}" --chip esp32 --port "{serial.port}" --baud {upload.speed}  --before default_reset --after hard_reset write_flash -z --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size detect 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x1000 "{runtime.platform.path}/tools/sdk/bin/bootloader_{build.boot}_{build.flash_freq}.bin" 0x10000 "{build.path}/{build.project_name}.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin"
-tools.esptool.upload.network_pattern={network_cmd} -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin"
+tools.esptool_py.upload.protocol=esp32
+tools.esptool_py.upload.params.verbose=
+tools.esptool_py.upload.params.quiet=
+tools.esptool_py.upload.pattern="{path}/{cmd}" --chip esp32 --port "{serial.port}" --baud {upload.speed}  --before default_reset --after hard_reset write_flash -z --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size detect 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x1000 "{runtime.platform.path}/tools/sdk/bin/bootloader_{build.boot}_{build.flash_freq}.bin" 0x10000 "{build.path}/{build.project_name}.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin"
+tools.esptool_py.upload.pattern.linux=python "{path}/{cmd}" --chip esp32 --port "{serial.port}" --baud {upload.speed}  --before default_reset --after hard_reset write_flash -z --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size detect 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x1000 "{runtime.platform.path}/tools/sdk/bin/bootloader_{build.boot}_{build.flash_freq}.bin" 0x10000 "{build.path}/{build.project_name}.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin"
+tools.esptool_py.upload.network_pattern={network_cmd} -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin"
diff --git a/tools/build-release.sh b/tools/build-release.sh
index cf729de5a42..3de516603b2 100755
--- a/tools/build-release.sh
+++ b/tools/build-release.sh
@@ -231,7 +231,7 @@ echo " - updating platform.txt..."
 cat $srcdir/platform.txt | \
 sed "s/version=.*/version=$ver$extent/g" | \
 sed 's/runtime.tools.xtensa-esp32-elf-gcc.path={runtime.platform.path}\/tools\/xtensa-esp32-elf//g' | \
-sed 's/tools.esptool.path={runtime.platform.path}\/tools\/esptool/tools.esptool.path=\{runtime.tools.esptool.path\}/g' \
+sed 's/tools.esptool_py.path={runtime.platform.path}\/tools\/esptool/tools.esptool_py.path=\{runtime.tools.esptool_py.path\}/g' \
  > $outdir/platform.txt
 
 # Put core version and short hash of git version into core_version.h
diff --git a/tools/gen_esp32part.exe b/tools/gen_esp32part.exe
index 55b8436a99fdb01d868ba41d947262a74786e059..f81ac71c56a1ab668d1f160bf82afbd1e2ebba6d 100644
GIT binary patch
delta 8955
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
N93K)ph~=JN<$s5TWMlvU

delta 8894
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
IfnE0h0q{*3iU0rr