esptool 4.8.dev4__tar.gz → 4.8.dev5__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-4.8.dev4 → esptool-4.8.dev5}/MANIFEST.in +2 -2
- esptool-4.8.dev5/PKG-INFO +53 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/__init__.py +54 -6
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/base_fields.py +4 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/base_operations.py +69 -20
- esptool-4.8.dev5/espefuse/efuse/csv_table_parser.py +266 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32/emulate_efuse_controller.py +2 -7
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32/fields.py +9 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32/mem_definition.py +2 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c2/emulate_efuse_controller.py +1 -1
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c2/fields.py +9 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c2/mem_definition.py +2 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c3/emulate_efuse_controller.py +1 -1
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c3/fields.py +9 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c3/mem_definition.py +2 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5/emulate_efuse_controller.py +1 -1
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5/fields.py +9 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5/mem_definition.py +2 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5beta3/emulate_efuse_controller.py +1 -1
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5beta3/fields.py +9 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5beta3/mem_definition.py +2 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c6/emulate_efuse_controller.py +1 -1
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c6/fields.py +9 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c6/mem_definition.py +2 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c61/emulate_efuse_controller.py +1 -1
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c61/fields.py +9 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c61/mem_definition.py +2 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2/emulate_efuse_controller.py +1 -1
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2/fields.py +9 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2/mem_definition.py +2 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2beta1/emulate_efuse_controller.py +1 -1
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2beta1/fields.py +9 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2beta1/mem_definition.py +2 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32p4/emulate_efuse_controller.py +1 -1
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32p4/fields.py +9 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32p4/mem_definition.py +2 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s2/emulate_efuse_controller.py +1 -1
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s2/fields.py +9 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s2/mem_definition.py +2 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3/emulate_efuse_controller.py +1 -1
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3/fields.py +31 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3/mem_definition.py +2 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3beta2/emulate_efuse_controller.py +1 -1
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3beta2/fields.py +31 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3beta2/mem_definition.py +2 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/mem_definition_base.py +62 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espsecure/__init__.py +157 -71
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/__init__.py +66 -6
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/bin_image.py +5 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/cmds.py +31 -6
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/loader.py +33 -17
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/reset.py +29 -16
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32.py +3 -1
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c2.py +3 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c3.py +22 -3
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c5.py +82 -2
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c5beta3.py +18 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c6.py +7 -3
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c61.py +21 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32h2.py +18 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32h2beta1.py +23 -3
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32p4.py +26 -4
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32s2.py +24 -3
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32s3.py +24 -3
- esptool-4.8.dev5/esptool/targets/stub_flasher/1/README.md +3 -0
- esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32c5.json +8 -0
- esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32c5beta3.json +8 -0
- esptool-4.8.dev5/esptool/targets/stub_flasher/2/LICENSE-APACHE +201 -0
- esptool-4.8.dev5/esptool/targets/stub_flasher/2/LICENSE-MIT +25 -0
- esptool-4.8.dev5/esptool/targets/stub_flasher/2/README.md +3 -0
- esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32.json +1 -0
- esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32c2.json +1 -0
- esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32c3.json +1 -0
- esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32c6.json +1 -0
- esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32h2.json +1 -0
- esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32s2.json +1 -0
- esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32s3.json +1 -0
- esptool-4.8.dev5/esptool.egg-info/PKG-INFO +53 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool.egg-info/SOURCES.txt +28 -14
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool.egg-info/requires.txt +3 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool.egg-info/top_level.txt +3 -0
- esptool-4.8.dev5/pyproject.toml +166 -0
- esptool-4.8.dev5/setup.py +21 -0
- esptool-4.8.dev4/PKG-INFO +0 -46
- esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32c5beta3.json +0 -8
- esptool-4.8.dev4/esptool.egg-info/PKG-INFO +0 -46
- esptool-4.8.dev4/setup.py +0 -137
- {esptool-4.8.dev4 → esptool-4.8.dev5}/LICENSE +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/README.md +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esp_rfc2217_server.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/__main__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/emulate_efuse_controller_base.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32/operations.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c2/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c2/operations.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c3/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c3/operations.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5/operations.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5beta3/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5beta3/operations.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c6/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c6/operations.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c61/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c61/operations.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2/operations.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2beta1/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2beta1/operations.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32p4/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32p4/operations.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s2/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s2/operations.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3/operations.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3beta2/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3beta2/operations.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/util.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32.yaml +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32c2.yaml +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32c3.yaml +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32c5.yaml +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32c5beta3.yaml +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32c6.yaml +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32c61.yaml +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32h2.yaml +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32p4.yaml +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32s2.yaml +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32s3.yaml +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espsecure/__main__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espsecure/esp_hsm_sign/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espsecure/esp_hsm_sign/exceptions.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/espsecure.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/__main__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/config.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/__init__.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c6beta.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32h2beta2.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32s3beta2.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp8266.py +0 -0
- /esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32.json → /esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32.json +0 -0
- /esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32c2.json → /esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32c2.json +0 -0
- /esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32c3.json → /esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32c3.json +0 -0
- /esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32c6.json → /esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32c6.json +0 -0
- /esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32c6beta.json → /esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32c6beta.json +0 -0
- /esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32h2.json → /esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32h2.json +0 -0
- /esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32h2beta1.json → /esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32h2beta1.json +0 -0
- /esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32h2beta2.json → /esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32h2beta2.json +0 -0
- /esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32p4.json → /esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32p4.json +0 -0
- /esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32s2.json → /esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32s2.json +0 -0
- /esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32s3.json → /esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32s3.json +0 -0
- /esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32s3beta2.json → /esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32s3beta2.json +0 -0
- /esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_8266.json → /esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp8266.json +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/uf2_writer.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/util.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool.egg-info/dependency_links.txt +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool.py +0 -0
- {esptool-4.8.dev4 → esptool-4.8.dev5}/setup.cfg +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
include README.md
|
|
2
2
|
include LICENSE
|
|
3
|
-
include esptool/targets/stub_flasher
|
|
3
|
+
include esptool/targets/stub_flasher/1/*
|
|
4
|
+
include esptool/targets/stub_flasher/2/*
|
|
4
5
|
include espefuse/efuse_defs/*.yaml
|
|
5
6
|
# sdist includes test/test*.py by default, but esptool.py tests
|
|
6
7
|
# are so far only intended to run from the git repo itself
|
|
7
8
|
prune test
|
|
8
|
-
prune flasher_stub
|
|
9
9
|
prune .github
|
|
10
10
|
prune docs
|
|
11
11
|
exclude .git*
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: esptool
|
|
3
|
+
Version: 4.8.dev5
|
|
4
|
+
Summary: A serial utility to communicate & flash code to Espressif chips.
|
|
5
|
+
Author: Fredrik Ahlberg (themadinventor), Angus Gratton (projectgus), Espressif Systems
|
|
6
|
+
License: GPLv2+
|
|
7
|
+
Project-URL: Homepage, https://github.com/espressif/esptool/
|
|
8
|
+
Project-URL: Documentation, https://docs.espressif.com/projects/esptool/
|
|
9
|
+
Project-URL: Source, https://github.com/espressif/esptool/
|
|
10
|
+
Project-URL: Tracker, https://github.com/espressif/esptool/issues/
|
|
11
|
+
Project-URL: Changelog, https://github.com/espressif/esptool/blob/master/CHANGELOG.md
|
|
12
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Natural Language :: English
|
|
15
|
+
Classifier: Operating System :: POSIX
|
|
16
|
+
Classifier: Operating System :: Microsoft :: Windows
|
|
17
|
+
Classifier: Operating System :: MacOS :: MacOS X
|
|
18
|
+
Classifier: Topic :: Software Development :: Embedded Systems
|
|
19
|
+
Classifier: Environment :: Console
|
|
20
|
+
Classifier: License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.7
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
26
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
27
|
+
Requires-Python: >=3.7
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Provides-Extra: hsm
|
|
31
|
+
License-File: LICENSE
|
|
32
|
+
|
|
33
|
+
# esptool.py
|
|
34
|
+
|
|
35
|
+
A Python-based, open-source, platform-independent utility to communicate with the ROM bootloader in Espressif chips.
|
|
36
|
+
|
|
37
|
+
[](https://github.com/espressif/esptool/actions/workflows/test_esptool.yml) [](https://github.com/espressif/esptool/actions/workflows/build_esptool.yml)
|
|
38
|
+
|
|
39
|
+
## Documentation
|
|
40
|
+
|
|
41
|
+
Visit the [documentation](https://docs.espressif.com/projects/esptool/) or run `esptool.py -h`.
|
|
42
|
+
|
|
43
|
+
## Contribute
|
|
44
|
+
|
|
45
|
+
If you're interested in contributing to esptool.py, please check the [contributions guide](https://docs.espressif.com/projects/esptool/en/latest/contributing.html).
|
|
46
|
+
|
|
47
|
+
## About
|
|
48
|
+
|
|
49
|
+
esptool.py was initially created by Fredrik Ahlberg (@[themadinventor](https://github.com/themadinventor/)), and later maintained by Angus Gratton (@[projectgus](https://github.com/projectgus/)). It is now supported by Espressif Systems. It has also received improvements from many members of the community.
|
|
50
|
+
|
|
51
|
+
## License
|
|
52
|
+
|
|
53
|
+
This document and the attached source code are released as Free Software under GNU General Public License Version 2 or later. See the accompanying [LICENSE file](https://github.com/espressif/esptool/blob/master/LICENSE) for a copy.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# SPDX-FileCopyrightText: 2016-2022 Espressif Systems (Shanghai) CO LTD
|
|
2
2
|
#
|
|
3
3
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
4
|
+
# PYTHON_ARGCOMPLETE_OK
|
|
4
5
|
|
|
5
6
|
import argparse
|
|
6
7
|
import os
|
|
@@ -39,13 +40,15 @@ SUPPORTED_BURN_COMMANDS = [
|
|
|
39
40
|
"execute_scripts",
|
|
40
41
|
]
|
|
41
42
|
|
|
42
|
-
|
|
43
|
+
SUPPORTED_READ_COMMANDS = [
|
|
43
44
|
"summary",
|
|
44
45
|
"dump",
|
|
45
46
|
"get_custom_mac",
|
|
46
47
|
"adc_info",
|
|
47
48
|
"check_error",
|
|
48
|
-
]
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
SUPPORTED_COMMANDS = SUPPORTED_READ_COMMANDS + SUPPORTED_BURN_COMMANDS
|
|
49
52
|
|
|
50
53
|
SUPPORTED_CHIPS = {
|
|
51
54
|
"esp32": DefChip("ESP32", esp32_efuse, esptool.targets.ESP32ROM),
|
|
@@ -94,15 +97,25 @@ def get_esp(
|
|
|
94
97
|
)
|
|
95
98
|
if not skip_connect:
|
|
96
99
|
esp.connect(connect_mode)
|
|
100
|
+
if esp.sync_stub_detected:
|
|
101
|
+
esp = esp.STUB_CLASS(esp)
|
|
97
102
|
return esp
|
|
98
103
|
|
|
99
104
|
|
|
100
|
-
def get_efuses(
|
|
105
|
+
def get_efuses(
|
|
106
|
+
esp,
|
|
107
|
+
skip_connect=False,
|
|
108
|
+
debug_mode=False,
|
|
109
|
+
do_not_confirm=False,
|
|
110
|
+
extend_efuse_table=None,
|
|
111
|
+
):
|
|
101
112
|
for name in SUPPORTED_CHIPS:
|
|
102
113
|
if SUPPORTED_CHIPS[name].chip_name == esp.CHIP_NAME:
|
|
103
114
|
efuse = SUPPORTED_CHIPS[name].efuse_lib
|
|
104
115
|
return (
|
|
105
|
-
efuse.EspEfuses(
|
|
116
|
+
efuse.EspEfuses(
|
|
117
|
+
esp, skip_connect, debug_mode, do_not_confirm, extend_efuse_table
|
|
118
|
+
),
|
|
106
119
|
efuse.operations,
|
|
107
120
|
)
|
|
108
121
|
else:
|
|
@@ -224,9 +237,15 @@ def main(custom_commandline=None, esp=None):
|
|
|
224
237
|
"(efuses which disable access to blocks or chip).",
|
|
225
238
|
action="store_true",
|
|
226
239
|
)
|
|
240
|
+
init_parser.add_argument(
|
|
241
|
+
"--extend-efuse-table",
|
|
242
|
+
help="CSV file from ESP-IDF (esp_efuse_custom_table.csv)",
|
|
243
|
+
type=argparse.FileType("r"),
|
|
244
|
+
default=None,
|
|
245
|
+
)
|
|
227
246
|
|
|
228
247
|
common_args, remaining_args = init_parser.parse_known_args(custom_commandline)
|
|
229
|
-
debug_mode = common_args.debug
|
|
248
|
+
debug_mode = common_args.debug
|
|
230
249
|
just_print_help = [
|
|
231
250
|
True for arg in remaining_args if arg in ["--help", "-h"]
|
|
232
251
|
] or remaining_args == []
|
|
@@ -253,7 +272,11 @@ def main(custom_commandline=None, esp=None):
|
|
|
253
272
|
# TODO: Require the --port argument in the next major release, ESPTOOL-490
|
|
254
273
|
|
|
255
274
|
efuses, efuse_operations = get_efuses(
|
|
256
|
-
esp,
|
|
275
|
+
esp,
|
|
276
|
+
just_print_help,
|
|
277
|
+
debug_mode,
|
|
278
|
+
common_args.do_not_confirm,
|
|
279
|
+
common_args.extend_efuse_table,
|
|
257
280
|
)
|
|
258
281
|
|
|
259
282
|
parser = argparse.ArgumentParser(parents=[init_parser])
|
|
@@ -263,6 +286,15 @@ def main(custom_commandline=None, esp=None):
|
|
|
263
286
|
|
|
264
287
|
efuse_operations.add_commands(subparsers, efuses)
|
|
265
288
|
|
|
289
|
+
# Enable argcomplete only on Unix-like systems
|
|
290
|
+
if sys.platform != "win32":
|
|
291
|
+
try:
|
|
292
|
+
import argcomplete
|
|
293
|
+
|
|
294
|
+
argcomplete.autocomplete(parser)
|
|
295
|
+
except ImportError:
|
|
296
|
+
pass
|
|
297
|
+
|
|
266
298
|
grouped_remaining_args, used_cmds = split_on_groups(remaining_args)
|
|
267
299
|
if len(grouped_remaining_args) == 0:
|
|
268
300
|
parser.print_help()
|
|
@@ -302,6 +334,22 @@ def main(custom_commandline=None, esp=None):
|
|
|
302
334
|
if not efuses.burn_all(check_batch_mode=True):
|
|
303
335
|
raise esptool.FatalError("BURN was not done")
|
|
304
336
|
print("Successful")
|
|
337
|
+
|
|
338
|
+
if (
|
|
339
|
+
sum(cmd in SUPPORTED_BURN_COMMANDS for cmd in used_cmds) > 0
|
|
340
|
+
and sum(cmd in SUPPORTED_READ_COMMANDS for cmd in used_cmds) > 0
|
|
341
|
+
):
|
|
342
|
+
# [burn_cmd1] [burn_cmd2] [read_cmd1] [burn_cmd3] [read_cmd2]
|
|
343
|
+
print("\n=== Run read commands after burn commands ===")
|
|
344
|
+
for rem_args in grouped_remaining_args:
|
|
345
|
+
args, unused_args = parser.parse_known_args(
|
|
346
|
+
rem_args, namespace=common_args
|
|
347
|
+
)
|
|
348
|
+
current_cmd = args.operation
|
|
349
|
+
if current_cmd in SUPPORTED_READ_COMMANDS:
|
|
350
|
+
print(f"\n=== Run {args.operation} command ===")
|
|
351
|
+
operation_func = vars(efuse_operations)[current_cmd]
|
|
352
|
+
operation_func(esp, efuses, args)
|
|
305
353
|
finally:
|
|
306
354
|
if not external_esp and not common_args.virt and esp._port:
|
|
307
355
|
esp._port.close()
|
|
@@ -649,6 +649,10 @@ class EspEfusesBase(object):
|
|
|
649
649
|
"""Returns (error count, failure boolean flag)"""
|
|
650
650
|
return self.blocks[block_num].num_errors, self.blocks[block_num].fail
|
|
651
651
|
|
|
652
|
+
def is_efuses_incompatible_for_burn(self):
|
|
653
|
+
# Overwrite this function for a specific target if you want to check if a certain eFuse(s) can be burned.
|
|
654
|
+
return False
|
|
655
|
+
|
|
652
656
|
|
|
653
657
|
class EfuseFieldBase(EfuseProtectBase):
|
|
654
658
|
def __init__(self, parent, param):
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
6
6
|
|
|
7
7
|
import argparse
|
|
8
|
+
import os
|
|
8
9
|
import json
|
|
9
10
|
import sys
|
|
10
11
|
|
|
@@ -74,6 +75,11 @@ def add_common_commands(subparsers, efuses):
|
|
|
74
75
|
+ [name for e in efuses.efuses for name in e.alt_names if name != ""],
|
|
75
76
|
efuses=efuses,
|
|
76
77
|
)
|
|
78
|
+
burn.add_argument(
|
|
79
|
+
"--force",
|
|
80
|
+
help="Suppress an error to burn eFuses",
|
|
81
|
+
action="store_true",
|
|
82
|
+
)
|
|
77
83
|
|
|
78
84
|
read_protect_efuse = subparsers.add_parser(
|
|
79
85
|
"read_protect_efuse",
|
|
@@ -168,12 +174,22 @@ def add_common_commands(subparsers, efuses):
|
|
|
168
174
|
help="Display information about ADC calibration data stored in efuse.",
|
|
169
175
|
)
|
|
170
176
|
|
|
171
|
-
dump_cmd = subparsers.add_parser("dump", help="Dump raw hex values of all
|
|
177
|
+
dump_cmd = subparsers.add_parser("dump", help="Dump raw hex values of all eFuses")
|
|
178
|
+
dump_cmd.add_argument(
|
|
179
|
+
"--format",
|
|
180
|
+
help="Select the dump format: "
|
|
181
|
+
"default - usual console eFuse dump; "
|
|
182
|
+
"joint - all eFuse blocks are stored in one file; "
|
|
183
|
+
"split - each eFuse block is placed into its own file. The tool will create multiple files based on "
|
|
184
|
+
"the given --file_name (/path/blk.bin): blk0.bin, blk1.bin ... blkN.bin. Use the burn_block_data cmd "
|
|
185
|
+
"to write it back to another chip.",
|
|
186
|
+
choices=["default", "split", "joint"],
|
|
187
|
+
default="default",
|
|
188
|
+
)
|
|
172
189
|
dump_cmd.add_argument(
|
|
173
190
|
"--file_name",
|
|
174
|
-
help="
|
|
175
|
-
|
|
176
|
-
"Use burn_block_data to write it back to another chip.",
|
|
191
|
+
help="The path to the file in which to save the dump, if not specified, output to the console.",
|
|
192
|
+
default=sys.stdout,
|
|
177
193
|
)
|
|
178
194
|
|
|
179
195
|
summary_cmd = subparsers.add_parser(
|
|
@@ -374,23 +390,48 @@ def summary(esp, efuses, args):
|
|
|
374
390
|
|
|
375
391
|
def dump(esp, efuses, args):
|
|
376
392
|
"""Dump raw efuse data registers"""
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
393
|
+
dump_file = args.file_name
|
|
394
|
+
to_console = args.file_name == sys.stdout
|
|
395
|
+
|
|
396
|
+
def output_block_to_file(block, f, to_console):
|
|
397
|
+
block_dump = BitStream(block.get_bitstring())
|
|
398
|
+
block_dump.byteswap()
|
|
399
|
+
if to_console:
|
|
400
|
+
f.write(block_dump.hex + "\n")
|
|
401
|
+
else:
|
|
402
|
+
block_dump.tofile(f)
|
|
403
|
+
|
|
404
|
+
if args.format == "default":
|
|
405
|
+
if to_console:
|
|
406
|
+
# for "espefuse.py dump" cmd
|
|
407
|
+
for block in efuses.blocks:
|
|
408
|
+
block.print_block(block.get_bitstring(), "dump", debug=True)
|
|
409
|
+
return
|
|
410
|
+
else:
|
|
411
|
+
# for back compatibility to support "espefuse.py dump --file_name dump.bin"
|
|
412
|
+
args.format = "split"
|
|
413
|
+
|
|
414
|
+
if args.format == "split":
|
|
415
|
+
# each efuse block is placed into its own file
|
|
382
416
|
for block in efuses.blocks:
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
file_dump_name
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
)
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
417
|
+
if not to_console:
|
|
418
|
+
file_dump_name = args.file_name
|
|
419
|
+
fname, fextension = os.path.splitext(file_dump_name)
|
|
420
|
+
file_dump_name = f"{fname}{block.id}{fextension}"
|
|
421
|
+
print(f"Dump efuse block{block.id} -> {file_dump_name}")
|
|
422
|
+
dump_file = open(file_dump_name, "wb")
|
|
423
|
+
output_block_to_file(block, dump_file, to_console)
|
|
424
|
+
if not to_console:
|
|
425
|
+
dump_file.close()
|
|
426
|
+
elif args.format == "joint":
|
|
427
|
+
# all efuse blocks are stored in one file
|
|
428
|
+
if not to_console:
|
|
429
|
+
print(f"Dump efuse blocks -> {args.file_name}")
|
|
430
|
+
dump_file = open(args.file_name, "wb")
|
|
431
|
+
for block in efuses.blocks:
|
|
432
|
+
output_block_to_file(block, dump_file, to_console)
|
|
433
|
+
if not to_console:
|
|
434
|
+
dump_file.close()
|
|
394
435
|
|
|
395
436
|
|
|
396
437
|
def burn_efuse(esp, efuses, args):
|
|
@@ -480,6 +521,14 @@ def burn_efuse(esp, efuses, args):
|
|
|
480
521
|
)
|
|
481
522
|
print(" espefuse/esptool will not work.")
|
|
482
523
|
|
|
524
|
+
if efuses.is_efuses_incompatible_for_burn():
|
|
525
|
+
if args.force:
|
|
526
|
+
print("Ignore incompatible eFuse settings.")
|
|
527
|
+
else:
|
|
528
|
+
raise esptool.FatalError(
|
|
529
|
+
"Incompatible eFuse settings detected, abort. (use --force flag to skip it)."
|
|
530
|
+
)
|
|
531
|
+
|
|
483
532
|
if not efuses.burn_all(check_batch_mode=True):
|
|
484
533
|
return
|
|
485
534
|
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
# This file helps to parse CSV eFuse tables
|
|
2
|
+
#
|
|
3
|
+
# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
|
4
|
+
#
|
|
5
|
+
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
6
|
+
|
|
7
|
+
import os
|
|
8
|
+
import re
|
|
9
|
+
import sys
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class CSVFuseTable(list):
|
|
13
|
+
@classmethod
|
|
14
|
+
def from_csv(cls, csv_contents):
|
|
15
|
+
res = CSVFuseTable()
|
|
16
|
+
lines = csv_contents.splitlines()
|
|
17
|
+
|
|
18
|
+
def expand_vars(f):
|
|
19
|
+
f = os.path.expandvars(f)
|
|
20
|
+
m = re.match(r"(?<!\\)\$([A-Za-z_]\w*)", f)
|
|
21
|
+
if m:
|
|
22
|
+
raise InputError(f"unknown variable '{m.group(1)}'")
|
|
23
|
+
return f
|
|
24
|
+
|
|
25
|
+
for line_no, line in enumerate(lines):
|
|
26
|
+
line = expand_vars(line).strip()
|
|
27
|
+
if line.startswith("#") or len(line) == 0:
|
|
28
|
+
continue
|
|
29
|
+
try:
|
|
30
|
+
res.append(FuseDefinition.from_csv(line))
|
|
31
|
+
except InputError as err:
|
|
32
|
+
raise InputError(f"Error at line {line_no + 1}: {err}")
|
|
33
|
+
except Exception:
|
|
34
|
+
sys.stderr.write(f"Unexpected error parsing line {line_no + 1}: {line}")
|
|
35
|
+
raise
|
|
36
|
+
|
|
37
|
+
# fix up missing bit_start
|
|
38
|
+
last_efuse_block = None
|
|
39
|
+
for i in res:
|
|
40
|
+
if last_efuse_block != i.efuse_block:
|
|
41
|
+
last_end = 0
|
|
42
|
+
if i.bit_start is None:
|
|
43
|
+
i.bit_start = last_end
|
|
44
|
+
last_end = i.bit_start + i.bit_count
|
|
45
|
+
last_efuse_block = i.efuse_block
|
|
46
|
+
|
|
47
|
+
res.verify_duplicate_name()
|
|
48
|
+
|
|
49
|
+
# fix up missing field_name
|
|
50
|
+
last_field = None
|
|
51
|
+
for i in res:
|
|
52
|
+
if i.field_name == "":
|
|
53
|
+
if last_field is None:
|
|
54
|
+
raise InputError(
|
|
55
|
+
f"Error at line {line_no + 1}: {i} missing field name"
|
|
56
|
+
)
|
|
57
|
+
elif last_field is not None:
|
|
58
|
+
i.field_name = last_field.field_name
|
|
59
|
+
last_field = i
|
|
60
|
+
|
|
61
|
+
# fill group
|
|
62
|
+
names = [p.field_name for p in res]
|
|
63
|
+
duplicates = set(n for n in names if names.count(n) > 1)
|
|
64
|
+
for dname in duplicates:
|
|
65
|
+
i_count = 0
|
|
66
|
+
for p in res:
|
|
67
|
+
if p.field_name != dname:
|
|
68
|
+
continue
|
|
69
|
+
if len(duplicates.intersection([p.field_name])) != 0:
|
|
70
|
+
p.field_name = f"{p.field_name}_{i_count}"
|
|
71
|
+
if p.alt_names:
|
|
72
|
+
p.alt_names = f"{p.alt_names}_{i_count}"
|
|
73
|
+
i_count += 1
|
|
74
|
+
else:
|
|
75
|
+
i_count = 0
|
|
76
|
+
|
|
77
|
+
for p in res:
|
|
78
|
+
p.field_name = p.field_name.replace(".", "_")
|
|
79
|
+
if p.alt_names:
|
|
80
|
+
p.alt_names = p.alt_names.replace(".", "_")
|
|
81
|
+
res.verify_duplicate_name()
|
|
82
|
+
return res
|
|
83
|
+
|
|
84
|
+
def verify_duplicate_name(self):
|
|
85
|
+
# check on duplicate name
|
|
86
|
+
names = [p.field_name for p in self]
|
|
87
|
+
names += [name.replace(".", "_") for name in names if "." in name]
|
|
88
|
+
duplicates = set(n for n in names if names.count(n) > 1)
|
|
89
|
+
|
|
90
|
+
# print sorted duplicate partitions by name
|
|
91
|
+
if len(duplicates) != 0:
|
|
92
|
+
fl_error = False
|
|
93
|
+
for p in self:
|
|
94
|
+
field_name = p.field_name + p.group
|
|
95
|
+
if field_name != "" and len(duplicates.intersection([field_name])) != 0:
|
|
96
|
+
fl_error = True
|
|
97
|
+
print(
|
|
98
|
+
f"Field at {p.field_name}, {p.efuse_block}, "
|
|
99
|
+
f"{p.bit_start}, {p.bit_count} have duplicate field_name"
|
|
100
|
+
)
|
|
101
|
+
if fl_error is True:
|
|
102
|
+
raise InputError("Field names must be unique")
|
|
103
|
+
|
|
104
|
+
def check_struct_field_name(self):
|
|
105
|
+
# check that structured fields have a root field
|
|
106
|
+
for p in self:
|
|
107
|
+
if "." in p.field_name:
|
|
108
|
+
name = ""
|
|
109
|
+
for sub in p.field_name.split(".")[:-1]:
|
|
110
|
+
name = sub if name == "" else name + "." + sub
|
|
111
|
+
missed_name = True
|
|
112
|
+
for d in self:
|
|
113
|
+
if (
|
|
114
|
+
p is not d
|
|
115
|
+
and p.efuse_block == d.efuse_block
|
|
116
|
+
and name == d.field_name
|
|
117
|
+
):
|
|
118
|
+
missed_name = False
|
|
119
|
+
if missed_name:
|
|
120
|
+
raise InputError(f"{name} is not found")
|
|
121
|
+
|
|
122
|
+
def verify(self, type_table=None):
|
|
123
|
+
def check(p, n):
|
|
124
|
+
left = n.bit_start
|
|
125
|
+
right = n.bit_start + n.bit_count - 1
|
|
126
|
+
start = p.bit_start
|
|
127
|
+
end = p.bit_start + p.bit_count - 1
|
|
128
|
+
if left <= start <= right:
|
|
129
|
+
if left <= end <= right:
|
|
130
|
+
return "included in" # [n [p...p] n]
|
|
131
|
+
return "intersected with" # [n [p..n]..p]
|
|
132
|
+
if left <= end <= right:
|
|
133
|
+
return "intersected with" # [p..[n..p] n]
|
|
134
|
+
if start <= left and right <= end:
|
|
135
|
+
return "wraps" # [p [n...n] p]
|
|
136
|
+
return "ok" # [p] [n] or [n] [p]
|
|
137
|
+
|
|
138
|
+
def print_error(p, n, state):
|
|
139
|
+
raise InputError(
|
|
140
|
+
f"Field at {p.field_name}, {p.efuse_block}, {p.bit_start}, {p.bit_count} {state} {n.field_name}, {n.efuse_block}, {n.bit_start}, {n.bit_count}"
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
for p in self:
|
|
144
|
+
p.verify(type_table)
|
|
145
|
+
|
|
146
|
+
self.verify_duplicate_name()
|
|
147
|
+
if type_table != "custom_table":
|
|
148
|
+
# check will be done for common and custom tables together
|
|
149
|
+
self.check_struct_field_name()
|
|
150
|
+
|
|
151
|
+
# check for overlaps
|
|
152
|
+
for p in self:
|
|
153
|
+
for n in self:
|
|
154
|
+
if p is not n and p.efuse_block == n.efuse_block:
|
|
155
|
+
state = check(p, n)
|
|
156
|
+
if state != "ok":
|
|
157
|
+
if "." in p.field_name:
|
|
158
|
+
name = ""
|
|
159
|
+
for sub in p.field_name.split("."):
|
|
160
|
+
name = sub if name == "" else name + "." + sub
|
|
161
|
+
for d in self:
|
|
162
|
+
if (
|
|
163
|
+
p is not d
|
|
164
|
+
and p.efuse_block == d.efuse_block
|
|
165
|
+
and name == d.field_name
|
|
166
|
+
):
|
|
167
|
+
state = check(p, d)
|
|
168
|
+
if state == "included in":
|
|
169
|
+
break
|
|
170
|
+
elif state != "intersected with":
|
|
171
|
+
state = "out of range"
|
|
172
|
+
print_error(p, d, state)
|
|
173
|
+
continue
|
|
174
|
+
elif "." in n.field_name:
|
|
175
|
+
continue
|
|
176
|
+
print_error(p, n, state)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class FuseDefinition(object):
|
|
180
|
+
def __init__(self):
|
|
181
|
+
self.field_name = ""
|
|
182
|
+
self.group = ""
|
|
183
|
+
self.efuse_block = ""
|
|
184
|
+
self.bit_start = None
|
|
185
|
+
self.bit_count = None
|
|
186
|
+
self.define = None
|
|
187
|
+
self.comment = ""
|
|
188
|
+
self.alt_names = ""
|
|
189
|
+
self.MAX_BITS_OF_BLOCK = 256
|
|
190
|
+
|
|
191
|
+
@classmethod
|
|
192
|
+
def from_csv(cls, line):
|
|
193
|
+
"""Parse a line from the CSV"""
|
|
194
|
+
line_w_defaults = line + ",,,,"
|
|
195
|
+
fields = [f.strip() for f in line_w_defaults.split(",")]
|
|
196
|
+
|
|
197
|
+
res = FuseDefinition()
|
|
198
|
+
res.field_name = fields[0]
|
|
199
|
+
res.efuse_block = res.parse_block(fields[1])
|
|
200
|
+
res.bit_start = res.parse_num(fields[2])
|
|
201
|
+
res.bit_count = res.parse_bit_count(fields[3])
|
|
202
|
+
if res.bit_count is None or res.bit_count == 0:
|
|
203
|
+
raise InputError("Field bit_count can't be empty")
|
|
204
|
+
res.comment = fields[4].rstrip("\\").rstrip()
|
|
205
|
+
res.comment += f" ({res.bit_start}-{res.bit_start + res.bit_count - 1})"
|
|
206
|
+
res.alt_names = res.get_alt_names(res.comment)
|
|
207
|
+
return res
|
|
208
|
+
|
|
209
|
+
def parse_num(self, strval):
|
|
210
|
+
if strval == "":
|
|
211
|
+
return None
|
|
212
|
+
return self.parse_int(strval)
|
|
213
|
+
|
|
214
|
+
def parse_bit_count(self, strval):
|
|
215
|
+
if strval == "MAX_BLK_LEN":
|
|
216
|
+
self.define = strval
|
|
217
|
+
return self.MAX_BITS_OF_BLOCK
|
|
218
|
+
else:
|
|
219
|
+
return self.parse_num(strval)
|
|
220
|
+
|
|
221
|
+
def parse_int(self, v):
|
|
222
|
+
try:
|
|
223
|
+
return int(v, 0)
|
|
224
|
+
except ValueError:
|
|
225
|
+
raise InputError(f"Invalid field value {v}")
|
|
226
|
+
|
|
227
|
+
def parse_block(self, strval):
|
|
228
|
+
if strval == "":
|
|
229
|
+
raise InputError("Field 'efuse_block' can't be left empty.")
|
|
230
|
+
return self.parse_int(strval.lstrip("EFUSE_BLK"))
|
|
231
|
+
|
|
232
|
+
def verify(self, type_table):
|
|
233
|
+
if self.efuse_block is None:
|
|
234
|
+
raise ValidationError(self, "efuse_block field is not set")
|
|
235
|
+
if self.bit_count is None:
|
|
236
|
+
raise ValidationError(self, "bit_count field is not set")
|
|
237
|
+
max_bits = self.MAX_BITS_OF_BLOCK
|
|
238
|
+
if self.bit_start + self.bit_count > max_bits:
|
|
239
|
+
raise ValidationError(
|
|
240
|
+
self,
|
|
241
|
+
f"The field is outside the boundaries(max_bits = {max_bits}) of the {self.efuse_block} block",
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
def get_bit_count(self, check_define=True):
|
|
245
|
+
if check_define is True and self.define is not None:
|
|
246
|
+
return self.define
|
|
247
|
+
else:
|
|
248
|
+
return self.bit_count
|
|
249
|
+
|
|
250
|
+
def get_alt_names(self, comment):
|
|
251
|
+
result = re.search(r"^\[(.*?)\]", comment)
|
|
252
|
+
if result:
|
|
253
|
+
return result.group(1)
|
|
254
|
+
return ""
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
class InputError(RuntimeError):
|
|
258
|
+
def __init__(self, e):
|
|
259
|
+
super(InputError, self).__init__(e)
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
class ValidationError(InputError):
|
|
263
|
+
def __init__(self, p, message):
|
|
264
|
+
super(ValidationError, self).__init__(
|
|
265
|
+
f"Entry {p.field_name} invalid: {message}"
|
|
266
|
+
)
|
|
@@ -19,7 +19,7 @@ class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
|
19
19
|
|
|
20
20
|
def __init__(self, efuse_file=None, debug=False):
|
|
21
21
|
self.Blocks = EfuseDefineBlocks
|
|
22
|
-
self.Fields = EfuseDefineFields()
|
|
22
|
+
self.Fields = EfuseDefineFields(None)
|
|
23
23
|
self.REGS = EfuseDefineRegisters
|
|
24
24
|
super(EmulateEfuseController, self).__init__(efuse_file, debug)
|
|
25
25
|
|
|
@@ -38,12 +38,7 @@ class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
|
38
38
|
if addr == self.REGS.APB_CTL_DATE_ADDR:
|
|
39
39
|
return self.REGS.APB_CTL_DATE_V << self.REGS.APB_CTL_DATE_S
|
|
40
40
|
else:
|
|
41
|
-
|
|
42
|
-
if addr == self.REGS.EFUSE_BLK0_RDATA3_REG:
|
|
43
|
-
val = self.REGS.EFUSE_RD_CHIP_VER_REV1
|
|
44
|
-
if addr == self.REGS.EFUSE_BLK0_RDATA5_REG:
|
|
45
|
-
val = self.REGS.EFUSE_RD_CHIP_VER_REV2
|
|
46
|
-
return val | super(EmulateEfuseController, self).read_reg(addr)
|
|
41
|
+
return super(EmulateEfuseController, self).read_reg(addr)
|
|
47
42
|
|
|
48
43
|
""" << esptool method end """
|
|
49
44
|
|
|
@@ -68,9 +68,16 @@ class EspEfuses(base_fields.EspEfusesBase):
|
|
|
68
68
|
debug = False
|
|
69
69
|
do_not_confirm = False
|
|
70
70
|
|
|
71
|
-
def __init__(
|
|
71
|
+
def __init__(
|
|
72
|
+
self,
|
|
73
|
+
esp,
|
|
74
|
+
skip_connect=False,
|
|
75
|
+
debug=False,
|
|
76
|
+
do_not_confirm=False,
|
|
77
|
+
extend_efuse_table=None,
|
|
78
|
+
):
|
|
72
79
|
self.Blocks = EfuseDefineBlocks()
|
|
73
|
-
self.Fields = EfuseDefineFields()
|
|
80
|
+
self.Fields = EfuseDefineFields(extend_efuse_table)
|
|
74
81
|
self.REGS = EfuseDefineRegisters
|
|
75
82
|
self.BURN_BLOCK_DATA_NAMES = self.Blocks.get_burn_block_data_names()
|
|
76
83
|
self.BLOCKS_FOR_KEYS = self.Blocks.get_blocks_for_keys()
|
|
@@ -89,7 +89,7 @@ class EfuseDefineBlocks(EfuseBlocksBase):
|
|
|
89
89
|
|
|
90
90
|
|
|
91
91
|
class EfuseDefineFields(EfuseFieldsBase):
|
|
92
|
-
def __init__(self) -> None:
|
|
92
|
+
def __init__(self, extend_efuse_table) -> None:
|
|
93
93
|
self.EFUSES = []
|
|
94
94
|
# if MAC_VERSION is set "1", these efuse fields are in BLOCK3:
|
|
95
95
|
self.CUSTOM_MAC = []
|
|
@@ -109,7 +109,7 @@ class EfuseDefineFields(EfuseFieldsBase):
|
|
|
109
109
|
efuse_file = os.path.join(dir_name, "efuse_defs", file_name)
|
|
110
110
|
with open(f"{efuse_file}", "r") as r_file:
|
|
111
111
|
e_desc = yaml.safe_load(r_file)
|
|
112
|
-
super().__init__(e_desc)
|
|
112
|
+
super().__init__(e_desc, extend_efuse_table)
|
|
113
113
|
|
|
114
114
|
for i, efuse in enumerate(self.ALL_EFUSES):
|
|
115
115
|
if efuse.name == "BLOCK1" or efuse.name == "BLOCK2":
|
|
@@ -21,7 +21,7 @@ class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
|
21
21
|
|
|
22
22
|
def __init__(self, efuse_file=None, debug=False):
|
|
23
23
|
self.Blocks = EfuseDefineBlocks
|
|
24
|
-
self.Fields = EfuseDefineFields()
|
|
24
|
+
self.Fields = EfuseDefineFields(None)
|
|
25
25
|
self.REGS = EfuseDefineRegisters
|
|
26
26
|
super(EmulateEfuseController, self).__init__(efuse_file, debug)
|
|
27
27
|
self.write_reg(self.REGS.EFUSE_CMD_REG, 0)
|