esptool 5.2.dev1__tar.gz → 5.2.dev3__tar.gz

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