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.
Files changed (161) hide show
  1. {esptool-4.8.dev4 → esptool-4.8.dev5}/MANIFEST.in +2 -2
  2. esptool-4.8.dev5/PKG-INFO +53 -0
  3. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/__init__.py +54 -6
  4. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/base_fields.py +4 -0
  5. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/base_operations.py +69 -20
  6. esptool-4.8.dev5/espefuse/efuse/csv_table_parser.py +266 -0
  7. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32/emulate_efuse_controller.py +2 -7
  8. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32/fields.py +9 -2
  9. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32/mem_definition.py +2 -2
  10. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c2/emulate_efuse_controller.py +1 -1
  11. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c2/fields.py +9 -2
  12. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c2/mem_definition.py +2 -2
  13. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c3/emulate_efuse_controller.py +1 -1
  14. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c3/fields.py +9 -2
  15. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c3/mem_definition.py +2 -2
  16. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5/emulate_efuse_controller.py +1 -1
  17. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5/fields.py +9 -2
  18. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5/mem_definition.py +2 -2
  19. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5beta3/emulate_efuse_controller.py +1 -1
  20. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5beta3/fields.py +9 -2
  21. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5beta3/mem_definition.py +2 -2
  22. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c6/emulate_efuse_controller.py +1 -1
  23. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c6/fields.py +9 -2
  24. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c6/mem_definition.py +2 -2
  25. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c61/emulate_efuse_controller.py +1 -1
  26. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c61/fields.py +9 -2
  27. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c61/mem_definition.py +2 -2
  28. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2/emulate_efuse_controller.py +1 -1
  29. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2/fields.py +9 -2
  30. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2/mem_definition.py +2 -2
  31. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2beta1/emulate_efuse_controller.py +1 -1
  32. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2beta1/fields.py +9 -2
  33. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2beta1/mem_definition.py +2 -2
  34. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32p4/emulate_efuse_controller.py +1 -1
  35. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32p4/fields.py +9 -2
  36. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32p4/mem_definition.py +2 -2
  37. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s2/emulate_efuse_controller.py +1 -1
  38. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s2/fields.py +9 -2
  39. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s2/mem_definition.py +2 -2
  40. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3/emulate_efuse_controller.py +1 -1
  41. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3/fields.py +31 -2
  42. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3/mem_definition.py +2 -2
  43. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3beta2/emulate_efuse_controller.py +1 -1
  44. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3beta2/fields.py +31 -2
  45. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3beta2/mem_definition.py +2 -2
  46. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/mem_definition_base.py +62 -2
  47. {esptool-4.8.dev4 → esptool-4.8.dev5}/espsecure/__init__.py +157 -71
  48. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/__init__.py +66 -6
  49. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/bin_image.py +5 -2
  50. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/cmds.py +31 -6
  51. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/loader.py +33 -17
  52. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/reset.py +29 -16
  53. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32.py +3 -1
  54. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c2.py +3 -0
  55. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c3.py +22 -3
  56. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c5.py +82 -2
  57. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c5beta3.py +18 -0
  58. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c6.py +7 -3
  59. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c61.py +21 -0
  60. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32h2.py +18 -0
  61. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32h2beta1.py +23 -3
  62. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32p4.py +26 -4
  63. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32s2.py +24 -3
  64. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32s3.py +24 -3
  65. esptool-4.8.dev5/esptool/targets/stub_flasher/1/README.md +3 -0
  66. esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32c5.json +8 -0
  67. esptool-4.8.dev5/esptool/targets/stub_flasher/1/esp32c5beta3.json +8 -0
  68. esptool-4.8.dev5/esptool/targets/stub_flasher/2/LICENSE-APACHE +201 -0
  69. esptool-4.8.dev5/esptool/targets/stub_flasher/2/LICENSE-MIT +25 -0
  70. esptool-4.8.dev5/esptool/targets/stub_flasher/2/README.md +3 -0
  71. esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32.json +1 -0
  72. esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32c2.json +1 -0
  73. esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32c3.json +1 -0
  74. esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32c6.json +1 -0
  75. esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32h2.json +1 -0
  76. esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32s2.json +1 -0
  77. esptool-4.8.dev5/esptool/targets/stub_flasher/2/esp32s3.json +1 -0
  78. esptool-4.8.dev5/esptool.egg-info/PKG-INFO +53 -0
  79. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool.egg-info/SOURCES.txt +28 -14
  80. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool.egg-info/requires.txt +3 -0
  81. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool.egg-info/top_level.txt +3 -0
  82. esptool-4.8.dev5/pyproject.toml +166 -0
  83. esptool-4.8.dev5/setup.py +21 -0
  84. esptool-4.8.dev4/PKG-INFO +0 -46
  85. esptool-4.8.dev4/esptool/targets/stub_flasher/stub_flasher_32c5beta3.json +0 -8
  86. esptool-4.8.dev4/esptool.egg-info/PKG-INFO +0 -46
  87. esptool-4.8.dev4/setup.py +0 -137
  88. {esptool-4.8.dev4 → esptool-4.8.dev5}/LICENSE +0 -0
  89. {esptool-4.8.dev4 → esptool-4.8.dev5}/README.md +0 -0
  90. {esptool-4.8.dev4 → esptool-4.8.dev5}/esp_rfc2217_server.py +0 -0
  91. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/__main__.py +0 -0
  92. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/__init__.py +0 -0
  93. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/emulate_efuse_controller_base.py +0 -0
  94. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32/__init__.py +0 -0
  95. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32/operations.py +0 -0
  96. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c2/__init__.py +0 -0
  97. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c2/operations.py +0 -0
  98. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c3/__init__.py +0 -0
  99. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c3/operations.py +0 -0
  100. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5/__init__.py +0 -0
  101. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5/operations.py +0 -0
  102. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5beta3/__init__.py +0 -0
  103. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c5beta3/operations.py +0 -0
  104. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c6/__init__.py +0 -0
  105. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c6/operations.py +0 -0
  106. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c61/__init__.py +0 -0
  107. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32c61/operations.py +0 -0
  108. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2/__init__.py +0 -0
  109. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2/operations.py +0 -0
  110. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2beta1/__init__.py +0 -0
  111. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32h2beta1/operations.py +0 -0
  112. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32p4/__init__.py +0 -0
  113. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32p4/operations.py +0 -0
  114. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s2/__init__.py +0 -0
  115. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s2/operations.py +0 -0
  116. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3/__init__.py +0 -0
  117. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3/operations.py +0 -0
  118. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3beta2/__init__.py +0 -0
  119. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/esp32s3beta2/operations.py +0 -0
  120. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse/util.py +0 -0
  121. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32.yaml +0 -0
  122. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32c2.yaml +0 -0
  123. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32c3.yaml +0 -0
  124. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32c5.yaml +0 -0
  125. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32c5beta3.yaml +0 -0
  126. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32c6.yaml +0 -0
  127. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32c61.yaml +0 -0
  128. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32h2.yaml +0 -0
  129. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32p4.yaml +0 -0
  130. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32s2.yaml +0 -0
  131. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse/efuse_defs/esp32s3.yaml +0 -0
  132. {esptool-4.8.dev4 → esptool-4.8.dev5}/espefuse.py +0 -0
  133. {esptool-4.8.dev4 → esptool-4.8.dev5}/espsecure/__main__.py +0 -0
  134. {esptool-4.8.dev4 → esptool-4.8.dev5}/espsecure/esp_hsm_sign/__init__.py +0 -0
  135. {esptool-4.8.dev4 → esptool-4.8.dev5}/espsecure/esp_hsm_sign/exceptions.py +0 -0
  136. {esptool-4.8.dev4 → esptool-4.8.dev5}/espsecure.py +0 -0
  137. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/__main__.py +0 -0
  138. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/config.py +0 -0
  139. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/__init__.py +0 -0
  140. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32c6beta.py +0 -0
  141. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32h2beta2.py +0 -0
  142. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp32s3beta2.py +0 -0
  143. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/targets/esp8266.py +0 -0
  144. /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
  145. /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
  146. /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
  147. /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
  148. /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
  149. /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
  150. /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
  151. /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
  152. /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
  153. /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
  154. /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
  155. /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
  156. /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
  157. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/uf2_writer.py +0 -0
  158. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool/util.py +0 -0
  159. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool.egg-info/dependency_links.txt +0 -0
  160. {esptool-4.8.dev4 → esptool-4.8.dev5}/esptool.py +0 -0
  161. {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/*.json
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
+ [![Test esptool](https://github.com/espressif/esptool/actions/workflows/test_esptool.yml/badge.svg?branch=master)](https://github.com/espressif/esptool/actions/workflows/test_esptool.yml) [![Build esptool](https://github.com/espressif/esptool/actions/workflows/build_esptool.yml/badge.svg?branch=master)](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
- SUPPORTED_COMMANDS = [
43
+ SUPPORTED_READ_COMMANDS = [
43
44
  "summary",
44
45
  "dump",
45
46
  "get_custom_mac",
46
47
  "adc_info",
47
48
  "check_error",
48
- ] + SUPPORTED_BURN_COMMANDS
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(esp, skip_connect=False, debug_mode=False, do_not_confirm=False):
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(esp, skip_connect, debug_mode, do_not_confirm),
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 or ("dump" in remaining_args)
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, just_print_help, debug_mode, common_args.do_not_confirm
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 efuses")
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="Saves dump for each block into separate file. Provide the common "
175
- "path name /path/blk.bin, it will create: blk0.bin, blk1.bin ... blkN.bin. "
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
- # Using --debug option allows to print dump.
378
- # Nothing to do here. The log will be printed
379
- # during EspEfuses.__init__() in self.read_blocks()
380
- if args.file_name:
381
- # save dump to the file
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
- file_dump_name = args.file_name
384
- place_for_index = file_dump_name.find(".bin")
385
- file_dump_name = (
386
- file_dump_name[:place_for_index]
387
- + str(block.id)
388
- + file_dump_name[place_for_index:]
389
- )
390
- print(file_dump_name)
391
- with open(file_dump_name, "wb") as f:
392
- block.get_bitstring().byteswap()
393
- block.get_bitstring().tofile(f)
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
- val = 0
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__(self, esp, skip_connect=False, debug=False, do_not_confirm=False):
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)