esptool 4.8.dev5__tar.gz → 4.9.dev1__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 (163) hide show
  1. {esptool-4.8.dev5/esptool.egg-info → esptool-4.9.dev1}/PKG-INFO +19 -2
  2. esptool-4.9.dev1/esp_rfc2217_server/__init__.py +124 -0
  3. esptool-4.9.dev1/esp_rfc2217_server/__main__.py +9 -0
  4. esptool-4.9.dev1/esp_rfc2217_server/esp_port_manager.py +101 -0
  5. esptool-4.9.dev1/esp_rfc2217_server/redirector.py +89 -0
  6. esptool-4.9.dev1/esp_rfc2217_server.py +56 -0
  7. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/base_fields.py +36 -0
  8. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c2/fields.py +1 -1
  9. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c2/mem_definition.py +0 -3
  10. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c2/operations.py +2 -4
  11. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c3/fields.py +1 -1
  12. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c3/mem_definition.py +0 -4
  13. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c3/operations.py +2 -4
  14. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c5/fields.py +5 -5
  15. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c5/mem_definition.py +0 -4
  16. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c5/operations.py +5 -1
  17. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c5beta3/fields.py +5 -5
  18. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c5beta3/mem_definition.py +0 -4
  19. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c6/fields.py +1 -1
  20. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c6/mem_definition.py +0 -4
  21. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c6/operations.py +2 -4
  22. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c61/fields.py +5 -5
  23. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c61/mem_definition.py +0 -4
  24. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c61/operations.py +5 -1
  25. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32h2/fields.py +1 -1
  26. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32h2/mem_definition.py +0 -4
  27. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32h2/operations.py +2 -4
  28. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32h2beta1/fields.py +1 -1
  29. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32h2beta1/mem_definition.py +0 -4
  30. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32h2beta1/operations.py +2 -4
  31. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32p4/fields.py +5 -6
  32. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32p4/mem_definition.py +0 -4
  33. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32p4/operations.py +5 -1
  34. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s2/fields.py +1 -1
  35. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s2/mem_definition.py +0 -4
  36. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s2/operations.py +2 -4
  37. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s3/fields.py +14 -1
  38. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s3/mem_definition.py +10 -4
  39. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s3/operations.py +2 -3
  40. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s3beta2/fields.py +1 -1
  41. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s3beta2/mem_definition.py +0 -4
  42. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s3beta2/operations.py +2 -4
  43. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/mem_definition_base.py +14 -1
  44. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse_defs/esp32c5.yaml +59 -24
  45. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse_defs/esp32c5beta3.yaml +41 -22
  46. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse_defs/esp32c61.yaml +38 -12
  47. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse_defs/esp32p4.yaml +112 -69
  48. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse_defs/esp32s3.yaml +5 -3
  49. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/__init__.py +100 -5
  50. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/cmds.py +73 -23
  51. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/config.py +2 -0
  52. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/loader.py +25 -9
  53. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/reset.py +1 -1
  54. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32.py +3 -7
  55. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32c2.py +12 -3
  56. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32c3.py +19 -1
  57. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32c5.py +13 -3
  58. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32c5beta3.py +12 -0
  59. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32c6.py +2 -1
  60. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32c61.py +39 -2
  61. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32h2.py +6 -1
  62. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32p4.py +70 -6
  63. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32s2.py +29 -32
  64. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32s3.py +34 -36
  65. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/README.md +1 -1
  66. esptool-4.9.dev1/esptool/targets/stub_flasher/1/esp32c61.json +8 -0
  67. {esptool-4.8.dev5 → esptool-4.9.dev1/esptool.egg-info}/PKG-INFO +19 -2
  68. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool.egg-info/SOURCES.txt +5 -0
  69. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool.egg-info/requires.txt +1 -1
  70. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool.egg-info/top_level.txt +2 -3
  71. {esptool-4.8.dev5 → esptool-4.9.dev1}/pyproject.toml +4 -3
  72. {esptool-4.8.dev5 → esptool-4.9.dev1}/setup.py +1 -1
  73. esptool-4.8.dev5/esp_rfc2217_server.py +0 -311
  74. {esptool-4.8.dev5 → esptool-4.9.dev1}/LICENSE +0 -0
  75. {esptool-4.8.dev5 → esptool-4.9.dev1}/MANIFEST.in +0 -0
  76. {esptool-4.8.dev5 → esptool-4.9.dev1}/README.md +0 -0
  77. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/__init__.py +0 -0
  78. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/__main__.py +0 -0
  79. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/__init__.py +0 -0
  80. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/base_operations.py +0 -0
  81. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/csv_table_parser.py +0 -0
  82. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/emulate_efuse_controller_base.py +0 -0
  83. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32/__init__.py +0 -0
  84. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32/emulate_efuse_controller.py +0 -0
  85. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32/fields.py +0 -0
  86. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32/mem_definition.py +0 -0
  87. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32/operations.py +0 -0
  88. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c2/__init__.py +0 -0
  89. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c2/emulate_efuse_controller.py +0 -0
  90. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c3/__init__.py +0 -0
  91. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c3/emulate_efuse_controller.py +0 -0
  92. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c5/__init__.py +0 -0
  93. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c5/emulate_efuse_controller.py +0 -0
  94. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c5beta3/__init__.py +0 -0
  95. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c5beta3/emulate_efuse_controller.py +0 -0
  96. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c5beta3/operations.py +0 -0
  97. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c6/__init__.py +0 -0
  98. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c6/emulate_efuse_controller.py +0 -0
  99. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c61/__init__.py +0 -0
  100. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32c61/emulate_efuse_controller.py +0 -0
  101. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32h2/__init__.py +0 -0
  102. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32h2/emulate_efuse_controller.py +0 -0
  103. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32h2beta1/__init__.py +0 -0
  104. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32h2beta1/emulate_efuse_controller.py +0 -0
  105. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32p4/__init__.py +0 -0
  106. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32p4/emulate_efuse_controller.py +0 -0
  107. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s2/__init__.py +0 -0
  108. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s2/emulate_efuse_controller.py +0 -0
  109. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s3/__init__.py +0 -0
  110. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s3/emulate_efuse_controller.py +0 -0
  111. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s3beta2/__init__.py +0 -0
  112. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/esp32s3beta2/emulate_efuse_controller.py +0 -0
  113. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse/util.py +0 -0
  114. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse_defs/esp32.yaml +0 -0
  115. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse_defs/esp32c2.yaml +0 -0
  116. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse_defs/esp32c3.yaml +0 -0
  117. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse_defs/esp32c6.yaml +0 -0
  118. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse_defs/esp32h2.yaml +0 -0
  119. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse/efuse_defs/esp32s2.yaml +0 -0
  120. {esptool-4.8.dev5 → esptool-4.9.dev1}/espefuse.py +0 -0
  121. {esptool-4.8.dev5 → esptool-4.9.dev1}/espsecure/__init__.py +0 -0
  122. {esptool-4.8.dev5 → esptool-4.9.dev1}/espsecure/__main__.py +0 -0
  123. {esptool-4.8.dev5 → esptool-4.9.dev1}/espsecure/esp_hsm_sign/__init__.py +0 -0
  124. {esptool-4.8.dev5 → esptool-4.9.dev1}/espsecure/esp_hsm_sign/exceptions.py +0 -0
  125. {esptool-4.8.dev5 → esptool-4.9.dev1}/espsecure.py +0 -0
  126. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/__main__.py +0 -0
  127. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/bin_image.py +0 -0
  128. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/__init__.py +0 -0
  129. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32c6beta.py +0 -0
  130. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32h2beta1.py +0 -0
  131. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32h2beta2.py +0 -0
  132. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp32s3beta2.py +0 -0
  133. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/esp8266.py +0 -0
  134. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32.json +0 -0
  135. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32c2.json +0 -0
  136. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32c3.json +0 -0
  137. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32c5.json +0 -0
  138. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32c5beta3.json +0 -0
  139. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32c6.json +0 -0
  140. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32c6beta.json +0 -0
  141. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32h2.json +0 -0
  142. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32h2beta1.json +0 -0
  143. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32h2beta2.json +0 -0
  144. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32p4.json +0 -0
  145. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32s2.json +0 -0
  146. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32s3.json +0 -0
  147. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp32s3beta2.json +0 -0
  148. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/1/esp8266.json +0 -0
  149. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/2/LICENSE-APACHE +0 -0
  150. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/2/LICENSE-MIT +0 -0
  151. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/2/README.md +0 -0
  152. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/2/esp32.json +0 -0
  153. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/2/esp32c2.json +0 -0
  154. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/2/esp32c3.json +0 -0
  155. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/2/esp32c6.json +0 -0
  156. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/2/esp32h2.json +0 -0
  157. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/2/esp32s2.json +0 -0
  158. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/targets/stub_flasher/2/esp32s3.json +0 -0
  159. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/uf2_writer.py +0 -0
  160. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool/util.py +0 -0
  161. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool.egg-info/dependency_links.txt +0 -0
  162. {esptool-4.8.dev5 → esptool-4.9.dev1}/esptool.py +0 -0
  163. {esptool-4.8.dev5 → esptool-4.9.dev1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: esptool
3
- Version: 4.8.dev5
3
+ Version: 4.9.dev1
4
4
  Summary: A serial utility to communicate & flash code to Espressif chips.
5
5
  Author: Fredrik Ahlberg (themadinventor), Angus Gratton (projectgus), Espressif Systems
6
6
  License: GPLv2+
@@ -24,11 +24,28 @@ Classifier: Programming Language :: Python :: 3.9
24
24
  Classifier: Programming Language :: Python :: 3.10
25
25
  Classifier: Programming Language :: Python :: 3.11
26
26
  Classifier: Programming Language :: Python :: 3.12
27
+ Classifier: Programming Language :: Python :: 3.13
27
28
  Requires-Python: >=3.7
28
29
  Description-Content-Type: text/markdown
30
+ License-File: LICENSE
31
+ Requires-Dist: bitstring!=4.2.0,>=3.1.6
32
+ Requires-Dist: cryptography>=2.1.4
33
+ Requires-Dist: ecdsa>=0.16.0
34
+ Requires-Dist: pyserial>=3.3
35
+ Requires-Dist: reedsolo<1.8,>=1.5.3
36
+ Requires-Dist: PyYAML>=5.1
37
+ Requires-Dist: intelhex
38
+ Requires-Dist: argcomplete>=3; sys_platform != "win32"
29
39
  Provides-Extra: dev
40
+ Requires-Dist: pyelftools; extra == "dev"
41
+ Requires-Dist: coverage~=6.0; extra == "dev"
42
+ Requires-Dist: pre-commit; extra == "dev"
43
+ Requires-Dist: pytest; extra == "dev"
44
+ Requires-Dist: pytest-rerunfailures; extra == "dev"
45
+ Requires-Dist: requests; extra == "dev"
46
+ Requires-Dist: commitizen; extra == "dev"
30
47
  Provides-Extra: hsm
31
- License-File: LICENSE
48
+ Requires-Dist: python-pkcs11; extra == "hsm"
32
49
 
33
50
  # esptool.py
34
51
 
@@ -0,0 +1,124 @@
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
+
22
+
23
+ def main():
24
+ import argparse
25
+
26
+ parser = argparse.ArgumentParser(
27
+ description="RFC 2217 Serial to Network (TCP/IP) redirector.",
28
+ epilog="NOTE: no security measures are implemented. "
29
+ "Anyone can remotely connect to this service over the network.\n"
30
+ "Only one connection at once is supported. "
31
+ "When the connection is terminated it waits for the next connect.",
32
+ )
33
+
34
+ parser.add_argument("SERIALPORT")
35
+
36
+ parser.add_argument(
37
+ "-p",
38
+ "--localport",
39
+ type=int,
40
+ help="local TCP port, default: %(default)s",
41
+ metavar="TCPPORT",
42
+ default=2217,
43
+ )
44
+
45
+ parser.add_argument(
46
+ "-v",
47
+ "--verbose",
48
+ dest="verbosity",
49
+ action="count",
50
+ help="print more diagnostic messages (option can be given multiple times)",
51
+ default=0,
52
+ )
53
+
54
+ parser.add_argument(
55
+ "--r0",
56
+ help="Use delays necessary for ESP32 revision 0 chips",
57
+ action="store_true",
58
+ )
59
+
60
+ args = parser.parse_args()
61
+
62
+ if args.verbosity > 3:
63
+ args.verbosity = 3
64
+ level = (logging.WARNING, logging.INFO, logging.DEBUG, logging.NOTSET)[
65
+ args.verbosity
66
+ ]
67
+ logging.basicConfig(level=logging.INFO)
68
+ # logging.getLogger('root').setLevel(logging.INFO)
69
+ logging.getLogger("rfc2217").setLevel(level)
70
+
71
+ # connect to serial port
72
+ ser = serial.serial_for_url(args.SERIALPORT, do_not_open=True, exclusive=True)
73
+ ser.timeout = 3 # required so that the reader thread can exit
74
+ # reset control line as no _remote_ "terminal" has been connected yet
75
+ ser.dtr = False
76
+ ser.rts = False
77
+
78
+ logging.info(" RFC 2217 TCP/IP to Serial redirector - type Ctrl-C / BREAK to quit")
79
+
80
+ try:
81
+ ser.open()
82
+ except serial.SerialException as e:
83
+ logging.error(" Could not open serial port {}: {}".format(ser.name, e))
84
+ sys.exit(1)
85
+
86
+ logging.info(" Serving serial port: {}".format(ser.name))
87
+ settings = ser.get_settings()
88
+
89
+ srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
90
+ srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
91
+ srv.bind(("", args.localport))
92
+ srv.listen(1)
93
+ logging.info(" TCP/IP port: {}".format(args.localport))
94
+ while True:
95
+ try:
96
+ client_socket, addr = srv.accept()
97
+ logging.info("Connected by {}:{}".format(addr[0], addr[1]))
98
+ client_socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
99
+ ser.rts = True
100
+ ser.dtr = True
101
+ # enter network <-> serial loop
102
+ r = Redirector(ser, client_socket, args.verbosity > 0, args.r0)
103
+ try:
104
+ r.shortcircuit()
105
+ finally:
106
+ logging.info("Disconnected")
107
+ r.stop()
108
+ client_socket.close()
109
+ ser.dtr = False
110
+ ser.rts = False
111
+ # Restore port settings (may have been changed by RFC 2217
112
+ # capable client)
113
+ ser.apply_settings(settings)
114
+ except KeyboardInterrupt:
115
+ sys.stdout.write("\n")
116
+ break
117
+ except socket.error as msg:
118
+ logging.error(str(msg))
119
+
120
+ logging.info("--- exit ---")
121
+
122
+
123
+ if __name__ == "__main__":
124
+ main()
@@ -0,0 +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()
@@ -0,0 +1,101 @@
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(EspPortManager, self).__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(EspPortManager, self)._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.py 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)()
@@ -0,0 +1,89 @@
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 threading
6
+ import time
7
+ import logging
8
+ import socket
9
+
10
+ from esp_rfc2217_server.esp_port_manager import EspPortManager
11
+
12
+
13
+ class Redirector(object):
14
+ def __init__(self, serial_instance, socket, debug=False, esp32r0delay=False):
15
+ self.serial = serial_instance
16
+ self.socket = socket
17
+ self._write_lock = threading.Lock()
18
+ self.rfc2217 = EspPortManager(
19
+ self.serial,
20
+ self,
21
+ esp32r0delay,
22
+ logger=logging.getLogger("rfc2217.server") if debug else None,
23
+ )
24
+ self.log = logging.getLogger("redirector")
25
+ self.force_exit = False
26
+
27
+ def statusline_poller(self):
28
+ self.log.debug("status line poll thread started")
29
+ while self.alive:
30
+ time.sleep(1)
31
+ self.rfc2217.check_modem_lines()
32
+ self.log.debug("status line poll thread terminated")
33
+
34
+ def shortcircuit(self):
35
+ """connect the serial port to the TCP port by copying everything
36
+ from one side to the other"""
37
+ self.alive = True
38
+ self.thread_read = threading.Thread(target=self.reader)
39
+ self.thread_read.daemon = True
40
+ self.thread_read.name = "serial->socket"
41
+ self.thread_read.start()
42
+ self.thread_poll = threading.Thread(target=self.statusline_poller)
43
+ self.thread_poll.daemon = True
44
+ self.thread_poll.name = "status line poll"
45
+ self.thread_poll.start()
46
+ self.writer()
47
+
48
+ def reader(self):
49
+ """loop forever and copy serial->socket"""
50
+ self.log.debug("reader thread started")
51
+ while self.alive:
52
+ try:
53
+ data = self.serial.read(self.serial.in_waiting or 1)
54
+ if data:
55
+ # escape outgoing data when needed (Telnet IAC (0xff) character)
56
+ self.write(b"".join(self.rfc2217.escape(data)))
57
+ except socket.error as msg:
58
+ self.log.error("{}".format(msg))
59
+ # probably got disconnected
60
+ break
61
+ self.alive = False
62
+ self.log.debug("reader thread terminated")
63
+
64
+ def write(self, data):
65
+ """thread safe socket write with no data escaping. used to send telnet stuff"""
66
+ with self._write_lock:
67
+ self.socket.sendall(data)
68
+
69
+ def writer(self):
70
+ """loop forever and copy socket->serial"""
71
+ while self.alive:
72
+ try:
73
+ data = self.socket.recv(1024)
74
+ if not data:
75
+ break
76
+ self.serial.write(b"".join(self.rfc2217.filter(data)))
77
+ except socket.error as msg:
78
+ self.log.error("{}".format(msg))
79
+ # probably got disconnected
80
+ break
81
+ self.stop()
82
+
83
+ def stop(self):
84
+ """Stop copying"""
85
+ self.log.debug("stopping")
86
+ if self.alive:
87
+ self.alive = False
88
+ self.thread_read.join()
89
+ self.thread_poll.join()
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env python
2
+ #
3
+ # SPDX-FileCopyrightText: 2014-2024 Fredrik Ahlberg, Angus Gratton,
4
+ # Espressif Systems (Shanghai) CO LTD, other contributors as noted.
5
+ #
6
+ # SPDX-License-Identifier: BSD-3-Clause
7
+
8
+ # This executable script is a thin wrapper around the main functionality
9
+ # in the esp_rfc2217_server Python package
10
+
11
+ # When updating this script, please also update esptool.py, espefuse.py and espsecure.py
12
+
13
+ ###################################################################################
14
+ # Redirect data from a TCP/IP connection to a serial port and vice versa using RFC 2217.
15
+ #
16
+ # This is a modified version of rfc2217_server.py provided by the pyserial package
17
+ # (pythonhosted.org/pyserial/examples.html#single-port-tcp-ip-serial-bridge-rfc-2217).
18
+ # It uses a custom PortManager to properly apply the RTS & DTR signals
19
+ # for resetting ESP chips.
20
+ #
21
+ # Run the following command on the server side to make
22
+ # connection between /dev/ttyUSB1 and TCP port 4000:
23
+ #
24
+ # python esp_rfc2217_server.py -p 4000 /dev/ttyUSB1
25
+ #
26
+ # Esptool can connect to the ESP device through that server as it is
27
+ # demonstrated in the following example:
28
+ #
29
+ # esptool.py --port rfc2217://localhost:4000?ign_set_control flash_id
30
+ #
31
+
32
+ import contextlib
33
+ import os
34
+ import sys
35
+
36
+ if os.name != "nt":
37
+ # Linux/macOS: remove current script directory to avoid importing this file
38
+ # as a module; we want to import the installed esp_rfc2217_server module instead
39
+ with contextlib.suppress(ValueError):
40
+ executable_dir = os.path.dirname(sys.executable)
41
+ sys.path = [
42
+ path
43
+ for path in sys.path
44
+ if not path.endswith(("/bin", "/sbin")) and path != executable_dir
45
+ ]
46
+
47
+ # Linux/macOS: delete imported module entry to force Python to load
48
+ # the module from scratch; this enables importing esp_rfc2217_server module in
49
+ # other Python scripts
50
+ with contextlib.suppress(KeyError):
51
+ del sys.modules["esp_rfc2217_server"]
52
+
53
+ import esp_rfc2217_server
54
+
55
+ if __name__ == "__main__":
56
+ esp_rfc2217_server.main()
@@ -653,6 +653,42 @@ class EspEfusesBase(object):
653
653
  # Overwrite this function for a specific target if you want to check if a certain eFuse(s) can be burned.
654
654
  return False
655
655
 
656
+ def get_major_chip_version(self):
657
+ try:
658
+ return self["WAFER_VERSION_MAJOR"].get()
659
+ except KeyError:
660
+ return 0
661
+
662
+ def get_minor_chip_version(self):
663
+ try:
664
+ return self["WAFER_VERSION_MINOR"].get()
665
+ except KeyError:
666
+ return 0
667
+
668
+ def get_chip_version(self):
669
+ return self.get_major_chip_version() * 100 + self.get_minor_chip_version()
670
+
671
+ def get_major_block_version(self):
672
+ try:
673
+ return self["BLK_VERSION_MAJOR"].get()
674
+ except KeyError:
675
+ return 0
676
+
677
+ def get_minor_block_version(self):
678
+ try:
679
+ return self["BLK_VERSION_MINOR"].get()
680
+ except KeyError:
681
+ return 0
682
+
683
+ def get_block_version(self):
684
+ return self.get_major_block_version() * 100 + self.get_minor_block_version()
685
+
686
+ def get_pkg_version(self):
687
+ try:
688
+ return self["PKG_VERSION"].get()
689
+ except KeyError:
690
+ return 0
691
+
656
692
 
657
693
  class EfuseFieldBase(EfuseProtectBase):
658
694
  def __init__(self, parent, param):
@@ -102,7 +102,7 @@ class EspEfuses(base_fields.EspEfusesBase):
102
102
  for efuse in self.Fields.BLOCK2_CALIBRATION_EFUSES
103
103
  ]
104
104
  else:
105
- if self["BLK_VERSION_MINOR"].get() == 1:
105
+ if self.get_block_version() >= 1:
106
106
  self.efuses += [
107
107
  EfuseField.convert(self, efuse)
108
108
  for efuse in self.Fields.BLOCK2_CALIBRATION_EFUSES
@@ -97,10 +97,7 @@ class EfuseDefineFields(EfuseFieldsBase):
97
97
  def __init__(self, extend_efuse_table) -> None:
98
98
  # List of efuse fields from TRM the chapter eFuse Controller.
99
99
  self.EFUSES = []
100
-
101
100
  self.KEYBLOCKS = []
102
-
103
- # if BLK_VERSION_MINOR is 1, these efuse fields are in BLOCK2
104
101
  self.BLOCK2_CALIBRATION_EFUSES = []
105
102
 
106
103
  dir_name = os.path.dirname(os.path.abspath(__file__))
@@ -150,9 +150,9 @@ def set_flash_voltage(esp, efuses, args):
150
150
 
151
151
 
152
152
  def adc_info(esp, efuses, args):
153
- print("")
154
153
  # fmt: off
155
- if efuses["BLK_VERSION_MINOR"].get() == 1:
154
+ print("Block version:", efuses.get_block_version())
155
+ if efuses.get_block_version() >= 1:
156
156
  print("Temperature Sensor Calibration = {}C".format(efuses["TEMP_CALIB"].get()))
157
157
  print("ADC OCode = ", efuses["OCODE"].get())
158
158
  print("ADC1:")
@@ -160,8 +160,6 @@ def adc_info(esp, efuses, args):
160
160
  print("INIT_CODE_ATTEN3 = ", efuses["ADC1_INIT_CODE_ATTEN3"].get())
161
161
  print("CAL_VOL_ATTEN0 = ", efuses["ADC1_CAL_VOL_ATTEN0"].get())
162
162
  print("CAL_VOL_ATTEN3 = ", efuses["ADC1_CAL_VOL_ATTEN3"].get())
163
- else:
164
- print("BLK_VERSION_MINOR = {}".format(efuses["BLK_VERSION_MINOR"].get_meaning()))
165
163
  # fmt: on
166
164
 
167
165
 
@@ -102,7 +102,7 @@ class EspEfuses(base_fields.EspEfusesBase):
102
102
  for efuse in self.Fields.BLOCK2_CALIBRATION_EFUSES
103
103
  ]
104
104
  else:
105
- if self["BLK_VERSION_MAJOR"].get() == 1:
105
+ if self.get_block_version() >= 100:
106
106
  self.efuses += [
107
107
  EfuseField.convert(self, efuse)
108
108
  for efuse in self.Fields.BLOCK2_CALIBRATION_EFUSES
@@ -130,12 +130,8 @@ class EfuseDefineFields(EfuseFieldsBase):
130
130
  def __init__(self, extend_efuse_table) -> None:
131
131
  # List of efuse fields from TRM the chapter eFuse Controller.
132
132
  self.EFUSES = []
133
-
134
133
  self.KEYBLOCKS = []
135
-
136
- # if BLK_VERSION_MAJOR is 1, these efuse fields are in BLOCK2
137
134
  self.BLOCK2_CALIBRATION_EFUSES = []
138
-
139
135
  self.CALC = []
140
136
 
141
137
  dir_name = os.path.dirname(os.path.abspath(__file__))
@@ -192,9 +192,9 @@ def set_flash_voltage(esp, efuses, args):
192
192
 
193
193
 
194
194
  def adc_info(esp, efuses, args):
195
- print("")
196
195
  # fmt: off
197
- if efuses["BLK_VERSION_MAJOR"].get() == 1:
196
+ print("Block version:", efuses.get_block_version())
197
+ if efuses.get_block_version() >= 100:
198
198
  print("Temperature Sensor Calibration = {}C".format(efuses["TEMP_CALIB"].get()))
199
199
  print("ADC OCode = ", efuses["OCODE"].get())
200
200
  print("ADC1:")
@@ -206,8 +206,6 @@ def adc_info(esp, efuses, args):
206
206
  print("CAL_VOL_ATTEN1 = ", efuses["ADC1_CAL_VOL_ATTEN1"].get())
207
207
  print("CAL_VOL_ATTEN2 = ", efuses["ADC1_CAL_VOL_ATTEN2"].get())
208
208
  print("CAL_VOL_ATTEN3 = ", efuses["ADC1_CAL_VOL_ATTEN3"].get())
209
- else:
210
- print("BLK_VERSION_MAJOR = {}".format(efuses["BLK_VERSION_MAJOR"].get_meaning()))
211
209
  # fmt: on
212
210
 
213
211
 
@@ -102,11 +102,11 @@ class EspEfuses(base_fields.EspEfusesBase):
102
102
  for efuse in self.Fields.BLOCK2_CALIBRATION_EFUSES
103
103
  ]
104
104
  else:
105
- # if self["BLK_VERSION_MINOR"].get() == 1:
106
- # self.efuses += [
107
- # EfuseField.convert(self, efuse)
108
- # for efuse in self.Fields.BLOCK2_CALIBRATION_EFUSES
109
- # ]
105
+ if self.get_block_version() >= 1:
106
+ self.efuses += [
107
+ EfuseField.convert(self, efuse)
108
+ for efuse in self.Fields.BLOCK2_CALIBRATION_EFUSES
109
+ ]
110
110
  self.efuses += [
111
111
  EfuseField.convert(self, efuse) for efuse in self.Fields.CALC
112
112
  ]
@@ -114,12 +114,8 @@ class EfuseDefineFields(EfuseFieldsBase):
114
114
  def __init__(self, extend_efuse_table) -> None:
115
115
  # List of efuse fields from TRM the chapter eFuse Controller.
116
116
  self.EFUSES = []
117
-
118
117
  self.KEYBLOCKS = []
119
-
120
- # if BLK_VERSION_MINOR is 1, these efuse fields are in BLOCK2
121
118
  self.BLOCK2_CALIBRATION_EFUSES = []
122
-
123
119
  self.CALC = []
124
120
 
125
121
  dir_name = os.path.dirname(os.path.abspath(__file__))
@@ -192,7 +192,11 @@ def set_flash_voltage(esp, efuses, args):
192
192
 
193
193
 
194
194
  def adc_info(esp, efuses, args):
195
- print("not supported yet")
195
+ print("Block version:", efuses.get_block_version())
196
+ if efuses.get_block_version() >= 1:
197
+ for efuse in efuses:
198
+ if efuse.category == "calibration":
199
+ print(f"{efuse.name:<30} = ", efuses[efuse.name].get())
196
200
 
197
201
 
198
202
  def burn_key(esp, efuses, args, digest=None):
@@ -102,11 +102,11 @@ class EspEfuses(base_fields.EspEfusesBase):
102
102
  for efuse in self.Fields.BLOCK2_CALIBRATION_EFUSES
103
103
  ]
104
104
  else:
105
- # if self["BLK_VERSION_MINOR"].get() == 1:
106
- # self.efuses += [
107
- # EfuseField.convert(self, efuse)
108
- # for efuse in self.Fields.BLOCK2_CALIBRATION_EFUSES
109
- # ]
105
+ if self.get_block_version() >= 1:
106
+ self.efuses += [
107
+ EfuseField.convert(self, efuse)
108
+ for efuse in self.Fields.BLOCK2_CALIBRATION_EFUSES
109
+ ]
110
110
  self.efuses += [
111
111
  EfuseField.convert(self, efuse) for efuse in self.Fields.CALC
112
112
  ]
@@ -114,12 +114,8 @@ class EfuseDefineFields(EfuseFieldsBase):
114
114
  def __init__(self, extend_efuse_table) -> None:
115
115
  # List of efuse fields from TRM the chapter eFuse Controller.
116
116
  self.EFUSES = []
117
-
118
117
  self.KEYBLOCKS = []
119
-
120
- # if BLK_VERSION_MINOR is 1, these efuse fields are in BLOCK2
121
118
  self.BLOCK2_CALIBRATION_EFUSES = []
122
-
123
119
  self.CALC = []
124
120
 
125
121
  dir_name = os.path.dirname(os.path.abspath(__file__))
@@ -102,7 +102,7 @@ class EspEfuses(base_fields.EspEfusesBase):
102
102
  for efuse in self.Fields.BLOCK2_CALIBRATION_EFUSES
103
103
  ]
104
104
  else:
105
- if self["BLK_VERSION_MINOR"].get() == 1:
105
+ if self.get_block_version() >= 1:
106
106
  self.efuses += [
107
107
  EfuseField.convert(self, efuse)
108
108
  for efuse in self.Fields.BLOCK2_CALIBRATION_EFUSES
@@ -114,12 +114,8 @@ class EfuseDefineFields(EfuseFieldsBase):
114
114
  def __init__(self, extend_efuse_table) -> None:
115
115
  # List of efuse fields from TRM the chapter eFuse Controller.
116
116
  self.EFUSES = []
117
-
118
117
  self.KEYBLOCKS = []
119
-
120
- # if BLK_VERSION_MINOR is 1, these efuse fields are in BLOCK2
121
118
  self.BLOCK2_CALIBRATION_EFUSES = []
122
-
123
119
  self.CALC = []
124
120
 
125
121
  dir_name = os.path.dirname(os.path.abspath(__file__))