esp32tool 1.1.9 → 1.3.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 (64) hide show
  1. package/.nojekyll +0 -0
  2. package/README.md +100 -6
  3. package/apple-touch-icon.png +0 -0
  4. package/build-electron-cli.cjs +177 -0
  5. package/build-single-binary.cjs +295 -0
  6. package/css/light.css +11 -0
  7. package/css/style.css +261 -41
  8. package/dist/cli.d.ts +17 -0
  9. package/dist/cli.js +458 -0
  10. package/dist/console.d.ts +15 -0
  11. package/dist/console.js +237 -0
  12. package/dist/const.d.ts +99 -0
  13. package/dist/const.js +129 -8
  14. package/dist/esp_loader.d.ts +244 -22
  15. package/dist/esp_loader.js +1960 -251
  16. package/dist/index.d.ts +2 -1
  17. package/dist/index.js +37 -4
  18. package/dist/node-usb-adapter.d.ts +47 -0
  19. package/dist/node-usb-adapter.js +725 -0
  20. package/dist/stubs/index.d.ts +1 -2
  21. package/dist/stubs/index.js +4 -0
  22. package/dist/util/console-color.d.ts +19 -0
  23. package/dist/util/console-color.js +272 -0
  24. package/dist/util/line-break-transformer.d.ts +5 -0
  25. package/dist/util/line-break-transformer.js +17 -0
  26. package/dist/web/index.js +1 -1
  27. package/electron/cli-main.cjs +74 -0
  28. package/electron/main.cjs +338 -0
  29. package/electron/main.js +7 -2
  30. package/favicon.ico +0 -0
  31. package/fix-cli-imports.cjs +127 -0
  32. package/generate-icons.sh +89 -0
  33. package/icons/icon-128.png +0 -0
  34. package/icons/icon-144.png +0 -0
  35. package/icons/icon-152.png +0 -0
  36. package/icons/icon-192.png +0 -0
  37. package/icons/icon-384.png +0 -0
  38. package/icons/icon-512.png +0 -0
  39. package/icons/icon-72.png +0 -0
  40. package/icons/icon-96.png +0 -0
  41. package/index.html +143 -73
  42. package/install-android.html +411 -0
  43. package/js/console.js +269 -0
  44. package/js/modules/esptool.js +1 -1
  45. package/js/script.js +750 -175
  46. package/js/util/console-color.js +282 -0
  47. package/js/util/line-break-transformer.js +19 -0
  48. package/js/webusb-serial.js +1017 -0
  49. package/license.md +1 -1
  50. package/manifest.json +89 -0
  51. package/package.cli.json +29 -0
  52. package/package.json +35 -24
  53. package/screenshots/desktop.png +0 -0
  54. package/screenshots/mobile.png +0 -0
  55. package/src/cli.ts +618 -0
  56. package/src/console.ts +278 -0
  57. package/src/const.ts +165 -8
  58. package/src/esp_loader.ts +2354 -302
  59. package/src/index.ts +69 -3
  60. package/src/node-usb-adapter.ts +924 -0
  61. package/src/stubs/index.ts +4 -1
  62. package/src/util/console-color.ts +290 -0
  63. package/src/util/line-break-transformer.ts +20 -0
  64. package/sw.js +155 -0
@@ -3,10 +3,10 @@ export declare class ESPLoader extends EventTarget {
3
3
  port: SerialPort;
4
4
  logger: Logger;
5
5
  private _parent?;
6
- chipFamily: ChipFamily;
7
- chipName: string | null;
8
- chipRevision: number | null;
9
- chipVariant: string | null;
6
+ __chipFamily?: ChipFamily;
7
+ __chipName: string | null;
8
+ __chipRevision: number | null;
9
+ __chipVariant: string | null;
10
10
  _efuses: any[];
11
11
  _flashsize: number;
12
12
  debug: boolean;
@@ -14,22 +14,66 @@ export declare class ESPLoader extends EventTarget {
14
14
  connected: boolean;
15
15
  flashSize: string | null;
16
16
  __inputBuffer?: number[];
17
+ __inputBufferReadIndex?: number;
17
18
  __totalBytesRead?: number;
18
- private _currentBaudRate;
19
+ currentBaudRate: number;
19
20
  private _maxUSBSerialBaudrate?;
20
21
  private _reader?;
21
22
  private _isESP32S2NativeUSB;
22
23
  private _initializationSucceeded;
23
24
  private __commandLock;
24
25
  private __isReconfiguring;
26
+ private __abandonCurrentOperation;
27
+ private _suppressDisconnect;
28
+ private __consoleMode;
29
+ _isUsbJtagOrOtg: boolean | undefined;
30
+ /**
31
+ * Check if device is using USB-JTAG or USB-OTG (not external serial chip)
32
+ * Returns undefined if not yet determined
33
+ */
34
+ get isUsbJtagOrOtg(): boolean | undefined;
35
+ private __adaptiveBlockMultiplier;
36
+ private __adaptiveMaxInFlightMultiplier;
37
+ private __consecutiveSuccessfulChunks;
38
+ private __lastAdaptiveAdjustment;
39
+ private __isCDCDevice;
25
40
  constructor(port: SerialPort, logger: Logger, _parent?: ESPLoader | undefined);
41
+ get chipFamily(): ChipFamily;
42
+ set chipFamily(value: ChipFamily);
43
+ get chipName(): string | null;
44
+ set chipName(value: string | null);
45
+ get chipRevision(): number | null;
46
+ set chipRevision(value: number | null);
47
+ get chipVariant(): string | null;
48
+ set chipVariant(value: string | null);
49
+ private get _consoleMode();
50
+ private set _consoleMode(value);
51
+ setConsoleMode(value: boolean): void;
26
52
  private get _inputBuffer();
53
+ private get _inputBufferReadIndex();
54
+ private set _inputBufferReadIndex(value);
55
+ private get _inputBufferAvailable();
56
+ private _readByte;
57
+ private _clearInputBuffer;
58
+ private _compactInputBuffer;
27
59
  private get _totalBytesRead();
28
60
  private set _totalBytesRead(value);
29
61
  private get _commandLock();
30
62
  private set _commandLock(value);
31
63
  private get _isReconfiguring();
32
64
  private set _isReconfiguring(value);
65
+ private get _abandonCurrentOperation();
66
+ private set _abandonCurrentOperation(value);
67
+ private get _adaptiveBlockMultiplier();
68
+ private set _adaptiveBlockMultiplier(value);
69
+ private get _adaptiveMaxInFlightMultiplier();
70
+ private set _adaptiveMaxInFlightMultiplier(value);
71
+ private get _consecutiveSuccessfulChunks();
72
+ private set _consecutiveSuccessfulChunks(value);
73
+ private get _lastAdaptiveAdjustment();
74
+ private set _lastAdaptiveAdjustment(value);
75
+ private get _isCDCDevice();
76
+ private set _isCDCDevice(value);
33
77
  private detectUSBSerialChip;
34
78
  initialize(): Promise<void>;
35
79
  /**
@@ -50,6 +94,10 @@ export declare class ESPLoader extends EventTarget {
50
94
  chipId: number;
51
95
  apiVersion: number;
52
96
  }>;
97
+ /**
98
+ * Get MAC address from efuses
99
+ */
100
+ getMacAddress(): Promise<string>;
53
101
  /**
54
102
  * @name readLoop
55
103
  * Reads data from the input stream and places it in the inputBuffer
@@ -57,8 +105,142 @@ export declare class ESPLoader extends EventTarget {
57
105
  readLoop(): Promise<void>;
58
106
  sleep(ms?: number): Promise<unknown>;
59
107
  state_DTR: boolean;
108
+ state_RTS: boolean;
60
109
  setRTS(state: boolean): Promise<void>;
61
110
  setDTR(state: boolean): Promise<void>;
111
+ setDTRandRTS(dtr: boolean, rts: boolean): Promise<void>;
112
+ /**
113
+ * @name hardResetUSBJTAGSerial
114
+ * USB-JTAG/Serial reset for Web Serial (Desktop)
115
+ */
116
+ hardResetUSBJTAGSerial(): Promise<void>;
117
+ /**
118
+ * @name hardResetClassic
119
+ * Classic reset for Web Serial (Desktop) DTR = IO0, RTS = EN
120
+ */
121
+ hardResetClassic(): Promise<void>;
122
+ /**
123
+ * Reset to firmware mode (not bootloader) for Web Serial
124
+ * Keeps IO0=HIGH during reset so chip boots into firmware
125
+ */
126
+ hardResetToFirmware(): Promise<void>;
127
+ /**
128
+ * Reset to firmware mode (not bootloader) for WebUSB
129
+ * Keeps IO0=HIGH during reset so chip boots into firmware
130
+ */
131
+ hardResetToFirmwareWebUSB(): Promise<void>;
132
+ /**
133
+ * @name hardResetUnixTight
134
+ * Unix Tight reset for Web Serial (Desktop) - sets DTR and RTS simultaneously
135
+ */
136
+ hardResetUnixTight(): Promise<void>;
137
+ setRTSWebUSB(state: boolean): Promise<void>;
138
+ setDTRWebUSB(state: boolean): Promise<void>;
139
+ setDTRandRTSWebUSB(dtr: boolean, rts: boolean): Promise<void>;
140
+ /**
141
+ * @name hardResetUSBJTAGSerialWebUSB
142
+ * USB-JTAG/Serial reset for WebUSB (Android)
143
+ */
144
+ hardResetUSBJTAGSerialWebUSB(): Promise<void>;
145
+ /**
146
+ * @name hardResetUSBJTAGSerialInvertedDTRWebUSB
147
+ * USB-JTAG/Serial reset with inverted DTR for WebUSB (Android)
148
+ */
149
+ hardResetUSBJTAGSerialInvertedDTRWebUSB(): Promise<void>;
150
+ /**
151
+ * @name hardResetClassicWebUSB
152
+ * Classic reset for WebUSB (Android)
153
+ */
154
+ hardResetClassicWebUSB(): Promise<void>;
155
+ /**
156
+ * @name hardResetUnixTightWebUSB
157
+ * Unix Tight reset for WebUSB (Android) - sets DTR and RTS simultaneously
158
+ */
159
+ hardResetUnixTightWebUSB(): Promise<void>;
160
+ /**
161
+ * @name hardResetClassicLongDelayWebUSB
162
+ * Classic reset with longer delays for WebUSB (Android)
163
+ * Specifically for CP2102/CH340 which may need more time
164
+ */
165
+ hardResetClassicLongDelayWebUSB(): Promise<void>;
166
+ /**
167
+ * @name hardResetClassicShortDelayWebUSB
168
+ * Classic reset with shorter delays for WebUSB (Android)
169
+ */
170
+ hardResetClassicShortDelayWebUSB(): Promise<void>;
171
+ /**
172
+ * @name hardResetInvertedWebUSB
173
+ * Inverted reset sequence for WebUSB (Android) - both signals inverted
174
+ */
175
+ hardResetInvertedWebUSB(): Promise<void>;
176
+ /**
177
+ * @name hardResetInvertedDTRWebUSB
178
+ * Only DTR inverted for WebUSB (Android)
179
+ */
180
+ hardResetInvertedDTRWebUSB(): Promise<void>;
181
+ /**
182
+ * @name hardResetInvertedRTSWebUSB
183
+ * Only RTS inverted for WebUSB (Android)
184
+ */
185
+ hardResetInvertedRTSWebUSB(): Promise<void>;
186
+ /**
187
+ * Check if we're using WebUSB (Android) or Web Serial (Desktop)
188
+ */
189
+ private isWebUSB;
190
+ /**
191
+ * @name connectWithResetStrategies
192
+ * Try different reset strategies to enter bootloader mode
193
+ * Similar to esptool.py's connect() method with multiple reset strategies
194
+ */
195
+ connectWithResetStrategies(): Promise<void>;
196
+ /**
197
+ * @name watchdogReset
198
+ * Watchdog reset for ESP32-S2/S3/C3 with USB-OTG or USB-JTAG/Serial
199
+ * Uses RTC watchdog timer to reset the chip - works when DTR/RTS signals are not available
200
+ * This is an alias for rtcWdtResetChipSpecific() for backwards compatibility
201
+ */
202
+ watchdogReset(): Promise<void>;
203
+ /**
204
+ * Check if current chip is using USB-OTG
205
+ * Supports ESP32-S2 and ESP32-S3
206
+ */
207
+ usingUsbOtg(): Promise<boolean>;
208
+ /**
209
+ * Check if current chip is using USB-JTAG/Serial
210
+ * Supports ESP32-S3 and ESP32-C3
211
+ */
212
+ usingUsbJtagSerial(): Promise<boolean>;
213
+ /**
214
+ * Get chip revision for ESP32-C3
215
+ * Reads from EFUSE registers and calculates revision
216
+ */
217
+ getChipRevisionC3(): Promise<number>;
218
+ /**
219
+ * RTC watchdog timer reset for ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C5, ESP32-C6, and ESP32-P4
220
+ * Uses specific registers for each chip family
221
+ * Note: ESP32-H2 does NOT support WDT reset
222
+ */
223
+ rtcWdtResetChipSpecific(): Promise<void>;
224
+ /**
225
+ * Helper: Check if USB-based WDT reset should be used for S2/S3
226
+ * Returns true if WDT reset was performed, false otherwise
227
+ */
228
+ private tryUsbWdtReset;
229
+ /**
230
+ * Chip-specific hard reset for ESP32-S2
231
+ * Checks if using USB-JTAG/Serial and uses watchdog reset if necessary
232
+ */
233
+ hardResetS2(): Promise<void>;
234
+ /**
235
+ * Chip-specific hard reset for ESP32-S3
236
+ * Checks if using USB-JTAG/Serial and uses watchdog reset if necessary
237
+ */
238
+ hardResetS3(): Promise<void>;
239
+ /**
240
+ * Chip-specific hard reset for ESP32-C3
241
+ * Checks if using USB-JTAG/Serial and uses watchdog reset if necessary
242
+ */
243
+ hardResetC3(): Promise<void>;
62
244
  hardReset(bootloader?: boolean): Promise<void>;
63
245
  /**
64
246
  * @name macAddr
@@ -86,6 +268,10 @@ export declare class ESPLoader extends EventTarget {
86
268
  * @name readPacket
87
269
  * Generator to read SLIP packets from a serial port.
88
270
  * Yields one full SLIP packet at a time, raises exception on timeout or invalid data.
271
+ *
272
+ * Two implementations:
273
+ * - Burst: CDC devices (Native USB) and CH343 - very fast processing
274
+ * - Byte-by-byte: CH340, CP2102, and other USB-Serial adapters - stable fast processing
89
275
  */
90
276
  readPacket(timeout: number): Promise<number[]>;
91
277
  /**
@@ -103,21 +289,11 @@ export declare class ESPLoader extends EventTarget {
103
289
  setBaudrate(baud: number): Promise<void>;
104
290
  reconfigurePort(baud: number): Promise<void>;
105
291
  /**
106
- * @name connectWithResetStrategies
107
- * Try different reset strategies to enter bootloader mode
108
- * Similar to esptool.py's connect() method with multiple reset strategies
109
- */
110
- connectWithResetStrategies(): Promise<void>;
111
- /**
112
- * @name hardResetUSBJTAGSerial
113
- * USB-JTAG/Serial reset sequence for ESP32-C3, ESP32-S3, ESP32-C6, etc.
292
+ * @name syncWithTimeout
293
+ * Sync with timeout that can be abandoned (for reset strategy loop)
294
+ * This is internally time-bounded and checks the abandon flag
114
295
  */
115
- hardResetUSBJTAGSerial(): Promise<void>;
116
- /**
117
- * @name hardResetClassic
118
- * Classic reset sequence for USB-to-Serial bridge chips (CH340, CP2102, etc.)
119
- */
120
- hardResetClassic(): Promise<void>;
296
+ syncWithTimeout(timeoutMs: number): Promise<boolean>;
121
297
  /**
122
298
  * @name sync
123
299
  * Put into ROM bootload mode & attempt to synchronize with the
@@ -205,11 +381,44 @@ export declare class ESPLoader extends EventTarget {
205
381
  private set _writeChain(value);
206
382
  writeToStream(data: number[]): Promise<void>;
207
383
  disconnect(): Promise<void>;
384
+ /**
385
+ * @name releaseReaderWriter
386
+ * Release reader and writer locks without closing the port
387
+ * Used when switching to console mode
388
+ */
389
+ releaseReaderWriter(): Promise<void>;
390
+ /**
391
+ * @name resetToFirmware
392
+ * Public method to reset device from bootloader to firmware for console mode
393
+ * Automatically detects USB-JTAG/Serial and USB-OTG devices and performs appropriate reset
394
+ * @returns true if reset was performed, false if not needed
395
+ */
396
+ resetToFirmware(): Promise<boolean>;
397
+ /**
398
+ * @name enterConsoleMode
399
+ * Prepare device for console mode by resetting to firmware
400
+ * Handles both USB-JTAG/OTG devices (closes port) and external serial chips (keeps port open)
401
+ * @returns true if port was closed (USB-JTAG), false if port stays open (serial chip)
402
+ */
403
+ enterConsoleMode(): Promise<boolean>;
404
+ /**
405
+ * @name _resetToFirmwareIfNeeded
406
+ * Reset device from bootloader to firmware when switching to console mode
407
+ * Detects USB-JTAG/Serial and USB-OTG devices and performs appropriate reset
408
+ * @returns true if reconnect was performed, false otherwise
409
+ */
410
+ private _resetToFirmwareIfNeeded;
208
411
  /**
209
412
  * @name reconnectAndResume
210
413
  * Reconnect the serial port to flush browser buffers and reload stub
211
414
  */
212
415
  reconnect(): Promise<void>;
416
+ /**
417
+ * @name reconnectToBootloader
418
+ * Close and reopen the port, then reset ESP to bootloader mode
419
+ * This is needed after Improv or other operations that leave ESP in firmware mode
420
+ */
421
+ reconnectToBootloader(): Promise<void>;
213
422
  /**
214
423
  * @name drainInputBuffer
215
424
  * Actively drain the input buffer by reading data for a specified time.
@@ -233,9 +442,17 @@ export declare class ESPLoader extends EventTarget {
233
442
  * @param addr - Address to read from
234
443
  * @param size - Number of bytes to read
235
444
  * @param onPacketReceived - Optional callback function called when packet is received
445
+ * @param options - Optional parameters for advanced control
446
+ * - chunkSize: Amount of data to request from ESP in one command (bytes)
447
+ * - blockSize: Size of each data block sent by ESP (bytes)
448
+ * - maxInFlight: Maximum unacknowledged bytes (bytes)
236
449
  * @returns Uint8Array containing the flash data
237
450
  */
238
- readFlash(addr: number, size: number, onPacketReceived?: (packet: Uint8Array, progress: number, totalSize: number) => void): Promise<Uint8Array>;
451
+ readFlash(addr: number, size: number, onPacketReceived?: (packet: Uint8Array, progress: number, totalSize: number) => void, options?: {
452
+ chunkSize?: number;
453
+ blockSize?: number;
454
+ maxInFlight?: number;
455
+ }): Promise<Uint8Array>;
239
456
  }
240
457
  declare class EspStubLoader extends ESPLoader {
241
458
  IS_STUB: boolean;
@@ -245,9 +462,14 @@ declare class EspStubLoader extends ESPLoader {
245
462
  */
246
463
  memBegin(size: number, _blocks: number, _blocksize: number, offset: number): Promise<[number, number[]]>;
247
464
  /**
248
- * @name getEraseSize
249
- * depending on flash chip model the erase may take this long (maybe longer!)
465
+ * @name eraseFlash
466
+ * Erase entire flash chip
250
467
  */
251
468
  eraseFlash(): Promise<void>;
469
+ /**
470
+ * @name eraseRegion
471
+ * Erase a specific region of flash
472
+ */
473
+ eraseRegion(offset: number, size: number): Promise<void>;
252
474
  }
253
475
  export {};