tasmota-webserial-esptool 6.5.4 → 7.0.0

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 (101) hide show
  1. package/.vscode/settings.json +2 -0
  2. package/README.md +4 -3
  3. package/READ_FLASH_FEATURE.md +130 -0
  4. package/css/light.css +11 -0
  5. package/css/style.css +213 -45
  6. package/dist/const.d.ts +41 -2
  7. package/dist/const.js +100 -2
  8. package/dist/esp_loader.d.ts +27 -3
  9. package/dist/esp_loader.js +376 -17
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.js +1 -2
  12. package/dist/partition.d.ts +26 -0
  13. package/dist/partition.js +129 -0
  14. package/dist/stubs/esp32.json +4 -4
  15. package/dist/stubs/esp32c2.json +4 -4
  16. package/dist/stubs/esp32c3.json +4 -4
  17. package/dist/stubs/esp32c5.json +4 -4
  18. package/dist/stubs/esp32c6.json +4 -4
  19. package/dist/stubs/esp32c61.json +4 -4
  20. package/dist/stubs/esp32h2.json +4 -4
  21. package/dist/stubs/esp32p4.json +4 -4
  22. package/dist/stubs/esp32p4r3.json +4 -4
  23. package/dist/stubs/esp32s2.json +4 -4
  24. package/dist/stubs/esp32s3.json +4 -4
  25. package/dist/stubs/esp8266.json +3 -3
  26. package/dist/stubs/index.d.ts +1 -1
  27. package/dist/stubs/index.js +7 -1
  28. package/dist/web/esp32-CijhsJH1.js +1 -0
  29. package/dist/web/esp32c2-C17SM4gO.js +1 -0
  30. package/dist/web/esp32c3-DxRGijbg.js +1 -0
  31. package/dist/web/esp32c5-3mDOIGa4.js +1 -0
  32. package/dist/web/esp32c6-h6U0SQTm.js +1 -0
  33. package/dist/web/esp32c61-BKtexhPZ.js +1 -0
  34. package/dist/web/esp32h2-RtuWSEmP.js +1 -0
  35. package/dist/web/esp32p4-5nkIjxqJ.js +1 -0
  36. package/dist/web/esp32p4r3-CpHBYEwI.js +1 -0
  37. package/dist/web/esp32s2-IiDBtXxo.js +1 -0
  38. package/dist/web/esp32s3-6yv5yxum.js +1 -0
  39. package/dist/web/esp8266-CUwxJpGa.js +1 -0
  40. package/dist/web/index.js +1 -1
  41. package/index.html +158 -34
  42. package/js/modules/esp32-CijhsJH1.js +1 -0
  43. package/js/modules/esp32c2-C17SM4gO.js +1 -0
  44. package/js/modules/esp32c3-DxRGijbg.js +1 -0
  45. package/js/modules/esp32c5-3mDOIGa4.js +1 -0
  46. package/js/modules/esp32c6-h6U0SQTm.js +1 -0
  47. package/js/modules/esp32c61-BKtexhPZ.js +1 -0
  48. package/js/modules/esp32h2-RtuWSEmP.js +1 -0
  49. package/js/modules/esp32p4-5nkIjxqJ.js +1 -0
  50. package/js/modules/esp32p4r3-CpHBYEwI.js +1 -0
  51. package/js/modules/esp32s2-IiDBtXxo.js +1 -0
  52. package/js/modules/esp32s3-6yv5yxum.js +1 -0
  53. package/js/modules/esp8266-CUwxJpGa.js +1 -0
  54. package/js/modules/esptool.js +1 -1
  55. package/js/script.js +456 -11
  56. package/package.json +6 -6
  57. package/src/const.ts +107 -3
  58. package/src/esp_loader.ts +491 -18
  59. package/src/index.ts +3 -1
  60. package/src/partition.ts +155 -0
  61. package/src/stubs/README.md +1 -1
  62. package/src/stubs/esp32.json +4 -4
  63. package/src/stubs/esp32c2.json +4 -4
  64. package/src/stubs/esp32c3.json +4 -4
  65. package/src/stubs/esp32c5.json +4 -4
  66. package/src/stubs/esp32c6.json +4 -4
  67. package/src/stubs/esp32c61.json +4 -4
  68. package/src/stubs/esp32h2.json +4 -4
  69. package/src/stubs/esp32p4.json +4 -4
  70. package/src/stubs/esp32p4r3.json +4 -4
  71. package/src/stubs/esp32s2.json +4 -4
  72. package/src/stubs/esp32s3.json +4 -4
  73. package/src/stubs/esp8266.json +3 -3
  74. package/src/stubs/index.ts +14 -2
  75. package/BUGFIX_GET_SECURITY_INFO.md +0 -126
  76. package/IMPLEMENTATION_SUMMARY.md +0 -232
  77. package/SECURITY_INFO_EXPLANATION.md +0 -145
  78. package/dist/web/esp32-BNIFdu1P.js +0 -1
  79. package/dist/web/esp32c2-BqxquOKw.js +0 -1
  80. package/dist/web/esp32c3-BOOqe8me.js +0 -1
  81. package/dist/web/esp32c5-mcj52-K1.js +0 -1
  82. package/dist/web/esp32c6-Cg5qYgg7.js +0 -1
  83. package/dist/web/esp32c61-CzCdsydk.js +0 -1
  84. package/dist/web/esp32h2-DZa_lpff.js +0 -1
  85. package/dist/web/esp32p4-DyGqUAeZ.js +0 -1
  86. package/dist/web/esp32p4r3-Cle9QJmZ.js +0 -1
  87. package/dist/web/esp32s2-Bk4mqADi.js +0 -1
  88. package/dist/web/esp32s3-Df3OUCOC.js +0 -1
  89. package/dist/web/esp8266-CQFcqJ_a.js +0 -1
  90. package/js/modules/esp32-BNIFdu1P.js +0 -1
  91. package/js/modules/esp32c2-BqxquOKw.js +0 -1
  92. package/js/modules/esp32c3-BOOqe8me.js +0 -1
  93. package/js/modules/esp32c5-mcj52-K1.js +0 -1
  94. package/js/modules/esp32c6-Cg5qYgg7.js +0 -1
  95. package/js/modules/esp32c61-CzCdsydk.js +0 -1
  96. package/js/modules/esp32h2-DZa_lpff.js +0 -1
  97. package/js/modules/esp32p4-DyGqUAeZ.js +0 -1
  98. package/js/modules/esp32p4r3-Cle9QJmZ.js +0 -1
  99. package/js/modules/esp32s2-Bk4mqADi.js +0 -1
  100. package/js/modules/esp32s3-Df3OUCOC.js +0 -1
  101. package/js/modules/esp8266-CQFcqJ_a.js +0 -1
package/dist/const.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { toByteArray } from "./util";
2
2
  export const baudRates = [
3
- 115200, 128000, 153600, 230400, 460800, 921600, 1500000, 2000000,
3
+ 115200, 128000, 153600, 230400, 460800, 500000, 921600, 1500000, 2000000,
4
4
  ];
5
5
  export const FLASH_SIZES = {
6
6
  "512KB": 0x00,
@@ -33,6 +33,20 @@ export const DETECTED_FLASH_SIZES = {
33
33
  0x18: "16MB",
34
34
  0x19: "32MB",
35
35
  0x1a: "64MB",
36
+ 0x1b: "128MB",
37
+ 0x1c: "256MB",
38
+ 0x20: "64MB",
39
+ 0x21: "128MB",
40
+ 0x22: "256MB",
41
+ 0x32: "256KB",
42
+ 0x33: "512KB",
43
+ 0x34: "1MB",
44
+ 0x35: "2MB",
45
+ 0x36: "4MB",
46
+ 0x37: "8MB",
47
+ 0x38: "16MB",
48
+ 0x39: "32MB",
49
+ 0x3a: "64MB",
36
50
  };
37
51
  export const FLASH_WRITE_SIZE = 0x400;
38
52
  export const STUB_FLASH_WRITE_SIZE = 0x4000;
@@ -149,6 +163,28 @@ export const ESP32H2_SPI_MISO_DLEN_OFFS = 0x28;
149
163
  export const ESP32H2_SPI_W0_OFFS = 0x58;
150
164
  export const ESP32H2_UART_DATE_REG_ADDR = 0x6000007c;
151
165
  export const ESP32H2_BOOTLOADER_FLASH_OFFSET = 0x0;
166
+ export const ESP32H4_SPI_REG_BASE = 0x60099000;
167
+ export const ESP32H4_BASEFUSEADDR = 0x600b1800;
168
+ export const ESP32H4_MACFUSEADDR = 0x600b1800 + 0x044;
169
+ export const ESP32H4_SPI_USR_OFFS = 0x18;
170
+ export const ESP32H4_SPI_USR1_OFFS = 0x1c;
171
+ export const ESP32H4_SPI_USR2_OFFS = 0x20;
172
+ export const ESP32H4_SPI_MOSI_DLEN_OFFS = 0x24;
173
+ export const ESP32H4_SPI_MISO_DLEN_OFFS = 0x28;
174
+ export const ESP32H4_SPI_W0_OFFS = 0x58;
175
+ export const ESP32H4_UART_DATE_REG_ADDR = 0x60012000 + 0x7c;
176
+ export const ESP32H4_BOOTLOADER_FLASH_OFFSET = 0x2000;
177
+ export const ESP32H21_SPI_REG_BASE = 0x60003000;
178
+ export const ESP32H21_BASEFUSEADDR = 0x600b4000;
179
+ export const ESP32H21_MACFUSEADDR = 0x600b4000 + 0x044;
180
+ export const ESP32H21_SPI_USR_OFFS = 0x18;
181
+ export const ESP32H21_SPI_USR1_OFFS = 0x1c;
182
+ export const ESP32H21_SPI_USR2_OFFS = 0x20;
183
+ export const ESP32H21_SPI_MOSI_DLEN_OFFS = 0x24;
184
+ export const ESP32H21_SPI_MISO_DLEN_OFFS = 0x28;
185
+ export const ESP32H21_SPI_W0_OFFS = 0x58;
186
+ export const ESP32H21_UART_DATE_REG_ADDR = 0x6000007c;
187
+ export const ESP32H21_BOOTLOADER_FLASH_OFFSET = 0x0;
152
188
  export const ESP32P4_SPI_REG_BASE = 0x5008d000;
153
189
  export const ESP32P4_BASEFUSEADDR = 0x5012d000;
154
190
  export const ESP32P4_EFUSE_BLOCK1_ADDR = ESP32P4_BASEFUSEADDR + 0x044;
@@ -161,6 +197,18 @@ export const ESP32P4_SPI_MISO_DLEN_OFFS = 0x28;
161
197
  export const ESP32P4_SPI_W0_OFFS = 0x58;
162
198
  export const ESP32P4_UART_DATE_REG_ADDR = 0x500ca000 + 0x8c;
163
199
  export const ESP32P4_BOOTLOADER_FLASH_OFFSET = 0x2000;
200
+ export const ESP32S31_SPI_REG_BASE = 0x20500000;
201
+ export const ESP32S31_BASEFUSEADDR = 0x20715000;
202
+ export const ESP32S31_EFUSE_BLOCK1_ADDR = ESP32S31_BASEFUSEADDR + 0x044;
203
+ export const ESP32S31_MACFUSEADDR = 0x20715000 + 0x044;
204
+ export const ESP32S31_SPI_USR_OFFS = 0x18;
205
+ export const ESP32S31_SPI_USR1_OFFS = 0x1c;
206
+ export const ESP32S31_SPI_USR2_OFFS = 0x20;
207
+ export const ESP32S31_SPI_MOSI_DLEN_OFFS = 0x24;
208
+ export const ESP32S31_SPI_MISO_DLEN_OFFS = 0x28;
209
+ export const ESP32S31_SPI_W0_OFFS = 0x58;
210
+ export const ESP32S31_UART_DATE_REG_ADDR = 0x2038a000 + 0x8c;
211
+ export const ESP32S31_BOOTLOADER_FLASH_OFFSET = 0x2000;
164
212
  export const SYNC_PACKET = toByteArray("\x07\x07\x12 UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU");
165
213
  export const CHIP_DETECT_MAGIC_REG_ADDR = 0x40001000;
166
214
  // Image Chip IDs (used by ESP32-C3 and later for chip detection)
@@ -175,7 +223,10 @@ export const CHIP_FAMILY_ESP32C5 = 0x32c5;
175
223
  export const CHIP_FAMILY_ESP32C6 = 0x32c6;
176
224
  export const CHIP_FAMILY_ESP32C61 = 0x32c61;
177
225
  export const CHIP_FAMILY_ESP32H2 = 0x3272;
226
+ export const CHIP_FAMILY_ESP32H4 = 0x3274;
227
+ export const CHIP_FAMILY_ESP32H21 = 0x3275;
178
228
  export const CHIP_FAMILY_ESP32P4 = 0x3280;
229
+ export const CHIP_FAMILY_ESP32S31 = 0x3231;
179
230
  export const CHIP_ID_TO_INFO = {
180
231
  5: { name: "ESP32-C3", family: CHIP_FAMILY_ESP32C3 },
181
232
  9: { name: "ESP32-S3", family: CHIP_FAMILY_ESP32S3 },
@@ -185,6 +236,9 @@ export const CHIP_ID_TO_INFO = {
185
236
  18: { name: "ESP32-P4", family: CHIP_FAMILY_ESP32P4 },
186
237
  20: { name: "ESP32-C61", family: CHIP_FAMILY_ESP32C61 },
187
238
  23: { name: "ESP32-C5", family: CHIP_FAMILY_ESP32C5 },
239
+ 25: { name: "ESP32-H21", family: CHIP_FAMILY_ESP32H21 },
240
+ 28: { name: "ESP32-H4", family: CHIP_FAMILY_ESP32H4 },
241
+ 32: { name: "ESP32-S31", family: CHIP_FAMILY_ESP32S31 },
188
242
  };
189
243
  export const CHIP_DETECT_MAGIC_VALUES = {
190
244
  0xfff0c101: { name: "ESP8266", family: CHIP_FAMILY_ESP8266 },
@@ -227,6 +281,7 @@ export const ESP_WRITE_REG = 0x09;
227
281
  export const ESP_READ_REG = 0x0a;
228
282
  export const ESP_ERASE_FLASH = 0xd0;
229
283
  export const ESP_ERASE_REGION = 0xd1;
284
+ export const ESP_READ_FLASH = 0xd2;
230
285
  export const ESP_SPI_SET_PARAMS = 0x0b;
231
286
  export const ESP_SPI_ATTACH = 0x0d;
232
287
  export const ESP_CHANGE_BAUDRATE = 0x0f;
@@ -241,11 +296,12 @@ export const USB_RAM_BLOCK = 0x800;
241
296
  export const ESP_RAM_BLOCK = 0x1800;
242
297
  // Timeouts
243
298
  export const DEFAULT_TIMEOUT = 3000;
244
- export const CHIP_ERASE_TIMEOUT = 600000; // timeout for full chip erase in ms
299
+ export const CHIP_ERASE_TIMEOUT = 150000; // timeout for full chip erase in ms
245
300
  export const MAX_TIMEOUT = CHIP_ERASE_TIMEOUT * 2; // longest any command can run in ms
246
301
  export const SYNC_TIMEOUT = 100; // timeout for syncing with bootloader in ms
247
302
  export const ERASE_REGION_TIMEOUT_PER_MB = 30000; // timeout (per megabyte) for erasing a region in ms
248
303
  export const MEM_END_ROM_TIMEOUT = 500;
304
+ export const FLASH_READ_TIMEOUT = 100; // timeout for reading flash in ms
249
305
  /**
250
306
  * @name timeoutPerMb
251
307
  * Scales timeouts which are size-specific
@@ -399,6 +455,34 @@ export const getSpiFlashAddresses = (chipFamily) => {
399
455
  uartDateReg: ESP32H2_UART_DATE_REG_ADDR,
400
456
  flashOffs: ESP32H2_BOOTLOADER_FLASH_OFFSET,
401
457
  };
458
+ case CHIP_FAMILY_ESP32H4:
459
+ return {
460
+ regBase: ESP32H4_SPI_REG_BASE,
461
+ baseFuse: ESP32H4_BASEFUSEADDR,
462
+ macFuse: ESP32H4_MACFUSEADDR,
463
+ usrOffs: ESP32H4_SPI_USR_OFFS,
464
+ usr1Offs: ESP32H4_SPI_USR1_OFFS,
465
+ usr2Offs: ESP32H4_SPI_USR2_OFFS,
466
+ mosiDlenOffs: ESP32H4_SPI_MOSI_DLEN_OFFS,
467
+ misoDlenOffs: ESP32H4_SPI_MISO_DLEN_OFFS,
468
+ w0Offs: ESP32H4_SPI_W0_OFFS,
469
+ uartDateReg: ESP32H4_UART_DATE_REG_ADDR,
470
+ flashOffs: ESP32H4_BOOTLOADER_FLASH_OFFSET,
471
+ };
472
+ case CHIP_FAMILY_ESP32H21:
473
+ return {
474
+ regBase: ESP32H21_SPI_REG_BASE,
475
+ baseFuse: ESP32H21_BASEFUSEADDR,
476
+ macFuse: ESP32H21_MACFUSEADDR,
477
+ usrOffs: ESP32H21_SPI_USR_OFFS,
478
+ usr1Offs: ESP32H21_SPI_USR1_OFFS,
479
+ usr2Offs: ESP32H21_SPI_USR2_OFFS,
480
+ mosiDlenOffs: ESP32H21_SPI_MOSI_DLEN_OFFS,
481
+ misoDlenOffs: ESP32H21_SPI_MISO_DLEN_OFFS,
482
+ w0Offs: ESP32H21_SPI_W0_OFFS,
483
+ uartDateReg: ESP32H21_UART_DATE_REG_ADDR,
484
+ flashOffs: ESP32H21_BOOTLOADER_FLASH_OFFSET,
485
+ };
402
486
  case CHIP_FAMILY_ESP32P4:
403
487
  return {
404
488
  regBase: ESP32P4_SPI_REG_BASE,
@@ -413,6 +497,20 @@ export const getSpiFlashAddresses = (chipFamily) => {
413
497
  uartDateReg: ESP32P4_UART_DATE_REG_ADDR,
414
498
  flashOffs: ESP32P4_BOOTLOADER_FLASH_OFFSET,
415
499
  };
500
+ case CHIP_FAMILY_ESP32S31:
501
+ return {
502
+ regBase: ESP32S31_SPI_REG_BASE,
503
+ baseFuse: ESP32S31_BASEFUSEADDR,
504
+ macFuse: ESP32S31_MACFUSEADDR,
505
+ usrOffs: ESP32S31_SPI_USR_OFFS,
506
+ usr1Offs: ESP32S31_SPI_USR1_OFFS,
507
+ usr2Offs: ESP32S31_SPI_USR2_OFFS,
508
+ mosiDlenOffs: ESP32S31_SPI_MOSI_DLEN_OFFS,
509
+ misoDlenOffs: ESP32S31_SPI_MISO_DLEN_OFFS,
510
+ w0Offs: ESP32S31_SPI_W0_OFFS,
511
+ uartDateReg: ESP32S31_UART_DATE_REG_ADDR,
512
+ flashOffs: ESP32S31_BOOTLOADER_FLASH_OFFSET,
513
+ };
416
514
  default:
417
515
  return {
418
516
  regBase: -1,
@@ -14,9 +14,15 @@ export declare class ESPLoader extends EventTarget {
14
14
  connected: boolean;
15
15
  flashSize: string | null;
16
16
  __inputBuffer?: number[];
17
+ __totalBytesRead?: number;
18
+ private _currentBaudRate;
19
+ private _maxUSBSerialBaudrate?;
17
20
  private _reader?;
18
21
  constructor(port: SerialPort, logger: Logger, _parent?: ESPLoader | undefined);
19
22
  private get _inputBuffer();
23
+ private get _totalBytesRead();
24
+ private set _totalBytesRead(value);
25
+ private detectUSBSerialChip;
20
26
  initialize(): Promise<void>;
21
27
  /**
22
28
  * Detect chip type using GET_SECURITY_INFO (for newer chips) or magic value (for older chips)
@@ -69,8 +75,6 @@ export declare class ESPLoader extends EventTarget {
69
75
  * @name readPacket
70
76
  * Generator to read SLIP packets from a serial port.
71
77
  * Yields one full SLIP packet at a time, raises exception on timeout or invalid data.
72
- * Designed to avoid too many calls to serial.read(1), which can bog
73
- * down on slow systems.
74
78
  */
75
79
  readPacket(timeout: number): Promise<number[]>;
76
80
  /**
@@ -165,9 +169,29 @@ export declare class ESPLoader extends EventTarget {
165
169
  * ignore errors.
166
170
  */
167
171
  memFinish(entrypoint?: number): Promise<[number, number[]]>;
168
- runStub(): Promise<EspStubLoader>;
172
+ runStub(skipFlashDetection?: boolean): Promise<EspStubLoader>;
169
173
  writeToStream(data: number[]): Promise<void>;
170
174
  disconnect(): Promise<void>;
175
+ /**
176
+ * @name reconnectAndResume
177
+ * Reconnect the serial port to flush browser buffers and reload stub
178
+ */
179
+ reconnect(): Promise<void>;
180
+ /**
181
+ * @name flushSerialBuffers
182
+ * Flush any pending data in the TX and RX serial port buffers
183
+ * This clears both the application RX buffer and waits for hardware buffers to drain
184
+ */
185
+ private flushSerialBuffers;
186
+ /**
187
+ * @name readFlash
188
+ * Read flash memory from the chip (only works with stub loader)
189
+ * @param addr - Address to read from
190
+ * @param size - Number of bytes to read
191
+ * @param onPacketReceived - Optional callback function called when packet is received
192
+ * @returns Uint8Array containing the flash data
193
+ */
194
+ readFlash(addr: number, size: number, onPacketReceived?: (packet: Uint8Array, progress: number, totalSize: number) => void): Promise<Uint8Array>;
171
195
  }
172
196
  declare class EspStubLoader extends ESPLoader {
173
197
  IS_STUB: boolean;