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.
Files changed (149) hide show
  1. {esptool-4.8.dev1/esptool.egg-info → esptool-4.8.dev3}/PKG-INFO +17 -20
  2. {esptool-4.8.dev1 → esptool-4.8.dev3}/esp_rfc2217_server.py +2 -2
  3. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/__init__.py +13 -0
  4. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/base_fields.py +107 -8
  5. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/base_operations.py +2 -1
  6. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32/emulate_efuse_controller.py +5 -1
  7. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32/fields.py +5 -1
  8. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c2/fields.py +2 -3
  9. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c2/operations.py +7 -12
  10. {esptool-4.8.dev1/espefuse/efuse/esp32c5beta3 → esptool-4.8.dev3/espefuse/efuse/esp32c3}/operations.py +14 -23
  11. esptool-4.8.dev3/espefuse/efuse/esp32c5/emulate_efuse_controller.py +92 -0
  12. esptool-4.8.dev3/espefuse/efuse/esp32c5/fields.py +457 -0
  13. {esptool-4.8.dev1/espefuse/efuse/esp32p4 → esptool-4.8.dev3/espefuse/efuse/esp32c5}/mem_definition.py +3 -3
  14. {esptool-4.8.dev1/espefuse/efuse/esp32c3 → esptool-4.8.dev3/espefuse/efuse/esp32c5}/operations.py +5 -39
  15. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c5beta3/fields.py +6 -5
  16. esptool-4.8.dev3/espefuse/efuse/esp32c5beta3/operations.py +388 -0
  17. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c6/operations.py +17 -19
  18. esptool-4.8.dev3/espefuse/efuse/esp32c61/emulate_efuse_controller.py +92 -0
  19. esptool-4.8.dev3/espefuse/efuse/esp32c61/fields.py +459 -0
  20. esptool-4.8.dev3/espefuse/efuse/esp32c61/mem_definition.py +158 -0
  21. esptool-4.8.dev3/espefuse/efuse/esp32c61/operations.py +462 -0
  22. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2/operations.py +14 -17
  23. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2beta1/fields.py +1 -1
  24. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2beta1/operations.py +17 -30
  25. esptool-4.8.dev3/espefuse/efuse/esp32p4/mem_definition.py +158 -0
  26. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s2/operations.py +19 -30
  27. esptool-4.8.dev3/espefuse/efuse/esp32s3/__init__.py +3 -0
  28. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3/operations.py +20 -30
  29. esptool-4.8.dev3/espefuse/efuse/esp32s3beta2/__init__.py +3 -0
  30. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3beta2/operations.py +20 -30
  31. esptool-4.8.dev3/espefuse/efuse_defs/esp32c5.yaml +85 -0
  32. esptool-4.8.dev3/espefuse/efuse_defs/esp32c5beta3.yaml +85 -0
  33. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32c6.yaml +11 -5
  34. esptool-4.8.dev3/espefuse/efuse_defs/esp32c61.yaml +69 -0
  35. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32h2.yaml +16 -13
  36. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32p4.yaml +33 -15
  37. {esptool-4.8.dev1 → esptool-4.8.dev3}/espsecure/__init__.py +7 -3
  38. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/__init__.py +68 -37
  39. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/bin_image.py +55 -19
  40. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/cmds.py +66 -42
  41. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/loader.py +20 -8
  42. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/reset.py +25 -7
  43. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/__init__.py +4 -0
  44. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32.py +98 -24
  45. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32c2.py +1 -1
  46. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32c3.py +3 -0
  47. esptool-4.8.dev3/esptool/targets/esp32c5.py +96 -0
  48. esptool-4.8.dev3/esptool/targets/esp32c61.py +86 -0
  49. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32p4.py +16 -7
  50. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32s2.py +9 -0
  51. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32s3.py +9 -0
  52. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp8266.py +6 -0
  53. esptool-4.8.dev3/esptool/targets/stub_flasher/stub_flasher_32c3.json +8 -0
  54. esptool-4.8.dev3/esptool/targets/stub_flasher/stub_flasher_32c5beta3.json +8 -0
  55. esptool-4.8.dev3/esptool/targets/stub_flasher/stub_flasher_32c6.json +8 -0
  56. esptool-4.8.dev3/esptool/targets/stub_flasher/stub_flasher_32h2.json +8 -0
  57. esptool-4.8.dev3/esptool/targets/stub_flasher/stub_flasher_32p4.json +8 -0
  58. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32s3.json +4 -4
  59. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/util.py +20 -0
  60. {esptool-4.8.dev1 → esptool-4.8.dev3/esptool.egg-info}/PKG-INFO +17 -20
  61. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool.egg-info/SOURCES.txt +15 -1
  62. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool.egg-info/requires.txt +1 -5
  63. esptool-4.8.dev3/setup.cfg +4 -0
  64. {esptool-4.8.dev1 → esptool-4.8.dev3}/setup.py +1 -5
  65. esptool-4.8.dev1/esptool/targets/stub_flasher/stub_flasher_32c3.json +0 -8
  66. esptool-4.8.dev1/esptool/targets/stub_flasher/stub_flasher_32c5beta3.json +0 -8
  67. esptool-4.8.dev1/esptool/targets/stub_flasher/stub_flasher_32c6.json +0 -8
  68. esptool-4.8.dev1/esptool/targets/stub_flasher/stub_flasher_32h2.json +0 -8
  69. esptool-4.8.dev1/esptool/targets/stub_flasher/stub_flasher_32p4.json +0 -8
  70. esptool-4.8.dev1/setup.cfg +0 -23
  71. {esptool-4.8.dev1 → esptool-4.8.dev3}/LICENSE +0 -0
  72. {esptool-4.8.dev1 → esptool-4.8.dev3}/MANIFEST.in +0 -0
  73. {esptool-4.8.dev1 → esptool-4.8.dev3}/README.md +0 -0
  74. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/__main__.py +0 -0
  75. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/__init__.py +0 -0
  76. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/emulate_efuse_controller_base.py +0 -0
  77. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32/__init__.py +0 -0
  78. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32/mem_definition.py +0 -0
  79. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32/operations.py +0 -0
  80. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c2/__init__.py +0 -0
  81. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c2/emulate_efuse_controller.py +0 -0
  82. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c2/mem_definition.py +0 -0
  83. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c3/__init__.py +0 -0
  84. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c3/emulate_efuse_controller.py +0 -0
  85. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c3/fields.py +0 -0
  86. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c3/mem_definition.py +0 -0
  87. {esptool-4.8.dev1/espefuse/efuse/esp32c5beta3 → esptool-4.8.dev3/espefuse/efuse/esp32c5}/__init__.py +0 -0
  88. {esptool-4.8.dev1/espefuse/efuse/esp32c6 → esptool-4.8.dev3/espefuse/efuse/esp32c5beta3}/__init__.py +0 -0
  89. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c5beta3/emulate_efuse_controller.py +0 -0
  90. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c5beta3/mem_definition.py +0 -0
  91. {esptool-4.8.dev1/espefuse/efuse/esp32h2 → esptool-4.8.dev3/espefuse/efuse/esp32c6}/__init__.py +0 -0
  92. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c6/emulate_efuse_controller.py +0 -0
  93. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c6/fields.py +0 -0
  94. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32c6/mem_definition.py +0 -0
  95. {esptool-4.8.dev1/espefuse/efuse/esp32h2beta1 → esptool-4.8.dev3/espefuse/efuse/esp32c61}/__init__.py +0 -0
  96. {esptool-4.8.dev1/espefuse/efuse/esp32p4 → esptool-4.8.dev3/espefuse/efuse/esp32h2}/__init__.py +0 -0
  97. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2/emulate_efuse_controller.py +0 -0
  98. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2/fields.py +0 -0
  99. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2/mem_definition.py +0 -0
  100. {esptool-4.8.dev1/espefuse/efuse/esp32s2 → esptool-4.8.dev3/espefuse/efuse/esp32h2beta1}/__init__.py +0 -0
  101. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2beta1/emulate_efuse_controller.py +0 -0
  102. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32h2beta1/mem_definition.py +0 -0
  103. {esptool-4.8.dev1/espefuse/efuse/esp32s3 → esptool-4.8.dev3/espefuse/efuse/esp32p4}/__init__.py +0 -0
  104. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32p4/emulate_efuse_controller.py +0 -0
  105. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32p4/fields.py +0 -0
  106. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32p4/operations.py +0 -0
  107. {esptool-4.8.dev1/espefuse/efuse/esp32s3beta2 → esptool-4.8.dev3/espefuse/efuse/esp32s2}/__init__.py +0 -0
  108. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s2/emulate_efuse_controller.py +0 -0
  109. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s2/fields.py +0 -0
  110. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s2/mem_definition.py +0 -0
  111. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3/emulate_efuse_controller.py +0 -0
  112. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3/fields.py +0 -0
  113. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3/mem_definition.py +0 -0
  114. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3beta2/emulate_efuse_controller.py +0 -0
  115. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3beta2/fields.py +0 -0
  116. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/esp32s3beta2/mem_definition.py +0 -0
  117. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/mem_definition_base.py +0 -0
  118. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse/util.py +0 -0
  119. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32.yaml +0 -0
  120. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32c2.yaml +0 -0
  121. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32c3.yaml +0 -0
  122. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32s2.yaml +0 -0
  123. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse/efuse_defs/esp32s3.yaml +0 -0
  124. {esptool-4.8.dev1 → esptool-4.8.dev3}/espefuse.py +0 -0
  125. {esptool-4.8.dev1 → esptool-4.8.dev3}/espsecure/__main__.py +0 -0
  126. {esptool-4.8.dev1 → esptool-4.8.dev3}/espsecure/esp_hsm_sign/__init__.py +0 -0
  127. {esptool-4.8.dev1 → esptool-4.8.dev3}/espsecure/esp_hsm_sign/exceptions.py +0 -0
  128. {esptool-4.8.dev1 → esptool-4.8.dev3}/espsecure.py +0 -0
  129. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/__main__.py +0 -0
  130. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/config.py +0 -0
  131. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32c5beta3.py +0 -0
  132. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32c6.py +0 -0
  133. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32c6beta.py +0 -0
  134. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32h2.py +0 -0
  135. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32h2beta1.py +0 -0
  136. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32h2beta2.py +0 -0
  137. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/esp32s3beta2.py +0 -0
  138. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32.json +0 -0
  139. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32c2.json +0 -0
  140. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32c6beta.json +0 -0
  141. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32h2beta1.json +0 -0
  142. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32h2beta2.json +0 -0
  143. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32s2.json +0 -0
  144. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_32s3beta2.json +0 -0
  145. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/targets/stub_flasher/stub_flasher_8266.json +0 -0
  146. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool/uf2_writer.py +0 -0
  147. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool.egg-info/dependency_links.txt +0 -0
  148. {esptool-4.8.dev1 → esptool-4.8.dev3}/esptool.egg-info/top_level.txt +0 -0
  149. {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.dev1
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 reseting ESP chips.
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
- "(given None)".format(efuse.name)
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
- "Countinue with empty chunk."
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
- # Burn from BLKn -> BLK0. Because BLK0 can set rd or/and wr protection bits.
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 bitarray_new_value == bitarray_old_value:
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 neeed to check below condition for them.
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
- error_in_blocks = efuses.get_coding_scheme_warnings()
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
- return (
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
- self.coding_scheme = (
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
- # fmt: on
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(" RF_REF_I_BIAS_CONFIG: {}".format(efuses["RF_REF_I_BIAS_CONFIG"].get()))
157
-
158
- print(" LDO_VOL_BIAS_CONFIG_LOW: {}".format(efuses["LDO_VOL_BIAS_CONFIG_LOW"].get()))
159
- print(" LDO_VOL_BIAS_CONFIG_HIGH: {}".format(efuses["LDO_VOL_BIAS_CONFIG_HIGH"].get()))
160
-
161
- print(" PVT_LOW: {}".format(efuses["PVT_LOW"].get()))
162
- print(" PVT_HIGH: {}".format(efuses["PVT_HIGH"].get()))
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-C5 beta3 chip
1
+ # This file includes the operations with eFuses for ESP32-C3 chip
2
2
  #
3
- # SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
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["BLK_VERSION_MINOR"].get() == 1:
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("ADC1 Calibration data stored in efuse BLOCK2:")
202
- print(f"OCODE: {efuses['OCODE'].get()}")
203
- print(f"INIT_CODE_ATTEN0: {efuses['ADC1_INIT_CODE_ATTEN0'].get()}")
204
- print(f"INIT_CODE_ATTEN1: {efuses['ADC1_INIT_CODE_ATTEN1'].get()}")
205
- print(f"INIT_CODE_ATTEN2: {efuses['ADC1_INIT_CODE_ATTEN2'].get()}")
206
- print(f"INIT_CODE_ATTEN3: {efuses['ADC1_INIT_CODE_ATTEN3'].get()}")
207
- print(f"CAL_VOL_ATTEN0: {efuses['ADC1_CAL_VOL_ATTEN0'].get()}")
208
- print(f"CAL_VOL_ATTEN1: {efuses['ADC1_CAL_VOL_ATTEN1'].get()}")
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("BLK_VERSION_MINOR = {}".format(efuses["BLK_VERSION_MINOR"].get_meaning()))
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