esptool 5.3.dev2__tar.gz → 5.3.1__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 (191) hide show
  1. {esptool-5.3.dev2/esptool.egg-info → esptool-5.3.1}/PKG-INFO +6 -1
  2. {esptool-5.3.dev2 → esptool-5.3.1}/README.md +4 -0
  3. {esptool-5.3.dev2 → esptool-5.3.1}/esp_rfc2217_server/__init__.py +150 -149
  4. {esptool-5.3.dev2 → esptool-5.3.1}/esp_rfc2217_server/__main__.py +9 -9
  5. {esptool-5.3.dev2 → esptool-5.3.1}/esp_rfc2217_server/esp_port_manager.py +102 -101
  6. {esptool-5.3.dev2 → esptool-5.3.1}/esp_rfc2217_server.py +0 -0
  7. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/__init__.py +6 -7
  8. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/cli_util.py +4 -5
  9. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/base_fields.py +4 -8
  10. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/base_operations.py +8 -7
  11. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/emulate_efuse_controller_base.py +2 -4
  12. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32/fields.py +2 -3
  13. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c2/emulate_efuse_controller.py +3 -5
  14. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c2/fields.py +2 -3
  15. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c2/operations.py +3 -2
  16. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c3/fields.py +2 -3
  17. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c5/fields.py +2 -3
  18. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c5/operations.py +3 -2
  19. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c6/operations.py +4 -3
  20. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c61/fields.py +3 -8
  21. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c61/operations.py +4 -3
  22. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32e22/fields.py +2 -3
  23. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h2/fields.py +3 -4
  24. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h2/operations.py +4 -3
  25. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h21/fields.py +3 -4
  26. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h21/operations.py +4 -12
  27. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h4/fields.py +3 -4
  28. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h4/operations.py +4 -3
  29. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32p4/fields.py +3 -4
  30. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32p4/operations.py +4 -3
  31. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s2/fields.py +3 -4
  32. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s3/fields.py +3 -4
  33. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s31/emulate_efuse_controller.py +4 -7
  34. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s31/fields.py +29 -23
  35. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s31/operations.py +4 -3
  36. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/mem_definition_base.py +2 -1
  37. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/util.py +19 -0
  38. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32c5.yaml +35 -34
  39. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32h21.yaml +76 -86
  40. esptool-5.3.1/espefuse/efuse_defs/esp32s31.yaml +138 -0
  41. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_interface.py +5 -6
  42. {esptool-5.3.dev2 → esptool-5.3.1}/espsecure/__init__.py +4 -6
  43. {esptool-5.3.dev2 → esptool-5.3.1}/espsecure/esp_hsm_sign/__init__.py +3 -1
  44. {esptool-5.3.dev2 → esptool-5.3.1}/espsecure/esp_hsm_sign/exceptions.py +1 -2
  45. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/__init__.py +201 -45
  46. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/bin_image.py +8 -3
  47. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/cli_util.py +5 -5
  48. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/cmds.py +563 -23
  49. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/loader.py +323 -66
  50. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/logger.py +29 -27
  51. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/reset.py +52 -14
  52. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/__init__.py +1 -2
  53. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32.py +7 -7
  54. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32c3.py +3 -22
  55. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32c5.py +2 -4
  56. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32c6.py +1 -4
  57. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32c61.py +1 -20
  58. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32e22.py +1 -12
  59. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32h2.py +1 -4
  60. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32h21.py +21 -4
  61. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32h4.py +2 -5
  62. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32p4.py +3 -35
  63. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32s2.py +1 -12
  64. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32s3.py +3 -22
  65. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32s31.py +46 -28
  66. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/2/README.md +1 -1
  67. esptool-5.3.1/esptool/targets/stub_flasher/2/esp32.json +8 -0
  68. esptool-5.3.1/esptool/targets/stub_flasher/2/esp32c2.json +8 -0
  69. esptool-5.3.1/esptool/targets/stub_flasher/2/esp32c3.json +8 -0
  70. esptool-5.3.1/esptool/targets/stub_flasher/2/esp32c5.json +8 -0
  71. esptool-5.3.1/esptool/targets/stub_flasher/2/esp32c6.json +8 -0
  72. esptool-5.3.1/esptool/targets/stub_flasher/2/esp32c61.json +8 -0
  73. esptool-5.3.1/esptool/targets/stub_flasher/2/esp32h2.json +8 -0
  74. esptool-5.3.1/esptool/targets/stub_flasher/2/esp32h4.json +8 -0
  75. esptool-5.3.1/esptool/targets/stub_flasher/2/esp32p4-rev1.json +8 -0
  76. esptool-5.3.1/esptool/targets/stub_flasher/2/esp32p4.json +8 -0
  77. esptool-5.3.1/esptool/targets/stub_flasher/2/esp32s2.json +8 -0
  78. esptool-5.3.1/esptool/targets/stub_flasher/2/esp32s3.json +30 -0
  79. esptool-5.3.1/esptool/targets/stub_flasher/2/esp32s31.json +8 -0
  80. esptool-5.3.1/esptool/targets/stub_flasher/2/esp8266.json +8 -0
  81. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/util.py +30 -1
  82. {esptool-5.3.dev2 → esptool-5.3.1/esptool.egg-info}/PKG-INFO +6 -1
  83. {esptool-5.3.dev2 → esptool-5.3.1}/esptool.egg-info/SOURCES.txt +1 -0
  84. {esptool-5.3.dev2 → esptool-5.3.1}/esptool.egg-info/requires.txt +3 -0
  85. {esptool-5.3.dev2 → esptool-5.3.1}/pyproject.toml +6 -2
  86. {esptool-5.3.dev2 → esptool-5.3.1}/setup.py +1 -0
  87. esptool-5.3.dev2/espefuse/efuse_defs/esp32s31.yaml +0 -122
  88. esptool-5.3.dev2/esptool/targets/stub_flasher/2/esp32.json +0 -8
  89. esptool-5.3.dev2/esptool/targets/stub_flasher/2/esp32c2.json +0 -8
  90. esptool-5.3.dev2/esptool/targets/stub_flasher/2/esp32c3.json +0 -8
  91. esptool-5.3.dev2/esptool/targets/stub_flasher/2/esp32c5.json +0 -8
  92. esptool-5.3.dev2/esptool/targets/stub_flasher/2/esp32c6.json +0 -8
  93. esptool-5.3.dev2/esptool/targets/stub_flasher/2/esp32c61.json +0 -8
  94. esptool-5.3.dev2/esptool/targets/stub_flasher/2/esp32h2.json +0 -8
  95. esptool-5.3.dev2/esptool/targets/stub_flasher/2/esp32h4.json +0 -8
  96. esptool-5.3.dev2/esptool/targets/stub_flasher/2/esp32p4-rev1.json +0 -8
  97. esptool-5.3.dev2/esptool/targets/stub_flasher/2/esp32p4.json +0 -8
  98. esptool-5.3.dev2/esptool/targets/stub_flasher/2/esp32s2.json +0 -8
  99. esptool-5.3.dev2/esptool/targets/stub_flasher/2/esp32s3.json +0 -29
  100. esptool-5.3.dev2/esptool/targets/stub_flasher/2/esp8266.json +0 -8
  101. {esptool-5.3.dev2 → esptool-5.3.1}/LICENSE +0 -0
  102. {esptool-5.3.dev2 → esptool-5.3.1}/MANIFEST.in +0 -0
  103. {esptool-5.3.dev2 → esptool-5.3.1}/esp_rfc2217_server/redirector.py +1 -1
  104. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/__main__.py +0 -0
  105. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/__init__.py +0 -0
  106. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/csv_table_parser.py +0 -0
  107. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32/__init__.py +0 -0
  108. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32/emulate_efuse_controller.py +3 -3
  109. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32/mem_definition.py +1 -1
  110. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32/operations.py +3 -3
  111. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c2/__init__.py +0 -0
  112. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c2/mem_definition.py +1 -1
  113. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c3/__init__.py +0 -0
  114. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c3/emulate_efuse_controller.py +3 -3
  115. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c3/mem_definition.py +1 -1
  116. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c3/operations.py +3 -3
  117. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c5/__init__.py +0 -0
  118. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c5/emulate_efuse_controller.py +3 -3
  119. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c5/mem_definition.py +1 -1
  120. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c6/__init__.py +0 -0
  121. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c6/emulate_efuse_controller.py +3 -3
  122. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c6/fields.py +4 -4
  123. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c6/mem_definition.py +1 -1
  124. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c61/__init__.py +0 -0
  125. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c61/emulate_efuse_controller.py +3 -3
  126. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32c61/mem_definition.py +1 -1
  127. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32e22/__init__.py +0 -0
  128. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32e22/emulate_efuse_controller.py +3 -3
  129. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32e22/mem_definition.py +1 -1
  130. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32e22/operations.py +3 -3
  131. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h2/__init__.py +0 -0
  132. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h2/emulate_efuse_controller.py +3 -3
  133. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h2/mem_definition.py +1 -1
  134. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h21/__init__.py +0 -0
  135. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h21/emulate_efuse_controller.py +3 -3
  136. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h21/mem_definition.py +1 -1
  137. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h4/__init__.py +0 -0
  138. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h4/emulate_efuse_controller.py +3 -3
  139. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32h4/mem_definition.py +1 -1
  140. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32p4/__init__.py +0 -0
  141. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32p4/emulate_efuse_controller.py +3 -3
  142. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32p4/mem_definition.py +1 -1
  143. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s2/__init__.py +0 -0
  144. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s2/emulate_efuse_controller.py +3 -3
  145. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s2/mem_definition.py +1 -1
  146. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s2/operations.py +3 -3
  147. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s3/__init__.py +0 -0
  148. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s3/emulate_efuse_controller.py +3 -3
  149. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s3/mem_definition.py +1 -1
  150. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s3/operations.py +4 -4
  151. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s31/__init__.py +0 -0
  152. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse/esp32s31/mem_definition.py +1 -1
  153. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32.yaml +0 -0
  154. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32c2.yaml +0 -0
  155. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32c3.yaml +0 -0
  156. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32c6.yaml +0 -0
  157. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32c61.yaml +0 -0
  158. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32e22.yaml +0 -0
  159. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32h2.yaml +0 -0
  160. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32h2_v0.0_v1.1.yaml +0 -0
  161. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32h4.yaml +0 -0
  162. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32p4.yaml +0 -0
  163. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32p4_v3.0.yaml +0 -0
  164. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32s2.yaml +0 -0
  165. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse/efuse_defs/esp32s3.yaml +0 -0
  166. {esptool-5.3.dev2 → esptool-5.3.1}/espefuse.py +0 -0
  167. {esptool-5.3.dev2 → esptool-5.3.1}/espsecure/__main__.py +0 -0
  168. {esptool-5.3.dev2 → esptool-5.3.1}/espsecure.py +0 -0
  169. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/__main__.py +0 -0
  170. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/config.py +0 -0
  171. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp32c2.py +1 -1
  172. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/esp8266.py +0 -0
  173. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/1/README.md +0 -0
  174. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32.json +0 -0
  175. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32c2.json +0 -0
  176. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32c3.json +0 -0
  177. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32c5.json +0 -0
  178. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32c6.json +0 -0
  179. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32h2.json +0 -0
  180. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32p4-rev1.json +0 -0
  181. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32s2.json +0 -0
  182. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp32s3.json +0 -0
  183. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/1/esp8266.json +0 -0
  184. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/2/LICENSE-APACHE +0 -0
  185. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/targets/stub_flasher/2/LICENSE-MIT +0 -0
  186. {esptool-5.3.dev2 → esptool-5.3.1}/esptool/uf2_writer.py +0 -0
  187. {esptool-5.3.dev2 → esptool-5.3.1}/esptool.egg-info/dependency_links.txt +0 -0
  188. {esptool-5.3.dev2 → esptool-5.3.1}/esptool.egg-info/entry_points.txt +0 -0
  189. {esptool-5.3.dev2 → esptool-5.3.1}/esptool.egg-info/top_level.txt +0 -0
  190. {esptool-5.3.dev2 → esptool-5.3.1}/esptool.py +0 -0
  191. {esptool-5.3.dev2 → esptool-5.3.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: esptool
3
- Version: 5.3.dev2
3
+ Version: 5.3.1
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+
@@ -28,6 +28,7 @@ Description-Content-Type: text/markdown
28
28
  License-File: LICENSE
29
29
  Requires-Dist: bitstring!=4.2.0,>=3.1.6
30
30
  Requires-Dist: cryptography>=43.0.0
31
+ Requires-Dist: cryptography<49.0.0; platform_system == "Darwin" and platform_machine == "x86_64"
31
32
  Requires-Dist: pyserial>=3.3
32
33
  Requires-Dist: reedsolo<1.8,>=1.5.3
33
34
  Requires-Dist: PyYAML>=5.1
@@ -60,6 +61,10 @@ A Python-based, open-source, platform-independent serial utility for flashing, p
60
61
 
61
62
  Visit the [documentation](https://docs.espressif.com/projects/esptool/) or run `esptool -h`.
62
63
 
64
+ ## Flasher Stub
65
+
66
+ esptool uploads a small [flasher stub](https://docs.espressif.com/projects/esptool/en/latest/esptool/flasher-stub.html) program to the chip to improve flashing performance and work around ROM bootloader limitations. The stub is developed in the [esp-flasher-stub](https://github.com/espressif/esp-flasher-stub) repository. Prebuilt binaries are bundled with esptool releases.
67
+
63
68
  ## Contribute
64
69
 
65
70
  If you're interested in contributing to esptool, please check the [contributions guide](https://docs.espressif.com/projects/esptool/en/latest/contributing.html).
@@ -9,6 +9,10 @@ A Python-based, open-source, platform-independent serial utility for flashing, p
9
9
 
10
10
  Visit the [documentation](https://docs.espressif.com/projects/esptool/) or run `esptool -h`.
11
11
 
12
+ ## Flasher Stub
13
+
14
+ esptool uploads a small [flasher stub](https://docs.espressif.com/projects/esptool/en/latest/esptool/flasher-stub.html) program to the chip to improve flashing performance and work around ROM bootloader limitations. The stub is developed in the [esp-flasher-stub](https://github.com/espressif/esp-flasher-stub) repository. Prebuilt binaries are bundled with esptool releases.
15
+
12
16
  ## Contribute
13
17
 
14
18
  If you're interested in contributing to esptool, please check the [contributions guide](https://docs.espressif.com/projects/esptool/en/latest/contributing.html).
@@ -1,149 +1,150 @@
1
- # SPDX-FileCopyrightText: 2009-2015 Chris Liechti
2
- # SPDX-FileContributor: 2020-2024 Espressif Systems (Shanghai) CO LTD
3
- # SPDX-License-Identifier: BSD-3-Clause
4
- #
5
- # Redirect data from a TCP/IP connection to a serial port and vice versa using RFC 2217.
6
-
7
- ###################################################################################
8
- # redirect data from a TCP/IP connection to a serial port and vice versa
9
- # using RFC 2217
10
- #
11
- # (C) 2009-2015 Chris Liechti <cliechti@gmx.net>
12
- #
13
- # SPDX-License-Identifier: BSD-3-Clause
14
-
15
- import logging
16
- import socket
17
- import sys
18
- import serial
19
-
20
- from esp_rfc2217_server.redirector import Redirector
21
- from esptool.util import check_deprecated_py_suffix
22
-
23
-
24
- def main():
25
- check_deprecated_py_suffix("esp_rfc2217_server")
26
- import argparse
27
-
28
- parser = argparse.ArgumentParser(
29
- description="RFC 2217 Serial to Network (TCP/IP) redirector.",
30
- epilog="NOTE: no security measures are implemented. "
31
- "Anyone can remotely connect to this service over the network.\n"
32
- "Only one connection at once is supported. "
33
- "When the connection is terminated it waits for the next connect.",
34
- )
35
-
36
- parser.add_argument("SERIALPORT")
37
-
38
- parser.add_argument(
39
- "-p",
40
- "--localport",
41
- type=int,
42
- help="local TCP port, default: %(default)s",
43
- metavar="TCPPORT",
44
- default=2217,
45
- )
46
-
47
- parser.add_argument(
48
- "-v",
49
- "--verbose",
50
- dest="verbosity",
51
- action="count",
52
- help="print more diagnostic messages (option can be given multiple times)",
53
- default=0,
54
- )
55
-
56
- parser.add_argument(
57
- "--r0",
58
- help="Use delays necessary for ESP32 revision 0 chips",
59
- action="store_true",
60
- )
61
-
62
- args = parser.parse_args()
63
-
64
- if args.verbosity > 3:
65
- args.verbosity = 3
66
- level = (logging.WARNING, logging.INFO, logging.DEBUG, logging.NOTSET)[
67
- args.verbosity
68
- ]
69
- logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.INFO)
70
- logging.getLogger("rfc2217").setLevel(level)
71
-
72
- # connect to serial port
73
- ser = serial.serial_for_url(args.SERIALPORT, do_not_open=True, exclusive=True)
74
- ser.timeout = 3 # required so that the reader thread can exit
75
- # reset control line as no _remote_ "terminal" has been connected yet
76
- ser.dtr = False
77
- ser.rts = False
78
-
79
- logging.info("RFC 2217 TCP/IP to Serial redirector - type Ctrl-C / BREAK to quit")
80
-
81
- try:
82
- ser.open()
83
- except serial.SerialException as e:
84
- logging.error(f"Could not open serial port {ser.name}: {e}")
85
- sys.exit(1)
86
-
87
- logging.info(f"Serving serial port: {ser.name}")
88
- settings = ser.get_settings()
89
-
90
- srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
91
- srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
92
- srv.bind(("", args.localport))
93
- srv.listen(1)
94
- logging.info(f"TCP/IP port: {args.localport}")
95
-
96
- try:
97
- host_ip = socket.gethostbyname(socket.gethostname())
98
- except OSError:
99
- # CI/minimal containers often have no DNS for gethostname(); the server
100
- # is still reachable on loopback.
101
- host_ip = "127.0.0.1"
102
- wait_msg = (
103
- "Waiting for connection ... use the 'rfc2217://"
104
- f"{host_ip}:{args.localport}?ign_set_control' as a PORT"
105
- )
106
- logging.info(wait_msg)
107
-
108
- while True:
109
- srv.settimeout(5)
110
- client_socket = None
111
- try:
112
- while client_socket is None:
113
- try:
114
- client_socket, addr = srv.accept()
115
- except TimeoutError:
116
- print(".", end="", flush=True)
117
- except KeyboardInterrupt:
118
- print("") # resetting inline print
119
- logging.info("Exited with keyboard interrupt")
120
- break
121
- try:
122
- logging.info(f"Connected by {addr[0]}:{addr[1]}")
123
- client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
124
- ser.rts = True
125
- ser.dtr = True
126
- # enter network <-> serial loop
127
- r = Redirector(ser, client_socket, args.verbosity > 0, args.r0)
128
- try:
129
- r.shortcircuit()
130
- finally:
131
- logging.info("Disconnected")
132
- r.stop()
133
- client_socket.close()
134
- ser.dtr = False
135
- ser.rts = False
136
- # Restore port settings (may have been changed by RFC 2217
137
- # capable client)
138
- ser.apply_settings(settings)
139
- except KeyboardInterrupt:
140
- print(flush=True)
141
- break
142
- except OSError as msg:
143
- logging.error(str(msg))
144
-
145
- logging.info("--- exit ---")
146
-
147
-
148
- if __name__ == "__main__":
149
- main()
1
+ # SPDX-FileCopyrightText: 2009-2015 Chris Liechti
2
+ # SPDX-FileContributor: 2020-2024 Espressif Systems (Shanghai) CO LTD
3
+ # SPDX-License-Identifier: BSD-3-Clause
4
+ #
5
+ # Redirect data from a TCP/IP connection to a serial port and vice versa using RFC 2217.
6
+
7
+ ###################################################################################
8
+ # redirect data from a TCP/IP connection to a serial port and vice versa
9
+ # using RFC 2217
10
+ #
11
+ # (C) 2009-2015 Chris Liechti <cliechti@gmx.net>
12
+ #
13
+ # SPDX-License-Identifier: BSD-3-Clause
14
+
15
+ import logging
16
+ import socket
17
+ import sys
18
+
19
+ import serial
20
+
21
+ from esp_rfc2217_server.redirector import Redirector
22
+ from esptool.util import check_deprecated_py_suffix
23
+
24
+
25
+ def main():
26
+ check_deprecated_py_suffix("esp_rfc2217_server")
27
+ import argparse
28
+
29
+ parser = argparse.ArgumentParser(
30
+ description="RFC 2217 Serial to Network (TCP/IP) redirector.",
31
+ epilog="NOTE: no security measures are implemented. "
32
+ "Anyone can remotely connect to this service over the network.\n"
33
+ "Only one connection at once is supported. "
34
+ "When the connection is terminated it waits for the next connect.",
35
+ )
36
+
37
+ parser.add_argument("SERIALPORT")
38
+
39
+ parser.add_argument(
40
+ "-p",
41
+ "--localport",
42
+ type=int,
43
+ help="local TCP port, default: %(default)s",
44
+ metavar="TCPPORT",
45
+ default=2217,
46
+ )
47
+
48
+ parser.add_argument(
49
+ "-v",
50
+ "--verbose",
51
+ dest="verbosity",
52
+ action="count",
53
+ help="print more diagnostic messages (option can be given multiple times)",
54
+ default=0,
55
+ )
56
+
57
+ parser.add_argument(
58
+ "--r0",
59
+ help="Use delays necessary for ESP32 revision 0 chips",
60
+ action="store_true",
61
+ )
62
+
63
+ args = parser.parse_args()
64
+
65
+ if args.verbosity > 3:
66
+ args.verbosity = 3
67
+ level = (logging.WARNING, logging.INFO, logging.DEBUG, logging.NOTSET)[
68
+ args.verbosity
69
+ ]
70
+ logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.INFO)
71
+ logging.getLogger("rfc2217").setLevel(level)
72
+
73
+ # connect to serial port
74
+ ser = serial.serial_for_url(args.SERIALPORT, do_not_open=True, exclusive=True)
75
+ ser.timeout = 3 # required so that the reader thread can exit
76
+ # reset control line as no _remote_ "terminal" has been connected yet
77
+ ser.dtr = False
78
+ ser.rts = False
79
+
80
+ logging.info("RFC 2217 TCP/IP to Serial redirector - type Ctrl-C / BREAK to quit")
81
+
82
+ try:
83
+ ser.open()
84
+ except serial.SerialException as e:
85
+ logging.error(f"Could not open serial port {ser.name}: {e}")
86
+ sys.exit(1)
87
+
88
+ logging.info(f"Serving serial port: {ser.name}")
89
+ settings = ser.get_settings()
90
+
91
+ srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
92
+ srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
93
+ srv.bind(("", args.localport))
94
+ srv.listen(1)
95
+ logging.info(f"TCP/IP port: {args.localport}")
96
+
97
+ try:
98
+ host_ip = socket.gethostbyname(socket.gethostname())
99
+ except OSError:
100
+ # CI/minimal containers often have no DNS for gethostname(); the server
101
+ # is still reachable on loopback.
102
+ host_ip = "127.0.0.1"
103
+ wait_msg = (
104
+ "Waiting for connection ... use the 'rfc2217://"
105
+ f"{host_ip}:{args.localport}?ign_set_control' as a PORT"
106
+ )
107
+ logging.info(wait_msg)
108
+
109
+ while True:
110
+ srv.settimeout(5)
111
+ client_socket = None
112
+ try:
113
+ while client_socket is None:
114
+ try:
115
+ client_socket, addr = srv.accept()
116
+ except TimeoutError:
117
+ print(".", end="", flush=True)
118
+ except KeyboardInterrupt:
119
+ print("") # resetting inline print
120
+ logging.info("Exited with keyboard interrupt")
121
+ break
122
+ try:
123
+ logging.info(f"Connected by {addr[0]}:{addr[1]}")
124
+ client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
125
+ ser.rts = True
126
+ ser.dtr = True
127
+ # enter network <-> serial loop
128
+ r = Redirector(ser, client_socket, args.verbosity > 0, args.r0)
129
+ try:
130
+ r.shortcircuit()
131
+ finally:
132
+ logging.info("Disconnected")
133
+ r.stop()
134
+ client_socket.close()
135
+ ser.dtr = False
136
+ ser.rts = False
137
+ # Restore port settings (may have been changed by RFC 2217
138
+ # capable client)
139
+ ser.apply_settings(settings)
140
+ except KeyboardInterrupt:
141
+ print(flush=True)
142
+ break
143
+ except OSError as msg:
144
+ logging.error(str(msg))
145
+
146
+ logging.info("--- exit ---")
147
+
148
+
149
+ if __name__ == "__main__":
150
+ main()
@@ -1,9 +1,9 @@
1
- # SPDX-FileCopyrightText: 2014-2024 Fredrik Ahlberg, Angus Gratton,
2
- # Espressif Systems (Shanghai) CO LTD, other contributors as noted.
3
- #
4
- # SPDX-License-Identifier: BSD-3-Clause
5
-
6
- import esp_rfc2217_server
7
-
8
- if __name__ == "__main__":
9
- esp_rfc2217_server.main()
1
+ # SPDX-FileCopyrightText: 2014-2024 Fredrik Ahlberg, Angus Gratton,
2
+ # Espressif Systems (Shanghai) CO LTD, other contributors as noted.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+
6
+ import esp_rfc2217_server
7
+
8
+ if __name__ == "__main__":
9
+ esp_rfc2217_server.main()
@@ -1,101 +1,102 @@
1
- # SPDX-FileCopyrightText: 2014-2024 Fredrik Ahlberg, Angus Gratton,
2
- # Espressif Systems (Shanghai) CO LTD, other contributors as noted.
3
- #
4
- # SPDX-License-Identifier: BSD-3-Clause
5
- import os
6
- import threading
7
- from esptool.reset import (
8
- ClassicReset,
9
- CustomReset,
10
- DEFAULT_RESET_DELAY,
11
- HardReset,
12
- UnixTightReset,
13
- )
14
- import serial
15
- import serial.rfc2217
16
- from serial.rfc2217 import (
17
- COM_PORT_OPTION,
18
- SET_CONTROL,
19
- SET_CONTROL_DTR_OFF,
20
- SET_CONTROL_DTR_ON,
21
- SET_CONTROL_RTS_OFF,
22
- SET_CONTROL_RTS_ON,
23
- )
24
-
25
- from esptool.config import load_config_file
26
-
27
- cfg, _ = load_config_file(verbose=True)
28
- cfg = cfg["esptool"]
29
-
30
-
31
- class EspPortManager(serial.rfc2217.PortManager):
32
- """
33
- The beginning of the reset sequence is detected and the proper reset sequence
34
- is applied in a thread. The rest of the reset sequence received is just ignored
35
- and not sent to the serial port.
36
- """
37
-
38
- def __init__(self, serial_port, connection, esp32r0_delay, logger=None):
39
- self.esp32r0_delay = esp32r0_delay
40
- self.is_download_mode = False
41
- super().__init__(serial_port, connection, logger)
42
-
43
- def _telnet_process_subnegotiation(self, suboption):
44
- if suboption[0:1] == COM_PORT_OPTION and suboption[1:2] == SET_CONTROL:
45
- if suboption[2:3] == SET_CONTROL_DTR_OFF:
46
- self.is_download_mode = False
47
- self.serial.dtr = False
48
- return
49
- elif suboption[2:3] == SET_CONTROL_RTS_OFF and not self.is_download_mode:
50
- reset_thread = threading.Thread(target=self._hard_reset_thread)
51
- reset_thread.daemon = True
52
- reset_thread.name = "hard_reset_thread"
53
- reset_thread.start()
54
- return
55
- elif suboption[2:3] == SET_CONTROL_DTR_ON and not self.is_download_mode:
56
- self.is_download_mode = True
57
- reset_thread = threading.Thread(target=self._reset_thread)
58
- reset_thread.daemon = True
59
- reset_thread.name = "reset_thread"
60
- reset_thread.start()
61
- return
62
- elif suboption[2:3] in [
63
- SET_CONTROL_DTR_ON,
64
- SET_CONTROL_RTS_ON,
65
- SET_CONTROL_RTS_OFF,
66
- ]:
67
- return
68
- # only in cases not handled above do the original implementation in PortManager
69
- super()._telnet_process_subnegotiation(suboption)
70
-
71
- def _hard_reset_thread(self):
72
- """
73
- The reset logic used for hard resetting the chip.
74
- """
75
- if self.logger:
76
- self.logger.info("Activating hard reset in thread")
77
- cfg_custom_hard_reset_sequence = cfg.get("custom_hard_reset_sequence")
78
- if cfg_custom_hard_reset_sequence is not None:
79
- CustomReset(self.serial, cfg_custom_hard_reset_sequence)()
80
- else:
81
- HardReset(self.serial)()
82
-
83
- def _reset_thread(self):
84
- """
85
- The reset logic is used from esptool because the RTS and DTR signals
86
- cannot be retransmitted through RFC 2217 with proper timing.
87
- """
88
- if self.logger:
89
- self.logger.info("Activating reset in thread")
90
-
91
- delay = DEFAULT_RESET_DELAY
92
- if self.esp32r0_delay:
93
- delay += 0.5
94
-
95
- cfg_custom_reset_sequence = cfg.get("custom_reset_sequence")
96
- if cfg_custom_reset_sequence is not None:
97
- CustomReset(self.serial, cfg_custom_reset_sequence)()
98
- elif os.name != "nt":
99
- UnixTightReset(self.serial, delay)()
100
- else:
101
- ClassicReset(self.serial, delay)()
1
+ # SPDX-FileCopyrightText: 2014-2024 Fredrik Ahlberg, Angus Gratton,
2
+ # Espressif Systems (Shanghai) CO LTD, other contributors as noted.
3
+ #
4
+ # SPDX-License-Identifier: BSD-3-Clause
5
+ import os
6
+ import threading
7
+
8
+ import serial
9
+ import serial.rfc2217
10
+ from serial.rfc2217 import (
11
+ COM_PORT_OPTION,
12
+ SET_CONTROL,
13
+ SET_CONTROL_DTR_OFF,
14
+ SET_CONTROL_DTR_ON,
15
+ SET_CONTROL_RTS_OFF,
16
+ SET_CONTROL_RTS_ON,
17
+ )
18
+
19
+ from esptool.config import load_config_file
20
+ from esptool.reset import (
21
+ DEFAULT_RESET_DELAY,
22
+ ClassicReset,
23
+ CustomReset,
24
+ HardReset,
25
+ UnixTightReset,
26
+ )
27
+
28
+ cfg, _ = load_config_file(verbose=True)
29
+ cfg = cfg["esptool"]
30
+
31
+
32
+ class EspPortManager(serial.rfc2217.PortManager):
33
+ """
34
+ The beginning of the reset sequence is detected and the proper reset sequence
35
+ is applied in a thread. The rest of the reset sequence received is just ignored
36
+ and not sent to the serial port.
37
+ """
38
+
39
+ def __init__(self, serial_port, connection, esp32r0_delay, logger=None):
40
+ self.esp32r0_delay = esp32r0_delay
41
+ self.is_download_mode = False
42
+ super().__init__(serial_port, connection, logger)
43
+
44
+ def _telnet_process_subnegotiation(self, suboption):
45
+ if suboption[0:1] == COM_PORT_OPTION and suboption[1:2] == SET_CONTROL:
46
+ if suboption[2:3] == SET_CONTROL_DTR_OFF:
47
+ self.is_download_mode = False
48
+ self.serial.dtr = False
49
+ return
50
+ elif suboption[2:3] == SET_CONTROL_RTS_OFF and not self.is_download_mode:
51
+ reset_thread = threading.Thread(target=self._hard_reset_thread)
52
+ reset_thread.daemon = True
53
+ reset_thread.name = "hard_reset_thread"
54
+ reset_thread.start()
55
+ return
56
+ elif suboption[2:3] == SET_CONTROL_DTR_ON and not self.is_download_mode:
57
+ self.is_download_mode = True
58
+ reset_thread = threading.Thread(target=self._reset_thread)
59
+ reset_thread.daemon = True
60
+ reset_thread.name = "reset_thread"
61
+ reset_thread.start()
62
+ return
63
+ elif suboption[2:3] in [
64
+ SET_CONTROL_DTR_ON,
65
+ SET_CONTROL_RTS_ON,
66
+ SET_CONTROL_RTS_OFF,
67
+ ]:
68
+ return
69
+ # only in cases not handled above do the original implementation in PortManager
70
+ super()._telnet_process_subnegotiation(suboption)
71
+
72
+ def _hard_reset_thread(self):
73
+ """
74
+ The reset logic used for hard resetting the chip.
75
+ """
76
+ if self.logger:
77
+ self.logger.info("Activating hard reset in thread")
78
+ cfg_custom_hard_reset_sequence = cfg.get("custom_hard_reset_sequence")
79
+ if cfg_custom_hard_reset_sequence is not None:
80
+ CustomReset(self.serial, cfg_custom_hard_reset_sequence)()
81
+ else:
82
+ HardReset(self.serial)()
83
+
84
+ def _reset_thread(self):
85
+ """
86
+ The reset logic is used from esptool because the RTS and DTR signals
87
+ cannot be retransmitted through RFC 2217 with proper timing.
88
+ """
89
+ if self.logger:
90
+ self.logger.info("Activating reset in thread")
91
+
92
+ delay = DEFAULT_RESET_DELAY
93
+ if self.esp32r0_delay:
94
+ delay += 0.5
95
+
96
+ cfg_custom_reset_sequence = cfg.get("custom_reset_sequence")
97
+ if cfg_custom_reset_sequence is not None:
98
+ CustomReset(self.serial, cfg_custom_reset_sequence)()
99
+ elif os.name != "nt":
100
+ UnixTightReset(self.serial, delay)()
101
+ else:
102
+ ClassicReset(self.serial, delay)()
@@ -7,20 +7,19 @@ import sys
7
7
  import rich_click as click
8
8
 
9
9
  import esptool
10
- from esptool.cli_util import BaudRateType, ChipType, ResetModeType, SerialPortType
11
- from esptool.logger import log
12
-
13
10
  from espefuse.cli_util import Group
14
11
  from espefuse.efuse.base_operations import BaseCommands
15
12
  from espefuse.efuse_interface import (
16
13
  DEPRECATED_COMMANDS,
17
- get_esp,
18
- init_commands,
19
- SUPPORTED_COMMANDS,
20
14
  SUPPORTED_BURN_COMMANDS,
21
- SUPPORTED_READ_COMMANDS,
22
15
  SUPPORTED_CHIPS,
16
+ SUPPORTED_COMMANDS,
17
+ SUPPORTED_READ_COMMANDS,
18
+ get_esp,
19
+ init_commands,
23
20
  )
21
+ from esptool.cli_util import BaudRateType, ChipType, ResetModeType, SerialPortType
22
+ from esptool.logger import log
24
23
  from esptool.util import check_deprecated_py_suffix
25
24
 
26
25
  __all__ = [
@@ -6,17 +6,16 @@ from typing import Any
6
6
 
7
7
  import rich_click as click
8
8
  from click.parser import OptionParser, ParsingState, _unpack_args
9
- from esptool.cli_util import Group as EsptoolGroup
10
- from esptool.logger import log
11
9
 
12
10
  from espefuse.efuse_interface import (
13
11
  DEPRECATED_COMMANDS,
14
- init_commands,
15
12
  SUPPORTED_BURN_COMMANDS,
16
- SUPPORTED_READ_COMMANDS,
17
13
  SUPPORTED_COMMANDS,
14
+ SUPPORTED_READ_COMMANDS,
15
+ init_commands,
18
16
  )
19
-
17
+ from esptool.cli_util import Group as EsptoolGroup
18
+ from esptool.logger import log
20
19
 
21
20
  click.rich_click.USE_CLICK_SHORT_HELP = True
22
21
  click.rich_click.COMMAND_GROUPS = {