esptool 5.2.dev1__tar.gz → 5.2.dev3__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.2.dev1/esptool.egg-info → esptool-5.2.dev3}/PKG-INFO +2 -2
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/__init__.py +3 -3
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/base_fields.py +2 -2
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/base_operations.py +13 -8
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/emulate_efuse_controller_base.py +94 -58
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32/emulate_efuse_controller.py +20 -14
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32/mem_definition.py +24 -20
- esptool-5.2.dev3/espefuse/efuse/esp32c2/emulate_efuse_controller.py +113 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c2/mem_definition.py +2 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c3/emulate_efuse_controller.py +16 -11
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c3/mem_definition.py +13 -9
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c3/operations.py +1 -1
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c5/emulate_efuse_controller.py +16 -11
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c5/mem_definition.py +37 -29
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c6/emulate_efuse_controller.py +16 -11
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c6/mem_definition.py +13 -9
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c61/emulate_efuse_controller.py +16 -11
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c61/mem_definition.py +2 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h2/emulate_efuse_controller.py +16 -11
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h2/mem_definition.py +13 -9
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h21/emulate_efuse_controller.py +16 -11
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h21/mem_definition.py +13 -9
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h4/emulate_efuse_controller.py +16 -11
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h4/mem_definition.py +13 -9
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32p4/emulate_efuse_controller.py +16 -11
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32p4/mem_definition.py +24 -18
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s2/emulate_efuse_controller.py +16 -11
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s2/mem_definition.py +13 -9
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s3/emulate_efuse_controller.py +15 -10
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s3/mem_definition.py +25 -19
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s31/emulate_efuse_controller.py +16 -11
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s31/mem_definition.py +2 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/mem_definition_base.py +96 -46
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32c2.yaml +5 -2
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32c5.yaml +46 -46
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32h2.yaml +3 -2
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_interface.py +14 -9
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espsecure/__init__.py +42 -8
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/__init__.py +6 -83
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/cli_util.py +143 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/cmds.py +54 -29
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/loader.py +26 -41
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/logger.py +2 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp32.py +8 -1
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp32c2.py +17 -8
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp32c3.py +4 -2
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp32c6.py +0 -2
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp32h4.py +0 -2
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp32p4.py +66 -2
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp32s2.py +4 -2
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp32s3.py +4 -2
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/1/README.md +1 -1
- esptool-5.2.dev3/esptool/targets/stub_flasher/1/esp32.json +8 -0
- esptool-5.2.dev3/esptool/targets/stub_flasher/1/esp32c2.json +8 -0
- esptool-5.2.dev3/esptool/targets/stub_flasher/1/esp32c3.json +8 -0
- esptool-5.2.dev3/esptool/targets/stub_flasher/1/esp32c5.json +8 -0
- esptool-5.2.dev3/esptool/targets/stub_flasher/1/esp32c6.json +8 -0
- esptool-5.2.dev3/esptool/targets/stub_flasher/1/esp32c61.json +8 -0
- esptool-5.2.dev3/esptool/targets/stub_flasher/1/esp32h2.json +8 -0
- esptool-5.2.dev3/esptool/targets/stub_flasher/1/esp32p4.json +8 -0
- esptool-5.2.dev3/esptool/targets/stub_flasher/1/esp32p4rc1.json +8 -0
- esptool-5.2.dev3/esptool/targets/stub_flasher/1/esp32s2.json +8 -0
- esptool-5.2.dev3/esptool/targets/stub_flasher/1/esp32s3.json +8 -0
- esptool-5.2.dev3/esptool/targets/stub_flasher/1/esp8266.json +8 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3/esptool.egg-info}/PKG-INFO +2 -2
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool.egg-info/requires.txt +1 -1
- {esptool-5.2.dev1 → esptool-5.2.dev3}/pyproject.toml +2 -2
- esptool-5.2.dev1/espefuse/efuse/esp32c2/emulate_efuse_controller.py +0 -139
- esptool-5.2.dev1/esptool/targets/stub_flasher/1/esp32.json +0 -8
- esptool-5.2.dev1/esptool/targets/stub_flasher/1/esp32c2.json +0 -8
- esptool-5.2.dev1/esptool/targets/stub_flasher/1/esp32c3.json +0 -8
- esptool-5.2.dev1/esptool/targets/stub_flasher/1/esp32c5.json +0 -8
- esptool-5.2.dev1/esptool/targets/stub_flasher/1/esp32c6.json +0 -8
- esptool-5.2.dev1/esptool/targets/stub_flasher/1/esp32c61.json +0 -8
- esptool-5.2.dev1/esptool/targets/stub_flasher/1/esp32h2.json +0 -8
- esptool-5.2.dev1/esptool/targets/stub_flasher/1/esp32p4.json +0 -8
- esptool-5.2.dev1/esptool/targets/stub_flasher/1/esp32p4rc1.json +0 -8
- esptool-5.2.dev1/esptool/targets/stub_flasher/1/esp32s2.json +0 -8
- esptool-5.2.dev1/esptool/targets/stub_flasher/1/esp32s3.json +0 -8
- esptool-5.2.dev1/esptool/targets/stub_flasher/1/esp8266.json +0 -8
- {esptool-5.2.dev1 → esptool-5.2.dev3}/LICENSE +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/MANIFEST.in +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/README.md +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esp_rfc2217_server/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esp_rfc2217_server/__main__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esp_rfc2217_server/esp_port_manager.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esp_rfc2217_server/redirector.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esp_rfc2217_server.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/__main__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/cli_util.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/csv_table_parser.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32/fields.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32/operations.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c2/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c2/fields.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c2/operations.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c3/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c3/fields.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c5/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c5/fields.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c5/operations.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c6/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c6/fields.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c6/operations.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c61/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c61/fields.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32c61/operations.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h2/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h2/fields.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h2/operations.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h21/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h21/fields.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h21/operations.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h4/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h4/fields.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32h4/operations.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32p4/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32p4/fields.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32p4/operations.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s2/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s2/fields.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s2/operations.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s3/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s3/fields.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s3/operations.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s31/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s31/fields.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/esp32s31/operations.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse/util.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32.yaml +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32c3.yaml +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32c6.yaml +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32c61.yaml +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32h21.yaml +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32h2_v0.0_v1.1.yaml +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32h4.yaml +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32p4.yaml +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32p4_v3.0.yaml +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32s2.yaml +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32s3.yaml +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse/efuse_defs/esp32s31.yaml +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espefuse.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espsecure/__main__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espsecure/esp_hsm_sign/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espsecure/esp_hsm_sign/exceptions.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/espsecure.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/__main__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/bin_image.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/config.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/reset.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/__init__.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp32c5.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp32c61.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp32h2.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp32h21.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp32s31.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/esp8266.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/LICENSE-APACHE +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/LICENSE-MIT +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/README.md +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/esp32.json +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/esp32c2.json +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/esp32c3.json +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/esp32c5.json +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/esp32c6.json +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/esp32c61.json +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/esp32h2.json +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/esp32p4.json +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/esp32s2.json +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/esp32s3.json +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/targets/stub_flasher/2/esp8266.json +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/uf2_writer.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool/util.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool.egg-info/SOURCES.txt +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool.egg-info/dependency_links.txt +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool.egg-info/entry_points.txt +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool.egg-info/top_level.txt +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/esptool.py +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/setup.cfg +0 -0
- {esptool-5.2.dev1 → esptool-5.2.dev3}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: esptool
|
|
3
|
-
Version: 5.2.
|
|
3
|
+
Version: 5.2.dev3
|
|
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+
|
|
@@ -31,7 +31,7 @@ Requires-Dist: pyserial>=3.3
|
|
|
31
31
|
Requires-Dist: reedsolo<1.8,>=1.5.3
|
|
32
32
|
Requires-Dist: PyYAML>=5.1
|
|
33
33
|
Requires-Dist: intelhex
|
|
34
|
-
Requires-Dist: rich_click<
|
|
34
|
+
Requires-Dist: rich_click<2
|
|
35
35
|
Requires-Dist: click<9
|
|
36
36
|
Provides-Extra: dev
|
|
37
37
|
Requires-Dist: pyelftools; extra == "dev"
|
|
@@ -7,7 +7,7 @@ import sys
|
|
|
7
7
|
import rich_click as click
|
|
8
8
|
|
|
9
9
|
import esptool
|
|
10
|
-
from esptool.cli_util import ChipType, ResetModeType
|
|
10
|
+
from esptool.cli_util import BaudRateType, ChipType, ResetModeType, SerialPortType
|
|
11
11
|
from esptool.logger import log
|
|
12
12
|
|
|
13
13
|
from espefuse.cli_util import Group
|
|
@@ -53,7 +53,7 @@ __all__ = [
|
|
|
53
53
|
@click.option(
|
|
54
54
|
"--baud",
|
|
55
55
|
"-b",
|
|
56
|
-
type=
|
|
56
|
+
type=BaudRateType(),
|
|
57
57
|
default=esptool.ESPLoader.ESP_ROM_BAUD,
|
|
58
58
|
envvar="ESPTOOL_BAUD",
|
|
59
59
|
help="Serial port baud rate used when flashing/reading.",
|
|
@@ -62,7 +62,7 @@ __all__ = [
|
|
|
62
62
|
"--port",
|
|
63
63
|
"-p",
|
|
64
64
|
envvar="ESPTOOL_PORT",
|
|
65
|
-
type=
|
|
65
|
+
type=SerialPortType(),
|
|
66
66
|
help="Serial port device.",
|
|
67
67
|
)
|
|
68
68
|
@click.option(
|
|
@@ -88,7 +88,7 @@ class CheckArgValue:
|
|
|
88
88
|
class EfuseProtectBase:
|
|
89
89
|
# This class is used by EfuseBlockBase and EfuseFieldBase
|
|
90
90
|
read_disable_bit: int | list[int] | None
|
|
91
|
-
write_disable_bit: int |
|
|
91
|
+
write_disable_bit: int | None
|
|
92
92
|
parent: "EspEfusesBase"
|
|
93
93
|
name: str
|
|
94
94
|
|
|
@@ -182,7 +182,7 @@ class EfuseBlockBase(EfuseProtectBase):
|
|
|
182
182
|
self.rd_addr: int = param.rd_addr
|
|
183
183
|
self.wr_addr: int = param.wr_addr
|
|
184
184
|
self.write_disable_bit: int | None = param.write_disable_bit
|
|
185
|
-
self.read_disable_bit: int | None = param.read_disable_bit
|
|
185
|
+
self.read_disable_bit: int | list[int] | None = param.read_disable_bit
|
|
186
186
|
self.len: int = param.len
|
|
187
187
|
self.key_purpose_name: str | None = param.key_purpose
|
|
188
188
|
bit_block_len: int = self.get_block_len() * 8
|
|
@@ -223,16 +223,21 @@ class BaseCommands:
|
|
|
223
223
|
f"({self.CHIP_NAME} != {self.esp.CHIP_NAME})"
|
|
224
224
|
)
|
|
225
225
|
|
|
226
|
+
@classmethod
|
|
227
|
+
def _close_port(
|
|
228
|
+
cls,
|
|
229
|
+
esp: esptool.ESPLoader | EmulateEfuseControllerBase | None,
|
|
230
|
+
external_esp: bool = False,
|
|
231
|
+
) -> None:
|
|
232
|
+
"""Close the serial port if it was opened internally."""
|
|
233
|
+
if esp is not None and not external_esp and isinstance(esp, esptool.ESPLoader):
|
|
234
|
+
esp._port.close()
|
|
235
|
+
|
|
226
236
|
def __enter__(self):
|
|
227
237
|
return self
|
|
228
238
|
|
|
229
239
|
def __exit__(self, exc_type, exc_value, traceback):
|
|
230
|
-
|
|
231
|
-
self.esp is not None
|
|
232
|
-
and not self.external_esp
|
|
233
|
-
and isinstance(self.esp, esptool.ESPLoader)
|
|
234
|
-
):
|
|
235
|
-
self.esp._port.close()
|
|
240
|
+
self._close_port(self.esp, self.external_esp)
|
|
236
241
|
|
|
237
242
|
################################# CLI definitions #################################
|
|
238
243
|
|
|
@@ -994,8 +999,8 @@ class BaseCommands:
|
|
|
994
999
|
f"{efuse_name} must be readable, stop this operation!"
|
|
995
1000
|
)
|
|
996
1001
|
else:
|
|
997
|
-
for
|
|
998
|
-
block = self.efuses.Blocks.get(
|
|
1002
|
+
for block_tuple in self.efuses.Blocks.BLOCKS:
|
|
1003
|
+
block = self.efuses.Blocks.get(block_tuple)
|
|
999
1004
|
if block.name == efuse_name and block.key_purpose is not None:
|
|
1000
1005
|
if not self.efuses[block.key_purpose].need_rd_protect(
|
|
1001
1006
|
self.efuses[block.key_purpose].get()
|
|
@@ -1,27 +1,36 @@
|
|
|
1
1
|
# This file describes eFuses controller for ESP32 chip
|
|
2
2
|
#
|
|
3
|
-
# SPDX-FileCopyrightText: 2020-
|
|
3
|
+
# SPDX-FileCopyrightText: 2020-2026 Espressif Systems (Shanghai) CO LTD
|
|
4
4
|
#
|
|
5
5
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
6
6
|
|
|
7
|
+
from abc import abstractmethod
|
|
7
8
|
import re
|
|
9
|
+
from typing import Any
|
|
8
10
|
|
|
9
11
|
from bitstring import BitStream
|
|
12
|
+
from espefuse.efuse.mem_definition_base import (
|
|
13
|
+
BlockDefinition,
|
|
14
|
+
EfuseBlocksBase,
|
|
15
|
+
EfuseFieldsBase,
|
|
16
|
+
EfuseRegistersBase,
|
|
17
|
+
Field,
|
|
18
|
+
)
|
|
10
19
|
from esptool.logger import log
|
|
11
20
|
|
|
12
21
|
|
|
13
22
|
class EmulateEfuseControllerBase:
|
|
14
23
|
"""The class for virtual efuse operations. Using for HOST_TEST."""
|
|
15
24
|
|
|
16
|
-
CHIP_NAME = ""
|
|
17
|
-
mem
|
|
18
|
-
debug = False
|
|
19
|
-
Blocks
|
|
20
|
-
Fields
|
|
21
|
-
REGS
|
|
22
|
-
USB_JTAG_SERIAL_PID = 0x1001
|
|
25
|
+
CHIP_NAME: str = ""
|
|
26
|
+
mem: BitStream
|
|
27
|
+
debug: bool = False
|
|
28
|
+
Blocks: type[EfuseBlocksBase]
|
|
29
|
+
Fields: EfuseFieldsBase
|
|
30
|
+
REGS: type[EfuseRegistersBase]
|
|
31
|
+
USB_JTAG_SERIAL_PID: int = 0x1001
|
|
23
32
|
|
|
24
|
-
def __init__(self, efuse_file=None, debug=False):
|
|
33
|
+
def __init__(self, efuse_file: str | None = None, debug: bool = False):
|
|
25
34
|
self.debug = debug
|
|
26
35
|
self.efuse_file = efuse_file
|
|
27
36
|
if self.efuse_file:
|
|
@@ -43,57 +52,72 @@ class EmulateEfuseControllerBase:
|
|
|
43
52
|
|
|
44
53
|
""" esptool method start >> """
|
|
45
54
|
|
|
46
|
-
|
|
55
|
+
@abstractmethod
|
|
56
|
+
def get_major_chip_version(self) -> int:
|
|
57
|
+
pass
|
|
58
|
+
|
|
59
|
+
@abstractmethod
|
|
60
|
+
def get_minor_chip_version(self) -> int:
|
|
61
|
+
pass
|
|
62
|
+
|
|
63
|
+
def get_chip_description(self) -> str:
|
|
47
64
|
major_rev = self.get_major_chip_version()
|
|
48
65
|
minor_rev = self.get_minor_chip_version()
|
|
49
66
|
return f"{self.CHIP_NAME} (revision v{major_rev}.{minor_rev})"
|
|
50
67
|
|
|
51
|
-
def get_chip_revision(self):
|
|
68
|
+
def get_chip_revision(self) -> int:
|
|
52
69
|
return self.get_major_chip_version() * 100 + self.get_minor_chip_version()
|
|
53
70
|
|
|
54
|
-
def read_efuse(self, n, block=0):
|
|
71
|
+
def read_efuse(self, n: int, block: int = 0) -> int:
|
|
55
72
|
"""Read the nth word of the ESP3x EFUSE region."""
|
|
56
73
|
blk = self.Blocks.get(self.Blocks.BLOCKS[block])
|
|
57
74
|
return self.read_reg(blk.rd_addr + (4 * n))
|
|
58
75
|
|
|
59
|
-
def read_reg(self, addr):
|
|
76
|
+
def read_reg(self, addr: int) -> int:
|
|
60
77
|
self.mem.pos = self.mem.length - ((addr - self.REGS.DR_REG_EFUSE_BASE) * 8 + 32)
|
|
61
|
-
return self.mem.read("uint:32")
|
|
62
|
-
|
|
63
|
-
def write_reg(
|
|
78
|
+
return int(self.mem.read("uint:32"))
|
|
79
|
+
|
|
80
|
+
def write_reg(
|
|
81
|
+
self,
|
|
82
|
+
addr: int,
|
|
83
|
+
value: int,
|
|
84
|
+
mask: int = 0xFFFFFFFF,
|
|
85
|
+
delay_us: int = 0,
|
|
86
|
+
delay_after_us: int = 0,
|
|
87
|
+
) -> None:
|
|
64
88
|
self.mem.pos = self.mem.length - ((addr - self.REGS.DR_REG_EFUSE_BASE) * 8 + 32)
|
|
65
89
|
self.mem.overwrite("uint:32={}".format(value & mask))
|
|
66
90
|
self.handle_writing_event(addr, value)
|
|
67
91
|
|
|
68
|
-
def update_reg(self, addr, mask, new_val):
|
|
92
|
+
def update_reg(self, addr: int, mask: int, new_val: int) -> None:
|
|
69
93
|
position = self.mem.length - ((addr - self.REGS.DR_REG_EFUSE_BASE) * 8 + 32)
|
|
70
94
|
self.mem.pos = position
|
|
71
95
|
cur_val = self.mem.read("uint:32")
|
|
72
96
|
self.mem.pos = position
|
|
73
97
|
self.mem.overwrite("uint:32={}".format(cur_val | (new_val & mask)))
|
|
74
98
|
|
|
75
|
-
def write_efuse(self, n, value, block=0):
|
|
99
|
+
def write_efuse(self, n: int, value: int, block: int = 0) -> None:
|
|
76
100
|
"""Write the nth word of the ESP3x EFUSE region."""
|
|
77
101
|
blk = self.Blocks.get(self.Blocks.BLOCKS[block])
|
|
78
102
|
self.write_reg(blk.wr_addr + (4 * n), value)
|
|
79
103
|
|
|
80
|
-
def _get_pid(self):
|
|
104
|
+
def _get_pid(self) -> int:
|
|
81
105
|
return -1
|
|
82
106
|
|
|
83
107
|
""" << esptool method end """
|
|
84
108
|
|
|
85
|
-
def handle_writing_event(self, addr, value):
|
|
109
|
+
def handle_writing_event(self, addr: int, value: int) -> None:
|
|
86
110
|
self.save_to_file()
|
|
87
111
|
|
|
88
|
-
def save_to_file(self):
|
|
112
|
+
def save_to_file(self) -> None:
|
|
89
113
|
if self.efuse_file:
|
|
90
114
|
with open(self.efuse_file, "wb") as f:
|
|
91
115
|
self.mem.tofile(f)
|
|
92
116
|
|
|
93
|
-
def handle_coding_scheme(self, blk, data):
|
|
117
|
+
def handle_coding_scheme(self, blk: BlockDefinition, data: BitStream) -> BitStream:
|
|
94
118
|
return data
|
|
95
119
|
|
|
96
|
-
def copy_blocks_wr_regs_to_rd_regs(self, updated_block=None):
|
|
120
|
+
def copy_blocks_wr_regs_to_rd_regs(self, updated_block: int | None = None) -> None:
|
|
97
121
|
for b in reversed(self.Blocks.BLOCKS):
|
|
98
122
|
blk = self.Blocks.get(b)
|
|
99
123
|
if updated_block is not None:
|
|
@@ -106,36 +130,38 @@ class EmulateEfuseControllerBase:
|
|
|
106
130
|
plain_data = self.check_wr_protection_area(blk.id, plain_data)
|
|
107
131
|
self.update_block(blk, plain_data)
|
|
108
132
|
|
|
109
|
-
def clean_blocks_wr_regs(self):
|
|
133
|
+
def clean_blocks_wr_regs(self) -> None:
|
|
110
134
|
for b in self.Blocks.BLOCKS:
|
|
111
135
|
blk = self.Blocks.get(b)
|
|
112
136
|
for offset in range(0, blk.len * 4, 4):
|
|
113
137
|
wr_addr = blk.wr_addr + offset
|
|
114
138
|
self.write_reg(wr_addr, 0)
|
|
115
139
|
|
|
116
|
-
def read_field(self, name, bitstring=True):
|
|
140
|
+
def read_field(self, name: str, bitstring: bool = True) -> Any:
|
|
117
141
|
for field in self.Fields.EFUSES:
|
|
118
142
|
if field.name == name:
|
|
119
|
-
self.read_block(field.block)
|
|
120
143
|
block = self.read_block(field.block)
|
|
121
144
|
if field.type.startswith("bool"):
|
|
122
145
|
field_len = 1
|
|
123
146
|
else:
|
|
124
|
-
|
|
147
|
+
match = re.search(r"\d+", field.type)
|
|
148
|
+
if match:
|
|
149
|
+
field_len = int(match.group())
|
|
150
|
+
else:
|
|
151
|
+
raise ValueError(f"Invalid field type: {field.type}")
|
|
125
152
|
if field.type.startswith("bytes"):
|
|
126
153
|
field_len *= 8
|
|
127
|
-
block.pos = block.length - (field.word * 32 + field.pos + field_len)
|
|
154
|
+
block.pos = block.length - (field.word * 32 + field.pos + field_len) # type: ignore
|
|
128
155
|
if bitstring:
|
|
129
156
|
return block.read(field_len)
|
|
130
157
|
else:
|
|
131
158
|
return block.read(field.type)
|
|
132
|
-
|
|
159
|
+
raise ValueError(f"Field {name} not found")
|
|
133
160
|
|
|
134
|
-
def get_bitlen_of_block(self, blk, wr=False):
|
|
161
|
+
def get_bitlen_of_block(self, blk: BlockDefinition, wr: bool = False) -> int:
|
|
135
162
|
return 32 * blk.len
|
|
136
163
|
|
|
137
|
-
def read_block(self, idx, wr_regs=False):
|
|
138
|
-
block = None
|
|
164
|
+
def read_block(self, idx: int, wr_regs: bool = False) -> BitStream:
|
|
139
165
|
for b in self.Blocks.BLOCKS:
|
|
140
166
|
blk = self.Blocks.get(b)
|
|
141
167
|
if blk.id == idx:
|
|
@@ -146,19 +172,23 @@ class EmulateEfuseControllerBase:
|
|
|
146
172
|
)
|
|
147
173
|
block = self.mem.read(blk_len_bits)
|
|
148
174
|
break
|
|
175
|
+
else:
|
|
176
|
+
raise ValueError(f"Block {idx} not found")
|
|
149
177
|
return block
|
|
150
178
|
|
|
151
|
-
def update_block(self, blk, wr_data):
|
|
179
|
+
def update_block(self, blk: BlockDefinition, wr_data: BitStream) -> None:
|
|
152
180
|
wr_data = self.read_block(blk.id) | wr_data
|
|
153
181
|
self.overwrite_mem_from_block(blk, wr_data)
|
|
154
182
|
|
|
155
|
-
def overwrite_mem_from_block(
|
|
183
|
+
def overwrite_mem_from_block(
|
|
184
|
+
self, blk: BlockDefinition, wr_data: BitStream
|
|
185
|
+
) -> None:
|
|
156
186
|
self.mem.pos = self.mem.length - (
|
|
157
187
|
(blk.rd_addr - self.REGS.DR_REG_EFUSE_BASE) * 8 + wr_data.len
|
|
158
188
|
)
|
|
159
189
|
self.mem.overwrite(wr_data)
|
|
160
190
|
|
|
161
|
-
def check_wr_protection_area(self, num_blk, wr_data):
|
|
191
|
+
def check_wr_protection_area(self, num_blk: int, wr_data: BitStream) -> BitStream:
|
|
162
192
|
# checks fields which have the write protection bit.
|
|
163
193
|
# if the write protection bit is set, we need to protect that area from changes.
|
|
164
194
|
write_disable_bit = self.read_field("WR_DIS", bitstring=False)
|
|
@@ -175,56 +205,62 @@ class EmulateEfuseControllerBase:
|
|
|
175
205
|
if field.write_disable_bit is not None and write_disable_bit & (
|
|
176
206
|
1 << field.write_disable_bit
|
|
177
207
|
):
|
|
178
|
-
data = self.read_field(field.name)
|
|
208
|
+
data: BitStream = self.read_field(field.name)
|
|
179
209
|
data.set(1)
|
|
180
210
|
mask_wr_data.pos = mask_wr_data.length - (
|
|
181
|
-
field.word * 32 + field.pos + data.len
|
|
211
|
+
field.word * 32 + field.pos + data.len # type: ignore
|
|
182
212
|
)
|
|
183
213
|
mask_wr_data.overwrite(data)
|
|
184
214
|
mask_wr_data.invert()
|
|
185
215
|
return wr_data & mask_wr_data
|
|
186
216
|
|
|
187
|
-
|
|
217
|
+
@staticmethod
|
|
218
|
+
def get_read_disable_mask(blk: BlockDefinition | Field) -> int:
|
|
219
|
+
mask = 0
|
|
220
|
+
if isinstance(blk.read_disable_bit, list):
|
|
221
|
+
for i in blk.read_disable_bit:
|
|
222
|
+
mask |= 1 << i
|
|
223
|
+
elif blk.read_disable_bit is not None:
|
|
224
|
+
mask = 1 << blk.read_disable_bit
|
|
225
|
+
return mask
|
|
226
|
+
|
|
227
|
+
def set_read_disable_bits(
|
|
228
|
+
self,
|
|
229
|
+
block: BitStream,
|
|
230
|
+
read_disable_bit: int,
|
|
231
|
+
blk: BlockDefinition,
|
|
232
|
+
) -> None:
|
|
233
|
+
block.set(0)
|
|
234
|
+
|
|
235
|
+
def check_rd_protection_area(self) -> None:
|
|
188
236
|
# checks fields which have the read protection bits.
|
|
189
237
|
# if the read protection bit is set then we need to reset this field to 0.
|
|
190
238
|
read_disable_bit = self.read_field("RD_DIS", bitstring=False)
|
|
191
239
|
for b in self.Blocks.BLOCKS:
|
|
192
240
|
blk = self.Blocks.get(b)
|
|
193
241
|
block = self.read_block(blk.id)
|
|
194
|
-
if
|
|
195
|
-
|
|
242
|
+
if (
|
|
243
|
+
blk.read_disable_bit is not None
|
|
244
|
+
and read_disable_bit & self.get_read_disable_mask(blk)
|
|
196
245
|
):
|
|
197
|
-
|
|
246
|
+
self.set_read_disable_bits(block, read_disable_bit, blk)
|
|
198
247
|
else:
|
|
199
248
|
for field in self.Fields.EFUSES:
|
|
200
249
|
if (
|
|
201
250
|
blk.id == field.block
|
|
202
251
|
and field.read_disable_bit is not None
|
|
203
|
-
and read_disable_bit & (
|
|
252
|
+
and read_disable_bit & self.get_read_disable_mask(field)
|
|
204
253
|
):
|
|
205
|
-
raw_data = self.read_field(field.name)
|
|
254
|
+
raw_data: BitStream = self.read_field(field.name)
|
|
206
255
|
raw_data.set(0)
|
|
207
256
|
block.pos = block.length - (
|
|
208
|
-
field.word * 32 + field.pos + raw_data.length
|
|
257
|
+
field.word * 32 + field.pos + raw_data.length # type: ignore
|
|
209
258
|
)
|
|
210
259
|
block.overwrite(BitStream(raw_data.length))
|
|
211
260
|
self.overwrite_mem_from_block(blk, block)
|
|
212
261
|
|
|
213
|
-
def clean_mem(self):
|
|
262
|
+
def clean_mem(self) -> None:
|
|
214
263
|
self.mem.set(0)
|
|
215
264
|
if self.efuse_file:
|
|
216
265
|
with open(self.efuse_file, "wb") as f:
|
|
217
266
|
self.mem.tofile(f)
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
class FatalError(RuntimeError):
|
|
221
|
-
"""
|
|
222
|
-
Wrapper class for runtime errors that aren't caused by internal bugs
|
|
223
|
-
"""
|
|
224
|
-
|
|
225
|
-
def __init__(self, message):
|
|
226
|
-
RuntimeError.__init__(self, message)
|
|
227
|
-
|
|
228
|
-
@staticmethod
|
|
229
|
-
def WithResult(message, result):
|
|
230
|
-
return FatalError(result)
|
|
@@ -6,19 +6,25 @@
|
|
|
6
6
|
|
|
7
7
|
import time
|
|
8
8
|
|
|
9
|
+
from bitstring import BitStream
|
|
10
|
+
|
|
11
|
+
from espefuse.efuse.mem_definition_base import BlockDefinition
|
|
12
|
+
|
|
9
13
|
from .mem_definition import EfuseDefineBlocks, EfuseDefineFields, EfuseDefineRegisters
|
|
10
|
-
from ..emulate_efuse_controller_base import EmulateEfuseControllerBase
|
|
14
|
+
from ..emulate_efuse_controller_base import EmulateEfuseControllerBase
|
|
11
15
|
from esptool.logger import log
|
|
16
|
+
from esptool import FatalError
|
|
12
17
|
|
|
13
18
|
|
|
14
19
|
class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
15
20
|
"""The class for virtual efuse operations. Using for HOST_TEST."""
|
|
16
21
|
|
|
17
22
|
CHIP_NAME = "ESP32"
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
Blocks: type[EfuseDefineBlocks]
|
|
24
|
+
Fields: EfuseDefineFields
|
|
25
|
+
REGS: type[EfuseDefineRegisters]
|
|
20
26
|
|
|
21
|
-
def __init__(self, efuse_file=None, debug=False):
|
|
27
|
+
def __init__(self, efuse_file: str | None = None, debug: bool = False):
|
|
22
28
|
self.Blocks = EfuseDefineBlocks
|
|
23
29
|
self.Fields = EfuseDefineFields(None)
|
|
24
30
|
self.REGS = EfuseDefineRegisters
|
|
@@ -26,16 +32,16 @@ class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
|
26
32
|
|
|
27
33
|
""" esptool method start >> """
|
|
28
34
|
|
|
29
|
-
def get_major_chip_version(self):
|
|
35
|
+
def get_major_chip_version(self) -> int:
|
|
30
36
|
return 3
|
|
31
37
|
|
|
32
|
-
def get_minor_chip_version(self):
|
|
38
|
+
def get_minor_chip_version(self) -> int:
|
|
33
39
|
return 0
|
|
34
40
|
|
|
35
|
-
def get_crystal_freq(self):
|
|
41
|
+
def get_crystal_freq(self) -> int:
|
|
36
42
|
return 40 # MHz (common for all chips)
|
|
37
43
|
|
|
38
|
-
def read_reg(self, addr):
|
|
44
|
+
def read_reg(self, addr: int) -> int:
|
|
39
45
|
if addr == self.REGS.APB_CTL_DATE_ADDR:
|
|
40
46
|
return self.REGS.APB_CTL_DATE_V << self.REGS.APB_CTL_DATE_S
|
|
41
47
|
else:
|
|
@@ -43,7 +49,7 @@ class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
|
43
49
|
|
|
44
50
|
""" << esptool method end """
|
|
45
51
|
|
|
46
|
-
def send_burn_cmd(self):
|
|
52
|
+
def send_burn_cmd(self) -> None:
|
|
47
53
|
def wait_idle():
|
|
48
54
|
deadline = time.time() + self.REGS.EFUSE_BURN_TIMEOUT
|
|
49
55
|
while time.time() < deadline:
|
|
@@ -59,7 +65,7 @@ class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
|
59
65
|
self.write_reg(self.REGS.EFUSE_REG_CMD, self.REGS.EFUSE_CMD_READ)
|
|
60
66
|
wait_idle()
|
|
61
67
|
|
|
62
|
-
def handle_writing_event(self, addr, value):
|
|
68
|
+
def handle_writing_event(self, addr: int, value: int) -> None:
|
|
63
69
|
if addr == self.REGS.EFUSE_REG_CMD:
|
|
64
70
|
if value == self.REGS.EFUSE_CMD_WRITE:
|
|
65
71
|
self.write_reg(addr, 0)
|
|
@@ -70,7 +76,7 @@ class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
|
70
76
|
self.write_reg(addr, 0)
|
|
71
77
|
self.save_to_file()
|
|
72
78
|
|
|
73
|
-
def read_raw_coding_scheme(self):
|
|
79
|
+
def read_raw_coding_scheme(self) -> int:
|
|
74
80
|
coding_scheme = (
|
|
75
81
|
self.read_efuse(self.REGS.EFUSE_CODING_SCHEME_WORD)
|
|
76
82
|
& self.REGS.EFUSE_CODING_SCHEME_MASK
|
|
@@ -80,7 +86,7 @@ class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
|
80
86
|
else:
|
|
81
87
|
return coding_scheme
|
|
82
88
|
|
|
83
|
-
def write_raw_coding_scheme(self, value):
|
|
89
|
+
def write_raw_coding_scheme(self, value: int) -> None:
|
|
84
90
|
self.write_efuse(
|
|
85
91
|
self.REGS.EFUSE_CODING_SCHEME_WORD,
|
|
86
92
|
value & self.REGS.EFUSE_CODING_SCHEME_MASK,
|
|
@@ -92,7 +98,7 @@ class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
|
92
98
|
)
|
|
93
99
|
log.print(f"Set coding scheme = {self.read_raw_coding_scheme()}")
|
|
94
100
|
|
|
95
|
-
def get_bitlen_of_block(self, blk, wr=False):
|
|
101
|
+
def get_bitlen_of_block(self, blk: BlockDefinition, wr: bool = False) -> int:
|
|
96
102
|
if blk.id == 0:
|
|
97
103
|
return 32 * blk.len
|
|
98
104
|
else:
|
|
@@ -107,7 +113,7 @@ class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
|
107
113
|
else:
|
|
108
114
|
raise FatalError(f"The {coding_scheme} coding scheme is not supported")
|
|
109
115
|
|
|
110
|
-
def handle_coding_scheme(self, blk, data):
|
|
116
|
+
def handle_coding_scheme(self, blk: BlockDefinition, data: BitStream) -> BitStream:
|
|
111
117
|
# it verifies the coding scheme part of data and returns just data
|
|
112
118
|
if blk.id != 0 and self.read_raw_coding_scheme() == self.REGS.CODING_SCHEME_34:
|
|
113
119
|
# CODING_SCHEME 3/4 applied only for BLK1..3
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
6
6
|
|
|
7
7
|
import copy
|
|
8
|
+
from dataclasses import dataclass
|
|
8
9
|
import os
|
|
9
10
|
|
|
10
11
|
import yaml
|
|
@@ -17,6 +18,7 @@ from ..mem_definition_base import (
|
|
|
17
18
|
)
|
|
18
19
|
|
|
19
20
|
|
|
21
|
+
@dataclass(frozen=True)
|
|
20
22
|
class EfuseDefineRegisters(EfuseRegistersBase):
|
|
21
23
|
EFUSE_MEM_SIZE = 0x011C + 4
|
|
22
24
|
|
|
@@ -150,27 +152,29 @@ class EfuseDefineFields(EfuseFieldsBase):
|
|
|
150
152
|
elif efuse.category == "spi pad":
|
|
151
153
|
efuse.class_type = "spipin"
|
|
152
154
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
155
|
+
self.CALC.append(
|
|
156
|
+
Field(
|
|
157
|
+
name="WAFER_VERSION_MAJOR",
|
|
158
|
+
block=0,
|
|
159
|
+
bit_len=3,
|
|
160
|
+
type="uint",
|
|
161
|
+
category="identity",
|
|
162
|
+
class_type="wafer",
|
|
163
|
+
description="calc WAFER VERSION MAJOR from CHIP_VER_REV1 and CHIP_VER_REV2 and apb_ctl_date (read only)",
|
|
164
|
+
)
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
self.CALC.append(
|
|
168
|
+
Field(
|
|
169
|
+
name="PKG_VERSION",
|
|
170
|
+
block=0,
|
|
171
|
+
bit_len=4,
|
|
172
|
+
type="uint",
|
|
173
|
+
category="identity",
|
|
174
|
+
class_type="pkg",
|
|
175
|
+
description="calc Chip package = CHIP_PACKAGE_4BIT << 3 + CHIP_PACKAGE (read only)",
|
|
176
|
+
)
|
|
172
177
|
)
|
|
173
|
-
self.CALC.append(f)
|
|
174
178
|
|
|
175
179
|
for efuse in self.ALL_EFUSES:
|
|
176
180
|
if efuse is not None:
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# This file describes eFuses controller for ESP32-C2 chip
|
|
2
|
+
#
|
|
3
|
+
# SPDX-FileCopyrightText: 2021-2026 Espressif Systems (Shanghai) CO LTD
|
|
4
|
+
#
|
|
5
|
+
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
6
|
+
|
|
7
|
+
from bitstring import BitStream
|
|
8
|
+
|
|
9
|
+
import reedsolo
|
|
10
|
+
|
|
11
|
+
from espefuse.efuse.mem_definition_base import BlockDefinition
|
|
12
|
+
|
|
13
|
+
from .mem_definition import EfuseDefineBlocks, EfuseDefineFields, EfuseDefineRegisters
|
|
14
|
+
from ..emulate_efuse_controller_base import EmulateEfuseControllerBase
|
|
15
|
+
|
|
16
|
+
from esptool import FatalError
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
20
|
+
"""The class for virtual efuse operation. Using for HOST_TEST."""
|
|
21
|
+
|
|
22
|
+
CHIP_NAME = "ESP32-C2"
|
|
23
|
+
Blocks: type[EfuseDefineBlocks]
|
|
24
|
+
Fields: EfuseDefineFields
|
|
25
|
+
REGS: type[EfuseDefineRegisters]
|
|
26
|
+
|
|
27
|
+
def __init__(self, efuse_file: str | None = None, debug: bool = False):
|
|
28
|
+
self.Blocks = EfuseDefineBlocks
|
|
29
|
+
self.Fields = EfuseDefineFields(None)
|
|
30
|
+
self.REGS = EfuseDefineRegisters
|
|
31
|
+
super().__init__(efuse_file, debug)
|
|
32
|
+
self.write_reg(self.REGS.EFUSE_CMD_REG, 0)
|
|
33
|
+
|
|
34
|
+
""" esptool method start >>"""
|
|
35
|
+
|
|
36
|
+
def get_major_chip_version(self) -> int:
|
|
37
|
+
return 1
|
|
38
|
+
|
|
39
|
+
def get_minor_chip_version(self) -> int:
|
|
40
|
+
return 0
|
|
41
|
+
|
|
42
|
+
def get_crystal_freq(self) -> int:
|
|
43
|
+
return 40 # MHz
|
|
44
|
+
|
|
45
|
+
def get_security_info(self) -> dict[str, int]:
|
|
46
|
+
return {
|
|
47
|
+
"flags": 0,
|
|
48
|
+
"flash_crypt_cnt": 0,
|
|
49
|
+
"key_purposes": 0,
|
|
50
|
+
"chip_id": 0,
|
|
51
|
+
"api_version": 0,
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
""" << esptool method end """
|
|
55
|
+
|
|
56
|
+
def handle_writing_event(self, addr: int, value: int) -> None:
|
|
57
|
+
if addr == self.REGS.EFUSE_CMD_REG:
|
|
58
|
+
if value & self.REGS.EFUSE_PGM_CMD:
|
|
59
|
+
self.copy_blocks_wr_regs_to_rd_regs(updated_block=(value >> 2) & 0xF)
|
|
60
|
+
self.clean_blocks_wr_regs()
|
|
61
|
+
self.check_rd_protection_area()
|
|
62
|
+
self.write_reg(addr, 0)
|
|
63
|
+
self.write_reg(self.REGS.EFUSE_CMD_REG, 0)
|
|
64
|
+
elif value == self.REGS.EFUSE_READ_CMD:
|
|
65
|
+
self.write_reg(addr, 0)
|
|
66
|
+
self.write_reg(self.REGS.EFUSE_CMD_REG, 0)
|
|
67
|
+
self.save_to_file()
|
|
68
|
+
|
|
69
|
+
def get_bitlen_of_block(self, blk: BlockDefinition, wr: bool = False) -> int:
|
|
70
|
+
if blk.id == 0:
|
|
71
|
+
if wr:
|
|
72
|
+
return 32 * 8
|
|
73
|
+
else:
|
|
74
|
+
return 32 * blk.len
|
|
75
|
+
else:
|
|
76
|
+
if wr:
|
|
77
|
+
rs_coding = 32 * 3
|
|
78
|
+
return 32 * 8 + rs_coding
|
|
79
|
+
else:
|
|
80
|
+
return 32 * blk.len
|
|
81
|
+
|
|
82
|
+
def handle_coding_scheme(self, blk: BlockDefinition, data: BitStream) -> BitStream:
|
|
83
|
+
if blk.id != 0:
|
|
84
|
+
# CODING_SCHEME RS applied only for all blocks except BLK0.
|
|
85
|
+
coded_bytes = 12
|
|
86
|
+
data.pos = coded_bytes * 8
|
|
87
|
+
plain_data = data.readlist("32*uint:8")[::-1]
|
|
88
|
+
# takes 32 bytes
|
|
89
|
+
# apply RS encoding
|
|
90
|
+
rs = reedsolo.RSCodec(coded_bytes)
|
|
91
|
+
# 32 byte of data + 12 bytes RS
|
|
92
|
+
calc_encoded_data = list(rs.encode([x for x in plain_data]))
|
|
93
|
+
data.pos = 0
|
|
94
|
+
if calc_encoded_data != data.readlist("44*uint:8")[::-1]:
|
|
95
|
+
raise FatalError("Error in coding scheme data")
|
|
96
|
+
data = data[coded_bytes * 8 :]
|
|
97
|
+
if blk.len < 8:
|
|
98
|
+
data = data[(8 - blk.len) * 32 :]
|
|
99
|
+
return data
|
|
100
|
+
|
|
101
|
+
def set_read_disable_bits(
|
|
102
|
+
self,
|
|
103
|
+
block: BitStream,
|
|
104
|
+
read_disable_bit,
|
|
105
|
+
blk: BlockDefinition,
|
|
106
|
+
) -> None:
|
|
107
|
+
if isinstance(blk.read_disable_bit, list):
|
|
108
|
+
if read_disable_bit & (1 << blk.read_disable_bit[0]):
|
|
109
|
+
block.set(0, [i for i in range(blk.len * 32 // 2, blk.len * 32)])
|
|
110
|
+
if read_disable_bit & (1 << blk.read_disable_bit[1]):
|
|
111
|
+
block.set(0, [i for i in range(0, blk.len * 32 // 2)])
|
|
112
|
+
else:
|
|
113
|
+
block.set(0)
|