esptool 5.1.dev1__tar.gz → 5.2.0__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 (201) hide show
  1. {esptool-5.1.dev1/esptool.egg-info → esptool-5.2.0}/PKG-INFO +5 -3
  2. {esptool-5.1.dev1 → esptool-5.2.0}/README.md +1 -0
  3. {esptool-5.1.dev1 → esptool-5.2.0}/esp_rfc2217_server/__init__.py +1 -1
  4. {esptool-5.1.dev1 → esptool-5.2.0}/esp_rfc2217_server/esp_port_manager.py +2 -2
  5. {esptool-5.1.dev1 → esptool-5.2.0}/esp_rfc2217_server/redirector.py +3 -4
  6. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/__init__.py +7 -6
  7. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/cli_util.py +1 -1
  8. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/base_fields.py +23 -18
  9. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/base_operations.py +27 -22
  10. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/csv_table_parser.py +3 -5
  11. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/emulate_efuse_controller_base.py +97 -57
  12. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32/emulate_efuse_controller.py +22 -16
  13. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32/fields.py +9 -11
  14. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32/mem_definition.py +25 -21
  15. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32/operations.py +3 -2
  16. esptool-5.2.0/espefuse/efuse/esp32c2/emulate_efuse_controller.py +113 -0
  17. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c2/fields.py +6 -7
  18. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c2/mem_definition.py +3 -1
  19. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c2/operations.py +8 -6
  20. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c3/emulate_efuse_controller.py +17 -12
  21. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c3/fields.py +5 -6
  22. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c3/mem_definition.py +14 -10
  23. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c3/operations.py +5 -3
  24. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c5/emulate_efuse_controller.py +17 -12
  25. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c5/fields.py +8 -16
  26. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c5/mem_definition.py +38 -30
  27. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c6/emulate_efuse_controller.py +17 -12
  28. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c6/fields.py +8 -9
  29. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c6/mem_definition.py +14 -10
  30. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c61/emulate_efuse_controller.py +17 -12
  31. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c61/fields.py +7 -8
  32. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c61/mem_definition.py +3 -1
  33. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c61/operations.py +4 -2
  34. esptool-5.2.0/espefuse/efuse/esp32e22/__init__.py +5 -0
  35. esptool-5.2.0/espefuse/efuse/esp32e22/emulate_efuse_controller.py +97 -0
  36. esptool-5.2.0/espefuse/efuse/esp32e22/fields.py +437 -0
  37. {esptool-5.1.dev1/espefuse/efuse/esp32p4 → esptool-5.2.0/espefuse/efuse/esp32e22}/mem_definition.py +9 -18
  38. esptool-5.2.0/espefuse/efuse/esp32e22/operations.py +295 -0
  39. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h2/emulate_efuse_controller.py +17 -12
  40. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h2/fields.py +10 -11
  41. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h2/mem_definition.py +14 -10
  42. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h2/operations.py +4 -2
  43. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h21/emulate_efuse_controller.py +17 -12
  44. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h21/fields.py +11 -12
  45. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h21/mem_definition.py +14 -10
  46. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h4/emulate_efuse_controller.py +17 -12
  47. {esptool-5.1.dev1/espefuse/efuse/esp32p4 → esptool-5.2.0/espefuse/efuse/esp32h4}/fields.py +34 -31
  48. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h4/mem_definition.py +14 -10
  49. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32p4/emulate_efuse_controller.py +18 -13
  50. esptool-5.2.0/espefuse/efuse/esp32p4/fields.py +549 -0
  51. esptool-5.2.0/espefuse/efuse/esp32p4/mem_definition.py +188 -0
  52. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32s2/emulate_efuse_controller.py +17 -12
  53. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32s2/fields.py +9 -10
  54. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32s2/mem_definition.py +14 -10
  55. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32s3/emulate_efuse_controller.py +16 -11
  56. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32s3/fields.py +10 -11
  57. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32s3/mem_definition.py +26 -20
  58. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32s3/operations.py +4 -2
  59. esptool-5.2.0/espefuse/efuse/esp32s31/__init__.py +5 -0
  60. esptool-5.2.0/espefuse/efuse/esp32s31/emulate_efuse_controller.py +97 -0
  61. {esptool-5.1.dev1/espefuse/efuse/esp32h4 → esptool-5.2.0/espefuse/efuse/esp32s31}/fields.py +16 -24
  62. esptool-5.2.0/espefuse/efuse/esp32s31/mem_definition.py +160 -0
  63. esptool-5.2.0/espefuse/efuse/esp32s31/operations.py +297 -0
  64. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/mem_definition_base.py +101 -51
  65. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/util.py +3 -3
  66. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_defs/esp32c2.yaml +5 -2
  67. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_defs/esp32c5.yaml +46 -46
  68. esptool-5.2.0/espefuse/efuse_defs/esp32e22.yaml +78 -0
  69. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_defs/esp32h2.yaml +3 -2
  70. esptool-5.2.0/espefuse/efuse_defs/esp32p4_v3.0.yaml +174 -0
  71. esptool-5.2.0/espefuse/efuse_defs/esp32s31.yaml +122 -0
  72. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_interface.py +18 -9
  73. {esptool-5.1.dev1 → esptool-5.2.0}/espsecure/__init__.py +62 -23
  74. {esptool-5.1.dev1 → esptool-5.2.0}/espsecure/esp_hsm_sign/__init__.py +5 -3
  75. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/__init__.py +60 -51
  76. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/bin_image.py +53 -33
  77. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/cli_util.py +212 -6
  78. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/cmds.py +525 -188
  79. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/loader.py +67 -69
  80. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/logger.py +8 -1
  81. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/reset.py +1 -1
  82. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/__init__.py +4 -0
  83. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/esp32.py +16 -8
  84. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/esp32c2.py +37 -27
  85. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/esp32c3.py +14 -3
  86. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/esp32c5.py +22 -5
  87. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/esp32c6.py +23 -6
  88. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/esp32c61.py +13 -4
  89. esptool-5.2.0/esptool/targets/esp32e22.py +260 -0
  90. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/esp32h4.py +34 -13
  91. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/esp32p4.py +98 -7
  92. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/esp32s2.py +4 -2
  93. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/esp32s3.py +4 -2
  94. esptool-5.2.0/esptool/targets/esp32s31.py +220 -0
  95. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/esp8266.py +2 -2
  96. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/stub_flasher/1/README.md +1 -1
  97. esptool-5.2.0/esptool/targets/stub_flasher/1/esp32.json +8 -0
  98. esptool-5.2.0/esptool/targets/stub_flasher/1/esp32c2.json +8 -0
  99. esptool-5.2.0/esptool/targets/stub_flasher/1/esp32c3.json +8 -0
  100. esptool-5.2.0/esptool/targets/stub_flasher/1/esp32c5.json +8 -0
  101. esptool-5.2.0/esptool/targets/stub_flasher/1/esp32c6.json +8 -0
  102. esptool-5.2.0/esptool/targets/stub_flasher/1/esp32c61.json +8 -0
  103. esptool-5.2.0/esptool/targets/stub_flasher/1/esp32h2.json +8 -0
  104. esptool-5.2.0/esptool/targets/stub_flasher/1/esp32p4-rev1.json +8 -0
  105. esptool-5.2.0/esptool/targets/stub_flasher/1/esp32p4.json +8 -0
  106. esptool-5.2.0/esptool/targets/stub_flasher/1/esp32s2.json +8 -0
  107. esptool-5.2.0/esptool/targets/stub_flasher/1/esp32s3.json +8 -0
  108. esptool-5.2.0/esptool/targets/stub_flasher/1/esp8266.json +8 -0
  109. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/stub_flasher/2/README.md +1 -1
  110. esptool-5.2.0/esptool/targets/stub_flasher/2/esp32.json +8 -0
  111. esptool-5.2.0/esptool/targets/stub_flasher/2/esp32c2.json +8 -0
  112. esptool-5.2.0/esptool/targets/stub_flasher/2/esp32c3.json +8 -0
  113. esptool-5.2.0/esptool/targets/stub_flasher/2/esp32c5.json +8 -0
  114. esptool-5.2.0/esptool/targets/stub_flasher/2/esp32c6.json +8 -0
  115. esptool-5.2.0/esptool/targets/stub_flasher/2/esp32c61.json +8 -0
  116. esptool-5.2.0/esptool/targets/stub_flasher/2/esp32h2.json +8 -0
  117. esptool-5.2.0/esptool/targets/stub_flasher/2/esp32h4.json +8 -0
  118. esptool-5.2.0/esptool/targets/stub_flasher/2/esp32p4-rev1.json +8 -0
  119. esptool-5.2.0/esptool/targets/stub_flasher/2/esp32p4.json +8 -0
  120. esptool-5.2.0/esptool/targets/stub_flasher/2/esp32s2.json +8 -0
  121. esptool-5.2.0/esptool/targets/stub_flasher/2/esp32s3.json +8 -0
  122. esptool-5.2.0/esptool/targets/stub_flasher/2/esp8266.json +8 -0
  123. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/uf2_writer.py +1 -1
  124. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/util.py +24 -21
  125. {esptool-5.1.dev1 → esptool-5.2.0/esptool.egg-info}/PKG-INFO +5 -3
  126. {esptool-5.1.dev1 → esptool-5.2.0}/esptool.egg-info/SOURCES.txt +18 -0
  127. {esptool-5.1.dev1 → esptool-5.2.0}/esptool.egg-info/requires.txt +2 -2
  128. {esptool-5.1.dev1 → esptool-5.2.0}/pyproject.toml +9 -6
  129. esptool-5.1.dev1/espefuse/efuse/esp32c2/emulate_efuse_controller.py +0 -139
  130. esptool-5.1.dev1/esptool/targets/stub_flasher/1/esp32.json +0 -8
  131. esptool-5.1.dev1/esptool/targets/stub_flasher/1/esp32c2.json +0 -8
  132. esptool-5.1.dev1/esptool/targets/stub_flasher/1/esp32c3.json +0 -8
  133. esptool-5.1.dev1/esptool/targets/stub_flasher/1/esp32c5.json +0 -8
  134. esptool-5.1.dev1/esptool/targets/stub_flasher/1/esp32c6.json +0 -8
  135. esptool-5.1.dev1/esptool/targets/stub_flasher/1/esp32c61.json +0 -8
  136. esptool-5.1.dev1/esptool/targets/stub_flasher/1/esp32h2.json +0 -8
  137. esptool-5.1.dev1/esptool/targets/stub_flasher/1/esp32p4.json +0 -8
  138. esptool-5.1.dev1/esptool/targets/stub_flasher/1/esp32s2.json +0 -8
  139. esptool-5.1.dev1/esptool/targets/stub_flasher/1/esp32s3.json +0 -8
  140. esptool-5.1.dev1/esptool/targets/stub_flasher/1/esp8266.json +0 -8
  141. esptool-5.1.dev1/esptool/targets/stub_flasher/2/esp32.json +0 -5
  142. esptool-5.1.dev1/esptool/targets/stub_flasher/2/esp32c2.json +0 -5
  143. esptool-5.1.dev1/esptool/targets/stub_flasher/2/esp32c3.json +0 -5
  144. esptool-5.1.dev1/esptool/targets/stub_flasher/2/esp32c5.json +0 -5
  145. esptool-5.1.dev1/esptool/targets/stub_flasher/2/esp32c6.json +0 -5
  146. esptool-5.1.dev1/esptool/targets/stub_flasher/2/esp32c61.json +0 -5
  147. esptool-5.1.dev1/esptool/targets/stub_flasher/2/esp32h2.json +0 -5
  148. esptool-5.1.dev1/esptool/targets/stub_flasher/2/esp32p4.json +0 -5
  149. esptool-5.1.dev1/esptool/targets/stub_flasher/2/esp32s2.json +0 -5
  150. esptool-5.1.dev1/esptool/targets/stub_flasher/2/esp32s3.json +0 -5
  151. esptool-5.1.dev1/esptool/targets/stub_flasher/2/esp8266.json +0 -5
  152. {esptool-5.1.dev1 → esptool-5.2.0}/LICENSE +0 -0
  153. {esptool-5.1.dev1 → esptool-5.2.0}/MANIFEST.in +0 -0
  154. {esptool-5.1.dev1 → esptool-5.2.0}/esp_rfc2217_server/__main__.py +0 -0
  155. {esptool-5.1.dev1 → esptool-5.2.0}/esp_rfc2217_server.py +0 -0
  156. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/__main__.py +0 -0
  157. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/__init__.py +0 -0
  158. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32/__init__.py +0 -0
  159. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c2/__init__.py +0 -0
  160. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c3/__init__.py +0 -0
  161. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c5/__init__.py +0 -0
  162. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c5/operations.py +0 -0
  163. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c6/__init__.py +0 -0
  164. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c6/operations.py +0 -0
  165. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32c61/__init__.py +0 -0
  166. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h2/__init__.py +0 -0
  167. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h21/__init__.py +0 -0
  168. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h21/operations.py +0 -0
  169. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h4/__init__.py +0 -0
  170. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32h4/operations.py +0 -0
  171. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32p4/__init__.py +0 -0
  172. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32p4/operations.py +0 -0
  173. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32s2/__init__.py +0 -0
  174. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32s2/operations.py +0 -0
  175. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse/esp32s3/__init__.py +0 -0
  176. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_defs/esp32.yaml +0 -0
  177. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_defs/esp32c3.yaml +0 -0
  178. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_defs/esp32c6.yaml +0 -0
  179. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_defs/esp32c61.yaml +0 -0
  180. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_defs/esp32h21.yaml +0 -0
  181. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_defs/esp32h2_v0.0_v1.1.yaml +0 -0
  182. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_defs/esp32h4.yaml +0 -0
  183. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_defs/esp32p4.yaml +0 -0
  184. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_defs/esp32s2.yaml +0 -0
  185. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse/efuse_defs/esp32s3.yaml +0 -0
  186. {esptool-5.1.dev1 → esptool-5.2.0}/espefuse.py +0 -0
  187. {esptool-5.1.dev1 → esptool-5.2.0}/espsecure/__main__.py +0 -0
  188. {esptool-5.1.dev1 → esptool-5.2.0}/espsecure/esp_hsm_sign/exceptions.py +0 -0
  189. {esptool-5.1.dev1 → esptool-5.2.0}/espsecure.py +0 -0
  190. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/__main__.py +0 -0
  191. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/config.py +0 -0
  192. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/esp32h2.py +0 -0
  193. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/esp32h21.py +0 -0
  194. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/stub_flasher/2/LICENSE-APACHE +0 -0
  195. {esptool-5.1.dev1 → esptool-5.2.0}/esptool/targets/stub_flasher/2/LICENSE-MIT +0 -0
  196. {esptool-5.1.dev1 → esptool-5.2.0}/esptool.egg-info/dependency_links.txt +0 -0
  197. {esptool-5.1.dev1 → esptool-5.2.0}/esptool.egg-info/entry_points.txt +0 -0
  198. {esptool-5.1.dev1 → esptool-5.2.0}/esptool.egg-info/top_level.txt +0 -0
  199. {esptool-5.1.dev1 → esptool-5.2.0}/esptool.py +0 -0
  200. {esptool-5.1.dev1 → esptool-5.2.0}/setup.cfg +0 -0
  201. {esptool-5.1.dev1 → esptool-5.2.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: esptool
3
- Version: 5.1.dev1
3
+ Version: 5.2.0
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+
@@ -22,6 +22,7 @@ Classifier: Programming Language :: Python :: 3.10
22
22
  Classifier: Programming Language :: Python :: 3.11
23
23
  Classifier: Programming Language :: Python :: 3.12
24
24
  Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Programming Language :: Python :: 3.14
25
26
  Requires-Python: >=3.10
26
27
  Description-Content-Type: text/markdown
27
28
  License-File: LICENSE
@@ -31,7 +32,7 @@ Requires-Dist: pyserial>=3.3
31
32
  Requires-Dist: reedsolo<1.8,>=1.5.3
32
33
  Requires-Dist: PyYAML>=5.1
33
34
  Requires-Dist: intelhex
34
- Requires-Dist: rich_click
35
+ Requires-Dist: rich_click<2
35
36
  Requires-Dist: click<9
36
37
  Provides-Extra: dev
37
38
  Requires-Dist: pyelftools; extra == "dev"
@@ -44,7 +45,7 @@ Requires-Dist: czespressif; extra == "dev"
44
45
  Provides-Extra: hsm
45
46
  Requires-Dist: python-pkcs11; extra == "hsm"
46
47
  Provides-Extra: docs
47
- Requires-Dist: esp-docs~=1.10; extra == "docs"
48
+ Requires-Dist: esp-docs~=2.1; extra == "docs"
48
49
  Requires-Dist: sphinx-tabs; extra == "docs"
49
50
  Dynamic: license-file
50
51
 
@@ -53,6 +54,7 @@ Dynamic: license-file
53
54
  A Python-based, open-source, platform-independent serial utility for flashing, provisioning, and interacting with Espressif SoCs.
54
55
 
55
56
  [![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)
57
+ [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/espressif/esptool/master.svg)](https://results.pre-commit.ci/latest/github/espressif/esptool/master)
56
58
 
57
59
  ## Documentation
58
60
 
@@ -3,6 +3,7 @@
3
3
  A Python-based, open-source, platform-independent serial utility for flashing, provisioning, and interacting with Espressif SoCs.
4
4
 
5
5
  [![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)
6
+ [![pre-commit.ci status](https://results.pre-commit.ci/badge/github/espressif/esptool/master.svg)](https://results.pre-commit.ci/latest/github/espressif/esptool/master)
6
7
 
7
8
  ## Documentation
8
9
 
@@ -134,7 +134,7 @@ def main():
134
134
  except KeyboardInterrupt:
135
135
  print(flush=True)
136
136
  break
137
- except socket.error as msg:
137
+ except OSError as msg:
138
138
  logging.error(str(msg))
139
139
 
140
140
  logging.info("--- exit ---")
@@ -38,7 +38,7 @@ class EspPortManager(serial.rfc2217.PortManager):
38
38
  def __init__(self, serial_port, connection, esp32r0_delay, logger=None):
39
39
  self.esp32r0_delay = esp32r0_delay
40
40
  self.is_download_mode = False
41
- super(EspPortManager, self).__init__(serial_port, connection, logger)
41
+ super().__init__(serial_port, connection, logger)
42
42
 
43
43
  def _telnet_process_subnegotiation(self, suboption):
44
44
  if suboption[0:1] == COM_PORT_OPTION and suboption[1:2] == SET_CONTROL:
@@ -66,7 +66,7 @@ class EspPortManager(serial.rfc2217.PortManager):
66
66
  ]:
67
67
  return
68
68
  # only in cases not handled above do the original implementation in PortManager
69
- super(EspPortManager, self)._telnet_process_subnegotiation(suboption)
69
+ super()._telnet_process_subnegotiation(suboption)
70
70
 
71
71
  def _hard_reset_thread(self):
72
72
  """
@@ -5,12 +5,11 @@
5
5
  import threading
6
6
  import time
7
7
  import logging
8
- import socket
9
8
 
10
9
  from esp_rfc2217_server.esp_port_manager import EspPortManager
11
10
 
12
11
 
13
- class Redirector(object):
12
+ class Redirector:
14
13
  def __init__(self, serial_instance, socket, debug=False, esp32r0delay=False):
15
14
  self.serial = serial_instance
16
15
  self.socket = socket
@@ -54,7 +53,7 @@ class Redirector(object):
54
53
  if data:
55
54
  # escape outgoing data when needed (Telnet IAC (0xff) character)
56
55
  self.write(b"".join(self.rfc2217.escape(data)))
57
- except socket.error as msg:
56
+ except OSError as msg:
58
57
  self.log.error("{}".format(msg))
59
58
  # probably got disconnected
60
59
  break
@@ -74,7 +73,7 @@ class Redirector(object):
74
73
  if not data:
75
74
  break
76
75
  self.serial.write(b"".join(self.rfc2217.filter(data)))
77
- except socket.error as msg:
76
+ except OSError as msg:
78
77
  self.log.error("{}".format(msg))
79
78
  # probably got disconnected
80
79
  break
@@ -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(
@@ -93,9 +93,10 @@ __all__ = [
93
93
  "Use with caution!",
94
94
  )
95
95
  @click.option(
96
- "--postpone",
97
- is_flag=True,
98
- help="Postpone burning some eFuses from BLOCK0 at the end.",
96
+ "--postpone/--no-postpone",
97
+ default=True,
98
+ help="Postpone burning some eFuses from BLOCK0 at the end "
99
+ "(enabled by default, can be disabled with --no-postpone).",
99
100
  )
100
101
  @click.option(
101
102
  "--extend-efuse-table",
@@ -220,7 +220,7 @@ class Group(EsptoolGroup):
220
220
  commands = init_commands(port=None, chip=ctx.obj["chip"], skip_connect=True)
221
221
  commands.add_cli_commands(self)
222
222
  elif len(used_cmds) == 0:
223
- self.get_help(ctx)
223
+ log.print(self.get_help(ctx))
224
224
  ctx.exit()
225
225
 
226
226
  cmd_groups = self.repeat_read_commands(used_cmds, cmd_groups)
@@ -17,7 +17,7 @@ from esptool.logger import log
17
17
  from . import util
18
18
 
19
19
 
20
- class CheckArgValue(object):
20
+ class CheckArgValue:
21
21
  def __init__(self, efuses, name):
22
22
  self.efuses = efuses
23
23
  self.name = name
@@ -85,10 +85,10 @@ class CheckArgValue(object):
85
85
  return check_arg_value(efuse, new_value)
86
86
 
87
87
 
88
- class EfuseProtectBase(object):
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
@@ -214,9 +214,7 @@ class EfuseBlockBase(EfuseProtectBase):
214
214
  elif coding_scheme == self.parent.REGS.CODING_SCHEME_RS:
215
215
  return self.len * 4
216
216
  else:
217
- raise esptool.FatalError(
218
- "Coding scheme (%d) not supported" % (coding_scheme)
219
- )
217
+ raise esptool.FatalError(f"Coding scheme ({coding_scheme}) not supported")
220
218
 
221
219
  def get_coding_scheme(self):
222
220
  if self.id == 0:
@@ -255,7 +253,7 @@ class EfuseBlockBase(EfuseProtectBase):
255
253
  words = self.get_words()
256
254
  data = BitArray()
257
255
  for word in reversed(words):
258
- data.append("uint:32=%d" % word)
256
+ data.append(f"uint:32={word}")
259
257
  self.bitarray.overwrite(data, pos=0)
260
258
  if print_info:
261
259
  self.print_block(self.bitarray, "read_regs")
@@ -264,13 +262,13 @@ class EfuseBlockBase(EfuseProtectBase):
264
262
  if self.parent.debug or debug:
265
263
  bit_string.pos = 0
266
264
  log.print(
267
- "%-15s (%-16s) [%-2d] %s:"
268
- % (self.name, " ".join(self.alias)[:16], self.id, comment),
265
+ f"{self.name:<15s} ({' '.join(self.alias)[:16]:<16s}) "
266
+ f"[{self.id:<2d}] {comment}:",
269
267
  " ".join(
270
268
  [
271
- "%08x" % word
269
+ f"{word:08x}"
272
270
  for word in bit_string.readlist(
273
- "%d*uint:32" % (bit_string.len / 32)
271
+ f"{int(bit_string.len / 32)}*uint:32"
274
272
  )[::-1]
275
273
  ]
276
274
  ),
@@ -285,8 +283,8 @@ class EfuseBlockBase(EfuseProtectBase):
285
283
  return False
286
284
  if len(wr_data.bytes) != len(self.bitarray.bytes):
287
285
  raise esptool.FatalError(
288
- "Data does not fit: the block%d size is %d bytes, data is %d bytes"
289
- % (self.id, len(self.bitarray.bytes), len(wr_data.bytes))
286
+ f"Data does not fit: block{self.id} size "
287
+ f"{len(self.bitarray.bytes)} bytes, data {len(wr_data.bytes)} bytes"
290
288
  )
291
289
  self.check_wr_rd_protect()
292
290
 
@@ -468,7 +466,7 @@ class EfuseBlockBase(EfuseProtectBase):
468
466
  self.wr_bitarray.set(0)
469
467
 
470
468
 
471
- class EspEfusesBase(object):
469
+ class EspEfusesBase:
472
470
  """
473
471
  Wrapper object to manage the efuse fields in a connected ESP bootloader
474
472
  """
@@ -538,8 +536,14 @@ class EspEfusesBase(object):
538
536
  log.print("Re-connecting...")
539
537
  baudrate = esp._port.baudrate
540
538
  port = esp._port.port
539
+ connect_mode = (
540
+ "usb-reset"
541
+ if esp._get_pid() == esp.USB_JTAG_SERIAL_PID
542
+ else "default-reset"
543
+ )
544
+ log.print(f"Port: {port}, Baudrate: {baudrate}, Connect mode: {connect_mode}")
541
545
  esp._port.close()
542
- return esptool.detect_chip(port, baudrate)
546
+ return esptool.detect_chip(port, baudrate, connect_mode)
543
547
 
544
548
  def get_index_block_by_name(self, name):
545
549
  for block in self.blocks:
@@ -674,8 +678,9 @@ class EspEfusesBase(object):
674
678
  @staticmethod
675
679
  def confirm(action, do_not_confirm):
676
680
  log.print(
677
- "%s%s\nThis is an irreversible operation!"
678
- % (action, "" if action.endswith("\n") else ". ")
681
+ "{}{}\nThis is an irreversible operation!".format(
682
+ action, "" if action.endswith("\n") else ". "
683
+ )
679
684
  )
680
685
  if not do_not_confirm:
681
686
  log.print("Type 'BURN' (all capitals) to continue.", flush=True)
@@ -9,7 +9,8 @@ import io
9
9
  import os
10
10
  import json
11
11
  import sys
12
- from typing import Any, BinaryIO, Callable, TextIO
12
+ from typing import Any, BinaryIO, TextIO
13
+ from collections.abc import Callable
13
14
 
14
15
  import espsecure
15
16
  import rich_click as click
@@ -222,16 +223,21 @@ class BaseCommands:
222
223
  f"({self.CHIP_NAME} != {self.esp.CHIP_NAME})"
223
224
  )
224
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
+
225
236
  def __enter__(self):
226
237
  return self
227
238
 
228
239
  def __exit__(self, exc_type, exc_value, traceback):
229
- if (
230
- self.esp is not None
231
- and not self.external_esp
232
- and isinstance(self.esp, esptool.ESPLoader)
233
- ):
234
- self.esp._port.close()
240
+ self._close_port(self.esp, self.external_esp)
235
241
 
236
242
  ################################# CLI definitions #################################
237
243
 
@@ -850,9 +856,9 @@ class BaseCommands:
850
856
  for block in self.efuses.blocks:
851
857
  burn_list_a_block = [e for e in burn_efuses_list if e.block == block.id]
852
858
  if len(burn_list_a_block):
853
- log.print(" from BLOCK%d" % (block.id))
859
+ log.print(f" from BLOCK{block.id}")
854
860
  for field in burn_list_a_block:
855
- log.print(" - %s" % (field.name))
861
+ log.print(f" - {field.name}")
856
862
  if (
857
863
  self.efuses.blocks[field.block].get_coding_scheme()
858
864
  != self.efuses.REGS.CODING_SCHEME_NONE
@@ -990,18 +996,18 @@ class BaseCommands:
990
996
  ]
991
997
  if error:
992
998
  raise esptool.FatalError(
993
- "%s must be readable, stop this operation!" % efuse_name
999
+ f"{efuse_name} must be readable, stop this operation!"
994
1000
  )
995
1001
  else:
996
- for block in self.efuses.Blocks.BLOCKS:
997
- block = self.efuses.Blocks.get(block)
1002
+ for block_tuple in self.efuses.Blocks.BLOCKS:
1003
+ block = self.efuses.Blocks.get(block_tuple)
998
1004
  if block.name == efuse_name and block.key_purpose is not None:
999
1005
  if not self.efuses[block.key_purpose].need_rd_protect(
1000
1006
  self.efuses[block.key_purpose].get()
1001
1007
  ):
1002
1008
  raise esptool.FatalError(
1003
- "%s must be readable, stop this operation!"
1004
- % efuse_name
1009
+ f"{efuse_name} must be readable, "
1010
+ f"stop this operation!"
1005
1011
  )
1006
1012
  break
1007
1013
  # make full list of which efuses will be disabled
@@ -1013,8 +1019,8 @@ class BaseCommands:
1013
1019
  ]
1014
1020
  names = ", ".join(e.name for e in all_disabling)
1015
1021
  log.print(
1016
- "Permanently read-disabling eFuse%s %s"
1017
- % ("s" if len(all_disabling) > 1 else "", names)
1022
+ f"Permanently read-disabling eFuse"
1023
+ f"{'s' if len(all_disabling) > 1 else ''} {names}"
1018
1024
  )
1019
1025
  efuse.disable_read()
1020
1026
 
@@ -1055,8 +1061,8 @@ class BaseCommands:
1055
1061
  ]
1056
1062
  names = ", ".join(e.name for e in all_disabling)
1057
1063
  log.print(
1058
- "Permanently write-disabling eFuse%s %s"
1059
- % ("s" if len(all_disabling) > 1 else "", names)
1064
+ f"Permanently write-disabling eFuse"
1065
+ f"{'s' if len(all_disabling) > 1 else ''} {names}"
1060
1066
  )
1061
1067
  efuse.disable_write()
1062
1068
 
@@ -1166,11 +1172,10 @@ class BaseCommands:
1166
1172
  )
1167
1173
  data_block.reverse()
1168
1174
  log.print(
1169
- "bit_number: "
1170
- "[%-03d]........................................................[0]"
1171
- % (data_block.len - 1)
1175
+ f"bit_number: [{data_block.len - 1:03d}]"
1176
+ f"........................................................[0]"
1172
1177
  )
1173
- log.print("BLOCK%-2d :" % block_obj.id, data_block)
1178
+ log.print(f"BLOCK{block_obj.id:>2d} :", data_block)
1174
1179
  block_obj.print_block(data_block, "regs_to_write", debug=True)
1175
1180
  block_obj.save(data_block.bytes[::-1])
1176
1181
 
@@ -180,7 +180,7 @@ class CSVFuseTable(list):
180
180
  print_error(p, n, state)
181
181
 
182
182
 
183
- class FuseDefinition(object):
183
+ class FuseDefinition:
184
184
  def __init__(self):
185
185
  self.field_name = ""
186
186
  self.group = ""
@@ -261,11 +261,9 @@ class FuseDefinition(object):
261
261
 
262
262
  class InputError(RuntimeError):
263
263
  def __init__(self, e):
264
- super(InputError, self).__init__(e)
264
+ super().__init__(e)
265
265
 
266
266
 
267
267
  class ValidationError(InputError):
268
268
  def __init__(self, p, message):
269
- super(ValidationError, self).__init__(
270
- f"Entry {p.field_name} invalid: {message}"
271
- )
269
+ super().__init__(f"Entry {p.field_name} invalid: {message}")