diff --git a/.gitignore b/.gitignore index 6413393ea9..7fd384ea42 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,16 @@ boards.local.txt .vs/ __vm/ *.vcxproj* + +#Ignore files generated by boards.txt.py +*.orig +tools/sdk/ld/backup/* + +#Ignore my extra files +*.odt* +tools/Gui.py +tools/Replace2SpceWith4.txt +*(Kopie)* +platform.local.txt + + diff --git a/boards.txt b/boards.txt index fd05749760..f922d400cd 100644 --- a/boards.txt +++ b/boards.txt @@ -26,6 +26,9 @@ menu.sdk=Espressif FW menu.ssl=SSL Support menu.mmu=MMU menu.non32xfer=Non-32-Bit Access +menu.Upload=Upload +menu.Filesystem=Filesystem +menu.Export=Export ############################################################## generic.name=Generic ESP8266 Module @@ -42,6 +45,24 @@ generic.build.variant=generic generic.build.spiffs_pagesize=256 generic.build.debug_port= generic.build.debug_level= +generic.menu.Upload.Sketch=Sketch +generic.menu.Upload.Sketch.build.Upload=1 +generic.menu.Upload.Filesystem=Filesystem +generic.menu.Upload.Filesystem.build.Upload=2 +generic.menu.Upload.Both=Both +generic.menu.Upload.Both.build.Upload=3 +generic.menu.Filesystem.Off=Off +generic.menu.Filesystem.Off.build.Filesystem=0 +generic.menu.Filesystem.LitteFs=LitteFs +generic.menu.Filesystem.LitteFs.build.Filesystem=1 +generic.menu.Filesystem.SPIFFS=SPIFFS +generic.menu.Filesystem.SPIFFS.build.Filesystem=2 +generic.menu.Export.Off=Off +generic.menu.Export.Off.build.Export=0 +generic.menu.Export.Binaries=.bin & .bin.signed +generic.menu.Export.Binaries.build.Export=1 +generic.menu.Export.GzBinaries=Create & Export gzipped Binaries too +generic.menu.Export.GzBinaries.build.Export=2 generic.menu.xtal.80=80 MHz generic.menu.xtal.80.build.f_cpu=80000000L generic.menu.xtal.160=160 MHz @@ -539,6 +560,24 @@ esp8285.build.core=esp8266 esp8285.build.spiffs_pagesize=256 esp8285.build.debug_port= esp8285.build.debug_level= +esp8285.menu.Upload.Sketch=Sketch +esp8285.menu.Upload.Sketch.build.Upload=1 +esp8285.menu.Upload.Filesystem=Filesystem +esp8285.menu.Upload.Filesystem.build.Upload=2 +esp8285.menu.Upload.Both=Both +esp8285.menu.Upload.Both.build.Upload=3 +esp8285.menu.Filesystem.Off=Off +esp8285.menu.Filesystem.Off.build.Filesystem=0 +esp8285.menu.Filesystem.LitteFs=LitteFs +esp8285.menu.Filesystem.LitteFs.build.Filesystem=1 +esp8285.menu.Filesystem.SPIFFS=SPIFFS +esp8285.menu.Filesystem.SPIFFS.build.Filesystem=2 +esp8285.menu.Export.Off=Off +esp8285.menu.Export.Off.build.Export=0 +esp8285.menu.Export.Binaries=.bin & .bin.signed +esp8285.menu.Export.Binaries.build.Export=1 +esp8285.menu.Export.GzBinaries=Create & Export gzipped Binaries too +esp8285.menu.Export.GzBinaries.build.Export=2 esp8285.menu.xtal.80=80 MHz esp8285.menu.xtal.80.build.f_cpu=80000000L esp8285.menu.xtal.160=160 MHz @@ -906,6 +945,24 @@ gen4iod.build.core=esp8266 gen4iod.build.spiffs_pagesize=256 gen4iod.build.debug_port= gen4iod.build.debug_level= +gen4iod.menu.Upload.Sketch=Sketch +gen4iod.menu.Upload.Sketch.build.Upload=1 +gen4iod.menu.Upload.Filesystem=Filesystem +gen4iod.menu.Upload.Filesystem.build.Upload=2 +gen4iod.menu.Upload.Both=Both +gen4iod.menu.Upload.Both.build.Upload=3 +gen4iod.menu.Filesystem.Off=Off +gen4iod.menu.Filesystem.Off.build.Filesystem=0 +gen4iod.menu.Filesystem.LitteFs=LitteFs +gen4iod.menu.Filesystem.LitteFs.build.Filesystem=1 +gen4iod.menu.Filesystem.SPIFFS=SPIFFS +gen4iod.menu.Filesystem.SPIFFS.build.Filesystem=2 +gen4iod.menu.Export.Off=Off +gen4iod.menu.Export.Off.build.Export=0 +gen4iod.menu.Export.Binaries=.bin & .bin.signed +gen4iod.menu.Export.Binaries.build.Export=1 +gen4iod.menu.Export.GzBinaries=Create & Export gzipped Binaries too +gen4iod.menu.Export.GzBinaries.build.Export=2 gen4iod.menu.xtal.80=80 MHz gen4iod.menu.xtal.80.build.f_cpu=80000000L gen4iod.menu.xtal.160=160 MHz @@ -1188,6 +1245,24 @@ huzzah.build.core=esp8266 huzzah.build.spiffs_pagesize=256 huzzah.build.debug_port= huzzah.build.debug_level= +huzzah.menu.Upload.Sketch=Sketch +huzzah.menu.Upload.Sketch.build.Upload=1 +huzzah.menu.Upload.Filesystem=Filesystem +huzzah.menu.Upload.Filesystem.build.Upload=2 +huzzah.menu.Upload.Both=Both +huzzah.menu.Upload.Both.build.Upload=3 +huzzah.menu.Filesystem.Off=Off +huzzah.menu.Filesystem.Off.build.Filesystem=0 +huzzah.menu.Filesystem.LitteFs=LitteFs +huzzah.menu.Filesystem.LitteFs.build.Filesystem=1 +huzzah.menu.Filesystem.SPIFFS=SPIFFS +huzzah.menu.Filesystem.SPIFFS.build.Filesystem=2 +huzzah.menu.Export.Off=Off +huzzah.menu.Export.Off.build.Export=0 +huzzah.menu.Export.Binaries=.bin & .bin.signed +huzzah.menu.Export.Binaries.build.Export=1 +huzzah.menu.Export.GzBinaries=Create & Export gzipped Binaries too +huzzah.menu.Export.GzBinaries.build.Export=2 huzzah.menu.xtal.80=80 MHz huzzah.menu.xtal.80.build.f_cpu=80000000L huzzah.menu.xtal.160=160 MHz @@ -1403,6 +1478,24 @@ wifi_slot.build.core=esp8266 wifi_slot.build.spiffs_pagesize=256 wifi_slot.build.debug_port= wifi_slot.build.debug_level= +wifi_slot.menu.Upload.Sketch=Sketch +wifi_slot.menu.Upload.Sketch.build.Upload=1 +wifi_slot.menu.Upload.Filesystem=Filesystem +wifi_slot.menu.Upload.Filesystem.build.Upload=2 +wifi_slot.menu.Upload.Both=Both +wifi_slot.menu.Upload.Both.build.Upload=3 +wifi_slot.menu.Filesystem.Off=Off +wifi_slot.menu.Filesystem.Off.build.Filesystem=0 +wifi_slot.menu.Filesystem.LitteFs=LitteFs +wifi_slot.menu.Filesystem.LitteFs.build.Filesystem=1 +wifi_slot.menu.Filesystem.SPIFFS=SPIFFS +wifi_slot.menu.Filesystem.SPIFFS.build.Filesystem=2 +wifi_slot.menu.Export.Off=Off +wifi_slot.menu.Export.Off.build.Export=0 +wifi_slot.menu.Export.Binaries=.bin & .bin.signed +wifi_slot.menu.Export.Binaries.build.Export=1 +wifi_slot.menu.Export.GzBinaries=Create & Export gzipped Binaries too +wifi_slot.menu.Export.GzBinaries.build.Export=2 wifi_slot.menu.xtal.80=80 MHz wifi_slot.menu.xtal.80.build.f_cpu=80000000L wifi_slot.menu.xtal.160=160 MHz @@ -1744,6 +1837,24 @@ arduino-esp8266.build.variant=generic arduino-esp8266.build.spiffs_pagesize=256 arduino-esp8266.build.debug_port= arduino-esp8266.build.debug_level= +arduino-esp8266.menu.Upload.Sketch=Sketch +arduino-esp8266.menu.Upload.Sketch.build.Upload=1 +arduino-esp8266.menu.Upload.Filesystem=Filesystem +arduino-esp8266.menu.Upload.Filesystem.build.Upload=2 +arduino-esp8266.menu.Upload.Both=Both +arduino-esp8266.menu.Upload.Both.build.Upload=3 +arduino-esp8266.menu.Filesystem.Off=Off +arduino-esp8266.menu.Filesystem.Off.build.Filesystem=0 +arduino-esp8266.menu.Filesystem.LitteFs=LitteFs +arduino-esp8266.menu.Filesystem.LitteFs.build.Filesystem=1 +arduino-esp8266.menu.Filesystem.SPIFFS=SPIFFS +arduino-esp8266.menu.Filesystem.SPIFFS.build.Filesystem=2 +arduino-esp8266.menu.Export.Off=Off +arduino-esp8266.menu.Export.Off.build.Export=0 +arduino-esp8266.menu.Export.Binaries=.bin & .bin.signed +arduino-esp8266.menu.Export.Binaries.build.Export=1 +arduino-esp8266.menu.Export.GzBinaries=Create & Export gzipped Binaries too +arduino-esp8266.menu.Export.GzBinaries.build.Export=2 arduino-esp8266.menu.xtal.80=80 MHz arduino-esp8266.menu.xtal.80.build.f_cpu=80000000L arduino-esp8266.menu.xtal.160=160 MHz @@ -1960,6 +2071,24 @@ espmxdevkit.build.core=esp8266 espmxdevkit.build.spiffs_pagesize=256 espmxdevkit.build.debug_port= espmxdevkit.build.debug_level= +espmxdevkit.menu.Upload.Sketch=Sketch +espmxdevkit.menu.Upload.Sketch.build.Upload=1 +espmxdevkit.menu.Upload.Filesystem=Filesystem +espmxdevkit.menu.Upload.Filesystem.build.Upload=2 +espmxdevkit.menu.Upload.Both=Both +espmxdevkit.menu.Upload.Both.build.Upload=3 +espmxdevkit.menu.Filesystem.Off=Off +espmxdevkit.menu.Filesystem.Off.build.Filesystem=0 +espmxdevkit.menu.Filesystem.LitteFs=LitteFs +espmxdevkit.menu.Filesystem.LitteFs.build.Filesystem=1 +espmxdevkit.menu.Filesystem.SPIFFS=SPIFFS +espmxdevkit.menu.Filesystem.SPIFFS.build.Filesystem=2 +espmxdevkit.menu.Export.Off=Off +espmxdevkit.menu.Export.Off.build.Export=0 +espmxdevkit.menu.Export.Binaries=.bin & .bin.signed +espmxdevkit.menu.Export.Binaries.build.Export=1 +espmxdevkit.menu.Export.GzBinaries=Create & Export gzipped Binaries too +espmxdevkit.menu.Export.GzBinaries.build.Export=2 espmxdevkit.menu.xtal.80=80 MHz espmxdevkit.menu.xtal.80.build.f_cpu=80000000L espmxdevkit.menu.xtal.160=160 MHz @@ -2216,6 +2345,24 @@ oak.build.core=esp8266 oak.build.spiffs_pagesize=256 oak.build.debug_port= oak.build.debug_level= +oak.menu.Upload.Sketch=Sketch +oak.menu.Upload.Sketch.build.Upload=1 +oak.menu.Upload.Filesystem=Filesystem +oak.menu.Upload.Filesystem.build.Upload=2 +oak.menu.Upload.Both=Both +oak.menu.Upload.Both.build.Upload=3 +oak.menu.Filesystem.Off=Off +oak.menu.Filesystem.Off.build.Filesystem=0 +oak.menu.Filesystem.LitteFs=LitteFs +oak.menu.Filesystem.LitteFs.build.Filesystem=1 +oak.menu.Filesystem.SPIFFS=SPIFFS +oak.menu.Filesystem.SPIFFS.build.Filesystem=2 +oak.menu.Export.Off=Off +oak.menu.Export.Off.build.Export=0 +oak.menu.Export.Binaries=.bin & .bin.signed +oak.menu.Export.Binaries.build.Export=1 +oak.menu.Export.GzBinaries=Create & Export gzipped Binaries too +oak.menu.Export.GzBinaries.build.Export=2 oak.menu.xtal.80=80 MHz oak.menu.xtal.80.build.f_cpu=80000000L oak.menu.xtal.160=160 MHz @@ -2440,6 +2587,24 @@ espduino.build.core=esp8266 espduino.build.spiffs_pagesize=256 espduino.build.debug_port= espduino.build.debug_level= +espduino.menu.Upload.Sketch=Sketch +espduino.menu.Upload.Sketch.build.Upload=1 +espduino.menu.Upload.Filesystem=Filesystem +espduino.menu.Upload.Filesystem.build.Upload=2 +espduino.menu.Upload.Both=Both +espduino.menu.Upload.Both.build.Upload=3 +espduino.menu.Filesystem.Off=Off +espduino.menu.Filesystem.Off.build.Filesystem=0 +espduino.menu.Filesystem.LitteFs=LitteFs +espduino.menu.Filesystem.LitteFs.build.Filesystem=1 +espduino.menu.Filesystem.SPIFFS=SPIFFS +espduino.menu.Filesystem.SPIFFS.build.Filesystem=2 +espduino.menu.Export.Off=Off +espduino.menu.Export.Off.build.Export=0 +espduino.menu.Export.Binaries=.bin & .bin.signed +espduino.menu.Export.Binaries.build.Export=1 +espduino.menu.Export.GzBinaries=Create & Export gzipped Binaries too +espduino.menu.Export.GzBinaries.build.Export=2 espduino.menu.xtal.80=80 MHz espduino.menu.xtal.80.build.f_cpu=80000000L espduino.menu.xtal.160=160 MHz @@ -2654,6 +2819,24 @@ espectro.build.core=esp8266 espectro.build.spiffs_pagesize=256 espectro.build.debug_port= espectro.build.debug_level= +espectro.menu.Upload.Sketch=Sketch +espectro.menu.Upload.Sketch.build.Upload=1 +espectro.menu.Upload.Filesystem=Filesystem +espectro.menu.Upload.Filesystem.build.Upload=2 +espectro.menu.Upload.Both=Both +espectro.menu.Upload.Both.build.Upload=3 +espectro.menu.Filesystem.Off=Off +espectro.menu.Filesystem.Off.build.Filesystem=0 +espectro.menu.Filesystem.LitteFs=LitteFs +espectro.menu.Filesystem.LitteFs.build.Filesystem=1 +espectro.menu.Filesystem.SPIFFS=SPIFFS +espectro.menu.Filesystem.SPIFFS.build.Filesystem=2 +espectro.menu.Export.Off=Off +espectro.menu.Export.Off.build.Export=0 +espectro.menu.Export.Binaries=.bin & .bin.signed +espectro.menu.Export.Binaries.build.Export=1 +espectro.menu.Export.GzBinaries=Create & Export gzipped Binaries too +espectro.menu.Export.GzBinaries.build.Export=2 espectro.menu.xtal.80=80 MHz espectro.menu.xtal.80.build.f_cpu=80000000L espectro.menu.xtal.160=160 MHz @@ -2869,6 +3052,24 @@ espino.build.core=esp8266 espino.build.spiffs_pagesize=256 espino.build.debug_port= espino.build.debug_level= +espino.menu.Upload.Sketch=Sketch +espino.menu.Upload.Sketch.build.Upload=1 +espino.menu.Upload.Filesystem=Filesystem +espino.menu.Upload.Filesystem.build.Upload=2 +espino.menu.Upload.Both=Both +espino.menu.Upload.Both.build.Upload=3 +espino.menu.Filesystem.Off=Off +espino.menu.Filesystem.Off.build.Filesystem=0 +espino.menu.Filesystem.LitteFs=LitteFs +espino.menu.Filesystem.LitteFs.build.Filesystem=1 +espino.menu.Filesystem.SPIFFS=SPIFFS +espino.menu.Filesystem.SPIFFS.build.Filesystem=2 +espino.menu.Export.Off=Off +espino.menu.Export.Off.build.Export=0 +espino.menu.Export.Binaries=.bin & .bin.signed +espino.menu.Export.Binaries.build.Export=1 +espino.menu.Export.GzBinaries=Create & Export gzipped Binaries too +espino.menu.Export.GzBinaries.build.Export=2 espino.menu.xtal.80=80 MHz espino.menu.xtal.80.build.f_cpu=80000000L espino.menu.xtal.160=160 MHz @@ -3087,6 +3288,24 @@ espresso_lite_v1.build.core=esp8266 espresso_lite_v1.build.spiffs_pagesize=256 espresso_lite_v1.build.debug_port= espresso_lite_v1.build.debug_level= +espresso_lite_v1.menu.Upload.Sketch=Sketch +espresso_lite_v1.menu.Upload.Sketch.build.Upload=1 +espresso_lite_v1.menu.Upload.Filesystem=Filesystem +espresso_lite_v1.menu.Upload.Filesystem.build.Upload=2 +espresso_lite_v1.menu.Upload.Both=Both +espresso_lite_v1.menu.Upload.Both.build.Upload=3 +espresso_lite_v1.menu.Filesystem.Off=Off +espresso_lite_v1.menu.Filesystem.Off.build.Filesystem=0 +espresso_lite_v1.menu.Filesystem.LitteFs=LitteFs +espresso_lite_v1.menu.Filesystem.LitteFs.build.Filesystem=1 +espresso_lite_v1.menu.Filesystem.SPIFFS=SPIFFS +espresso_lite_v1.menu.Filesystem.SPIFFS.build.Filesystem=2 +espresso_lite_v1.menu.Export.Off=Off +espresso_lite_v1.menu.Export.Off.build.Export=0 +espresso_lite_v1.menu.Export.Binaries=.bin & .bin.signed +espresso_lite_v1.menu.Export.Binaries.build.Export=1 +espresso_lite_v1.menu.Export.GzBinaries=Create & Export gzipped Binaries too +espresso_lite_v1.menu.Export.GzBinaries.build.Export=2 espresso_lite_v1.menu.xtal.80=80 MHz espresso_lite_v1.menu.xtal.80.build.f_cpu=80000000L espresso_lite_v1.menu.xtal.160=160 MHz @@ -3305,6 +3524,24 @@ espresso_lite_v2.build.core=esp8266 espresso_lite_v2.build.spiffs_pagesize=256 espresso_lite_v2.build.debug_port= espresso_lite_v2.build.debug_level= +espresso_lite_v2.menu.Upload.Sketch=Sketch +espresso_lite_v2.menu.Upload.Sketch.build.Upload=1 +espresso_lite_v2.menu.Upload.Filesystem=Filesystem +espresso_lite_v2.menu.Upload.Filesystem.build.Upload=2 +espresso_lite_v2.menu.Upload.Both=Both +espresso_lite_v2.menu.Upload.Both.build.Upload=3 +espresso_lite_v2.menu.Filesystem.Off=Off +espresso_lite_v2.menu.Filesystem.Off.build.Filesystem=0 +espresso_lite_v2.menu.Filesystem.LitteFs=LitteFs +espresso_lite_v2.menu.Filesystem.LitteFs.build.Filesystem=1 +espresso_lite_v2.menu.Filesystem.SPIFFS=SPIFFS +espresso_lite_v2.menu.Filesystem.SPIFFS.build.Filesystem=2 +espresso_lite_v2.menu.Export.Off=Off +espresso_lite_v2.menu.Export.Off.build.Export=0 +espresso_lite_v2.menu.Export.Binaries=.bin & .bin.signed +espresso_lite_v2.menu.Export.Binaries.build.Export=1 +espresso_lite_v2.menu.Export.GzBinaries=Create & Export gzipped Binaries too +espresso_lite_v2.menu.Export.GzBinaries.build.Export=2 espresso_lite_v2.menu.xtal.80=80 MHz espresso_lite_v2.menu.xtal.80.build.f_cpu=80000000L espresso_lite_v2.menu.xtal.160=160 MHz @@ -3533,6 +3770,24 @@ sonoff.build.core=esp8266 sonoff.build.spiffs_pagesize=256 sonoff.build.debug_port= sonoff.build.debug_level= +sonoff.menu.Upload.Sketch=Sketch +sonoff.menu.Upload.Sketch.build.Upload=1 +sonoff.menu.Upload.Filesystem=Filesystem +sonoff.menu.Upload.Filesystem.build.Upload=2 +sonoff.menu.Upload.Both=Both +sonoff.menu.Upload.Both.build.Upload=3 +sonoff.menu.Filesystem.Off=Off +sonoff.menu.Filesystem.Off.build.Filesystem=0 +sonoff.menu.Filesystem.LitteFs=LitteFs +sonoff.menu.Filesystem.LitteFs.build.Filesystem=1 +sonoff.menu.Filesystem.SPIFFS=SPIFFS +sonoff.menu.Filesystem.SPIFFS.build.Filesystem=2 +sonoff.menu.Export.Off=Off +sonoff.menu.Export.Off.build.Export=0 +sonoff.menu.Export.Binaries=.bin & .bin.signed +sonoff.menu.Export.Binaries.build.Export=1 +sonoff.menu.Export.GzBinaries=Create & Export gzipped Binaries too +sonoff.menu.Export.GzBinaries.build.Export=2 sonoff.menu.xtal.80=80 MHz sonoff.menu.xtal.80.build.f_cpu=80000000L sonoff.menu.xtal.160=160 MHz @@ -3788,6 +4043,24 @@ inventone.build.core=esp8266 inventone.build.spiffs_pagesize=256 inventone.build.debug_port= inventone.build.debug_level= +inventone.menu.Upload.Sketch=Sketch +inventone.menu.Upload.Sketch.build.Upload=1 +inventone.menu.Upload.Filesystem=Filesystem +inventone.menu.Upload.Filesystem.build.Upload=2 +inventone.menu.Upload.Both=Both +inventone.menu.Upload.Both.build.Upload=3 +inventone.menu.Filesystem.Off=Off +inventone.menu.Filesystem.Off.build.Filesystem=0 +inventone.menu.Filesystem.LitteFs=LitteFs +inventone.menu.Filesystem.LitteFs.build.Filesystem=1 +inventone.menu.Filesystem.SPIFFS=SPIFFS +inventone.menu.Filesystem.SPIFFS.build.Filesystem=2 +inventone.menu.Export.Off=Off +inventone.menu.Export.Off.build.Export=0 +inventone.menu.Export.Binaries=.bin & .bin.signed +inventone.menu.Export.Binaries.build.Export=1 +inventone.menu.Export.GzBinaries=Create & Export gzipped Binaries too +inventone.menu.Export.GzBinaries.build.Export=2 inventone.menu.xtal.80=80 MHz inventone.menu.xtal.80.build.f_cpu=80000000L inventone.menu.xtal.160=160 MHz @@ -4003,6 +4276,24 @@ d1_mini.build.core=esp8266 d1_mini.build.spiffs_pagesize=256 d1_mini.build.debug_port= d1_mini.build.debug_level= +d1_mini.menu.Upload.Sketch=Sketch +d1_mini.menu.Upload.Sketch.build.Upload=1 +d1_mini.menu.Upload.Filesystem=Filesystem +d1_mini.menu.Upload.Filesystem.build.Upload=2 +d1_mini.menu.Upload.Both=Both +d1_mini.menu.Upload.Both.build.Upload=3 +d1_mini.menu.Filesystem.Off=Off +d1_mini.menu.Filesystem.Off.build.Filesystem=0 +d1_mini.menu.Filesystem.LitteFs=LitteFs +d1_mini.menu.Filesystem.LitteFs.build.Filesystem=1 +d1_mini.menu.Filesystem.SPIFFS=SPIFFS +d1_mini.menu.Filesystem.SPIFFS.build.Filesystem=2 +d1_mini.menu.Export.Off=Off +d1_mini.menu.Export.Off.build.Export=0 +d1_mini.menu.Export.Binaries=.bin & .bin.signed +d1_mini.menu.Export.Binaries.build.Export=1 +d1_mini.menu.Export.GzBinaries=Create & Export gzipped Binaries too +d1_mini.menu.Export.GzBinaries.build.Export=2 d1_mini.menu.xtal.80=80 MHz d1_mini.menu.xtal.80.build.f_cpu=80000000L d1_mini.menu.xtal.160=160 MHz @@ -4218,6 +4509,24 @@ d1_mini_clone.build.core=esp8266 d1_mini_clone.build.spiffs_pagesize=256 d1_mini_clone.build.debug_port= d1_mini_clone.build.debug_level= +d1_mini_clone.menu.Upload.Sketch=Sketch +d1_mini_clone.menu.Upload.Sketch.build.Upload=1 +d1_mini_clone.menu.Upload.Filesystem=Filesystem +d1_mini_clone.menu.Upload.Filesystem.build.Upload=2 +d1_mini_clone.menu.Upload.Both=Both +d1_mini_clone.menu.Upload.Both.build.Upload=3 +d1_mini_clone.menu.Filesystem.Off=Off +d1_mini_clone.menu.Filesystem.Off.build.Filesystem=0 +d1_mini_clone.menu.Filesystem.LitteFs=LitteFs +d1_mini_clone.menu.Filesystem.LitteFs.build.Filesystem=1 +d1_mini_clone.menu.Filesystem.SPIFFS=SPIFFS +d1_mini_clone.menu.Filesystem.SPIFFS.build.Filesystem=2 +d1_mini_clone.menu.Export.Off=Off +d1_mini_clone.menu.Export.Off.build.Export=0 +d1_mini_clone.menu.Export.Binaries=.bin & .bin.signed +d1_mini_clone.menu.Export.Binaries.build.Export=1 +d1_mini_clone.menu.Export.GzBinaries=Create & Export gzipped Binaries too +d1_mini_clone.menu.Export.GzBinaries.build.Export=2 d1_mini_clone.menu.xtal.80=80 MHz d1_mini_clone.menu.xtal.80.build.f_cpu=80000000L d1_mini_clone.menu.xtal.160=160 MHz @@ -4450,6 +4759,24 @@ d1_mini_lite.build.core=esp8266 d1_mini_lite.build.spiffs_pagesize=256 d1_mini_lite.build.debug_port= d1_mini_lite.build.debug_level= +d1_mini_lite.menu.Upload.Sketch=Sketch +d1_mini_lite.menu.Upload.Sketch.build.Upload=1 +d1_mini_lite.menu.Upload.Filesystem=Filesystem +d1_mini_lite.menu.Upload.Filesystem.build.Upload=2 +d1_mini_lite.menu.Upload.Both=Both +d1_mini_lite.menu.Upload.Both.build.Upload=3 +d1_mini_lite.menu.Filesystem.Off=Off +d1_mini_lite.menu.Filesystem.Off.build.Filesystem=0 +d1_mini_lite.menu.Filesystem.LitteFs=LitteFs +d1_mini_lite.menu.Filesystem.LitteFs.build.Filesystem=1 +d1_mini_lite.menu.Filesystem.SPIFFS=SPIFFS +d1_mini_lite.menu.Filesystem.SPIFFS.build.Filesystem=2 +d1_mini_lite.menu.Export.Off=Off +d1_mini_lite.menu.Export.Off.build.Export=0 +d1_mini_lite.menu.Export.Binaries=.bin & .bin.signed +d1_mini_lite.menu.Export.Binaries.build.Export=1 +d1_mini_lite.menu.Export.GzBinaries=Create & Export gzipped Binaries too +d1_mini_lite.menu.Export.GzBinaries.build.Export=2 d1_mini_lite.menu.xtal.80=80 MHz d1_mini_lite.menu.xtal.80.build.f_cpu=80000000L d1_mini_lite.menu.xtal.160=160 MHz @@ -4705,6 +5032,24 @@ d1_mini_pro.build.core=esp8266 d1_mini_pro.build.spiffs_pagesize=256 d1_mini_pro.build.debug_port= d1_mini_pro.build.debug_level= +d1_mini_pro.menu.Upload.Sketch=Sketch +d1_mini_pro.menu.Upload.Sketch.build.Upload=1 +d1_mini_pro.menu.Upload.Filesystem=Filesystem +d1_mini_pro.menu.Upload.Filesystem.build.Upload=2 +d1_mini_pro.menu.Upload.Both=Both +d1_mini_pro.menu.Upload.Both.build.Upload=3 +d1_mini_pro.menu.Filesystem.Off=Off +d1_mini_pro.menu.Filesystem.Off.build.Filesystem=0 +d1_mini_pro.menu.Filesystem.LitteFs=LitteFs +d1_mini_pro.menu.Filesystem.LitteFs.build.Filesystem=1 +d1_mini_pro.menu.Filesystem.SPIFFS=SPIFFS +d1_mini_pro.menu.Filesystem.SPIFFS.build.Filesystem=2 +d1_mini_pro.menu.Export.Off=Off +d1_mini_pro.menu.Export.Off.build.Export=0 +d1_mini_pro.menu.Export.Binaries=.bin & .bin.signed +d1_mini_pro.menu.Export.Binaries.build.Export=1 +d1_mini_pro.menu.Export.GzBinaries=Create & Export gzipped Binaries too +d1_mini_pro.menu.Export.GzBinaries.build.Export=2 d1_mini_pro.menu.xtal.80=80 MHz d1_mini_pro.menu.xtal.80.build.f_cpu=80000000L d1_mini_pro.menu.xtal.160=160 MHz @@ -4903,6 +5248,24 @@ d1.build.core=esp8266 d1.build.spiffs_pagesize=256 d1.build.debug_port= d1.build.debug_level= +d1.menu.Upload.Sketch=Sketch +d1.menu.Upload.Sketch.build.Upload=1 +d1.menu.Upload.Filesystem=Filesystem +d1.menu.Upload.Filesystem.build.Upload=2 +d1.menu.Upload.Both=Both +d1.menu.Upload.Both.build.Upload=3 +d1.menu.Filesystem.Off=Off +d1.menu.Filesystem.Off.build.Filesystem=0 +d1.menu.Filesystem.LitteFs=LitteFs +d1.menu.Filesystem.LitteFs.build.Filesystem=1 +d1.menu.Filesystem.SPIFFS=SPIFFS +d1.menu.Filesystem.SPIFFS.build.Filesystem=2 +d1.menu.Export.Off=Off +d1.menu.Export.Off.build.Export=0 +d1.menu.Export.Binaries=.bin & .bin.signed +d1.menu.Export.Binaries.build.Export=1 +d1.menu.Export.GzBinaries=Create & Export gzipped Binaries too +d1.menu.Export.GzBinaries.build.Export=2 d1.menu.xtal.80=80 MHz d1.menu.xtal.80.build.f_cpu=80000000L d1.menu.xtal.160=160 MHz @@ -5118,6 +5481,24 @@ agruminolemon.build.core=esp8266 agruminolemon.build.spiffs_pagesize=256 agruminolemon.build.debug_port= agruminolemon.build.debug_level= +agruminolemon.menu.Upload.Sketch=Sketch +agruminolemon.menu.Upload.Sketch.build.Upload=1 +agruminolemon.menu.Upload.Filesystem=Filesystem +agruminolemon.menu.Upload.Filesystem.build.Upload=2 +agruminolemon.menu.Upload.Both=Both +agruminolemon.menu.Upload.Both.build.Upload=3 +agruminolemon.menu.Filesystem.Off=Off +agruminolemon.menu.Filesystem.Off.build.Filesystem=0 +agruminolemon.menu.Filesystem.LitteFs=LitteFs +agruminolemon.menu.Filesystem.LitteFs.build.Filesystem=1 +agruminolemon.menu.Filesystem.SPIFFS=SPIFFS +agruminolemon.menu.Filesystem.SPIFFS.build.Filesystem=2 +agruminolemon.menu.Export.Off=Off +agruminolemon.menu.Export.Off.build.Export=0 +agruminolemon.menu.Export.Binaries=.bin & .bin.signed +agruminolemon.menu.Export.Binaries.build.Export=1 +agruminolemon.menu.Export.GzBinaries=Create & Export gzipped Binaries too +agruminolemon.menu.Export.GzBinaries.build.Export=2 agruminolemon.menu.xtal.80=80 MHz agruminolemon.menu.xtal.80.build.f_cpu=80000000L agruminolemon.menu.xtal.160=160 MHz @@ -5353,6 +5734,24 @@ nodemcu.build.core=esp8266 nodemcu.build.spiffs_pagesize=256 nodemcu.build.debug_port= nodemcu.build.debug_level= +nodemcu.menu.Upload.Sketch=Sketch +nodemcu.menu.Upload.Sketch.build.Upload=1 +nodemcu.menu.Upload.Filesystem=Filesystem +nodemcu.menu.Upload.Filesystem.build.Upload=2 +nodemcu.menu.Upload.Both=Both +nodemcu.menu.Upload.Both.build.Upload=3 +nodemcu.menu.Filesystem.Off=Off +nodemcu.menu.Filesystem.Off.build.Filesystem=0 +nodemcu.menu.Filesystem.LitteFs=LitteFs +nodemcu.menu.Filesystem.LitteFs.build.Filesystem=1 +nodemcu.menu.Filesystem.SPIFFS=SPIFFS +nodemcu.menu.Filesystem.SPIFFS.build.Filesystem=2 +nodemcu.menu.Export.Off=Off +nodemcu.menu.Export.Off.build.Export=0 +nodemcu.menu.Export.Binaries=.bin & .bin.signed +nodemcu.menu.Export.Binaries.build.Export=1 +nodemcu.menu.Export.GzBinaries=Create & Export gzipped Binaries too +nodemcu.menu.Export.GzBinaries.build.Export=2 nodemcu.menu.xtal.80=80 MHz nodemcu.menu.xtal.80.build.f_cpu=80000000L nodemcu.menu.xtal.160=160 MHz @@ -5568,6 +5967,24 @@ nodemcuv2.build.core=esp8266 nodemcuv2.build.spiffs_pagesize=256 nodemcuv2.build.debug_port= nodemcuv2.build.debug_level= +nodemcuv2.menu.Upload.Sketch=Sketch +nodemcuv2.menu.Upload.Sketch.build.Upload=1 +nodemcuv2.menu.Upload.Filesystem=Filesystem +nodemcuv2.menu.Upload.Filesystem.build.Upload=2 +nodemcuv2.menu.Upload.Both=Both +nodemcuv2.menu.Upload.Both.build.Upload=3 +nodemcuv2.menu.Filesystem.Off=Off +nodemcuv2.menu.Filesystem.Off.build.Filesystem=0 +nodemcuv2.menu.Filesystem.LitteFs=LitteFs +nodemcuv2.menu.Filesystem.LitteFs.build.Filesystem=1 +nodemcuv2.menu.Filesystem.SPIFFS=SPIFFS +nodemcuv2.menu.Filesystem.SPIFFS.build.Filesystem=2 +nodemcuv2.menu.Export.Off=Off +nodemcuv2.menu.Export.Off.build.Export=0 +nodemcuv2.menu.Export.Binaries=.bin & .bin.signed +nodemcuv2.menu.Export.Binaries.build.Export=1 +nodemcuv2.menu.Export.GzBinaries=Create & Export gzipped Binaries too +nodemcuv2.menu.Export.GzBinaries.build.Export=2 nodemcuv2.menu.xtal.80=80 MHz nodemcuv2.menu.xtal.80.build.f_cpu=80000000L nodemcuv2.menu.xtal.160=160 MHz @@ -5787,6 +6204,24 @@ modwifi.build.core=esp8266 modwifi.build.spiffs_pagesize=256 modwifi.build.debug_port= modwifi.build.debug_level= +modwifi.menu.Upload.Sketch=Sketch +modwifi.menu.Upload.Sketch.build.Upload=1 +modwifi.menu.Upload.Filesystem=Filesystem +modwifi.menu.Upload.Filesystem.build.Upload=2 +modwifi.menu.Upload.Both=Both +modwifi.menu.Upload.Both.build.Upload=3 +modwifi.menu.Filesystem.Off=Off +modwifi.menu.Filesystem.Off.build.Filesystem=0 +modwifi.menu.Filesystem.LitteFs=LitteFs +modwifi.menu.Filesystem.LitteFs.build.Filesystem=1 +modwifi.menu.Filesystem.SPIFFS=SPIFFS +modwifi.menu.Filesystem.SPIFFS.build.Filesystem=2 +modwifi.menu.Export.Off=Off +modwifi.menu.Export.Off.build.Export=0 +modwifi.menu.Export.Binaries=.bin & .bin.signed +modwifi.menu.Export.Binaries.build.Export=1 +modwifi.menu.Export.GzBinaries=Create & Export gzipped Binaries too +modwifi.menu.Export.GzBinaries.build.Export=2 modwifi.menu.xtal.80=80 MHz modwifi.menu.xtal.80.build.f_cpu=80000000L modwifi.menu.xtal.160=160 MHz @@ -6022,6 +6457,24 @@ phoenix_v1.build.core=esp8266 phoenix_v1.build.spiffs_pagesize=256 phoenix_v1.build.debug_port= phoenix_v1.build.debug_level= +phoenix_v1.menu.Upload.Sketch=Sketch +phoenix_v1.menu.Upload.Sketch.build.Upload=1 +phoenix_v1.menu.Upload.Filesystem=Filesystem +phoenix_v1.menu.Upload.Filesystem.build.Upload=2 +phoenix_v1.menu.Upload.Both=Both +phoenix_v1.menu.Upload.Both.build.Upload=3 +phoenix_v1.menu.Filesystem.Off=Off +phoenix_v1.menu.Filesystem.Off.build.Filesystem=0 +phoenix_v1.menu.Filesystem.LitteFs=LitteFs +phoenix_v1.menu.Filesystem.LitteFs.build.Filesystem=1 +phoenix_v1.menu.Filesystem.SPIFFS=SPIFFS +phoenix_v1.menu.Filesystem.SPIFFS.build.Filesystem=2 +phoenix_v1.menu.Export.Off=Off +phoenix_v1.menu.Export.Off.build.Export=0 +phoenix_v1.menu.Export.Binaries=.bin & .bin.signed +phoenix_v1.menu.Export.Binaries.build.Export=1 +phoenix_v1.menu.Export.GzBinaries=Create & Export gzipped Binaries too +phoenix_v1.menu.Export.GzBinaries.build.Export=2 phoenix_v1.menu.xtal.80=80 MHz phoenix_v1.menu.xtal.80.build.f_cpu=80000000L phoenix_v1.menu.xtal.160=160 MHz @@ -6240,6 +6693,24 @@ phoenix_v2.build.core=esp8266 phoenix_v2.build.spiffs_pagesize=256 phoenix_v2.build.debug_port= phoenix_v2.build.debug_level= +phoenix_v2.menu.Upload.Sketch=Sketch +phoenix_v2.menu.Upload.Sketch.build.Upload=1 +phoenix_v2.menu.Upload.Filesystem=Filesystem +phoenix_v2.menu.Upload.Filesystem.build.Upload=2 +phoenix_v2.menu.Upload.Both=Both +phoenix_v2.menu.Upload.Both.build.Upload=3 +phoenix_v2.menu.Filesystem.Off=Off +phoenix_v2.menu.Filesystem.Off.build.Filesystem=0 +phoenix_v2.menu.Filesystem.LitteFs=LitteFs +phoenix_v2.menu.Filesystem.LitteFs.build.Filesystem=1 +phoenix_v2.menu.Filesystem.SPIFFS=SPIFFS +phoenix_v2.menu.Filesystem.SPIFFS.build.Filesystem=2 +phoenix_v2.menu.Export.Off=Off +phoenix_v2.menu.Export.Off.build.Export=0 +phoenix_v2.menu.Export.Binaries=.bin & .bin.signed +phoenix_v2.menu.Export.Binaries.build.Export=1 +phoenix_v2.menu.Export.GzBinaries=Create & Export gzipped Binaries too +phoenix_v2.menu.Export.GzBinaries.build.Export=2 phoenix_v2.menu.xtal.80=80 MHz phoenix_v2.menu.xtal.80.build.f_cpu=80000000L phoenix_v2.menu.xtal.160=160 MHz @@ -6458,6 +6929,24 @@ eduinowifi.build.core=esp8266 eduinowifi.build.spiffs_pagesize=256 eduinowifi.build.debug_port= eduinowifi.build.debug_level= +eduinowifi.menu.Upload.Sketch=Sketch +eduinowifi.menu.Upload.Sketch.build.Upload=1 +eduinowifi.menu.Upload.Filesystem=Filesystem +eduinowifi.menu.Upload.Filesystem.build.Upload=2 +eduinowifi.menu.Upload.Both=Both +eduinowifi.menu.Upload.Both.build.Upload=3 +eduinowifi.menu.Filesystem.Off=Off +eduinowifi.menu.Filesystem.Off.build.Filesystem=0 +eduinowifi.menu.Filesystem.LitteFs=LitteFs +eduinowifi.menu.Filesystem.LitteFs.build.Filesystem=1 +eduinowifi.menu.Filesystem.SPIFFS=SPIFFS +eduinowifi.menu.Filesystem.SPIFFS.build.Filesystem=2 +eduinowifi.menu.Export.Off=Off +eduinowifi.menu.Export.Off.build.Export=0 +eduinowifi.menu.Export.Binaries=.bin & .bin.signed +eduinowifi.menu.Export.Binaries.build.Export=1 +eduinowifi.menu.Export.GzBinaries=Create & Export gzipped Binaries too +eduinowifi.menu.Export.GzBinaries.build.Export=2 eduinowifi.menu.xtal.80=80 MHz eduinowifi.menu.xtal.80.build.f_cpu=80000000L eduinowifi.menu.xtal.160=160 MHz @@ -6673,6 +7162,24 @@ wiolink.build.core=esp8266 wiolink.build.spiffs_pagesize=256 wiolink.build.debug_port= wiolink.build.debug_level= +wiolink.menu.Upload.Sketch=Sketch +wiolink.menu.Upload.Sketch.build.Upload=1 +wiolink.menu.Upload.Filesystem=Filesystem +wiolink.menu.Upload.Filesystem.build.Upload=2 +wiolink.menu.Upload.Both=Both +wiolink.menu.Upload.Both.build.Upload=3 +wiolink.menu.Filesystem.Off=Off +wiolink.menu.Filesystem.Off.build.Filesystem=0 +wiolink.menu.Filesystem.LitteFs=LitteFs +wiolink.menu.Filesystem.LitteFs.build.Filesystem=1 +wiolink.menu.Filesystem.SPIFFS=SPIFFS +wiolink.menu.Filesystem.SPIFFS.build.Filesystem=2 +wiolink.menu.Export.Off=Off +wiolink.menu.Export.Off.build.Export=0 +wiolink.menu.Export.Binaries=.bin & .bin.signed +wiolink.menu.Export.Binaries.build.Export=1 +wiolink.menu.Export.GzBinaries=Create & Export gzipped Binaries too +wiolink.menu.Export.GzBinaries.build.Export=2 wiolink.menu.xtal.80=80 MHz wiolink.menu.xtal.80.build.f_cpu=80000000L wiolink.menu.xtal.160=160 MHz @@ -6888,6 +7395,24 @@ blynk.build.core=esp8266 blynk.build.spiffs_pagesize=256 blynk.build.debug_port= blynk.build.debug_level= +blynk.menu.Upload.Sketch=Sketch +blynk.menu.Upload.Sketch.build.Upload=1 +blynk.menu.Upload.Filesystem=Filesystem +blynk.menu.Upload.Filesystem.build.Upload=2 +blynk.menu.Upload.Both=Both +blynk.menu.Upload.Both.build.Upload=3 +blynk.menu.Filesystem.Off=Off +blynk.menu.Filesystem.Off.build.Filesystem=0 +blynk.menu.Filesystem.LitteFs=LitteFs +blynk.menu.Filesystem.LitteFs.build.Filesystem=1 +blynk.menu.Filesystem.SPIFFS=SPIFFS +blynk.menu.Filesystem.SPIFFS.build.Filesystem=2 +blynk.menu.Export.Off=Off +blynk.menu.Export.Off.build.Export=0 +blynk.menu.Export.Binaries=.bin & .bin.signed +blynk.menu.Export.Binaries.build.Export=1 +blynk.menu.Export.GzBinaries=Create & Export gzipped Binaries too +blynk.menu.Export.GzBinaries.build.Export=2 blynk.menu.xtal.80=80 MHz blynk.menu.xtal.80.build.f_cpu=80000000L blynk.menu.xtal.160=160 MHz @@ -7103,6 +7628,24 @@ thing.build.core=esp8266 thing.build.spiffs_pagesize=256 thing.build.debug_port= thing.build.debug_level= +thing.menu.Upload.Sketch=Sketch +thing.menu.Upload.Sketch.build.Upload=1 +thing.menu.Upload.Filesystem=Filesystem +thing.menu.Upload.Filesystem.build.Upload=2 +thing.menu.Upload.Both=Both +thing.menu.Upload.Both.build.Upload=3 +thing.menu.Filesystem.Off=Off +thing.menu.Filesystem.Off.build.Filesystem=0 +thing.menu.Filesystem.LitteFs=LitteFs +thing.menu.Filesystem.LitteFs.build.Filesystem=1 +thing.menu.Filesystem.SPIFFS=SPIFFS +thing.menu.Filesystem.SPIFFS.build.Filesystem=2 +thing.menu.Export.Off=Off +thing.menu.Export.Off.build.Export=0 +thing.menu.Export.Binaries=.bin & .bin.signed +thing.menu.Export.Binaries.build.Export=1 +thing.menu.Export.GzBinaries=Create & Export gzipped Binaries too +thing.menu.Export.GzBinaries.build.Export=2 thing.menu.xtal.80=80 MHz thing.menu.xtal.80.build.f_cpu=80000000L thing.menu.xtal.160=160 MHz @@ -7318,6 +7861,24 @@ thingdev.build.core=esp8266 thingdev.build.spiffs_pagesize=256 thingdev.build.debug_port= thingdev.build.debug_level= +thingdev.menu.Upload.Sketch=Sketch +thingdev.menu.Upload.Sketch.build.Upload=1 +thingdev.menu.Upload.Filesystem=Filesystem +thingdev.menu.Upload.Filesystem.build.Upload=2 +thingdev.menu.Upload.Both=Both +thingdev.menu.Upload.Both.build.Upload=3 +thingdev.menu.Filesystem.Off=Off +thingdev.menu.Filesystem.Off.build.Filesystem=0 +thingdev.menu.Filesystem.LitteFs=LitteFs +thingdev.menu.Filesystem.LitteFs.build.Filesystem=1 +thingdev.menu.Filesystem.SPIFFS=SPIFFS +thingdev.menu.Filesystem.SPIFFS.build.Filesystem=2 +thingdev.menu.Export.Off=Off +thingdev.menu.Export.Off.build.Export=0 +thingdev.menu.Export.Binaries=.bin & .bin.signed +thingdev.menu.Export.Binaries.build.Export=1 +thingdev.menu.Export.GzBinaries=Create & Export gzipped Binaries too +thingdev.menu.Export.GzBinaries.build.Export=2 thingdev.menu.xtal.80=80 MHz thingdev.menu.xtal.80.build.f_cpu=80000000L thingdev.menu.xtal.160=160 MHz @@ -7533,6 +8094,24 @@ esp210.build.variant=generic esp210.build.spiffs_pagesize=256 esp210.build.debug_port= esp210.build.debug_level= +esp210.menu.Upload.Sketch=Sketch +esp210.menu.Upload.Sketch.build.Upload=1 +esp210.menu.Upload.Filesystem=Filesystem +esp210.menu.Upload.Filesystem.build.Upload=2 +esp210.menu.Upload.Both=Both +esp210.menu.Upload.Both.build.Upload=3 +esp210.menu.Filesystem.Off=Off +esp210.menu.Filesystem.Off.build.Filesystem=0 +esp210.menu.Filesystem.LitteFs=LitteFs +esp210.menu.Filesystem.LitteFs.build.Filesystem=1 +esp210.menu.Filesystem.SPIFFS=SPIFFS +esp210.menu.Filesystem.SPIFFS.build.Filesystem=2 +esp210.menu.Export.Off=Off +esp210.menu.Export.Off.build.Export=0 +esp210.menu.Export.Binaries=.bin & .bin.signed +esp210.menu.Export.Binaries.build.Export=1 +esp210.menu.Export.GzBinaries=Create & Export gzipped Binaries too +esp210.menu.Export.GzBinaries.build.Export=2 esp210.menu.xtal.80=80 MHz esp210.menu.xtal.80.build.f_cpu=80000000L esp210.menu.xtal.160=160 MHz @@ -7748,6 +8327,24 @@ espinotee.build.core=esp8266 espinotee.build.spiffs_pagesize=256 espinotee.build.debug_port= espinotee.build.debug_level= +espinotee.menu.Upload.Sketch=Sketch +espinotee.menu.Upload.Sketch.build.Upload=1 +espinotee.menu.Upload.Filesystem=Filesystem +espinotee.menu.Upload.Filesystem.build.Upload=2 +espinotee.menu.Upload.Both=Both +espinotee.menu.Upload.Both.build.Upload=3 +espinotee.menu.Filesystem.Off=Off +espinotee.menu.Filesystem.Off.build.Filesystem=0 +espinotee.menu.Filesystem.LitteFs=LitteFs +espinotee.menu.Filesystem.LitteFs.build.Filesystem=1 +espinotee.menu.Filesystem.SPIFFS=SPIFFS +espinotee.menu.Filesystem.SPIFFS.build.Filesystem=2 +espinotee.menu.Export.Off=Off +espinotee.menu.Export.Off.build.Export=0 +espinotee.menu.Export.Binaries=.bin & .bin.signed +espinotee.menu.Export.Binaries.build.Export=1 +espinotee.menu.Export.GzBinaries=Create & Export gzipped Binaries too +espinotee.menu.Export.GzBinaries.build.Export=2 espinotee.menu.xtal.80=80 MHz espinotee.menu.xtal.80.build.f_cpu=80000000L espinotee.menu.xtal.160=160 MHz @@ -7963,6 +8560,24 @@ wifi_kit_8.build.core=esp8266 wifi_kit_8.build.spiffs_pagesize=256 wifi_kit_8.build.debug_port= wifi_kit_8.build.debug_level= +wifi_kit_8.menu.Upload.Sketch=Sketch +wifi_kit_8.menu.Upload.Sketch.build.Upload=1 +wifi_kit_8.menu.Upload.Filesystem=Filesystem +wifi_kit_8.menu.Upload.Filesystem.build.Upload=2 +wifi_kit_8.menu.Upload.Both=Both +wifi_kit_8.menu.Upload.Both.build.Upload=3 +wifi_kit_8.menu.Filesystem.Off=Off +wifi_kit_8.menu.Filesystem.Off.build.Filesystem=0 +wifi_kit_8.menu.Filesystem.LitteFs=LitteFs +wifi_kit_8.menu.Filesystem.LitteFs.build.Filesystem=1 +wifi_kit_8.menu.Filesystem.SPIFFS=SPIFFS +wifi_kit_8.menu.Filesystem.SPIFFS.build.Filesystem=2 +wifi_kit_8.menu.Export.Off=Off +wifi_kit_8.menu.Export.Off.build.Export=0 +wifi_kit_8.menu.Export.Binaries=.bin & .bin.signed +wifi_kit_8.menu.Export.Binaries.build.Export=1 +wifi_kit_8.menu.Export.GzBinaries=Create & Export gzipped Binaries too +wifi_kit_8.menu.Export.GzBinaries.build.Export=2 wifi_kit_8.menu.xtal.80=80 MHz wifi_kit_8.menu.xtal.80.build.f_cpu=80000000L wifi_kit_8.menu.xtal.160=160 MHz @@ -8178,6 +8793,24 @@ wifiduino.build.core=esp8266 wifiduino.build.spiffs_pagesize=256 wifiduino.build.debug_port= wifiduino.build.debug_level= +wifiduino.menu.Upload.Sketch=Sketch +wifiduino.menu.Upload.Sketch.build.Upload=1 +wifiduino.menu.Upload.Filesystem=Filesystem +wifiduino.menu.Upload.Filesystem.build.Upload=2 +wifiduino.menu.Upload.Both=Both +wifiduino.menu.Upload.Both.build.Upload=3 +wifiduino.menu.Filesystem.Off=Off +wifiduino.menu.Filesystem.Off.build.Filesystem=0 +wifiduino.menu.Filesystem.LitteFs=LitteFs +wifiduino.menu.Filesystem.LitteFs.build.Filesystem=1 +wifiduino.menu.Filesystem.SPIFFS=SPIFFS +wifiduino.menu.Filesystem.SPIFFS.build.Filesystem=2 +wifiduino.menu.Export.Off=Off +wifiduino.menu.Export.Off.build.Export=0 +wifiduino.menu.Export.Binaries=.bin & .bin.signed +wifiduino.menu.Export.Binaries.build.Export=1 +wifiduino.menu.Export.GzBinaries=Create & Export gzipped Binaries too +wifiduino.menu.Export.GzBinaries.build.Export=2 wifiduino.menu.xtal.80=80 MHz wifiduino.menu.xtal.80.build.f_cpu=80000000L wifiduino.menu.xtal.160=160 MHz @@ -8410,6 +9043,24 @@ wifinfo.build.core=esp8266 wifinfo.build.spiffs_pagesize=256 wifinfo.build.debug_port= wifinfo.build.debug_level= +wifinfo.menu.Upload.Sketch=Sketch +wifinfo.menu.Upload.Sketch.build.Upload=1 +wifinfo.menu.Upload.Filesystem=Filesystem +wifinfo.menu.Upload.Filesystem.build.Upload=2 +wifinfo.menu.Upload.Both=Both +wifinfo.menu.Upload.Both.build.Upload=3 +wifinfo.menu.Filesystem.Off=Off +wifinfo.menu.Filesystem.Off.build.Filesystem=0 +wifinfo.menu.Filesystem.LitteFs=LitteFs +wifinfo.menu.Filesystem.LitteFs.build.Filesystem=1 +wifinfo.menu.Filesystem.SPIFFS=SPIFFS +wifinfo.menu.Filesystem.SPIFFS.build.Filesystem=2 +wifinfo.menu.Export.Off=Off +wifinfo.menu.Export.Off.build.Export=0 +wifinfo.menu.Export.Binaries=.bin & .bin.signed +wifinfo.menu.Export.Binaries.build.Export=1 +wifinfo.menu.Export.GzBinaries=Create & Export gzipped Binaries too +wifinfo.menu.Export.GzBinaries.build.Export=2 wifinfo.menu.xtal.80=80 MHz wifinfo.menu.xtal.80.build.f_cpu=80000000L wifinfo.menu.xtal.160=160 MHz @@ -8672,6 +9323,24 @@ cw01.build.core=esp8266 cw01.build.spiffs_pagesize=256 cw01.build.debug_port= cw01.build.debug_level= +cw01.menu.Upload.Sketch=Sketch +cw01.menu.Upload.Sketch.build.Upload=1 +cw01.menu.Upload.Filesystem=Filesystem +cw01.menu.Upload.Filesystem.build.Upload=2 +cw01.menu.Upload.Both=Both +cw01.menu.Upload.Both.build.Upload=3 +cw01.menu.Filesystem.Off=Off +cw01.menu.Filesystem.Off.build.Filesystem=0 +cw01.menu.Filesystem.LitteFs=LitteFs +cw01.menu.Filesystem.LitteFs.build.Filesystem=1 +cw01.menu.Filesystem.SPIFFS=SPIFFS +cw01.menu.Filesystem.SPIFFS.build.Filesystem=2 +cw01.menu.Export.Off=Off +cw01.menu.Export.Off.build.Export=0 +cw01.menu.Export.Binaries=.bin & .bin.signed +cw01.menu.Export.Binaries.build.Export=1 +cw01.menu.Export.GzBinaries=Create & Export gzipped Binaries too +cw01.menu.Export.GzBinaries.build.Export=2 cw01.menu.xtal.80=80 MHz cw01.menu.xtal.80.build.f_cpu=80000000L cw01.menu.xtal.160=160 MHz diff --git a/doc/filesystem.rst b/doc/filesystem.rst index 85ee96abb0..3a8dbbf2b7 100644 --- a/doc/filesystem.rst +++ b/doc/filesystem.rst @@ -192,8 +192,53 @@ in the specific subdirectory. This mimics the POSIX behavior for directory traversal most C programmers are used to. -Uploading files to file system ------------------------------- +Uploading files to file system (combined firmware and filesystem) +----------------------------------------------------------------- + +Since PullRequest #8266 Filsystem generation is integrated into the +“compile and/or upload” action of Arduino. +There is no need to download any additional tool. + +Its configuration has 3 entries (“Upload”, "Filesystem" and "Export") in +the IDE's "Tools" menu, and is described as follows: + +Menu-Entry “Upload” lets You choose between: +- Sketch +- Filesystem +- Both +This Menu controls which parts are uploaded when "Sketch->Upload" (Ctrl-U) +is selected from the Arduino Menu. + +Menu-Entry “Filesystem” lets You choose between: +- Off +- LitteFs +- SPIFFS +This Menu controls which Fs will be created when "Sketch->Compile" (Ctrl-R) +is selected from the Arduino Menu. The Fs will always be created inside the +"export" dir (see below). + +Menu-Entry “Export” let You choose between: +- Off +- .bin & .bin.signed) +- Create & Export gzipped Binaries too +This Menu controls export & generation of (extra) Sketch-Binaries. + +The "export" dir +................ +After a (successful) compile, the files will be exported to a subdir +“bin/{variant}” of Your sketch directory +(“{variant}” replaced with the name of the board as shown behind +“Tools -> Board:”). +Signed variants of all Binaries are generated similar to the +“automatic signing” done for normal sketch binary. + +As valid for the "old" tools mentioned below, it is nessesary to place +files you want to be inside the generated file system into a directory +named ``data`` inside Your sketch directory. + + +Uploading files to file system (old tools) +------------------------------------------ *ESP8266FS* is a tool which integrates into the Arduino IDE. It adds a menu item to *Tools* menu for uploading the contents of sketch data diff --git a/libraries/SoftwareSerial b/libraries/SoftwareSerial deleted file mode 160000 index bdcbe747f8..0000000000 --- a/libraries/SoftwareSerial +++ /dev/null @@ -1 +0,0 @@ -Subproject commit bdcbe747f87417dcf0bb1b025912f49880ed32e8 diff --git a/platform.txt b/platform.txt index 9f823d2c99..b2a4070430 100644 --- a/platform.txt +++ b/platform.txt @@ -20,6 +20,7 @@ runtime.tools.makecorever={runtime.platform.path}/tools/makecorever.py runtime.tools.mkdir={runtime.platform.path}/tools/mkdir.py runtime.tools.cp={runtime.platform.path}/tools/cp.py runtime.tools.eboot={runtime.platform.path}/bootloaders/eboot/eboot.elf +runtime.tools.postbuild={runtime.platform.path}/tools/postbuild.py compiler.warning_flags=-w -Werror=return-type compiler.warning_flags.none=-w -Werror=return-type @@ -129,9 +130,14 @@ recipe.objcopy.hex.1.pattern="{runtime.tools.python3.path}/python3" -I "{runtime recipe.objcopy.hex.2.pattern="{runtime.tools.python3.path}/python3" -I "{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" --legacy "{build.path}/{build.project_name}.bin.legacy_sig" recipe.objcopy.hex.3.pattern="{runtime.tools.python3.path}/python3" -I "{runtime.tools.sizes}" --elf "{build.path}/{build.project_name}.elf" --path "{runtime.tools.xtensa-lx106-elf-gcc.path}/bin" --mmu "{build.mmuflags}" +# Post-Build: Handle new Menu-Enties: Filesystem & Binaries +recipe.hooks.objcopy.postobjcopy.1.pattern="{runtime.tools.python3.path}/python3" -I "{runtime.tools.postbuild}" -fi "{build.Filesystem}" -ex "{build.Export}" -na "{build.project_name}" -bp "{build.path}" -so "{build.source.path}" -va "{build.variant}" -ss "{build.spiffs_start}" -se "{build.spiffs_end}" -sp "{build.spiffs_pagesize}" -sl "{build.spiffs_blocksize}" + ## Save hex -recipe.output.tmp_file={build.project_name}.bin -recipe.output.save_file={build.project_name}.{build.variant}.bin +recipe.output.tmp_file.1={build.project_name}.bin +recipe.output.save_file.1=bin/{build.variant}/{build.project_name}.bin +recipe.output.tmp_file.2={build.project_name}.bin.signed +recipe.output.save_file.2=bin/{build.variant}/{build.project_name}.bin.signed ## Compute size recipe.size.pattern="{compiler.path}{compiler.size.cmd}" -A "{build.path}/{build.project_name}.elf" @@ -155,11 +161,8 @@ tools.esptool.upload.protocol=esp tools.esptool.upload.params.verbose= tools.esptool.upload.params.quiet= -# First, potentially perform an erase or nothing -# Next, do the binary upload -# Combined in one rule because Arduino doesn't support upload.1.pattern/upload.3.pattern -tools.esptool.upload.pattern="{cmd}" -I "{runtime.platform.path}/tools/upload.py" --chip esp8266 --port "{serial.port}" --baud "{upload.speed}" "{upload.verbose}" {upload.erase_cmd} {upload.resetmethod} write_flash 0x0 "{build.path}/{build.project_name}.bin" -tools.esptool.upload.network_pattern="{network_cmd}" -I "{runtime.platform.path}/tools/espota.py" -i "{serial.port}" -p "{network.port}" "--auth={network.password}" -f "{build.path}/{build.project_name}.bin" +tools.esptool.upload.pattern="{cmd}" -I "{runtime.platform.path}/tools/upload.py" -fi "{build.Filesystem}" -up "{build.Upload}" --port "{serial.port}" --baud "{upload.speed}" {upload.resetmethod} --sk 0x0 "{build.path}/{build.project_name}.bin" --fs {build.spiffs_start} "{build.path}/{build.project_name}" {upload.erase_cmd} "{upload.verbose}" +tools.esptool.upload.network_pattern="{network_cmd}" -I "{runtime.platform.path}/tools/netUpload.py" -fi "{build.Filesystem}" -up "{build.Upload}" -i "{serial.port}" -p "{network.port}" "--auth={network.password}" --sk "{build.path}/{build.project_name}.bin" --fs "{build.path}/{build.project_name}" tools.mkspiffs.cmd=mkspiffs tools.mkspiffs.cmd.windows=mkspiffs.exe diff --git a/tools/boards.txt.py b/tools/boards.txt.py index 673f8d8068..98c9b09174 100755 --- a/tools/boards.txt.py +++ b/tools/boards.txt.py @@ -1032,6 +1032,27 @@ ( '.build.spiffs_pagesize', '256' ), ( '.build.debug_port', '' ), ( '.build.debug_level', '' ), + + ( '.menu.Upload.Sketch', 'Sketch' ), + ( '.menu.Upload.Sketch.build.Upload', '1' ), + ( '.menu.Upload.Filesystem', 'Filesystem' ), + ( '.menu.Upload.Filesystem.build.Upload', '2' ), + ( '.menu.Upload.Both', 'Both' ), + ( '.menu.Upload.Both.build.Upload', '3' ), + + ( '.menu.Filesystem.Off', 'Off' ), + ( '.menu.Filesystem.Off.build.Filesystem', '0' ), + ( '.menu.Filesystem.LitteFs', 'LitteFs' ), + ( '.menu.Filesystem.LitteFs.build.Filesystem', '1' ), + ( '.menu.Filesystem.SPIFFS', 'SPIFFS' ), + ( '.menu.Filesystem.SPIFFS.build.Filesystem', '2' ), + + ( '.menu.Export.Off', 'Off' ), + ( '.menu.Export.Off.build.Export', '0' ), + ( '.menu.Export.Binaries', '.bin & .bin.signed' ), + ( '.menu.Export.Binaries.build.Export', '1' ), + ( '.menu.Export.GzBinaries', 'Create & Export gzipped Binaries too' ), + ( '.menu.Export.GzBinaries.build.Export', '2' ), ]), ####################### @@ -1658,6 +1679,9 @@ def all_boards (): print('menu.ssl=SSL Support') print('menu.mmu=MMU') print('menu.non32xfer=Non-32-Bit Access') + print('menu.Upload=Upload') + print('menu.Filesystem=Filesystem') + print('menu.Export=Export') print('') missingboards = [] diff --git a/tools/netUpload.py b/tools/netUpload.py new file mode 100755 index 0000000000..f80af195c6 --- /dev/null +++ b/tools/netUpload.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python3 + +# Network-Upload-Wrapper +# 2021-08-08: G.N.: Written to support (optional) uploading of sketch & filesystem in one step + +import os +import sys +ToolsDir = os.path.dirname( os.path.realpath( __file__ ) ).replace( '\\', '/' ) + "/" # convert to UNIX format +try: + sys.path.insert( 0, ToolsDir ) # ToolsDir + from utilities import * # If this fails, we can't continue and will bomb below +except Exception as e: + sys.stderr.write( '\nImport of utilities.py failed.\n...Is it not next to this %s tool?\n...Exception was: %s\n' % ( __file__, e ) ) + sys.exit( 2 ) + +try: + sys.path.insert( 0, ToolsDir ) # Add this dir to search path + import espota # If this fails, we can't continue and will bomb below +except Exception: + Msg( '\nespota not found next to this netUpload.py tool.' ) + sys.exit( 2 ) + +#Args: (original) +# As defined in 'platform.txt' for 'tools.esptool.upload.network_pattern' +# -i "{serial.port}" +# -p "{network.port}" +# "--auth={network.password}" +# -f "{build.path}/{build.project_name}.bin" + +#Args: (new) +# As defined in 'platform.txt' for 'tools.esptool.upload.network_pattern' +# | possible values/meaning +# | | +# -fi "{build.Filesystem}" 0-4 +# -i "{serial.port}" +# -p "{network.port}" +# "--auth={network.password}" +# --sk "{build.path}/{build.project_name}.bin" +# --fs "{build.path}/{build.project_name}" + +def parse_args( argsIn ): + parser = argparse.ArgumentParser( description = 'Network-Upload-Wrapper for Arduino esp8266' ) + parser.add_argument( '-fi', '--Filesystem', type = int, default = 0, help = '0: Off, 1: LitteFs: Create & Upload, 2: LitteFs: Create only, 3: SPIFFS: Create & Upload, 4: SPIFFS: Create only' ) + parser.add_argument( '-i', '--port', type = str, required = True, help = 'path to serial device' ) + parser.add_argument( '-p', '--netPort', type = str, required = True, help = 'network port' ) + parser.add_argument( '--auth', type = str, help = 'network password' ) + parser.add_argument( '--sk', type = str, required = True, help = 'path_path_to_sketch_binary' ) + parser.add_argument( '--fs', type = str, help = 'path_to_fs_binary_without_ext' ) + global Args + Args = parser.parse_args( argsIn ) + +def main( argsIn = None ): + """ + Main function for netUpload + + argsIn - Optional override for default arguments parsing (that uses sys.argv), can be a list of custom arguments. + Arguments and their values need to be added as individual items to the list e.g. "-b 115200" thus becomes ['-b', '115200']. + """ + + parse_args( argsIn ) + + if not os.path.exists( Args.port ): + Msg( "Port: '%s', does not exist!\n...Upload aborted" % Args.port ) + sys.exit( 1 ) + + baseArgs = [ '-i', Args.port, '-p', Args.netPort, '--auth', Args.auth ] + + sketchArgs = baseArgs + [ '-f', Args.sk ] + + Msg( "Uploading Binaries..." ) + + #Debug( str( sketchArgs ) ) + esptool.main( sketchArgs ) + filesUploaded = [ Args.sk ] + + if Args.Filesystem == 1 or Args.Filesystem == 3: + fsArgs = baseArgs + [ '-s', '-f' ] + if Args.Filesystem == 1: + fsArgs = baseArgs + [ "%s.littlefs" % Args.fs ] + elif Args.Filesystem == 3: + fsArgs = baseArgs + [ "%s.spiffs" % Args.fs ] + + #Debug( str( fsArgs ) ) + esptool.main( fsArgs ) + filesUploaded += [ Args.fs ] + + Msg( '...files uploaded: %s' % ", ".join( filesUploaded ) ) + +def main_(): + try: + main() + except RuntimeError as e: + Msg( '\nA RuntimeError error occurred: %s' % e ) + sys.exit( 2 ) + +if __name__ == '__main__': + main_() + diff --git a/tools/postbuild.py b/tools/postbuild.py new file mode 100755 index 0000000000..96c06606a9 --- /dev/null +++ b/tools/postbuild.py @@ -0,0 +1,221 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import os +import sys +import gzip +import shutil +ToolsDir = os.path.dirname( os.path.realpath( __file__ ) ).replace( '\\', '/' ) + "/" # convert to UNIX format +try: + sys.path.insert( 0, ToolsDir ) # ToolsDir + from utilities import * # If this fails, we can't continue and will bomb below +except Exception as e: + sys.stderr.write( '\nImport of utilities.py failed.\n...Is it not next to this %s tool?\n...Exception was: %s\n' % ( __file__, e ) ) + sys.exit( 2 ) + +def parse_args( argsIn ): + parser = argparse.ArgumentParser( description = 'PostBuild for ESP8288' ) + parser.add_argument( '-fi', '--Filesystem', type = int, default = 0, help = '0: Off, 1: LitteFs, 3: SPIFFS' ) + parser.add_argument( '-ex', '--Export', type = int, default = 0, help = '0: Off, 1: .bin & .bin.signed, 2: Create & Export gzipped Binaries too' ) + parser.add_argument( '-na', '--name', type = str, required = True, help = 'Name of sketch (without extension)' ) + parser.add_argument( '-bp', '--buildPath', type = str, required = True, help = 'Path to temporary dir where sketch was build' ) + parser.add_argument( '-so', '--source', type = str, required = True, help = 'Path to sketch' ) + parser.add_argument( '-va', '--variant', type = str, required = True, help = 'Name of board' ) + parser.add_argument( '-ss', '--spiffs_start', type = str, help = 'build.spiffs_start' ) + parser.add_argument( '-se', '--spiffs_end', type = str, help = 'build.spiffs_end' ) + parser.add_argument( '-sp', '--spiffs_pagesize', type = str, default = '256', help = 'build.spiffs_pagesize' ) + parser.add_argument( '-sl', '--spiffs_blocksize', type = str, default = '4096', help = 'build.spiffs_blocksize' ) + global Args + Args = parser.parse_args( argsIn ) + +def CountFilesInDir( dataDir ): + fileCount = 0 + for root, dir, files in os.walk( dataDir ): + for file in files: + #!? Why Ony count files without '.' ?? + if file[ 0 ] != ".": + fileCount += 1 + return fileCount + +def CreateGzFile( dir, name ): + """ gzip the file 'dir/name' and save the compressed file to 'dir/name.gz'. Return name of generated file as list. """ + outName = "%s.gz" % name + outPath = os.path.join( dir, outName ) + inPath = os.path.join( dir, name ) + with open( inPath, 'rb' ) as inFile: + with gzip.open( outPath, 'wb' ) as outFile: + shutil.copyfileobj( inFile, outFile ) + if not os.path.exists( outPath ): + raise FatalError( "gzip: file '%s' not created" % outName ) + return [ outName ] + +def CreateSignedFile( dir, name ): + """ Signs the file 'dir/name' with the private key (defined by global var 'SigningPrivKeyPath'). + Save the signed binary to 'dir/name.signed'. Return name of generated file as list. """ + inFilePath = os.path.join( dir, name ) + try: + with open( inFilePath, "rb" ) as b: + inFileData = b.read() + signcmd = [ 'openssl', 'dgst', '-sha256', '-sign', SigningPrivKeyPath ] + proc = subprocess.Popen( signcmd, stdout = subprocess.PIPE, stdin = subprocess.PIPE, stderr = subprocess.PIPE ) + signout, signerr = proc.communicate( input = inFileData ) + if proc.returncode: + raise FatalError( "OpenSSL returned an error signing the binary: %d\nSTDERR: %d" % ( proc.returncode, signerr ) ) + outName = "%s.signed" % name + with open( os.path.join( dir, outName ), "wb" ) as out: + out.write( inFileData ) + out.write( signout ) + out.write( b'\x00\x01\x00\x00' ) + return [ outName ] + except Exception as e: + raise FatalError( "Exception while signing '%s': %s" % ( name, e ) ) + return [] + +def RemoveFs( fsName ): + """ Removes the (possible existing from prev. builds) given fs from {build.path} + This enshures, that (at upload-stage) we don't use the wrong fs created formerly. + fsName = "littlefs" "spiffs" used for naming the binary to remove. """ + imageName = "./%s.%s" % ( Args.name, fsName ) + if os.path.exists( imageName ): + os.remove( imageName ) + +def CreateFs( fsName, mkFsName ): + """ Creates the given fs from all files inside subdir 'data' of the sketch. + fsName = "littlefs" "spiffs" used for naming the generated binary. + mkFsName = "mklittlefs" | "mkspiffs" the name of the programm that generates the fs """ + mkFsPath = Which( mkFsName, os.path.join( ToolsDir, mkFsName ) ) + if mkFsPath is None: + mkFsPath = Which( "%s.exe" % mkFsName, os.path.join( ToolsDir, mkFsName ) ) + res = [] + dataDir = "%s/data" % ( Args.source ) + if len( Args.spiffs_start ) == 0 or len( Args.spiffs_end ) == 0: + raise ProcessError( "CreateFs: %s Not Defined for this board" % fsName ) + if mkFsPath is None or not os.path.exists( mkFsPath ): + raise ProcessError( "CreateFs: %s dir does not exist: %s" % ( mkFsName, mkFsPath ) ) + if not os.path.exists( dataDir ): + raise ProcessError( "CreateFs: data dir does not exist: %s" % dataDir ) + if not os.path.isdir( dataDir ): + raise ProcessError( "CreateFs: data dir is not a directory: %s" % dataDir ) + FilesInDir = CountFilesInDir( dataDir ) + if FilesInDir == 0: + if not ConfirmDialog( "%s Create" % fsName, "No files have been found in your data folder!\nAre you sure you want to create an empty %s image?" % fsName ): + raise ProcessError( "Canceled by user" ) + os.makedirs( DstDir, exist_ok = True ) + imageName = "%s.%s" % ( Args.name, fsName ) + imagePath = os.path.join( Args.source, "bin", Args.variant, imageName ) + cmd = "\"%s\" -c \"%s\" -p %s -b %s -s %d \"%s\"" % ( mkFsPath, dataDir, Args.spiffs_pagesize, Args.spiffs_blocksize, IntValFromStr( Args.spiffs_end ) - IntValFromStr( Args.spiffs_start ), imagePath ) + if os.system( cmd ) != 0 or not os.path.exists( imagePath ): + raise FatalError( "%s: Creating failed" % fsName ) + res += [ imageName ] + + # fs is created inside subdir "bin/{build.variant}/" of sketch folder. + # That means there is no need for doing an (extra) "export". + # But unforunally during "upload" the variable {build.source.path} was not set. + # So, for supporting upload of fs, we copy the generated file back into {build.path} + shutil.copyfile( imagePath, "./%s" % imageName ) + + signing = Signing and os.path.exists( os.path.abspath( Args.name + ".bin.signed" ) ) + if signing: + res += CreateSignedFile( DstDir, imageName ) + if Args.Export == 2: + res += CreateGzFile( DstDir, imageName ) + if signing: + res += CreateSignedFile( DstDir, "%s.%s.gz" % ( Args.name, fsName ) ) + return res + +def ProcessFilesystem_(): + if Args.spiffs_start is None or Args.spiffs_end is None: + raise ProcessError( "'spiffs_start' and/or 'spiffs_end' missing" ) + if Args.Filesystem == 1: + RemoveFs( "spiffs" ) + return CreateFs( "littlefs", "mklittlefs" ) + elif Args.Filesystem == 2: + RemoveFs( "littlefs" ) + return CreateFs( "spiffs", "mkspiffs" ) + +def ProcessExport_(): + res = [] + os.makedirs( DstDir, exist_ok = True ) + # Copy Binaries + res += CopyToDir( Args.name, "bin", DstDir ) + res += CopyToDir( Args.name, "bin.signed", DstDir ) + if Args.Export == 2: + # Create & Export gzipped Binaries too + res += CreateGzFile( DstDir, "%s.bin" % Args.name ) + if os.path.exists( os.path.abspath( os.path.join( DstDir, "%s.bin.signed" % Args.name ) ) ): + res += CreateSignedFile( DstDir, "%s.bin.gz" % Args.name ) + return res + +def ProcessFilesystem(): + Msg( "Creating Filesystem..." ) + try: + filesCreated = ProcessFilesystem_() + Msg( '...files generated: %s' % ", ".join( filesCreated ) ) + except ProcessError as e: + Msg( '...aborted: %s' % e ) + try: + WarningDialog( "Filesystem Create aborted", e ) + except ProcessError: + pass + +def ProcessExport(): + Msg( "Exporting Binaries..." ) + filesExported = ProcessExport_() + Msg( '...files exported: %s' % ", ".join( filesExported ) ) + +def main( argsIn = None ): + """ + Main function for postbuild + + argsIn - Optional override for default arguments parsing (that uses sys.argv), can be a list of custom arguments. + Arguments and their values need to be added as individual items to the list e.g. "-b 115200" thus becomes ['-b', '115200']. + """ + + #Debug( "Python-Path: %s" % sys.executable ) + parse_args( argsIn ) + #Debug( "Posbuild: Args: %s" % ", ".join( sys.argv[ 1: ] ) ) + + #!! For unknown reason using/concatinig Args.buildPath with "/" (or enything else) will result in an empthy string ??? + #if You uncomment the following two lines You will see something like: + # Args.buildPath: /buildPath/arduino_build_572904. + # Args.buildPath/: . + #Debug( "Args.buildPath: %s." % Args.buildPath ) + #Debug( "Args.buildPath/: %s/." % Args.buildPath + '/' ) + + # Workaround: cd to the build/temp path + cwd = os.getcwd() + os.chdir( Args.buildPath ) + Msg( 'Build-Dir: %s\n' % Args.buildPath ) + + #! Even this will not give the correct path ! + #Debug( "abspath: %s" % os.path.abspath( "./" ) ) + #Debug( "abspath2: %s" % os.path.abspath( "./" ) + "/" ) + + global SigningPrivKeyPath, Signing, DstDir + try: + SigningPrivKeyPath = os.path.abspath( "%s/private.key" % Args.source ) + Signing = os.path.isfile( SigningPrivKeyPath ) + DstDir = os.path.join( Args.source, "bin", Args.variant ) + if Args.Filesystem == 0: + RemoveFs( "littlefs" ) + RemoveFs( "spiffs" ) + else: + ProcessFilesystem() + if Args.Export != 0: + ProcessExport() + finally: + # restore working dir + os.chdir( cwd ) + +def main_(): + try: + main() + except FatalError as e: + Msg( '\nA fatal error occurred: %s\n' % e ) + sys.exit( 1 ) + except RuntimeError as e: + Msg( '\nA RuntimeError error occurred: %s' % e ) + sys.exit( 2 ) + +if __name__ == '__main__': + main_() diff --git a/tools/upload.py b/tools/upload.py index 2b7016cc95..dd58587727 100755 --- a/tools/upload.py +++ b/tools/upload.py @@ -1,69 +1,131 @@ #!/usr/bin/env python3 -# 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 +# New Upload-Wrapper for Arduino esp8266 +# 2021-08-08: G.N.: Totally rewritten to support (optional) uploading of sketch & filesystem in one step -# First parameter is pyserial path, second is esptool path, then a series of command arguments -# i.e. upload.py tools/pyserial tools/esptool write_flash file 0x0 - -import sys import os +import sys +ToolsDir = os.path.dirname( os.path.realpath( __file__ ) ).replace( '\\', '/' ) + "/" # convert to UNIX format +try: + sys.path.insert( 0, ToolsDir ) # ToolsDir + from utilities import * # If this fails, we can't continue and will bomb below +except Exception as e: + sys.stderr.write( '\nImport of utilities.py failed.\n...Is it not next to this %s tool?\n...Exception was: %s\n' % ( __file__, e ) ) + sys.exit( 2 ) import tempfile +from pathlib import Path -sys.argv.pop(0) # Remove executable name -toolspath = os.path.dirname(os.path.realpath(__file__)).replace('\\', '/') # CWD in UNIX format try: - sys.path.insert(0, toolspath + "/pyserial") # Add pyserial dir to search path - sys.path.insert(0, toolspath + "/esptool") # Add esptool dir to search path + sys.path.insert( 0, ToolsDir + "pyserial" ) # Add pyserial dir to search path + sys.path.insert( 0, ToolsDir + "esptool" ) # Add esptool dir to search path import esptool # If this fails, we can't continue and will bomb below except Exception: - sys.stderr.write("pyserial or esptool directories not found next to this upload.py tool.\n") - sys.exit(1) + Msg( '\npyserial or esptool directories not found next to this upload.py tool.' ) + sys.exit( 2 ) + +#Args: (original) +# As defined in 'platform.txt' for 'tools.esptool.upload.pattern' possible values (from boards.txt[.py]) +# | | +# --chip esp8266 +# --port "{serial.port}" e.g.: /dev/ttyUSB0 +# --baud "{upload.speed}" e.g.: 115200 +# "{upload.verbose}" { '' | '--trace' } +# {upload.erase_cmd} { '' | 'erase_region "{build.rfcal_addr}" 0x4000' | 'erase_flash' } +# {upload.resetmethod} --before { default_reset | no_reset | no_reset_no_sync } --after { hard_reset | soft_reset } +# write_flash 0x0 "{build.path}/{build.project_name}.bin" write_flash + +#Args: (combined firmware and filesystem) +# As defined in 'platform.txt' for 'tools.esptool.upload.pattern' possible values +# | | +# -up "{build.Upload}" 1-3 +# -fi "{build.Filesystem}" 0-2 +# --port "{serial.port}" e.g.: /dev/ttyUSB0 +# --baud "{upload.speed}" e.g.: 115200 +# {upload.resetmethod} --before { default_reset | no_reset | no_reset_no_sync } --after { hard_reset | soft_reset } +# --sk 0x0 "{build.path}/{build.project_name}.bin" +# --fs {build.spiffs_start} "{build.path}/{build.project_name}" +# {upload.erase_cmd} { '' | 'erase_region "{build.rfcal_addr}" 0x4000' | 'erase_flash' } +# "{upload.verbose}" { '' | '--trace' } +# Remark: +# {upload.erase_cmd} "{upload.verbose}" should be the last two parameters given in 'platform.txt' + +def parse_args( argsIn ): + parser = argparse.ArgumentParser( description = 'Upload-Wrapper for Arduino esp8266' ) + parser.add_argument( '-up', '--Upload', type = int, default = 1, help = '1: Sketch, 2: Filesystem, 3: Both' ) + parser.add_argument( '-fi', '--Filesystem', type = int, default = 0, help = '0: Off, 1: LitteFs, 3: SPIFFS' ) + parser.add_argument( '--port', type = str, required = True, help = 'path to serial device' ) + parser.add_argument( '--baud', type = str, required = True, help = 'baudrate' ) + parser.add_argument( '--before', type = str, required = True, help = 'before (default_reset/no_reset/no_reset_no_sync)' ) + parser.add_argument( '--after', type = str, required = True, help = 'after (hard_reset/soft_reset)' ) + parser.add_argument( '--sk', type = str, nargs=2, help = 'adr path_path_to_sketch_binary' ) + parser.add_argument( '--fs', type = str, nargs=2, help = 'adr path_path_to_fs_binary_without_ext' ) + parser.add_argument( 'erase_cmd', type = str, nargs='*', help = 'erase_cmd' ) + parser.add_argument( '--trace', action='store_true', help = 'verbose' ) + global Args + Args = parser.parse_args( argsIn ) + -cmdline = [] -write_option = '' -write_addr = '0x0' -erase_addr = '' -erase_len = '' +def main( argsIn = None ): + """ + Main function for upload -while len(sys.argv): - thisarg = sys.argv.pop(0) + argsIn - Optional override for default arguments parsing (that uses sys.argv), can be a list of custom arguments. + Arguments and their values need to be added as individual items to the list e.g. "-b 115200" thus becomes ['-b', '115200']. + """ + + parse_args( argsIn ) + + if not os.path.exists( Args.port ): + Msg( "Port: '%s', does not exist!\n...Upload aborted" % Args.port ) + sys.exit( 1 ) # 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. - if thisarg == "921600": - thisarg = "460800" - - # 'erase_flash' command is translated to the write_flash --erase-all option - # https://github.com/esp8266/Arduino/issues/6755#issuecomment-553208688 - if thisarg == "erase_flash": - write_option = '--erase-all' - elif thisarg == 'erase_region': - erase_addr = sys.argv.pop(0) - erase_len = sys.argv.pop(0) - elif thisarg == 'write_flash': - write_addr = sys.argv.pop(0) - binary = sys.argv.pop(0) - elif len(thisarg): - cmdline = cmdline + [thisarg] - -cmdline = cmdline + ['write_flash'] -if len(write_option): - cmdline = cmdline + [write_option] -cmdline = cmdline + ['--flash_size', 'detect'] -cmdline = cmdline + [write_addr, binary] - -erase_file = '' -if len(erase_addr): - # Generate temporary empty (0xff) file - eraser = tempfile.mkstemp() - erase_file = eraser[1] - os.write(eraser[0], bytearray([255] * int(erase_len, 0))) - os.close(eraser[0]) - cmdline = cmdline + [ erase_addr, erase_file ] - -esptool.main(cmdline) - -if len(erase_file): - os.remove(erase_file) + if Args.baud == "921600": + Args.baud = "460800" + esptoolArgs = [ '--chip', 'esp8266', '--port', Args.port, '--baud', Args.baud, '--before', Args.before, '--after', Args.after ] + if Args.trace: + esptoolArgs += [ '--trace' ] + esptoolArgs += [ 'write_flash' ] + + EraseFilePath = '' + filesUploaded = [] + try: + if ( Args.Upload & 1 ) == 1: + if len( Args.erase_cmd ) and Args.erase_cmd[ 0 ] == "erase_flash": + esptoolArgs += [ '--erase-all' ] + esptoolArgs += [ '--flash_size', 'detect', Args.sk[ 0 ], Args.sk[ 1 ] ] + + if len( Args.erase_cmd ) and Args.erase_cmd[ 0 ] == "erase_region": + # Generate temporary empty (0xff) file + f, EraseFilePath = tempfile.mkstemp() + os.write( f, bytearray( [ 255 ] * int( Args.erase_cmd[ 2 ], 0 ) ) ) + os.close( f ) + esptoolArgs += [ Args.erase_cmd[ 1 ], EraseFilePath ] + + filesUploaded += [ Path( Args.sk[ 1 ] ).name ] + + if ( Args.Upload & 2 ) == 2: + fsName = "%s.%s" % ( Args.fs[ 1 ], "littlefs" if Args.Filesystem == 1 else "spiffs" ) + if os.path.exists( fsName ): + esptoolArgs += [ Args.fs[ 0 ], fsName ] + filesUploaded += [ Path( fsName ).name ] + + Msg( "Uploading Binaries..." ) + #Debug( str( esptoolArgs ) ) + esptool.main( esptoolArgs ) + Msg( '...files uploaded: %s' % ", ".join( filesUploaded ) ) + finally: + if len( EraseFilePath ): + os.remove( EraseFilePath ) + +def main_(): + try: + main() + except RuntimeError as e: + Msg( '\nA RuntimeError error occurred: %s' % e ) + sys.exit( 2 ) + +if __name__ == '__main__': + main_() diff --git a/tools/utilities.py b/tools/utilities.py new file mode 100755 index 0000000000..d300b7b0a7 --- /dev/null +++ b/tools/utilities.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import os +import sys +import platform +import argparse +import shutil +import subprocess + +PyautoguiAvailable = True +try: + import pyautogui +except: + PyautoguiAvailable = False + + +class FatalError( Exception ): + def __init__( self, msg ): + super().__init__( msg ) + +class ProcessError( Exception ): + def __init__( self, msg ): + super().__init__( msg ) + +def Msg( txt ): + sys.stderr.write( txt + "\n" ) + +def Debug( txt ): + sys.stderr.write( txt + "\n" ) + +def Which_Chdir_( prg, dir ): + cwd = os.getcwd() + try: + os.chdir( dir ) + except: + return None + res = None + try: + res = shutil.which( "./%s" % prg ) + if res is not None: + res = os.path.abspath( os.path.join( os.getcwd(), prg ) ) + finally: + os.chdir( cwd ) + return res + +def Which( prg, dir = None ): + """ returns full path to executable 'prg'. + Takes care of OS, on Windows searches for .exe instead of . + if is given prefers prg inside this dir over others""" + if platform.system() == "Windows": + prg = "%s.exe" % prg + res = None + if dir is not None: + res = Which_Chdir_( prg, dir ) + if res is None: + res = shutil.which( prg ) + return res + +def CopyToDir( name, ext, dstDir ): + """ if file './name.ext' exist, copy it to 'dstDir/name.ext'. Return name of copied file as list. """ + fileName = "%s.%s" % ( name, ext ) + srcPath = os.path.abspath( fileName ) + if not os.path.exists( srcPath ): + return [] + shutil.copyfile( srcPath, os.path.join( dstDir, fileName ) ) + return [ fileName ] + +def IntValFromStr( strVal ): + """ Convert string into integer, can be used with decimal value '123' or hex '0xabc'. """ + return int( strVal.strip(), 0 ) + +def RemoveIno( path ): + """ Returns the given path with extension ".ino" removed (if exist) """ + if path[ -4: ] == ".ino": + path = name[ 0:-4 ] + return path + +def TkDialog( title, text, mbName ): + try: + import tkinter + from tkinter import messagebox + except: + raise ProcessError( "tkinter not available.\nPlease install it with:\npip3 install tkinter\n" ) + rootWin = tkinter.Tk() # Create the object + rootWin.overrideredirect( 1 ) # Avoid it appearing and then disappearing quickly + #rootWin.iconbitmap("PythonIcon.ico") # Set an icon (this is optional - must be in a .ico format) + rootWin.withdraw() # Hide the window as we do not want to see this one + mbFunc = getattr( messagebox, mbName ) + return mbFunc( title, text, parent = rootWin ) +def InfoDialog( title, text ): + return TkDialog( title, text, 'showinfo' ) +def WarningDialog( title, text ): + return TkDialog( title, text, 'showwarning' ) +def ErrorDialog( title, text ): + return TkDialog( title, text, 'showerror' ) +def QuestionDialog( title, text ): + return TkDialog( title, text, 'askquestion' ) +def OkCancelDialog( title, text ): + return TkDialog( title, text, 'askokcancel' ) +def RetryCancelDialog( title, text ): + return TkDialog( title, text, 'askretrycancel' ) +def YesNoDialog( title, text ): + return TkDialog( title, text, 'askyesno' ) +def ConfirmDialog( title, text ): + return TkDialog( title, text, 'askyesno' ) +def YesNoCancelDialog( title, text ): + return TkDialog( title, text, 'askyesnocancel' ) +