diff --git a/.vscode/settings.json b/.vscode/settings.json index 268cfeab7..2dbb27e8f 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -15,6 +15,16 @@ "tooltip": "PlatformIO: Build", "commands": "platformio-ide.build" }, + { + "text": "Upload", + "tooltip": "PlatformIO: Flash firmware (NO build run)", + "commands": [ + { + "id": "platformio-ide.runPIOCoreCommand", + "args": "pio run -t nobuild -t factory_flash" + } + ] + }, { "text": "$(zap)", "tooltip": "PlatformIO: Build and Upload", @@ -30,11 +40,6 @@ } ] }, - { - "text": "$(arrow-right)", - "tooltip": "PlatformIO: Upload and Monitor", - "commands": "platformio-ide.uploadAndMonitor" - }, { "text": "$(error)", "tooltip": "PlatformIO: Erase Flash", @@ -45,6 +50,11 @@ } ] }, + { + "text": "$(arrow-right)", + "tooltip": "PlatformIO: Upload and Monitor", + "commands": "platformio-ide.uploadAndMonitor" + }, { "text": "$(device-desktop)", "tooltip": "PlatformIO: Serial Monitor", diff --git a/pio-tools/download_fs.py b/pio-tools/custom_target.py similarity index 90% rename from pio-tools/download_fs.py rename to pio-tools/custom_target.py index 0235af850..29a31f6d9 100644 --- a/pio-tools/download_fs.py +++ b/pio-tools/custom_target.py @@ -256,9 +256,14 @@ def get_fs_type_start_and_length(): def download_fs(fs_info: FSInfo): esptoolpy = join(platform.get_package_dir("tool-esptoolpy") or "", "esptool.py") + upload_port = join(env.get("UPLOAD_PORT", "none")) + if "none" in upload_port: + env.AutodetectUploadPort() + upload_port = join(env.get("UPLOAD_PORT", "none")) fs_file = join(env["PROJECT_DIR"], f"downloaded_fs_{hex(fs_info.start)}_{hex(fs_info.length)}.bin") esptoolpy_flags = [ "--chip", mcu, + "--port", upload_port, "--baud", env.subst("$UPLOAD_SPEED"), "--before", "default_reset", "--after", "hard_reset", @@ -318,6 +323,29 @@ def command_download_fs(*args, **kwargs): if unpack_ok is True: display_fs(unpacked_dir) +def upload_factory(*args, **kwargs): + esptoolpy = join(platform.get_package_dir("tool-esptoolpy") or "", "esptool.py") + upload_speed = join(str(board.get("upload.speed", "115200"))) + upload_port = join(env.get("UPLOAD_PORT", "none")) + cur_env = (env["PIOENV"]) + firm_name = cur_env + "%s" % (".bin" if mcu == "esp8266" else (".factory.bin")) + target_firm = join(env.subst("$PROJECT_DIR"), "build_output","firmware",firm_name) + if "none" in upload_port: + env.AutodetectUploadPort() + upload_port = join(env.get("UPLOAD_PORT", "none")) + if "tasmota" in cur_env: + esptoolpy_flags = [ + "--chip", mcu, + "--port", upload_port, + "--baud", upload_speed, + "write_flash", + "0x0", + target_firm + ] + esptoolpy_cmd = [env["PYTHONEXE"], esptoolpy] + esptoolpy_flags + print("Flash firmware at address 0x0") + subprocess.call(esptoolpy_cmd, shell=False) + env.AddCustomTarget( name="downloadfs", dependencies=None, @@ -327,3 +355,13 @@ env.AddCustomTarget( title="Download Filesystem", description="Downloads and displays files stored in the target ESP32/ESP8266" ) + +env.AddCustomTarget( + name="factory_flash", + dependencies=None, + actions=[ + upload_factory + ], + title="Flash factory", + description="Flash factory firmware" +) diff --git a/pio-tools/name-firmware.py b/pio-tools/name-firmware.py index d6a310337..09edb2866 100644 --- a/pio-tools/name-firmware.py +++ b/pio-tools/name-firmware.py @@ -29,4 +29,4 @@ def bin_map_copy(source, target, env): if env["PIOPLATFORM"] == "espressif32": shutil.copy(factory, one_bin_file) -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", bin_map_copy) +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", bin_map_copy) \ No newline at end of file diff --git a/pio-tools/set_partition_table.py b/pio-tools/set_partition_table.py index 7287c73ee..e8708609f 100644 --- a/pio-tools/set_partition_table.py +++ b/pio-tools/set_partition_table.py @@ -9,11 +9,26 @@ Import("env") import os +from os.path import isfile, join +import shutil from SCons.Script import COMMAND_LINE_TARGETS board_config = env.BoardConfig() if "nobuild" in COMMAND_LINE_TARGETS: + if not os.path.isfile(join(env.subst("$BUILD_DIR"),"firmware.bin")): + #print ("No firmware in path:",join(env.subst("$BUILD_DIR"))) + env.CleanProject() + cur_env = (env["PIOENV"]) + firm_name = cur_env + ".bin" + source_firm = join(env.subst("$PROJECT_DIR"), "build_output","firmware",firm_name) + if not os.path.exists(join(env.subst("$BUILD_DIR"))): + os.makedirs(join(env.subst("$BUILD_DIR"))) + shutil.copy(source_firm, join(env.subst("$BUILD_DIR"))) + target_ren = join(env.subst("$BUILD_DIR"), firm_name) + renamed = join(env.subst("$BUILD_DIR"), "firmware.bin") + os.rename(target_ren, renamed) + if env["PIOPLATFORM"] != "espressif32": framework_dir = env.PioPlatform().get_package_dir("framework-arduinoespressif8266") assert os.path.isdir(framework_dir) diff --git a/platformio.ini b/platformio.ini index 283261d2e..6cc1cb03a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -72,7 +72,7 @@ extra_scripts = pre:pio-tools/pre_source_dir.py [esp_defaults] extra_scripts = post:pio-tools/name-firmware.py post:pio-tools/gzip-firmware.py - post:pio-tools/download_fs.py + post:pio-tools/custom_target.py ; post:pio-tools/obj-dump.py ${scripts_defaults.extra_scripts} ; *** remove undesired all warnings