esptool 5.3.dev3__tar.gz → 5.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {esptool-5.3.dev3/esptool.egg-info → esptool-5.3.1}/PKG-INFO +6 -1
- {esptool-5.3.dev3 → esptool-5.3.1}/README.md +4 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esp_rfc2217_server/__init__.py +150 -150
- {esptool-5.3.dev3 → esptool-5.3.1}/esp_rfc2217_server/__main__.py +9 -9
- {esptool-5.3.dev3 → esptool-5.3.1}/esp_rfc2217_server/esp_port_manager.py +102 -102
- {esptool-5.3.dev3 → esptool-5.3.1}/esp_rfc2217_server.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c61/fields.py +0 -4
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h21/operations.py +0 -9
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32h21.yaml +76 -86
- {esptool-5.3.dev3 → esptool-5.3.1}/espsecure/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/__init__.py +3 -5
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/bin_image.py +6 -1
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/loader.py +80 -34
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/reset.py +52 -14
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32c3.py +2 -1
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32c61.py +0 -6
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32h21.py +20 -3
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32p4.py +2 -2
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32s3.py +2 -1
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/2/README.md +1 -1
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp32.json +8 -0
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp32c2.json +8 -0
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp32c3.json +8 -0
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp32c5.json +8 -0
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp32c6.json +8 -0
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp32c61.json +8 -0
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp32h2.json +8 -0
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp32h4.json +8 -0
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp32p4-rev1.json +8 -0
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp32p4.json +8 -0
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp32s2.json +8 -0
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp32s3.json +30 -0
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp32s31.json +8 -0
- esptool-5.3.1/esptool/targets/stub_flasher/2/esp8266.json +8 -0
- {esptool-5.3.dev3 → esptool-5.3.1/esptool.egg-info}/PKG-INFO +6 -1
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool.egg-info/requires.txt +3 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/pyproject.toml +5 -1
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32.json +0 -8
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32c2.json +0 -8
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32c3.json +0 -8
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32c5.json +0 -8
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32c6.json +0 -8
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32c61.json +0 -8
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32h2.json +0 -8
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32h4.json +0 -8
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32p4-rev1.json +0 -8
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32p4.json +0 -8
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32s2.json +0 -8
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32s3.json +0 -30
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32s31.json +0 -8
- esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp8266.json +0 -8
- {esptool-5.3.dev3 → esptool-5.3.1}/LICENSE +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/MANIFEST.in +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esp_rfc2217_server/redirector.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/__main__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/cli_util.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/base_fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/base_operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/csv_table_parser.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/emulate_efuse_controller_base.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32/fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32/operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c2/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c2/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c2/fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c2/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c2/operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c3/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c3/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c3/fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c3/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c3/operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c5/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c5/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c5/fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c5/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c5/operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c6/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c6/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c6/fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c6/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c6/operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c61/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c61/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c61/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32c61/operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32e22/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32e22/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32e22/fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32e22/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32e22/operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h2/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h2/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h2/fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h2/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h2/operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h21/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h21/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h21/fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h21/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h4/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h4/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h4/fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h4/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32h4/operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32p4/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32p4/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32p4/fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32p4/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32p4/operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s2/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s2/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s2/fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s2/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s2/operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s3/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s3/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s3/fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s3/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s3/operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s31/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s31/emulate_efuse_controller.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s31/fields.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s31/mem_definition.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/esp32s31/operations.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/mem_definition_base.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse/util.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32c2.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32c3.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32c5.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32c6.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32c61.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32e22.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32h2.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32h2_v0.0_v1.1.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32h4.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32p4.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32p4_v3.0.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32s2.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32s3.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_defs/esp32s31.yaml +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse/efuse_interface.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espefuse.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espsecure/__main__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espsecure/esp_hsm_sign/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espsecure/esp_hsm_sign/exceptions.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/espsecure.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/__main__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/cli_util.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/cmds.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/config.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/logger.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/__init__.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32c2.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32c5.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32c6.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32e22.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32h2.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32h4.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32s2.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp32s31.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/esp8266.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/1/README.md +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32.json +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32c2.json +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32c3.json +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32c5.json +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32c6.json +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32h2.json +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32p4-rev1.json +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32s2.json +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32s3.json +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp8266.json +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/2/LICENSE-APACHE +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/targets/stub_flasher/2/LICENSE-MIT +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/uf2_writer.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool/util.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool.egg-info/SOURCES.txt +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool.egg-info/dependency_links.txt +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool.egg-info/entry_points.txt +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool.egg-info/top_level.txt +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/esptool.py +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/setup.cfg +0 -0
- {esptool-5.3.dev3 → esptool-5.3.1}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: esptool
|
|
3
|
-
Version: 5.3.
|
|
3
|
+
Version: 5.3.1
|
|
4
4
|
Summary: A serial utility for flashing, provisioning, and interacting with Espressif SoCs.
|
|
5
5
|
Author: Fredrik Ahlberg (themadinventor), Angus Gratton (projectgus), Espressif Systems
|
|
6
6
|
License: GPLv2+
|
|
@@ -28,6 +28,7 @@ Description-Content-Type: text/markdown
|
|
|
28
28
|
License-File: LICENSE
|
|
29
29
|
Requires-Dist: bitstring!=4.2.0,>=3.1.6
|
|
30
30
|
Requires-Dist: cryptography>=43.0.0
|
|
31
|
+
Requires-Dist: cryptography<49.0.0; platform_system == "Darwin" and platform_machine == "x86_64"
|
|
31
32
|
Requires-Dist: pyserial>=3.3
|
|
32
33
|
Requires-Dist: reedsolo<1.8,>=1.5.3
|
|
33
34
|
Requires-Dist: PyYAML>=5.1
|
|
@@ -60,6 +61,10 @@ A Python-based, open-source, platform-independent serial utility for flashing, p
|
|
|
60
61
|
|
|
61
62
|
Visit the [documentation](https://docs.espressif.com/projects/esptool/) or run `esptool -h`.
|
|
62
63
|
|
|
64
|
+
## Flasher Stub
|
|
65
|
+
|
|
66
|
+
esptool uploads a small [flasher stub](https://docs.espressif.com/projects/esptool/en/latest/esptool/flasher-stub.html) program to the chip to improve flashing performance and work around ROM bootloader limitations. The stub is developed in the [esp-flasher-stub](https://github.com/espressif/esp-flasher-stub) repository. Prebuilt binaries are bundled with esptool releases.
|
|
67
|
+
|
|
63
68
|
## Contribute
|
|
64
69
|
|
|
65
70
|
If you're interested in contributing to esptool, please check the [contributions guide](https://docs.espressif.com/projects/esptool/en/latest/contributing.html).
|
|
@@ -9,6 +9,10 @@ A Python-based, open-source, platform-independent serial utility for flashing, p
|
|
|
9
9
|
|
|
10
10
|
Visit the [documentation](https://docs.espressif.com/projects/esptool/) or run `esptool -h`.
|
|
11
11
|
|
|
12
|
+
## Flasher Stub
|
|
13
|
+
|
|
14
|
+
esptool uploads a small [flasher stub](https://docs.espressif.com/projects/esptool/en/latest/esptool/flasher-stub.html) program to the chip to improve flashing performance and work around ROM bootloader limitations. The stub is developed in the [esp-flasher-stub](https://github.com/espressif/esp-flasher-stub) repository. Prebuilt binaries are bundled with esptool releases.
|
|
15
|
+
|
|
12
16
|
## Contribute
|
|
13
17
|
|
|
14
18
|
If you're interested in contributing to esptool, please check the [contributions guide](https://docs.espressif.com/projects/esptool/en/latest/contributing.html).
|
|
@@ -1,150 +1,150 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: 2009-2015 Chris Liechti
|
|
2
|
-
# SPDX-FileContributor: 2020-2024 Espressif Systems (Shanghai) CO LTD
|
|
3
|
-
# SPDX-License-Identifier: BSD-3-Clause
|
|
4
|
-
#
|
|
5
|
-
# Redirect data from a TCP/IP connection to a serial port and vice versa using RFC 2217.
|
|
6
|
-
|
|
7
|
-
###################################################################################
|
|
8
|
-
# redirect data from a TCP/IP connection to a serial port and vice versa
|
|
9
|
-
# using RFC 2217
|
|
10
|
-
#
|
|
11
|
-
# (C) 2009-2015 Chris Liechti <cliechti@gmx.net>
|
|
12
|
-
#
|
|
13
|
-
# SPDX-License-Identifier: BSD-3-Clause
|
|
14
|
-
|
|
15
|
-
import logging
|
|
16
|
-
import socket
|
|
17
|
-
import sys
|
|
18
|
-
|
|
19
|
-
import serial
|
|
20
|
-
|
|
21
|
-
from esp_rfc2217_server.redirector import Redirector
|
|
22
|
-
from esptool.util import check_deprecated_py_suffix
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def main():
|
|
26
|
-
check_deprecated_py_suffix("esp_rfc2217_server")
|
|
27
|
-
import argparse
|
|
28
|
-
|
|
29
|
-
parser = argparse.ArgumentParser(
|
|
30
|
-
description="RFC 2217 Serial to Network (TCP/IP) redirector.",
|
|
31
|
-
epilog="NOTE: no security measures are implemented. "
|
|
32
|
-
"Anyone can remotely connect to this service over the network.\n"
|
|
33
|
-
"Only one connection at once is supported. "
|
|
34
|
-
"When the connection is terminated it waits for the next connect.",
|
|
35
|
-
)
|
|
36
|
-
|
|
37
|
-
parser.add_argument("SERIALPORT")
|
|
38
|
-
|
|
39
|
-
parser.add_argument(
|
|
40
|
-
"-p",
|
|
41
|
-
"--localport",
|
|
42
|
-
type=int,
|
|
43
|
-
help="local TCP port, default: %(default)s",
|
|
44
|
-
metavar="TCPPORT",
|
|
45
|
-
default=2217,
|
|
46
|
-
)
|
|
47
|
-
|
|
48
|
-
parser.add_argument(
|
|
49
|
-
"-v",
|
|
50
|
-
"--verbose",
|
|
51
|
-
dest="verbosity",
|
|
52
|
-
action="count",
|
|
53
|
-
help="print more diagnostic messages (option can be given multiple times)",
|
|
54
|
-
default=0,
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
parser.add_argument(
|
|
58
|
-
"--r0",
|
|
59
|
-
help="Use delays necessary for ESP32 revision 0 chips",
|
|
60
|
-
action="store_true",
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
args = parser.parse_args()
|
|
64
|
-
|
|
65
|
-
if args.verbosity > 3:
|
|
66
|
-
args.verbosity = 3
|
|
67
|
-
level = (logging.WARNING, logging.INFO, logging.DEBUG, logging.NOTSET)[
|
|
68
|
-
args.verbosity
|
|
69
|
-
]
|
|
70
|
-
logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.INFO)
|
|
71
|
-
logging.getLogger("rfc2217").setLevel(level)
|
|
72
|
-
|
|
73
|
-
# connect to serial port
|
|
74
|
-
ser = serial.serial_for_url(args.SERIALPORT, do_not_open=True, exclusive=True)
|
|
75
|
-
ser.timeout = 3 # required so that the reader thread can exit
|
|
76
|
-
# reset control line as no _remote_ "terminal" has been connected yet
|
|
77
|
-
ser.dtr = False
|
|
78
|
-
ser.rts = False
|
|
79
|
-
|
|
80
|
-
logging.info("RFC 2217 TCP/IP to Serial redirector - type Ctrl-C / BREAK to quit")
|
|
81
|
-
|
|
82
|
-
try:
|
|
83
|
-
ser.open()
|
|
84
|
-
except serial.SerialException as e:
|
|
85
|
-
logging.error(f"Could not open serial port {ser.name}: {e}")
|
|
86
|
-
sys.exit(1)
|
|
87
|
-
|
|
88
|
-
logging.info(f"Serving serial port: {ser.name}")
|
|
89
|
-
settings = ser.get_settings()
|
|
90
|
-
|
|
91
|
-
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
92
|
-
srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
93
|
-
srv.bind(("", args.localport))
|
|
94
|
-
srv.listen(1)
|
|
95
|
-
logging.info(f"TCP/IP port: {args.localport}")
|
|
96
|
-
|
|
97
|
-
try:
|
|
98
|
-
host_ip = socket.gethostbyname(socket.gethostname())
|
|
99
|
-
except OSError:
|
|
100
|
-
# CI/minimal containers often have no DNS for gethostname(); the server
|
|
101
|
-
# is still reachable on loopback.
|
|
102
|
-
host_ip = "127.0.0.1"
|
|
103
|
-
wait_msg = (
|
|
104
|
-
"Waiting for connection ... use the 'rfc2217://"
|
|
105
|
-
f"{host_ip}:{args.localport}?ign_set_control' as a PORT"
|
|
106
|
-
)
|
|
107
|
-
logging.info(wait_msg)
|
|
108
|
-
|
|
109
|
-
while True:
|
|
110
|
-
srv.settimeout(5)
|
|
111
|
-
client_socket = None
|
|
112
|
-
try:
|
|
113
|
-
while client_socket is None:
|
|
114
|
-
try:
|
|
115
|
-
client_socket, addr = srv.accept()
|
|
116
|
-
except TimeoutError:
|
|
117
|
-
print(".", end="", flush=True)
|
|
118
|
-
except KeyboardInterrupt:
|
|
119
|
-
print("") # resetting inline print
|
|
120
|
-
logging.info("Exited with keyboard interrupt")
|
|
121
|
-
break
|
|
122
|
-
try:
|
|
123
|
-
logging.info(f"Connected by {addr[0]}:{addr[1]}")
|
|
124
|
-
client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
|
125
|
-
ser.rts = True
|
|
126
|
-
ser.dtr = True
|
|
127
|
-
# enter network <-> serial loop
|
|
128
|
-
r = Redirector(ser, client_socket, args.verbosity > 0, args.r0)
|
|
129
|
-
try:
|
|
130
|
-
r.shortcircuit()
|
|
131
|
-
finally:
|
|
132
|
-
logging.info("Disconnected")
|
|
133
|
-
r.stop()
|
|
134
|
-
client_socket.close()
|
|
135
|
-
ser.dtr = False
|
|
136
|
-
ser.rts = False
|
|
137
|
-
# Restore port settings (may have been changed by RFC 2217
|
|
138
|
-
# capable client)
|
|
139
|
-
ser.apply_settings(settings)
|
|
140
|
-
except KeyboardInterrupt:
|
|
141
|
-
print(flush=True)
|
|
142
|
-
break
|
|
143
|
-
except OSError as msg:
|
|
144
|
-
logging.error(str(msg))
|
|
145
|
-
|
|
146
|
-
logging.info("--- exit ---")
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
if __name__ == "__main__":
|
|
150
|
-
main()
|
|
1
|
+
# SPDX-FileCopyrightText: 2009-2015 Chris Liechti
|
|
2
|
+
# SPDX-FileContributor: 2020-2024 Espressif Systems (Shanghai) CO LTD
|
|
3
|
+
# SPDX-License-Identifier: BSD-3-Clause
|
|
4
|
+
#
|
|
5
|
+
# Redirect data from a TCP/IP connection to a serial port and vice versa using RFC 2217.
|
|
6
|
+
|
|
7
|
+
###################################################################################
|
|
8
|
+
# redirect data from a TCP/IP connection to a serial port and vice versa
|
|
9
|
+
# using RFC 2217
|
|
10
|
+
#
|
|
11
|
+
# (C) 2009-2015 Chris Liechti <cliechti@gmx.net>
|
|
12
|
+
#
|
|
13
|
+
# SPDX-License-Identifier: BSD-3-Clause
|
|
14
|
+
|
|
15
|
+
import logging
|
|
16
|
+
import socket
|
|
17
|
+
import sys
|
|
18
|
+
|
|
19
|
+
import serial
|
|
20
|
+
|
|
21
|
+
from esp_rfc2217_server.redirector import Redirector
|
|
22
|
+
from esptool.util import check_deprecated_py_suffix
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def main():
|
|
26
|
+
check_deprecated_py_suffix("esp_rfc2217_server")
|
|
27
|
+
import argparse
|
|
28
|
+
|
|
29
|
+
parser = argparse.ArgumentParser(
|
|
30
|
+
description="RFC 2217 Serial to Network (TCP/IP) redirector.",
|
|
31
|
+
epilog="NOTE: no security measures are implemented. "
|
|
32
|
+
"Anyone can remotely connect to this service over the network.\n"
|
|
33
|
+
"Only one connection at once is supported. "
|
|
34
|
+
"When the connection is terminated it waits for the next connect.",
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
parser.add_argument("SERIALPORT")
|
|
38
|
+
|
|
39
|
+
parser.add_argument(
|
|
40
|
+
"-p",
|
|
41
|
+
"--localport",
|
|
42
|
+
type=int,
|
|
43
|
+
help="local TCP port, default: %(default)s",
|
|
44
|
+
metavar="TCPPORT",
|
|
45
|
+
default=2217,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
parser.add_argument(
|
|
49
|
+
"-v",
|
|
50
|
+
"--verbose",
|
|
51
|
+
dest="verbosity",
|
|
52
|
+
action="count",
|
|
53
|
+
help="print more diagnostic messages (option can be given multiple times)",
|
|
54
|
+
default=0,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
parser.add_argument(
|
|
58
|
+
"--r0",
|
|
59
|
+
help="Use delays necessary for ESP32 revision 0 chips",
|
|
60
|
+
action="store_true",
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
args = parser.parse_args()
|
|
64
|
+
|
|
65
|
+
if args.verbosity > 3:
|
|
66
|
+
args.verbosity = 3
|
|
67
|
+
level = (logging.WARNING, logging.INFO, logging.DEBUG, logging.NOTSET)[
|
|
68
|
+
args.verbosity
|
|
69
|
+
]
|
|
70
|
+
logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.INFO)
|
|
71
|
+
logging.getLogger("rfc2217").setLevel(level)
|
|
72
|
+
|
|
73
|
+
# connect to serial port
|
|
74
|
+
ser = serial.serial_for_url(args.SERIALPORT, do_not_open=True, exclusive=True)
|
|
75
|
+
ser.timeout = 3 # required so that the reader thread can exit
|
|
76
|
+
# reset control line as no _remote_ "terminal" has been connected yet
|
|
77
|
+
ser.dtr = False
|
|
78
|
+
ser.rts = False
|
|
79
|
+
|
|
80
|
+
logging.info("RFC 2217 TCP/IP to Serial redirector - type Ctrl-C / BREAK to quit")
|
|
81
|
+
|
|
82
|
+
try:
|
|
83
|
+
ser.open()
|
|
84
|
+
except serial.SerialException as e:
|
|
85
|
+
logging.error(f"Could not open serial port {ser.name}: {e}")
|
|
86
|
+
sys.exit(1)
|
|
87
|
+
|
|
88
|
+
logging.info(f"Serving serial port: {ser.name}")
|
|
89
|
+
settings = ser.get_settings()
|
|
90
|
+
|
|
91
|
+
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
92
|
+
srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
93
|
+
srv.bind(("", args.localport))
|
|
94
|
+
srv.listen(1)
|
|
95
|
+
logging.info(f"TCP/IP port: {args.localport}")
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
host_ip = socket.gethostbyname(socket.gethostname())
|
|
99
|
+
except OSError:
|
|
100
|
+
# CI/minimal containers often have no DNS for gethostname(); the server
|
|
101
|
+
# is still reachable on loopback.
|
|
102
|
+
host_ip = "127.0.0.1"
|
|
103
|
+
wait_msg = (
|
|
104
|
+
"Waiting for connection ... use the 'rfc2217://"
|
|
105
|
+
f"{host_ip}:{args.localport}?ign_set_control' as a PORT"
|
|
106
|
+
)
|
|
107
|
+
logging.info(wait_msg)
|
|
108
|
+
|
|
109
|
+
while True:
|
|
110
|
+
srv.settimeout(5)
|
|
111
|
+
client_socket = None
|
|
112
|
+
try:
|
|
113
|
+
while client_socket is None:
|
|
114
|
+
try:
|
|
115
|
+
client_socket, addr = srv.accept()
|
|
116
|
+
except TimeoutError:
|
|
117
|
+
print(".", end="", flush=True)
|
|
118
|
+
except KeyboardInterrupt:
|
|
119
|
+
print("") # resetting inline print
|
|
120
|
+
logging.info("Exited with keyboard interrupt")
|
|
121
|
+
break
|
|
122
|
+
try:
|
|
123
|
+
logging.info(f"Connected by {addr[0]}:{addr[1]}")
|
|
124
|
+
client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
|
|
125
|
+
ser.rts = True
|
|
126
|
+
ser.dtr = True
|
|
127
|
+
# enter network <-> serial loop
|
|
128
|
+
r = Redirector(ser, client_socket, args.verbosity > 0, args.r0)
|
|
129
|
+
try:
|
|
130
|
+
r.shortcircuit()
|
|
131
|
+
finally:
|
|
132
|
+
logging.info("Disconnected")
|
|
133
|
+
r.stop()
|
|
134
|
+
client_socket.close()
|
|
135
|
+
ser.dtr = False
|
|
136
|
+
ser.rts = False
|
|
137
|
+
# Restore port settings (may have been changed by RFC 2217
|
|
138
|
+
# capable client)
|
|
139
|
+
ser.apply_settings(settings)
|
|
140
|
+
except KeyboardInterrupt:
|
|
141
|
+
print(flush=True)
|
|
142
|
+
break
|
|
143
|
+
except OSError as msg:
|
|
144
|
+
logging.error(str(msg))
|
|
145
|
+
|
|
146
|
+
logging.info("--- exit ---")
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
if __name__ == "__main__":
|
|
150
|
+
main()
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: 2014-2024 Fredrik Ahlberg, Angus Gratton,
|
|
2
|
-
# Espressif Systems (Shanghai) CO LTD, other contributors as noted.
|
|
3
|
-
#
|
|
4
|
-
# SPDX-License-Identifier: BSD-3-Clause
|
|
5
|
-
|
|
6
|
-
import esp_rfc2217_server
|
|
7
|
-
|
|
8
|
-
if __name__ == "__main__":
|
|
9
|
-
esp_rfc2217_server.main()
|
|
1
|
+
# SPDX-FileCopyrightText: 2014-2024 Fredrik Ahlberg, Angus Gratton,
|
|
2
|
+
# Espressif Systems (Shanghai) CO LTD, other contributors as noted.
|
|
3
|
+
#
|
|
4
|
+
# SPDX-License-Identifier: BSD-3-Clause
|
|
5
|
+
|
|
6
|
+
import esp_rfc2217_server
|
|
7
|
+
|
|
8
|
+
if __name__ == "__main__":
|
|
9
|
+
esp_rfc2217_server.main()
|
|
@@ -1,102 +1,102 @@
|
|
|
1
|
-
# SPDX-FileCopyrightText: 2014-2024 Fredrik Ahlberg, Angus Gratton,
|
|
2
|
-
# Espressif Systems (Shanghai) CO LTD, other contributors as noted.
|
|
3
|
-
#
|
|
4
|
-
# SPDX-License-Identifier: BSD-3-Clause
|
|
5
|
-
import os
|
|
6
|
-
import threading
|
|
7
|
-
|
|
8
|
-
import serial
|
|
9
|
-
import serial.rfc2217
|
|
10
|
-
from serial.rfc2217 import (
|
|
11
|
-
COM_PORT_OPTION,
|
|
12
|
-
SET_CONTROL,
|
|
13
|
-
SET_CONTROL_DTR_OFF,
|
|
14
|
-
SET_CONTROL_DTR_ON,
|
|
15
|
-
SET_CONTROL_RTS_OFF,
|
|
16
|
-
SET_CONTROL_RTS_ON,
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
from esptool.config import load_config_file
|
|
20
|
-
from esptool.reset import (
|
|
21
|
-
DEFAULT_RESET_DELAY,
|
|
22
|
-
ClassicReset,
|
|
23
|
-
CustomReset,
|
|
24
|
-
HardReset,
|
|
25
|
-
UnixTightReset,
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
cfg, _ = load_config_file(verbose=True)
|
|
29
|
-
cfg = cfg["esptool"]
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class EspPortManager(serial.rfc2217.PortManager):
|
|
33
|
-
"""
|
|
34
|
-
The beginning of the reset sequence is detected and the proper reset sequence
|
|
35
|
-
is applied in a thread. The rest of the reset sequence received is just ignored
|
|
36
|
-
and not sent to the serial port.
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
def __init__(self, serial_port, connection, esp32r0_delay, logger=None):
|
|
40
|
-
self.esp32r0_delay = esp32r0_delay
|
|
41
|
-
self.is_download_mode = False
|
|
42
|
-
super().__init__(serial_port, connection, logger)
|
|
43
|
-
|
|
44
|
-
def _telnet_process_subnegotiation(self, suboption):
|
|
45
|
-
if suboption[0:1] == COM_PORT_OPTION and suboption[1:2] == SET_CONTROL:
|
|
46
|
-
if suboption[2:3] == SET_CONTROL_DTR_OFF:
|
|
47
|
-
self.is_download_mode = False
|
|
48
|
-
self.serial.dtr = False
|
|
49
|
-
return
|
|
50
|
-
elif suboption[2:3] == SET_CONTROL_RTS_OFF and not self.is_download_mode:
|
|
51
|
-
reset_thread = threading.Thread(target=self._hard_reset_thread)
|
|
52
|
-
reset_thread.daemon = True
|
|
53
|
-
reset_thread.name = "hard_reset_thread"
|
|
54
|
-
reset_thread.start()
|
|
55
|
-
return
|
|
56
|
-
elif suboption[2:3] == SET_CONTROL_DTR_ON and not self.is_download_mode:
|
|
57
|
-
self.is_download_mode = True
|
|
58
|
-
reset_thread = threading.Thread(target=self._reset_thread)
|
|
59
|
-
reset_thread.daemon = True
|
|
60
|
-
reset_thread.name = "reset_thread"
|
|
61
|
-
reset_thread.start()
|
|
62
|
-
return
|
|
63
|
-
elif suboption[2:3] in [
|
|
64
|
-
SET_CONTROL_DTR_ON,
|
|
65
|
-
SET_CONTROL_RTS_ON,
|
|
66
|
-
SET_CONTROL_RTS_OFF,
|
|
67
|
-
]:
|
|
68
|
-
return
|
|
69
|
-
# only in cases not handled above do the original implementation in PortManager
|
|
70
|
-
super()._telnet_process_subnegotiation(suboption)
|
|
71
|
-
|
|
72
|
-
def _hard_reset_thread(self):
|
|
73
|
-
"""
|
|
74
|
-
The reset logic used for hard resetting the chip.
|
|
75
|
-
"""
|
|
76
|
-
if self.logger:
|
|
77
|
-
self.logger.info("Activating hard reset in thread")
|
|
78
|
-
cfg_custom_hard_reset_sequence = cfg.get("custom_hard_reset_sequence")
|
|
79
|
-
if cfg_custom_hard_reset_sequence is not None:
|
|
80
|
-
CustomReset(self.serial, cfg_custom_hard_reset_sequence)()
|
|
81
|
-
else:
|
|
82
|
-
HardReset(self.serial)()
|
|
83
|
-
|
|
84
|
-
def _reset_thread(self):
|
|
85
|
-
"""
|
|
86
|
-
The reset logic is used from esptool because the RTS and DTR signals
|
|
87
|
-
cannot be retransmitted through RFC 2217 with proper timing.
|
|
88
|
-
"""
|
|
89
|
-
if self.logger:
|
|
90
|
-
self.logger.info("Activating reset in thread")
|
|
91
|
-
|
|
92
|
-
delay = DEFAULT_RESET_DELAY
|
|
93
|
-
if self.esp32r0_delay:
|
|
94
|
-
delay += 0.5
|
|
95
|
-
|
|
96
|
-
cfg_custom_reset_sequence = cfg.get("custom_reset_sequence")
|
|
97
|
-
if cfg_custom_reset_sequence is not None:
|
|
98
|
-
CustomReset(self.serial, cfg_custom_reset_sequence)()
|
|
99
|
-
elif os.name != "nt":
|
|
100
|
-
UnixTightReset(self.serial, delay)()
|
|
101
|
-
else:
|
|
102
|
-
ClassicReset(self.serial, delay)()
|
|
1
|
+
# SPDX-FileCopyrightText: 2014-2024 Fredrik Ahlberg, Angus Gratton,
|
|
2
|
+
# Espressif Systems (Shanghai) CO LTD, other contributors as noted.
|
|
3
|
+
#
|
|
4
|
+
# SPDX-License-Identifier: BSD-3-Clause
|
|
5
|
+
import os
|
|
6
|
+
import threading
|
|
7
|
+
|
|
8
|
+
import serial
|
|
9
|
+
import serial.rfc2217
|
|
10
|
+
from serial.rfc2217 import (
|
|
11
|
+
COM_PORT_OPTION,
|
|
12
|
+
SET_CONTROL,
|
|
13
|
+
SET_CONTROL_DTR_OFF,
|
|
14
|
+
SET_CONTROL_DTR_ON,
|
|
15
|
+
SET_CONTROL_RTS_OFF,
|
|
16
|
+
SET_CONTROL_RTS_ON,
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
from esptool.config import load_config_file
|
|
20
|
+
from esptool.reset import (
|
|
21
|
+
DEFAULT_RESET_DELAY,
|
|
22
|
+
ClassicReset,
|
|
23
|
+
CustomReset,
|
|
24
|
+
HardReset,
|
|
25
|
+
UnixTightReset,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
cfg, _ = load_config_file(verbose=True)
|
|
29
|
+
cfg = cfg["esptool"]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class EspPortManager(serial.rfc2217.PortManager):
|
|
33
|
+
"""
|
|
34
|
+
The beginning of the reset sequence is detected and the proper reset sequence
|
|
35
|
+
is applied in a thread. The rest of the reset sequence received is just ignored
|
|
36
|
+
and not sent to the serial port.
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def __init__(self, serial_port, connection, esp32r0_delay, logger=None):
|
|
40
|
+
self.esp32r0_delay = esp32r0_delay
|
|
41
|
+
self.is_download_mode = False
|
|
42
|
+
super().__init__(serial_port, connection, logger)
|
|
43
|
+
|
|
44
|
+
def _telnet_process_subnegotiation(self, suboption):
|
|
45
|
+
if suboption[0:1] == COM_PORT_OPTION and suboption[1:2] == SET_CONTROL:
|
|
46
|
+
if suboption[2:3] == SET_CONTROL_DTR_OFF:
|
|
47
|
+
self.is_download_mode = False
|
|
48
|
+
self.serial.dtr = False
|
|
49
|
+
return
|
|
50
|
+
elif suboption[2:3] == SET_CONTROL_RTS_OFF and not self.is_download_mode:
|
|
51
|
+
reset_thread = threading.Thread(target=self._hard_reset_thread)
|
|
52
|
+
reset_thread.daemon = True
|
|
53
|
+
reset_thread.name = "hard_reset_thread"
|
|
54
|
+
reset_thread.start()
|
|
55
|
+
return
|
|
56
|
+
elif suboption[2:3] == SET_CONTROL_DTR_ON and not self.is_download_mode:
|
|
57
|
+
self.is_download_mode = True
|
|
58
|
+
reset_thread = threading.Thread(target=self._reset_thread)
|
|
59
|
+
reset_thread.daemon = True
|
|
60
|
+
reset_thread.name = "reset_thread"
|
|
61
|
+
reset_thread.start()
|
|
62
|
+
return
|
|
63
|
+
elif suboption[2:3] in [
|
|
64
|
+
SET_CONTROL_DTR_ON,
|
|
65
|
+
SET_CONTROL_RTS_ON,
|
|
66
|
+
SET_CONTROL_RTS_OFF,
|
|
67
|
+
]:
|
|
68
|
+
return
|
|
69
|
+
# only in cases not handled above do the original implementation in PortManager
|
|
70
|
+
super()._telnet_process_subnegotiation(suboption)
|
|
71
|
+
|
|
72
|
+
def _hard_reset_thread(self):
|
|
73
|
+
"""
|
|
74
|
+
The reset logic used for hard resetting the chip.
|
|
75
|
+
"""
|
|
76
|
+
if self.logger:
|
|
77
|
+
self.logger.info("Activating hard reset in thread")
|
|
78
|
+
cfg_custom_hard_reset_sequence = cfg.get("custom_hard_reset_sequence")
|
|
79
|
+
if cfg_custom_hard_reset_sequence is not None:
|
|
80
|
+
CustomReset(self.serial, cfg_custom_hard_reset_sequence)()
|
|
81
|
+
else:
|
|
82
|
+
HardReset(self.serial)()
|
|
83
|
+
|
|
84
|
+
def _reset_thread(self):
|
|
85
|
+
"""
|
|
86
|
+
The reset logic is used from esptool because the RTS and DTR signals
|
|
87
|
+
cannot be retransmitted through RFC 2217 with proper timing.
|
|
88
|
+
"""
|
|
89
|
+
if self.logger:
|
|
90
|
+
self.logger.info("Activating reset in thread")
|
|
91
|
+
|
|
92
|
+
delay = DEFAULT_RESET_DELAY
|
|
93
|
+
if self.esp32r0_delay:
|
|
94
|
+
delay += 0.5
|
|
95
|
+
|
|
96
|
+
cfg_custom_reset_sequence = cfg.get("custom_reset_sequence")
|
|
97
|
+
if cfg_custom_reset_sequence is not None:
|
|
98
|
+
CustomReset(self.serial, cfg_custom_reset_sequence)()
|
|
99
|
+
elif os.name != "nt":
|
|
100
|
+
UnixTightReset(self.serial, delay)()
|
|
101
|
+
else:
|
|
102
|
+
ClassicReset(self.serial, delay)()
|
|
File without changes
|
|
File without changes
|
|
@@ -304,10 +304,6 @@ class EfuseKeyPurposeField(base_fields.EfuseKeyPurposeFieldBase, EfuseField):
|
|
|
304
304
|
("USER", 0, None, None, "no_need_rd_protect"), # User purposes (software-only use)
|
|
305
305
|
("ECDSA_KEY", 1, None, "Reverse", "need_rd_protect"), # ECDSA key
|
|
306
306
|
("XTS_AES_128_KEY", 4, None, "Reverse", "need_rd_protect"), # XTS_AES_128_KEY (flash/PSRAM encryption)
|
|
307
|
-
("HMAC_DOWN_ALL", 5, None, None, "need_rd_protect"), # HMAC Downstream mode
|
|
308
|
-
("HMAC_DOWN_JTAG", 6, None, None, "need_rd_protect"), # JTAG soft enable key (uses HMAC Downstream mode)
|
|
309
|
-
("HMAC_DOWN_DIGITAL_SIGNATURE", 7, None, None, "need_rd_protect"), # Digital Signature peripheral key (uses HMAC Downstream mode)
|
|
310
|
-
("HMAC_UP", 8, None, None, "need_rd_protect"), # HMAC Upstream mode
|
|
311
307
|
("SECURE_BOOT_DIGEST0", 9, "DIGEST", None, "no_need_rd_protect"), # SECURE_BOOT_DIGEST0 (Secure Boot key digest)
|
|
312
308
|
("SECURE_BOOT_DIGEST1", 10, "DIGEST", None, "no_need_rd_protect"), # SECURE_BOOT_DIGEST1 (Secure Boot key digest)
|
|
313
309
|
("SECURE_BOOT_DIGEST2", 11, "DIGEST", None, "no_need_rd_protect"), # SECURE_BOOT_DIGEST2 (Secure Boot key digest)
|
|
@@ -229,15 +229,6 @@ class ESP32H21Commands(BaseCommands):
|
|
|
229
229
|
if self.efuses[block.key_purpose_name].is_writeable():
|
|
230
230
|
disable_wr_protect_key_purpose = True
|
|
231
231
|
|
|
232
|
-
if keypurpose == "ECDSA_KEY":
|
|
233
|
-
if self.efuses["ECDSA_FORCE_USE_HARDWARE_K"].get() == 0:
|
|
234
|
-
# For ECDSA key purpose block permanently enable
|
|
235
|
-
# the hardware TRNG supplied k mode (most secure mode)
|
|
236
|
-
log.print("\tECDSA_FORCE_USE_HARDWARE_K: 0 -> 1")
|
|
237
|
-
self.efuses["ECDSA_FORCE_USE_HARDWARE_K"].save(1)
|
|
238
|
-
else:
|
|
239
|
-
log.print("\tECDSA_FORCE_USE_HARDWARE_K is already '1'")
|
|
240
|
-
|
|
241
232
|
if disable_wr_protect_key_purpose:
|
|
242
233
|
log.print(f"\tDisabling write to '{block.key_purpose_name}'...")
|
|
243
234
|
self.efuses[block.key_purpose_name].disable_write()
|