esptool 4.8.dev1__tar.gz → 4.8.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-4.8.dev1/esptool.egg-info → esptool-4.8.dev3}/PKG-INFO +17 -20
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esp_rfc2217_server.py +2 -2
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/__init__.py +13 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/base_fields.py +107 -8
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/base_operations.py +2 -1
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32/emulate_efuse_controller.py +5 -1
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32/fields.py +5 -1
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c2/fields.py +2 -3
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c2/operations.py +7 -12
- {esptool-4.8.dev1/espefuse/efuse/esp32c5beta3 → esptool-4.8.dev3/espefuse/efuse/esp32c3}/operations.py +14 -23
- esptool-4.8.dev3/espefuse/efuse/esp32c5/emulate_efuse_controller.py +92 -0
- esptool-4.8.dev3/espefuse/efuse/esp32c5/fields.py +457 -0
- {esptool-4.8.dev1/espefuse/efuse/esp32p4 → esptool-4.8.dev3/espefuse/efuse/esp32c5}/mem_definition.py +3 -3
- {esptool-4.8.dev1/espefuse/efuse/esp32c3 → esptool-4.8.dev3/espefuse/efuse/esp32c5}/operations.py +5 -39
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c5beta3/fields.py +6 -5
- esptool-4.8.dev3/espefuse/efuse/esp32c5beta3/operations.py +388 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c6/operations.py +17 -19
- esptool-4.8.dev3/espefuse/efuse/esp32c61/emulate_efuse_controller.py +92 -0
- esptool-4.8.dev3/espefuse/efuse/esp32c61/fields.py +459 -0
- esptool-4.8.dev3/espefuse/efuse/esp32c61/mem_definition.py +158 -0
- esptool-4.8.dev3/espefuse/efuse/esp32c61/operations.py +462 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2/operations.py +14 -17
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2beta1/fields.py +1 -1
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2beta1/operations.py +17 -30
- esptool-4.8.dev3/espefuse/efuse/esp32p4/mem_definition.py +158 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s2/operations.py +19 -30
- esptool-4.8.dev3/espefuse/efuse/esp32s3/__init__.py +3 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3/operations.py +20 -30
- esptool-4.8.dev3/espefuse/efuse/esp32s3beta2/__init__.py +3 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3beta2/operations.py +20 -30
- esptool-4.8.dev3/espefuse/efuse_defs/esp32c5.yaml +85 -0
- esptool-4.8.dev3/espefuse/efuse_defs/esp32c5beta3.yaml +85 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32c6.yaml +11 -5
- esptool-4.8.dev3/espefuse/efuse_defs/esp32c61.yaml +69 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32h2.yaml +16 -13
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32p4.yaml +33 -15
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espsecure/__init__.py +7 -3
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/__init__.py +68 -37
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/bin_image.py +55 -19
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/cmds.py +66 -42
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/loader.py +20 -8
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/reset.py +25 -7
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/__init__.py +4 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32.py +98 -24
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32c2.py +1 -1
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32c3.py +3 -0
- esptool-4.8.dev3/esptool/targets/esp32c5.py +96 -0
- esptool-4.8.dev3/esptool/targets/esp32c61.py +86 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32p4.py +16 -7
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32s2.py +9 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32s3.py +9 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp8266.py +6 -0
- esptool-4.8.dev3/esptool/targets/stub_flasher/stub_flasher_32c3.json +8 -0
- esptool-4.8.dev3/esptool/targets/stub_flasher/stub_flasher_32c5beta3.json +8 -0
- esptool-4.8.dev3/esptool/targets/stub_flasher/stub_flasher_32c6.json +8 -0
- esptool-4.8.dev3/esptool/targets/stub_flasher/stub_flasher_32h2.json +8 -0
- esptool-4.8.dev3/esptool/targets/stub_flasher/stub_flasher_32p4.json +8 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32s3.json +4 -4
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/util.py +20 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3/esptool.egg-info}/PKG-INFO +17 -20
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool.egg-info/SOURCES.txt +15 -1
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool.egg-info/requires.txt +1 -5
- esptool-4.8.dev3/setup.cfg +4 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/setup.py +1 -5
- esptool-4.8.dev1/esptool/targets/stub_flasher/stub_flasher_32c3.json +0 -8
- esptool-4.8.dev1/esptool/targets/stub_flasher/stub_flasher_32c5beta3.json +0 -8
- esptool-4.8.dev1/esptool/targets/stub_flasher/stub_flasher_32c6.json +0 -8
- esptool-4.8.dev1/esptool/targets/stub_flasher/stub_flasher_32h2.json +0 -8
- esptool-4.8.dev1/esptool/targets/stub_flasher/stub_flasher_32p4.json +0 -8
- esptool-4.8.dev1/setup.cfg +0 -23
- {esptool-4.8.dev1 → esptool-4.8.dev3}/LICENSE +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/MANIFEST.in +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/README.md +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/__main__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/__init__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/emulate_efuse_controller_base.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32/__init__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32/mem_definition.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32/operations.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c2/__init__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c2/emulate_efuse_controller.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c2/mem_definition.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c3/__init__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c3/emulate_efuse_controller.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c3/fields.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c3/mem_definition.py +0 -0
- {esptool-4.8.dev1/espefuse/efuse/esp32c5beta3 → esptool-4.8.dev3/espefuse/efuse/esp32c5}/__init__.py +0 -0
- {esptool-4.8.dev1/espefuse/efuse/esp32c6 → esptool-4.8.dev3/espefuse/efuse/esp32c5beta3}/__init__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c5beta3/emulate_efuse_controller.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c5beta3/mem_definition.py +0 -0
- {esptool-4.8.dev1/espefuse/efuse/esp32h2 → esptool-4.8.dev3/espefuse/efuse/esp32c6}/__init__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c6/emulate_efuse_controller.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c6/fields.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c6/mem_definition.py +0 -0
- {esptool-4.8.dev1/espefuse/efuse/esp32h2beta1 → esptool-4.8.dev3/espefuse/efuse/esp32c61}/__init__.py +0 -0
- {esptool-4.8.dev1/espefuse/efuse/esp32p4 → esptool-4.8.dev3/espefuse/efuse/esp32h2}/__init__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2/emulate_efuse_controller.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2/fields.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2/mem_definition.py +0 -0
- {esptool-4.8.dev1/espefuse/efuse/esp32s2 → esptool-4.8.dev3/espefuse/efuse/esp32h2beta1}/__init__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2beta1/emulate_efuse_controller.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2beta1/mem_definition.py +0 -0
- {esptool-4.8.dev1/espefuse/efuse/esp32s3 → esptool-4.8.dev3/espefuse/efuse/esp32p4}/__init__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32p4/emulate_efuse_controller.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32p4/fields.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32p4/operations.py +0 -0
- {esptool-4.8.dev1/espefuse/efuse/esp32s3beta2 → esptool-4.8.dev3/espefuse/efuse/esp32s2}/__init__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s2/emulate_efuse_controller.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s2/fields.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s2/mem_definition.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3/emulate_efuse_controller.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3/fields.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3/mem_definition.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3beta2/emulate_efuse_controller.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3beta2/fields.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3beta2/mem_definition.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/mem_definition_base.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/util.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32.yaml +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32c2.yaml +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32c3.yaml +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32s2.yaml +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32s3.yaml +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espsecure/__main__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espsecure/esp_hsm_sign/__init__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espsecure/esp_hsm_sign/exceptions.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/espsecure.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/__main__.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/config.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32c5beta3.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32c6.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32c6beta.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32h2.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32h2beta1.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32h2beta2.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32s3beta2.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32.json +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32c2.json +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32c6beta.json +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32h2beta1.json +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32h2beta2.json +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32s2.json +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32s3beta2.json +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_8266.json +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/uf2_writer.py +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool.egg-info/dependency_links.txt +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool.egg-info/top_level.txt +0 -0
- {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: esptool
|
|
3
|
-
Version: 4.8.
|
|
3
|
+
Version: 4.8.dev3
|
|
4
4
|
Summary: A serial utility to communicate & flash code to Espressif chips.
|
|
5
5
|
Home-page: https://github.com/espressif/esptool/
|
|
6
6
|
Author: Fredrik Ahlberg (themadinventor) & Angus Gratton (projectgus) & Espressif Systems
|
|
@@ -9,6 +9,22 @@ License: GPLv2+
|
|
|
9
9
|
Project-URL: Documentation, https://docs.espressif.com/projects/esptool/
|
|
10
10
|
Project-URL: Source, https://github.com/espressif/esptool/
|
|
11
11
|
Project-URL: Tracker, https://github.com/espressif/esptool/issues/
|
|
12
|
+
Description:
|
|
13
|
+
==========
|
|
14
|
+
esptool.py
|
|
15
|
+
==========
|
|
16
|
+
A Python-based, open-source, platform-independent utility to communicate with the ROM bootloader in Espressif chips.
|
|
17
|
+
|
|
18
|
+
The esptool.py project is `hosted on github <https://github.com/espressif/esptool>`_.
|
|
19
|
+
|
|
20
|
+
Documentation
|
|
21
|
+
-------------
|
|
22
|
+
Visit online `esptool documentation <https://docs.espressif.com/projects/esptool/>`_ or run ``esptool.py -h``.
|
|
23
|
+
|
|
24
|
+
Contributing
|
|
25
|
+
------------
|
|
26
|
+
Please see the `contributions guide <https://docs.espressif.com/projects/esptool/en/latest/contributing.html>`_.
|
|
27
|
+
|
|
12
28
|
Platform: UNKNOWN
|
|
13
29
|
Classifier: Development Status :: 5 - Production/Stable
|
|
14
30
|
Classifier: Intended Audience :: Developers
|
|
@@ -28,22 +44,3 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
28
44
|
Requires-Python: >=3.7
|
|
29
45
|
Provides-Extra: dev
|
|
30
46
|
Provides-Extra: hsm
|
|
31
|
-
License-File: LICENSE
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
==========
|
|
35
|
-
esptool.py
|
|
36
|
-
==========
|
|
37
|
-
A Python-based, open-source, platform-independent utility to communicate with the ROM bootloader in Espressif chips.
|
|
38
|
-
|
|
39
|
-
The esptool.py project is `hosted on github <https://github.com/espressif/esptool>`_.
|
|
40
|
-
|
|
41
|
-
Documentation
|
|
42
|
-
-------------
|
|
43
|
-
Visit online `esptool documentation <https://docs.espressif.com/projects/esptool/>`_ or run ``esptool.py -h``.
|
|
44
|
-
|
|
45
|
-
Contributing
|
|
46
|
-
------------
|
|
47
|
-
Please see the `contributions guide <https://docs.espressif.com/projects/esptool/en/latest/contributing.html>`_.
|
|
48
|
-
|
|
49
|
-
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
# This is a modified version of rfc2217_server.py provided by the pyserial package
|
|
10
10
|
# (pythonhosted.org/pyserial/examples.html#single-port-tcp-ip-serial-bridge-rfc-2217).
|
|
11
11
|
# It uses a custom PortManager to properly apply the RTS & DTR signals
|
|
12
|
-
# for
|
|
12
|
+
# for resetting ESP chips.
|
|
13
13
|
#
|
|
14
14
|
# Run the following command on the server side to make
|
|
15
15
|
# connection between /dev/ttyUSB1 and TCP port 4000:
|
|
@@ -256,7 +256,7 @@ def main():
|
|
|
256
256
|
logging.getLogger("rfc2217").setLevel(level)
|
|
257
257
|
|
|
258
258
|
# connect to serial port
|
|
259
|
-
ser = serial.serial_for_url(args.SERIALPORT, do_not_open=True)
|
|
259
|
+
ser = serial.serial_for_url(args.SERIALPORT, do_not_open=True, exclusive=True)
|
|
260
260
|
ser.timeout = 3 # required so that the reader thread can exit
|
|
261
261
|
# reset control line as no _remote_ "terminal" has been connected yet
|
|
262
262
|
ser.dtr = False
|
|
@@ -11,8 +11,10 @@ from io import StringIO
|
|
|
11
11
|
import espefuse.efuse.esp32 as esp32_efuse
|
|
12
12
|
import espefuse.efuse.esp32c2 as esp32c2_efuse
|
|
13
13
|
import espefuse.efuse.esp32c3 as esp32c3_efuse
|
|
14
|
+
import espefuse.efuse.esp32c5 as esp32c5_efuse
|
|
14
15
|
import espefuse.efuse.esp32c5beta3 as esp32c5beta3_efuse
|
|
15
16
|
import espefuse.efuse.esp32c6 as esp32c6_efuse
|
|
17
|
+
import espefuse.efuse.esp32c61 as esp32c61_efuse
|
|
16
18
|
import espefuse.efuse.esp32h2 as esp32h2_efuse
|
|
17
19
|
import espefuse.efuse.esp32h2beta1 as esp32h2beta1_efuse
|
|
18
20
|
import espefuse.efuse.esp32p4 as esp32p4_efuse
|
|
@@ -50,6 +52,8 @@ SUPPORTED_CHIPS = {
|
|
|
50
52
|
"esp32c2": DefChip("ESP32-C2", esp32c2_efuse, esptool.targets.ESP32C2ROM),
|
|
51
53
|
"esp32c3": DefChip("ESP32-C3", esp32c3_efuse, esptool.targets.ESP32C3ROM),
|
|
52
54
|
"esp32c6": DefChip("ESP32-C6", esp32c6_efuse, esptool.targets.ESP32C6ROM),
|
|
55
|
+
"esp32c61": DefChip("ESP32-C61", esp32c61_efuse, esptool.targets.ESP32C61ROM),
|
|
56
|
+
"esp32c5": DefChip("ESP32-C5", esp32c5_efuse, esptool.targets.ESP32C5ROM),
|
|
53
57
|
"esp32c5beta3": DefChip(
|
|
54
58
|
"ESP32-C5(beta3)", esp32c5beta3_efuse, esptool.targets.ESP32C5BETA3ROM
|
|
55
59
|
),
|
|
@@ -214,6 +218,12 @@ def main(custom_commandline=None, esp=None):
|
|
|
214
218
|
"Use with caution.",
|
|
215
219
|
action="store_true",
|
|
216
220
|
)
|
|
221
|
+
init_parser.add_argument(
|
|
222
|
+
"--postpone",
|
|
223
|
+
help="Postpone burning some efuses from BLOCK0 at the end, "
|
|
224
|
+
"(efuses which disable access to blocks or chip).",
|
|
225
|
+
action="store_true",
|
|
226
|
+
)
|
|
217
227
|
|
|
218
228
|
common_args, remaining_args = init_parser.parse_known_args(custom_commandline)
|
|
219
229
|
debug_mode = common_args.debug or ("dump" in remaining_args)
|
|
@@ -263,6 +273,8 @@ def main(custom_commandline=None, esp=None):
|
|
|
263
273
|
if there_are_multiple_burn_commands_in_args:
|
|
264
274
|
efuses.batch_mode_cnt += 1
|
|
265
275
|
|
|
276
|
+
efuses.postpone = common_args.postpone
|
|
277
|
+
|
|
266
278
|
try:
|
|
267
279
|
for rem_args in grouped_remaining_args:
|
|
268
280
|
args, unused_args = parser.parse_known_args(rem_args, namespace=common_args)
|
|
@@ -289,6 +301,7 @@ def main(custom_commandline=None, esp=None):
|
|
|
289
301
|
efuses.batch_mode_cnt -= 1
|
|
290
302
|
if not efuses.burn_all(check_batch_mode=True):
|
|
291
303
|
raise esptool.FatalError("BURN was not done")
|
|
304
|
+
print("Successful")
|
|
292
305
|
finally:
|
|
293
306
|
if not external_esp and not common_args.virt and esp._port:
|
|
294
307
|
esp._port.close()
|
|
@@ -58,8 +58,9 @@ class CheckArgValue(object):
|
|
|
58
58
|
elif efuse.efuse_type.startswith("bytes"):
|
|
59
59
|
if new_value is None:
|
|
60
60
|
raise esptool.FatalError(
|
|
61
|
-
"New value required for efuse '{}' "
|
|
62
|
-
|
|
61
|
+
"New value required for efuse '{}' (given None)".format(
|
|
62
|
+
efuse.name
|
|
63
|
+
)
|
|
63
64
|
)
|
|
64
65
|
if len(new_value) * 8 != efuse.bitarray.len:
|
|
65
66
|
raise esptool.FatalError(
|
|
@@ -316,7 +317,7 @@ class EfuseBlockBase(EfuseProtectBase):
|
|
|
316
317
|
if rd_chunk == wr_chunk:
|
|
317
318
|
print(
|
|
318
319
|
"wr_chunk == rd_chunk. "
|
|
319
|
-
"
|
|
320
|
+
"Continue with empty chunk."
|
|
320
321
|
)
|
|
321
322
|
wr_data[i : i + 6 * 8 :].set(0)
|
|
322
323
|
else:
|
|
@@ -445,6 +446,7 @@ class EspEfusesBase(object):
|
|
|
445
446
|
coding_scheme = None
|
|
446
447
|
force_write_always = None
|
|
447
448
|
batch_mode_cnt = 0
|
|
449
|
+
postpone = False
|
|
448
450
|
|
|
449
451
|
def __iter__(self):
|
|
450
452
|
return self.efuses.__iter__()
|
|
@@ -489,6 +491,59 @@ class EspEfusesBase(object):
|
|
|
489
491
|
for efuse in self.efuses:
|
|
490
492
|
efuse.update(self.blocks[efuse.block].bitarray)
|
|
491
493
|
|
|
494
|
+
def postpone_efuses_from_block0_to_burn(self, block):
|
|
495
|
+
postpone_efuses = {}
|
|
496
|
+
|
|
497
|
+
if block.id != 0:
|
|
498
|
+
return postpone_efuses
|
|
499
|
+
|
|
500
|
+
# We need to check this list of efuses. If we are going to burn an efuse
|
|
501
|
+
# from this list, then we need to split the burn operation into two
|
|
502
|
+
# steps. The first step involves burning efuses not in this list. In
|
|
503
|
+
# case of an error during this step, we can recover by burning the
|
|
504
|
+
# efuses from this list at the very end. This approach provides the
|
|
505
|
+
# ability to recover efuses if an error occurs during the initial burn
|
|
506
|
+
# operation.
|
|
507
|
+
|
|
508
|
+
# List the efuses here that must be burned at the very end, such as read
|
|
509
|
+
# and write protection fields, as well as efuses that disable
|
|
510
|
+
# communication with the espefuse tool.
|
|
511
|
+
efuses_list = ["WR_DIS", "RD_DIS"]
|
|
512
|
+
if self._esp.CHIP_NAME == "ESP32":
|
|
513
|
+
# Efuses below disables communication with the espefuse tool.
|
|
514
|
+
efuses_list.append("UART_DOWNLOAD_DIS")
|
|
515
|
+
# other efuses that are better to burn at the very end.
|
|
516
|
+
efuses_list.append("ABS_DONE_1")
|
|
517
|
+
efuses_list.append("FLASH_CRYPT_CNT")
|
|
518
|
+
else:
|
|
519
|
+
# Efuses below disables communication with the espefuse tool.
|
|
520
|
+
efuses_list.append("ENABLE_SECURITY_DOWNLOAD")
|
|
521
|
+
efuses_list.append("DIS_DOWNLOAD_MODE")
|
|
522
|
+
# other efuses that are better to burn at the very end.
|
|
523
|
+
efuses_list.append("SPI_BOOT_CRYPT_CNT")
|
|
524
|
+
efuses_list.append("SECURE_BOOT_EN")
|
|
525
|
+
|
|
526
|
+
def get_raw_value_from_write(self, efuse_name):
|
|
527
|
+
return self[efuse_name].get_bitstring(from_read=False)
|
|
528
|
+
|
|
529
|
+
for efuse_name in efuses_list:
|
|
530
|
+
postpone_efuses[efuse_name] = get_raw_value_from_write(self, efuse_name)
|
|
531
|
+
|
|
532
|
+
if any(value != 0 for value in postpone_efuses.values()):
|
|
533
|
+
if self.debug:
|
|
534
|
+
print("These BLOCK0 efuses will be burned later at the very end:")
|
|
535
|
+
print(postpone_efuses)
|
|
536
|
+
# exclude these efuses from the first burn (postpone them till the end).
|
|
537
|
+
for key_name in postpone_efuses.keys():
|
|
538
|
+
self[key_name].reset()
|
|
539
|
+
return postpone_efuses
|
|
540
|
+
|
|
541
|
+
def recover_postponed_efuses_from_block0_to_burn(self, postpone_efuses):
|
|
542
|
+
if any(value != 0 for value in postpone_efuses.values()):
|
|
543
|
+
print("Burn postponed efuses from BLOCK0.")
|
|
544
|
+
for key_name in postpone_efuses.keys():
|
|
545
|
+
self[key_name].save(postpone_efuses[key_name])
|
|
546
|
+
|
|
492
547
|
def burn_all(self, check_batch_mode=False):
|
|
493
548
|
if check_batch_mode:
|
|
494
549
|
if self.batch_mode_cnt != 0:
|
|
@@ -508,18 +563,44 @@ class EspEfusesBase(object):
|
|
|
508
563
|
have_wr_data_for_burn = True
|
|
509
564
|
if not have_wr_data_for_burn:
|
|
510
565
|
print("Nothing to burn, see messages above.")
|
|
511
|
-
return
|
|
566
|
+
return True
|
|
512
567
|
EspEfusesBase.confirm("", self.do_not_confirm)
|
|
513
568
|
|
|
514
|
-
|
|
515
|
-
for block in reversed(self.blocks):
|
|
569
|
+
def burn_block(block, postponed_efuses):
|
|
516
570
|
old_fail = block.fail
|
|
517
571
|
old_num_errors = block.num_errors
|
|
518
572
|
block.burn()
|
|
519
573
|
if (block.fail and old_fail != block.fail) or (
|
|
520
574
|
block.num_errors and block.num_errors > old_num_errors
|
|
521
575
|
):
|
|
576
|
+
if postponed_efuses:
|
|
577
|
+
print("The postponed efuses were not burned due to an error.")
|
|
578
|
+
print("\t1. Try to fix a coding error by this cmd:")
|
|
579
|
+
print("\t 'espefuse.py check_error --recovery'")
|
|
580
|
+
command_string = " ".join(
|
|
581
|
+
f"{key} {value}"
|
|
582
|
+
for key, value in postponed_efuses.items()
|
|
583
|
+
if value.any(True)
|
|
584
|
+
)
|
|
585
|
+
print("\t2. Then run the cmd to burn all postponed efuses:")
|
|
586
|
+
print(f"\t 'espefuse.py burn_efuse {command_string}'")
|
|
587
|
+
|
|
522
588
|
raise esptool.FatalError("Error(s) were detected in eFuses")
|
|
589
|
+
|
|
590
|
+
# Burn from BLKn -> BLK0. Because BLK0 can set rd or/and wr protection bits.
|
|
591
|
+
for block in reversed(self.blocks):
|
|
592
|
+
postponed_efuses = (
|
|
593
|
+
self.postpone_efuses_from_block0_to_burn(block)
|
|
594
|
+
if self.postpone
|
|
595
|
+
else None
|
|
596
|
+
)
|
|
597
|
+
|
|
598
|
+
burn_block(block, postponed_efuses)
|
|
599
|
+
|
|
600
|
+
if postponed_efuses:
|
|
601
|
+
self.recover_postponed_efuses_from_block0_to_burn(postponed_efuses)
|
|
602
|
+
burn_block(block, postponed_efuses)
|
|
603
|
+
|
|
523
604
|
print("Reading updated efuses...")
|
|
524
605
|
self.read_coding_scheme()
|
|
525
606
|
self.read_blocks()
|
|
@@ -628,6 +709,10 @@ class EfuseFieldBase(EfuseProtectBase):
|
|
|
628
709
|
|
|
629
710
|
def check_new_value(self, bitarray_new_value):
|
|
630
711
|
bitarray_old_value = self.get_bitstring() | self.get_bitstring(from_read=False)
|
|
712
|
+
|
|
713
|
+
if not bitarray_new_value.any(True) and not bitarray_old_value.any(True):
|
|
714
|
+
return
|
|
715
|
+
|
|
631
716
|
if bitarray_new_value.len != bitarray_old_value.len:
|
|
632
717
|
raise esptool.FatalError(
|
|
633
718
|
"For {} efuse, the length of the new value is wrong, "
|
|
@@ -635,7 +720,10 @@ class EfuseFieldBase(EfuseProtectBase):
|
|
|
635
720
|
self.name, bitarray_old_value.len, bitarray_new_value.len
|
|
636
721
|
)
|
|
637
722
|
)
|
|
638
|
-
if
|
|
723
|
+
if (
|
|
724
|
+
bitarray_new_value == bitarray_old_value
|
|
725
|
+
or bitarray_new_value & self.get_bitstring() == bitarray_new_value
|
|
726
|
+
):
|
|
639
727
|
error_msg = "\tThe same value for {} ".format(self.name)
|
|
640
728
|
error_msg += "is already burned. Do not change the efuse."
|
|
641
729
|
print(error_msg)
|
|
@@ -648,7 +736,7 @@ class EfuseFieldBase(EfuseProtectBase):
|
|
|
648
736
|
else:
|
|
649
737
|
if self.name not in ["WR_DIS", "RD_DIS"]:
|
|
650
738
|
# WR_DIS, RD_DIS fields can have already set bits.
|
|
651
|
-
# Do not
|
|
739
|
+
# Do not need to check below condition for them.
|
|
652
740
|
if bitarray_new_value | bitarray_old_value != bitarray_new_value:
|
|
653
741
|
error_msg = "\tNew value contains some bits that cannot be cleared "
|
|
654
742
|
error_msg += "(value will be {})".format(
|
|
@@ -752,3 +840,14 @@ class EfuseFieldBase(EfuseProtectBase):
|
|
|
752
840
|
if name is not None:
|
|
753
841
|
output += f"\n Purpose: {self.parent[name].get()}\n "
|
|
754
842
|
return output
|
|
843
|
+
|
|
844
|
+
def reset(self):
|
|
845
|
+
# resets a efuse that is prepared for burning
|
|
846
|
+
bitarray_field = self.convert_to_bitstring(0)
|
|
847
|
+
block = self.parent.blocks[self.block]
|
|
848
|
+
wr_bitarray_temp = block.wr_bitarray.copy()
|
|
849
|
+
position = wr_bitarray_temp.length - (
|
|
850
|
+
self.word * 32 + self.pos + bitarray_field.len
|
|
851
|
+
)
|
|
852
|
+
wr_bitarray_temp.overwrite(bitarray_field, pos=position)
|
|
853
|
+
block.wr_bitarray = wr_bitarray_temp
|
|
@@ -684,7 +684,8 @@ def burn_bit(esp, efuses, args):
|
|
|
684
684
|
|
|
685
685
|
|
|
686
686
|
def get_error_summary(efuses):
|
|
687
|
-
|
|
687
|
+
efuses.get_coding_scheme_warnings()
|
|
688
|
+
error_in_blocks = any(blk.fail or blk.num_errors != 0 for blk in efuses.blocks)
|
|
688
689
|
if not error_in_blocks:
|
|
689
690
|
return False
|
|
690
691
|
writable = True
|
|
@@ -75,10 +75,14 @@ class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
|
75
75
|
self.save_to_file()
|
|
76
76
|
|
|
77
77
|
def read_raw_coding_scheme(self):
|
|
78
|
-
|
|
78
|
+
coding_scheme = (
|
|
79
79
|
self.read_efuse(self.REGS.EFUSE_CODING_SCHEME_WORD)
|
|
80
80
|
& self.REGS.EFUSE_CODING_SCHEME_MASK
|
|
81
81
|
)
|
|
82
|
+
if coding_scheme == self.REGS.CODING_SCHEME_NONE_RECOVERY:
|
|
83
|
+
return self.REGS.CODING_SCHEME_NONE
|
|
84
|
+
else:
|
|
85
|
+
return coding_scheme
|
|
82
86
|
|
|
83
87
|
def write_raw_coding_scheme(self, value):
|
|
84
88
|
self.write_efuse(
|
|
@@ -157,10 +157,14 @@ class EspEfuses(base_fields.EspEfusesBase):
|
|
|
157
157
|
raise KeyError
|
|
158
158
|
|
|
159
159
|
def read_coding_scheme(self):
|
|
160
|
-
|
|
160
|
+
coding_scheme = (
|
|
161
161
|
self.read_efuse(self.REGS.EFUSE_CODING_SCHEME_WORD)
|
|
162
162
|
& self.REGS.EFUSE_CODING_SCHEME_MASK
|
|
163
163
|
)
|
|
164
|
+
if coding_scheme == self.REGS.CODING_SCHEME_NONE_RECOVERY:
|
|
165
|
+
self.coding_scheme = self.REGS.CODING_SCHEME_NONE
|
|
166
|
+
else:
|
|
167
|
+
self.coding_scheme = coding_scheme
|
|
164
168
|
|
|
165
169
|
def print_status_regs(self):
|
|
166
170
|
print("")
|
|
@@ -368,15 +368,14 @@ class EfuseMacField(EfuseField):
|
|
|
368
368
|
|
|
369
369
|
|
|
370
370
|
class EfuseKeyPurposeField(EfuseField):
|
|
371
|
+
# fmt: off
|
|
371
372
|
KEY_PURPOSES = [
|
|
372
|
-
# fmt: off
|
|
373
373
|
("USER", 0, None), # User purposes (software-only use)
|
|
374
374
|
("XTS_AES_128_KEY", 1, None), # (whole 256bits) flash/PSRAM encryption
|
|
375
375
|
("XTS_AES_128_KEY_DERIVED_FROM_128_EFUSE_BITS", 2, None), # (lo 128bits) flash/PSRAM encryption
|
|
376
376
|
("SECURE_BOOT_DIGEST", 3, "DIGEST"),
|
|
377
377
|
# (hi 128bits) Secure Boot key digest
|
|
378
|
-
|
|
379
|
-
]
|
|
378
|
+
] # fmt: on
|
|
380
379
|
|
|
381
380
|
KEY_PURPOSES_NAME = [name[0] for name in KEY_PURPOSES]
|
|
382
381
|
DIGEST_KEY_PURPOSES = [name[0] for name in KEY_PURPOSES if name[2] == "DIGEST"]
|
|
@@ -153,18 +153,13 @@ def adc_info(esp, efuses, args):
|
|
|
153
153
|
print("")
|
|
154
154
|
# fmt: off
|
|
155
155
|
if efuses["BLK_VERSION_MINOR"].get() == 1:
|
|
156
|
-
print("
|
|
157
|
-
|
|
158
|
-
print("
|
|
159
|
-
print("
|
|
160
|
-
|
|
161
|
-
print("
|
|
162
|
-
print("
|
|
163
|
-
|
|
164
|
-
print(" ADC_CALIBRATION_0: {}".format(efuses["ADC_CALIBRATION_0"].get()))
|
|
165
|
-
print(" ADC_CALIBRATION_1: {}".format(efuses["ADC_CALIBRATION_1"].get()))
|
|
166
|
-
print(" ADC_CALIBRATION_2: {}".format(efuses["ADC_CALIBRATION_2"].get()))
|
|
167
|
-
|
|
156
|
+
print("Temperature Sensor Calibration = {}C".format(efuses["TEMP_CALIB"].get()))
|
|
157
|
+
print("ADC OCode = ", efuses["OCODE"].get())
|
|
158
|
+
print("ADC1:")
|
|
159
|
+
print("INIT_CODE_ATTEN0 = ", efuses["ADC1_INIT_CODE_ATTEN0"].get())
|
|
160
|
+
print("INIT_CODE_ATTEN3 = ", efuses["ADC1_INIT_CODE_ATTEN3"].get())
|
|
161
|
+
print("CAL_VOL_ATTEN0 = ", efuses["ADC1_CAL_VOL_ATTEN0"].get())
|
|
162
|
+
print("CAL_VOL_ATTEN3 = ", efuses["ADC1_CAL_VOL_ATTEN3"].get())
|
|
168
163
|
else:
|
|
169
164
|
print("BLK_VERSION_MINOR = {}".format(efuses["BLK_VERSION_MINOR"].get_meaning()))
|
|
170
165
|
# fmt: on
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# This file includes the operations with eFuses for ESP32-
|
|
1
|
+
# This file includes the operations with eFuses for ESP32-C3 chip
|
|
2
2
|
#
|
|
3
|
-
# SPDX-FileCopyrightText:
|
|
3
|
+
# SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD
|
|
4
4
|
#
|
|
5
5
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
6
6
|
|
|
@@ -194,29 +194,20 @@ def set_flash_voltage(esp, efuses, args):
|
|
|
194
194
|
def adc_info(esp, efuses, args):
|
|
195
195
|
print("")
|
|
196
196
|
# fmt: off
|
|
197
|
-
if efuses["
|
|
197
|
+
if efuses["BLK_VERSION_MAJOR"].get() == 1:
|
|
198
198
|
print("Temperature Sensor Calibration = {}C".format(efuses["TEMP_CALIB"].get()))
|
|
199
|
-
|
|
200
|
-
print("")
|
|
201
|
-
print("
|
|
202
|
-
print(
|
|
203
|
-
print(
|
|
204
|
-
print(
|
|
205
|
-
print(
|
|
206
|
-
print(
|
|
207
|
-
print(
|
|
208
|
-
print(
|
|
209
|
-
print(f"CAL_VOL_ATTEN2: {efuses['ADC1_CAL_VOL_ATTEN2'].get()}")
|
|
210
|
-
print(f"CAL_VOL_ATTEN3: {efuses['ADC1_CAL_VOL_ATTEN3'].get()}")
|
|
211
|
-
print(f"INIT_CODE_ATTEN0_CH0: {efuses['ADC1_INIT_CODE_ATTEN0_CH0'].get()}")
|
|
212
|
-
print(f"INIT_CODE_ATTEN0_CH1: {efuses['ADC1_INIT_CODE_ATTEN0_CH1'].get()}")
|
|
213
|
-
print(f"INIT_CODE_ATTEN0_CH2: {efuses['ADC1_INIT_CODE_ATTEN0_CH2'].get()}")
|
|
214
|
-
print(f"INIT_CODE_ATTEN0_CH3: {efuses['ADC1_INIT_CODE_ATTEN0_CH3'].get()}")
|
|
215
|
-
print(f"INIT_CODE_ATTEN0_CH4: {efuses['ADC1_INIT_CODE_ATTEN0_CH4'].get()}")
|
|
216
|
-
print(f"INIT_CODE_ATTEN0_CH5: {efuses['ADC1_INIT_CODE_ATTEN0_CH5'].get()}")
|
|
217
|
-
print(f"INIT_CODE_ATTEN0_CH6: {efuses['ADC1_INIT_CODE_ATTEN0_CH6'].get()}")
|
|
199
|
+
print("ADC OCode = ", efuses["OCODE"].get())
|
|
200
|
+
print("ADC1:")
|
|
201
|
+
print("INIT_CODE_ATTEN0 = ", efuses["ADC1_INIT_CODE_ATTEN0"].get())
|
|
202
|
+
print("INIT_CODE_ATTEN1 = ", efuses["ADC1_INIT_CODE_ATTEN1"].get())
|
|
203
|
+
print("INIT_CODE_ATTEN2 = ", efuses["ADC1_INIT_CODE_ATTEN2"].get())
|
|
204
|
+
print("INIT_CODE_ATTEN3 = ", efuses["ADC1_INIT_CODE_ATTEN3"].get())
|
|
205
|
+
print("CAL_VOL_ATTEN0 = ", efuses["ADC1_CAL_VOL_ATTEN0"].get())
|
|
206
|
+
print("CAL_VOL_ATTEN1 = ", efuses["ADC1_CAL_VOL_ATTEN1"].get())
|
|
207
|
+
print("CAL_VOL_ATTEN2 = ", efuses["ADC1_CAL_VOL_ATTEN2"].get())
|
|
208
|
+
print("CAL_VOL_ATTEN3 = ", efuses["ADC1_CAL_VOL_ATTEN3"].get())
|
|
218
209
|
else:
|
|
219
|
-
print("
|
|
210
|
+
print("BLK_VERSION_MAJOR = {}".format(efuses["BLK_VERSION_MAJOR"].get_meaning()))
|
|
220
211
|
# fmt: on
|
|
221
212
|
|
|
222
213
|
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# This file describes eFuses controller for ESP32-C5 chip
|
|
2
|
+
#
|
|
3
|
+
# SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
|
|
4
|
+
#
|
|
5
|
+
# SPDX-License-Identifier: GPL-2.0-or-later
|
|
6
|
+
|
|
7
|
+
import reedsolo
|
|
8
|
+
|
|
9
|
+
from .mem_definition import EfuseDefineBlocks, EfuseDefineFields, EfuseDefineRegisters
|
|
10
|
+
from ..emulate_efuse_controller_base import EmulateEfuseControllerBase, FatalError
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class EmulateEfuseController(EmulateEfuseControllerBase):
|
|
14
|
+
"""The class for virtual efuse operation. Using for HOST_TEST."""
|
|
15
|
+
|
|
16
|
+
CHIP_NAME = "ESP32-C5"
|
|
17
|
+
mem = None
|
|
18
|
+
debug = False
|
|
19
|
+
|
|
20
|
+
def __init__(self, efuse_file=None, debug=False):
|
|
21
|
+
self.Blocks = EfuseDefineBlocks
|
|
22
|
+
self.Fields = EfuseDefineFields()
|
|
23
|
+
self.REGS = EfuseDefineRegisters
|
|
24
|
+
super(EmulateEfuseController, self).__init__(efuse_file, debug)
|
|
25
|
+
self.write_reg(self.REGS.EFUSE_CMD_REG, 0)
|
|
26
|
+
|
|
27
|
+
""" esptool method start >>"""
|
|
28
|
+
|
|
29
|
+
def get_major_chip_version(self):
|
|
30
|
+
return 0
|
|
31
|
+
|
|
32
|
+
def get_minor_chip_version(self):
|
|
33
|
+
return 0
|
|
34
|
+
|
|
35
|
+
def get_crystal_freq(self):
|
|
36
|
+
return 40 # MHz (common for all chips)
|
|
37
|
+
|
|
38
|
+
def get_security_info(self):
|
|
39
|
+
return {
|
|
40
|
+
"flags": 0,
|
|
41
|
+
"flash_crypt_cnt": 0,
|
|
42
|
+
"key_purposes": 0,
|
|
43
|
+
"chip_id": 0,
|
|
44
|
+
"api_version": 0,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
""" << esptool method end """
|
|
48
|
+
|
|
49
|
+
def handle_writing_event(self, addr, value):
|
|
50
|
+
if addr == self.REGS.EFUSE_CMD_REG:
|
|
51
|
+
if value & self.REGS.EFUSE_PGM_CMD:
|
|
52
|
+
self.copy_blocks_wr_regs_to_rd_regs(updated_block=(value >> 2) & 0xF)
|
|
53
|
+
self.clean_blocks_wr_regs()
|
|
54
|
+
self.check_rd_protection_area()
|
|
55
|
+
self.write_reg(addr, 0)
|
|
56
|
+
self.write_reg(self.REGS.EFUSE_CMD_REG, 0)
|
|
57
|
+
elif value == self.REGS.EFUSE_READ_CMD:
|
|
58
|
+
self.write_reg(addr, 0)
|
|
59
|
+
self.write_reg(self.REGS.EFUSE_CMD_REG, 0)
|
|
60
|
+
self.save_to_file()
|
|
61
|
+
|
|
62
|
+
def get_bitlen_of_block(self, blk, wr=False):
|
|
63
|
+
if blk.id == 0:
|
|
64
|
+
if wr:
|
|
65
|
+
return 32 * 8
|
|
66
|
+
else:
|
|
67
|
+
return 32 * blk.len
|
|
68
|
+
else:
|
|
69
|
+
if wr:
|
|
70
|
+
rs_coding = 32 * 3
|
|
71
|
+
return 32 * 8 + rs_coding
|
|
72
|
+
else:
|
|
73
|
+
return 32 * blk.len
|
|
74
|
+
|
|
75
|
+
def handle_coding_scheme(self, blk, data):
|
|
76
|
+
if blk.id != 0:
|
|
77
|
+
# CODING_SCHEME RS applied only for all blocks except BLK0.
|
|
78
|
+
coded_bytes = 12
|
|
79
|
+
data.pos = coded_bytes * 8
|
|
80
|
+
plain_data = data.readlist("32*uint:8")[::-1]
|
|
81
|
+
# takes 32 bytes
|
|
82
|
+
# apply RS encoding
|
|
83
|
+
rs = reedsolo.RSCodec(coded_bytes)
|
|
84
|
+
# 32 byte of data + 12 bytes RS
|
|
85
|
+
calc_encoded_data = list(rs.encode([x for x in plain_data]))
|
|
86
|
+
data.pos = 0
|
|
87
|
+
if calc_encoded_data != data.readlist("44*uint:8")[::-1]:
|
|
88
|
+
raise FatalError("Error in coding scheme data")
|
|
89
|
+
data = data[coded_bytes * 8 :]
|
|
90
|
+
if blk.len < 8:
|
|
91
|
+
data = data[(8 - blk.len) * 32 :]
|
|
92
|
+
return data
|