esptool 5.3.dev3__tar.gz → 5.4.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 (197) hide show
  1. {esptool-5.3.dev3/esptool.egg-info → esptool-5.4.0}/PKG-INFO +7 -2
  2. {esptool-5.3.dev3 → esptool-5.4.0}/README.md +4 -0
  3. {esptool-5.3.dev3 → esptool-5.4.0}/esp_rfc2217_server/__init__.py +156 -150
  4. {esptool-5.3.dev3 → esptool-5.4.0}/esp_rfc2217_server/__main__.py +9 -9
  5. {esptool-5.3.dev3 → esptool-5.4.0}/esp_rfc2217_server/esp_port_manager.py +102 -102
  6. {esptool-5.3.dev3 → esptool-5.4.0}/esp_rfc2217_server.py +0 -0
  7. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/__init__.py +26 -14
  8. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/cli_util.py +9 -9
  9. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/base_fields.py +19 -3
  10. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/base_operations.py +93 -22
  11. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/emulate_efuse_controller_base.py +54 -4
  12. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32/emulate_efuse_controller.py +40 -4
  13. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32/fields.py +4 -1
  14. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32/mem_definition.py +4 -0
  15. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32/operations.py +4 -0
  16. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c2/emulate_efuse_controller.py +21 -6
  17. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c2/fields.py +1 -4
  18. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c2/mem_definition.py +8 -0
  19. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c2/operations.py +3 -2
  20. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c3/emulate_efuse_controller.py +27 -6
  21. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c3/fields.py +1 -4
  22. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c3/mem_definition.py +14 -1
  23. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c3/operations.py +3 -2
  24. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c5/emulate_efuse_controller.py +21 -6
  25. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c5/fields.py +1 -4
  26. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c5/mem_definition.py +13 -0
  27. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c5/operations.py +3 -2
  28. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c6/emulate_efuse_controller.py +21 -6
  29. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c6/fields.py +1 -4
  30. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c6/mem_definition.py +14 -1
  31. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c6/operations.py +3 -2
  32. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c61/emulate_efuse_controller.py +21 -6
  33. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c61/fields.py +1 -8
  34. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c61/mem_definition.py +16 -3
  35. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c61/operations.py +3 -2
  36. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32e22/emulate_efuse_controller.py +13 -2
  37. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32e22/fields.py +1 -4
  38. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32e22/mem_definition.py +13 -0
  39. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32e22/operations.py +3 -2
  40. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h2/emulate_efuse_controller.py +21 -6
  41. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h2/fields.py +1 -4
  42. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h2/mem_definition.py +13 -0
  43. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h2/operations.py +3 -2
  44. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h21/emulate_efuse_controller.py +21 -6
  45. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h21/fields.py +2 -8
  46. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h21/mem_definition.py +16 -3
  47. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h21/operations.py +3 -11
  48. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h4/emulate_efuse_controller.py +21 -6
  49. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h4/fields.py +1 -4
  50. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h4/mem_definition.py +13 -0
  51. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h4/operations.py +3 -2
  52. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32p4/emulate_efuse_controller.py +25 -6
  53. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32p4/fields.py +1 -4
  54. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32p4/mem_definition.py +13 -0
  55. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32p4/operations.py +3 -2
  56. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s2/emulate_efuse_controller.py +27 -6
  57. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s2/fields.py +1 -4
  58. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s2/mem_definition.py +16 -3
  59. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s2/operations.py +3 -2
  60. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s3/emulate_efuse_controller.py +56 -7
  61. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s3/fields.py +1 -4
  62. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s3/mem_definition.py +14 -1
  63. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s3/operations.py +3 -2
  64. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s31/emulate_efuse_controller.py +19 -4
  65. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s31/fields.py +1 -4
  66. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s31/mem_definition.py +16 -0
  67. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s31/operations.py +3 -2
  68. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/mem_definition_base.py +3 -1
  69. esptool-5.4.0/espefuse/efuse/token.py +178 -0
  70. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32h21.yaml +76 -86
  71. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32s31.yaml +8 -8
  72. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_interface.py +15 -3
  73. {esptool-5.3.dev3 → esptool-5.4.0}/espsecure/__init__.py +401 -33
  74. {esptool-5.3.dev3 → esptool-5.4.0}/espsecure/esp_hsm_sign/__init__.py +12 -19
  75. {esptool-5.3.dev3 → esptool-5.4.0}/espsecure/esp_hsm_sign/exceptions.py +16 -12
  76. esptool-5.4.0/espsecure/esp_sdc/__init__.py +1076 -0
  77. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/__init__.py +156 -153
  78. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/bin_image.py +19 -12
  79. esptool-5.4.0/esptool/cli_util.py +362 -0
  80. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/cmds.py +546 -177
  81. esptool-5.4.0/esptool/config.py +65 -0
  82. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/loader.py +186 -78
  83. esptool-5.4.0/esptool/logger.py +334 -0
  84. esptool-5.4.0/esptool/reset.py +173 -0
  85. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32c2.py +1 -1
  86. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32c3.py +3 -2
  87. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32c5.py +2 -2
  88. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32c6.py +1 -1
  89. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32c61.py +40 -10
  90. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32e22.py +1 -1
  91. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32h2.py +1 -1
  92. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32h21.py +21 -4
  93. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32h4.py +1 -1
  94. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32p4.py +15 -7
  95. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32s2.py +1 -1
  96. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32s3.py +3 -2
  97. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32s31.py +1 -1
  98. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/2/README.md +1 -1
  99. esptool-5.4.0/esptool/targets/stub_flasher/2/esp32.json +8 -0
  100. esptool-5.4.0/esptool/targets/stub_flasher/2/esp32c2.json +8 -0
  101. esptool-5.4.0/esptool/targets/stub_flasher/2/esp32c3.json +8 -0
  102. esptool-5.4.0/esptool/targets/stub_flasher/2/esp32c5.json +8 -0
  103. esptool-5.4.0/esptool/targets/stub_flasher/2/esp32c6.json +8 -0
  104. esptool-5.4.0/esptool/targets/stub_flasher/2/esp32c61.json +8 -0
  105. esptool-5.4.0/esptool/targets/stub_flasher/2/esp32h2.json +8 -0
  106. esptool-5.4.0/esptool/targets/stub_flasher/2/esp32h4.json +8 -0
  107. esptool-5.4.0/esptool/targets/stub_flasher/2/esp32p4-rev1.json +8 -0
  108. esptool-5.4.0/esptool/targets/stub_flasher/2/esp32p4.json +8 -0
  109. esptool-5.4.0/esptool/targets/stub_flasher/2/esp32s2.json +8 -0
  110. esptool-5.4.0/esptool/targets/stub_flasher/2/esp32s3.json +30 -0
  111. esptool-5.4.0/esptool/targets/stub_flasher/2/esp32s31.json +8 -0
  112. esptool-5.4.0/esptool/targets/stub_flasher/2/esp8266.json +8 -0
  113. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/util.py +29 -9
  114. {esptool-5.3.dev3 → esptool-5.4.0/esptool.egg-info}/PKG-INFO +7 -2
  115. {esptool-5.3.dev3 → esptool-5.4.0}/esptool.egg-info/SOURCES.txt +2 -0
  116. {esptool-5.3.dev3 → esptool-5.4.0}/esptool.egg-info/requires.txt +2 -1
  117. {esptool-5.3.dev3 → esptool-5.4.0}/pyproject.toml +6 -2
  118. esptool-5.3.dev3/esptool/cli_util.py +0 -653
  119. esptool-5.3.dev3/esptool/config.py +0 -96
  120. esptool-5.3.dev3/esptool/logger.py +0 -282
  121. esptool-5.3.dev3/esptool/reset.py +0 -210
  122. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32.json +0 -8
  123. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32c2.json +0 -8
  124. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32c3.json +0 -8
  125. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32c5.json +0 -8
  126. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32c6.json +0 -8
  127. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32c61.json +0 -8
  128. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32h2.json +0 -8
  129. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32h4.json +0 -8
  130. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32p4-rev1.json +0 -8
  131. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32p4.json +0 -8
  132. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32s2.json +0 -8
  133. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32s3.json +0 -30
  134. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp32s31.json +0 -8
  135. esptool-5.3.dev3/esptool/targets/stub_flasher/2/esp8266.json +0 -8
  136. {esptool-5.3.dev3 → esptool-5.4.0}/LICENSE +0 -0
  137. {esptool-5.3.dev3 → esptool-5.4.0}/MANIFEST.in +0 -0
  138. {esptool-5.3.dev3 → esptool-5.4.0}/esp_rfc2217_server/redirector.py +0 -0
  139. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/__main__.py +0 -0
  140. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/__init__.py +0 -0
  141. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/csv_table_parser.py +0 -0
  142. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32/__init__.py +0 -0
  143. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c2/__init__.py +0 -0
  144. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c3/__init__.py +0 -0
  145. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c5/__init__.py +0 -0
  146. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c6/__init__.py +0 -0
  147. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32c61/__init__.py +0 -0
  148. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32e22/__init__.py +0 -0
  149. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h2/__init__.py +0 -0
  150. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h21/__init__.py +0 -0
  151. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32h4/__init__.py +0 -0
  152. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32p4/__init__.py +0 -0
  153. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s2/__init__.py +0 -0
  154. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s3/__init__.py +0 -0
  155. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/esp32s31/__init__.py +0 -0
  156. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse/util.py +0 -0
  157. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32.yaml +0 -0
  158. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32c2.yaml +0 -0
  159. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32c3.yaml +0 -0
  160. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32c5.yaml +0 -0
  161. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32c6.yaml +0 -0
  162. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32c61.yaml +0 -0
  163. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32e22.yaml +0 -0
  164. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32h2.yaml +0 -0
  165. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32h2_v0.0_v1.1.yaml +0 -0
  166. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32h4.yaml +0 -0
  167. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32p4.yaml +0 -0
  168. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32p4_v3.0.yaml +0 -0
  169. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32s2.yaml +0 -0
  170. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse/efuse_defs/esp32s3.yaml +0 -0
  171. {esptool-5.3.dev3 → esptool-5.4.0}/espefuse.py +0 -0
  172. {esptool-5.3.dev3 → esptool-5.4.0}/espsecure/__main__.py +0 -0
  173. {esptool-5.3.dev3 → esptool-5.4.0}/espsecure.py +0 -0
  174. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/__main__.py +0 -0
  175. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/__init__.py +0 -0
  176. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp32.py +0 -0
  177. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/esp8266.py +0 -0
  178. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/1/README.md +0 -0
  179. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/1/esp32.json +0 -0
  180. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/1/esp32c2.json +0 -0
  181. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/1/esp32c3.json +0 -0
  182. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/1/esp32c5.json +0 -0
  183. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/1/esp32c6.json +0 -0
  184. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/1/esp32h2.json +0 -0
  185. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/1/esp32p4-rev1.json +0 -0
  186. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/1/esp32s2.json +0 -0
  187. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/1/esp32s3.json +0 -0
  188. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/1/esp8266.json +0 -0
  189. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/2/LICENSE-APACHE +0 -0
  190. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/targets/stub_flasher/2/LICENSE-MIT +0 -0
  191. {esptool-5.3.dev3 → esptool-5.4.0}/esptool/uf2_writer.py +0 -0
  192. {esptool-5.3.dev3 → esptool-5.4.0}/esptool.egg-info/dependency_links.txt +0 -0
  193. {esptool-5.3.dev3 → esptool-5.4.0}/esptool.egg-info/entry_points.txt +0 -0
  194. {esptool-5.3.dev3 → esptool-5.4.0}/esptool.egg-info/top_level.txt +0 -0
  195. {esptool-5.3.dev3 → esptool-5.4.0}/esptool.py +0 -0
  196. {esptool-5.3.dev3 → esptool-5.4.0}/setup.cfg +0 -0
  197. {esptool-5.3.dev3 → esptool-5.4.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: esptool
3
- Version: 5.3.dev3
3
+ Version: 5.4.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+
@@ -34,6 +34,7 @@ Requires-Dist: PyYAML>=5.1
34
34
  Requires-Dist: intelhex
35
35
  Requires-Dist: rich_click<2
36
36
  Requires-Dist: click<9
37
+ Requires-Dist: esp-pylib[cli,ide,serial]>=1.0.0
37
38
  Provides-Extra: dev
38
39
  Requires-Dist: pyelftools; extra == "dev"
39
40
  Requires-Dist: coverage~=6.0; extra == "dev"
@@ -45,7 +46,7 @@ Requires-Dist: czespressif; extra == "dev"
45
46
  Provides-Extra: hsm
46
47
  Requires-Dist: python-pkcs11; extra == "hsm"
47
48
  Provides-Extra: docs
48
- Requires-Dist: esp-docs~=2.1; extra == "docs"
49
+ Requires-Dist: esp-docs<3,>=2.1.4; extra == "docs"
49
50
  Requires-Dist: sphinx-tabs; extra == "docs"
50
51
  Dynamic: license-file
51
52
 
@@ -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,150 +1,156 @@
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
+ # SPDX-FileCopyrightText: 2009-2015 Chris Liechti
2
+ # SPDX-FileContributor: 2020-2026 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
+
18
+ import rich_click as click
19
+ import serial
20
+ from esp_pylib.cli_types import SerialPortType
21
+ from rich.markup import escape
22
+
23
+ from esp_rfc2217_server.redirector import Redirector
24
+ from esptool.logger import log
25
+ from esptool.util import check_deprecated_py_suffix
26
+
27
+
28
+ @click.command(
29
+ no_args_is_help=True,
30
+ context_settings=dict(help_option_names=["-h", "--help"], max_content_width=120),
31
+ help="RFC 2217 Serial to Network (TCP/IP) redirector.",
32
+ epilog="NOTE: no security measures are implemented. "
33
+ "Anyone can remotely connect to this service over the network. "
34
+ "Only one connection at once is supported. "
35
+ "When the connection is terminated it waits for the next connect.",
36
+ )
37
+ @click.argument("serialport", metavar="SERIALPORT", type=SerialPortType())
38
+ @click.option(
39
+ "--localport",
40
+ "-p",
41
+ type=int,
42
+ metavar="TCPPORT",
43
+ default=2217,
44
+ show_default=True,
45
+ help="Local TCP port.",
46
+ )
47
+ @click.option(
48
+ "--verbose",
49
+ "-v",
50
+ "verbosity",
51
+ count=True,
52
+ help="Print more diagnostic messages (option can be given multiple times).",
53
+ )
54
+ @click.option(
55
+ "--r0",
56
+ is_flag=True,
57
+ help="Use delays necessary for ESP32 revision 0 chips.",
58
+ )
59
+ def cli(serialport: str, localport: int, verbosity: int, r0: bool):
60
+ if verbosity > 3:
61
+ verbosity = 3
62
+ # The ``-v`` count only tunes pyserial's RFC2217 ``PortManager``, which
63
+ # logs through the stdlib ``logging`` module (it expects a
64
+ # ``logging.Logger``). The server's own status/error output below goes
65
+ # through the shared esptool/esp-pylib logger instead.
66
+ level = (logging.WARNING, logging.INFO, logging.DEBUG, logging.NOTSET)[verbosity]
67
+ logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.INFO)
68
+ logging.getLogger("rfc2217").setLevel(level)
69
+
70
+ # connect to serial port
71
+ ser = serial.serial_for_url(serialport, do_not_open=True, exclusive=True)
72
+ ser.timeout = 3 # required so that the reader thread can exit
73
+ # reset control line as no _remote_ "terminal" has been connected yet
74
+ ser.dtr = False
75
+ ser.rts = False
76
+
77
+ log.print("RFC 2217 TCP/IP to Serial redirector - type Ctrl-C / BREAK to quit")
78
+
79
+ try:
80
+ ser.open()
81
+ except serial.SerialException as e:
82
+ log.die(f"Could not open serial port {escape(str(ser.name))}: {escape(str(e))}")
83
+
84
+ log.print(f"Serving serial port: {ser.name}")
85
+ settings = ser.get_settings()
86
+
87
+ srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
88
+ srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
89
+ srv.bind(("", localport))
90
+ srv.listen(1)
91
+ log.print(f"TCP/IP port: {localport}")
92
+
93
+ try:
94
+ host_ip = socket.gethostbyname(socket.gethostname())
95
+ except OSError:
96
+ # CI/minimal containers often have no DNS for gethostname(); the server
97
+ # is still reachable on loopback.
98
+ host_ip = "127.0.0.1"
99
+ wait_msg = (
100
+ "Waiting for connection ... use the 'rfc2217://"
101
+ f"{host_ip}:{localport}?ign_set_control' as a PORT"
102
+ )
103
+ log.print(wait_msg)
104
+
105
+ while True:
106
+ srv.settimeout(5)
107
+ client_socket = None
108
+ try:
109
+ while client_socket is None:
110
+ try:
111
+ client_socket, addr = srv.accept()
112
+ except TimeoutError:
113
+ print(".", end="", flush=True)
114
+ except KeyboardInterrupt:
115
+ print("") # resetting inline print
116
+ log.print("Exited with keyboard interrupt")
117
+ break
118
+ try:
119
+ log.print(f"Connected by {addr[0]}:{addr[1]}")
120
+ client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
121
+ ser.rts = True
122
+ ser.dtr = True
123
+ # enter network <-> serial loop
124
+ r = Redirector(ser, client_socket, verbosity > 0, r0)
125
+ try:
126
+ r.shortcircuit()
127
+ finally:
128
+ log.print("Disconnected")
129
+ r.stop()
130
+ client_socket.close()
131
+ ser.dtr = False
132
+ ser.rts = False
133
+ # Restore port settings (may have been changed by RFC 2217
134
+ # capable client)
135
+ ser.apply_settings(settings)
136
+ except KeyboardInterrupt:
137
+ print(flush=True)
138
+ break
139
+ except OSError as msg:
140
+ log.err(str(msg))
141
+
142
+ log.print("--- exit ---")
143
+
144
+
145
+ def main(argv: list[str] | None = None):
146
+ """Entry point for the ``esp_rfc2217_server`` console script.
147
+
148
+ ``argv`` is an optional override for ``sys.argv`` (a list of argument
149
+ strings) to ease programmatic invocation and testing.
150
+ """
151
+ check_deprecated_py_suffix("esp_rfc2217_server")
152
+ cli.main(args=argv)
153
+
154
+
155
+ if __name__ == "__main__":
156
+ 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,102 +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
-
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)()
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)()