esp32tool 1.3.7 → 1.4.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.
Binary file
package/dist/console.js CHANGED
@@ -149,14 +149,25 @@ export class ESP32ToolConsole {
149
149
  }
150
150
  async _connect(abortSignal) {
151
151
  console.log("Starting console read loop");
152
- // Check if port.readable is available
153
- if (!this.port.readable) {
154
- this.console.addLine("");
155
- this.console.addLine("");
156
- this.console.addLine(`Terminal disconnected: Port readable stream not available`);
157
- console.error("Port readable stream not available - port may need to be reopened at correct baudrate");
158
- return;
152
+ // Wait for readable stream to be available with timeout
153
+ const maxWaitTime = 3000; // 3 seconds
154
+ const startTime = Date.now();
155
+ while (!this.port.readable) {
156
+ const elapsed = Date.now() - startTime;
157
+ if (elapsed > maxWaitTime) {
158
+ this.console.addLine("");
159
+ this.console.addLine("");
160
+ this.console.addLine(`Terminal disconnected: Port readable stream not available after ${maxWaitTime}ms`);
161
+ this.console.addLine(`This can happen if:`);
162
+ this.console.addLine(`1. Port was just opened and streams are not ready yet`);
163
+ this.console.addLine(`2. Device was reset and port needs to be reopened`);
164
+ this.console.addLine(`3. USB device re-enumerated after reset`);
165
+ console.error("Port readable stream not available - port may need to be reopened at correct baudrate");
166
+ return;
167
+ }
168
+ await new Promise((resolve) => setTimeout(resolve, 50));
159
169
  }
170
+ console.log("Port readable stream is ready - starting console");
160
171
  try {
161
172
  await this.port
162
173
  .readable.pipeThrough(new TextDecoderStream(), {
package/dist/const.d.ts CHANGED
@@ -206,6 +206,10 @@ export declare const ESP32C61_SPI_MISO_DLEN_OFFS = 40;
206
206
  export declare const ESP32C61_SPI_W0_OFFS = 88;
207
207
  export declare const ESP32C61_UART_DATE_REG_ADDR = 1610612860;
208
208
  export declare const ESP32C61_BOOTLOADER_FLASH_OFFSET = 0;
209
+ export declare const ESP32C61_UARTDEV_BUF_NO_REV_LE2 = 1082455532;
210
+ export declare const ESP32C61_UARTDEV_BUF_NO_REV_GT2 = 1082455524;
211
+ export declare const ESP32C61_UARTDEV_BUF_NO_USB_JTAG_SERIAL_REV_LE2 = 3;
212
+ export declare const ESP32C61_UARTDEV_BUF_NO_USB_JTAG_SERIAL_REV_GT2 = 4;
209
213
  export declare const ESP32H2_SPI_REG_BASE = 1610625024;
210
214
  export declare const ESP32H2_BASEFUSEADDR = 1611335680;
211
215
  export declare const ESP32H2_EFUSE_BLOCK1_ADDR: number;
@@ -244,6 +248,8 @@ export declare const ESP32H4_RTC_CNTL_WDTCONFIG0_REG: number;
244
248
  export declare const ESP32H4_RTC_CNTL_WDTCONFIG1_REG: number;
245
249
  export declare const ESP32H4_RTC_CNTL_WDT_WKEY = 1356348065;
246
250
  export declare const ESP32H4_RTC_CNTL_SWD_WKEY = 1356348065;
251
+ export declare const ESP32H4_UARTDEV_BUF_NO = 1082652032;
252
+ export declare const ESP32H4_UARTDEV_BUF_NO_USB_JTAG_SERIAL = 3;
247
253
  export declare const ESP32H21_SPI_REG_BASE = 1610625024;
248
254
  export declare const ESP32H21_BASEFUSEADDR = 1611350016;
249
255
  export declare const ESP32H21_EFUSE_BLOCK1_ADDR: number;
package/dist/const.js CHANGED
@@ -239,6 +239,11 @@ export const ESP32C61_SPI_MISO_DLEN_OFFS = 0x28;
239
239
  export const ESP32C61_SPI_W0_OFFS = 0x58;
240
240
  export const ESP32C61_UART_DATE_REG_ADDR = 0x6000007c;
241
241
  export const ESP32C61_BOOTLOADER_FLASH_OFFSET = 0x0000;
242
+ // ESP32-C61 USB-JTAG/Serial detection (dynamic based on chip revision)
243
+ export const ESP32C61_UARTDEV_BUF_NO_REV_LE2 = 0x4084f5ec; // revision <= 2
244
+ export const ESP32C61_UARTDEV_BUF_NO_REV_GT2 = 0x4084f5e4; // revision > 2
245
+ export const ESP32C61_UARTDEV_BUF_NO_USB_JTAG_SERIAL_REV_LE2 = 3; // revision <= 2
246
+ export const ESP32C61_UARTDEV_BUF_NO_USB_JTAG_SERIAL_REV_GT2 = 4; // revision > 2
242
247
  export const ESP32H2_SPI_REG_BASE = 0x60003000;
243
248
  export const ESP32H2_BASEFUSEADDR = 0x600b0800;
244
249
  export const ESP32H2_EFUSE_BLOCK1_ADDR = ESP32H2_BASEFUSEADDR + 0x044;
@@ -280,6 +285,9 @@ export const ESP32H4_RTC_CNTL_WDTCONFIG0_REG = ESP32H4_DR_REG_LP_WDT_BASE + 0x00
280
285
  export const ESP32H4_RTC_CNTL_WDTCONFIG1_REG = ESP32H4_DR_REG_LP_WDT_BASE + 0x0004; // LP_WDT_RWDT_CONFIG1_REG
281
286
  export const ESP32H4_RTC_CNTL_WDT_WKEY = 0x50d83aa1; // LP_WDT_SWD_WKEY, same as WDT key in this case
282
287
  export const ESP32H4_RTC_CNTL_SWD_WKEY = 0x50d83aa1; // LP_WDT_SWD_WKEY, same as WDT key in this case
288
+ // ESP32-H4 USB-JTAG/Serial detection
289
+ export const ESP32H4_UARTDEV_BUF_NO = 0x4087f580; // Variable in ROM .bss which indicates the port in use
290
+ export const ESP32H4_UARTDEV_BUF_NO_USB_JTAG_SERIAL = 3; // The above var when USB-JTAG/Serial is used
283
291
  export const ESP32H21_SPI_REG_BASE = 0x60003000;
284
292
  export const ESP32H21_BASEFUSEADDR = 0x600b4000;
285
293
  export const ESP32H21_EFUSE_BLOCK1_ADDR = ESP32H21_BASEFUSEADDR + 0x044;
@@ -110,12 +110,12 @@ export declare class ESPLoader extends EventTarget {
110
110
  * Reads data from the input stream and places it in the inputBuffer
111
111
  */
112
112
  readLoop(): Promise<void>;
113
- sleep(ms?: number): Promise<unknown>;
114
113
  state_DTR: boolean;
115
114
  state_RTS: boolean;
116
115
  setRTS(state: boolean): Promise<void>;
117
116
  setDTR(state: boolean): Promise<void>;
118
117
  setDTRandRTS(dtr: boolean, rts: boolean): Promise<void>;
118
+ private runSignalSequence;
119
119
  /**
120
120
  * @name hardResetUSBJTAGSerial
121
121
  * USB-JTAG/Serial reset for Web Serial (Desktop)
@@ -131,11 +131,6 @@ export declare class ESPLoader extends EventTarget {
131
131
  * Keeps IO0=HIGH during reset so chip boots into firmware
132
132
  */
133
133
  hardResetToFirmware(): Promise<void>;
134
- /**
135
- * Reset to firmware mode (not bootloader) for WebUSB
136
- * Keeps IO0=HIGH during reset so chip boots into firmware
137
- */
138
- hardResetToFirmwareWebUSB(): Promise<void>;
139
134
  /**
140
135
  * @name hardResetUnixTight
141
136
  * Unix Tight reset for Web Serial (Desktop) - sets DTR and RTS simultaneously
@@ -144,26 +139,11 @@ export declare class ESPLoader extends EventTarget {
144
139
  setRTSWebUSB(state: boolean): Promise<void>;
145
140
  setDTRWebUSB(state: boolean): Promise<void>;
146
141
  setDTRandRTSWebUSB(dtr: boolean, rts: boolean): Promise<void>;
147
- /**
148
- * @name hardResetUSBJTAGSerialWebUSB
149
- * USB-JTAG/Serial reset for WebUSB (Android)
150
- */
151
- hardResetUSBJTAGSerialWebUSB(): Promise<void>;
152
142
  /**
153
143
  * @name hardResetUSBJTAGSerialInvertedDTRWebUSB
154
144
  * USB-JTAG/Serial reset with inverted DTR for WebUSB (Android)
155
145
  */
156
146
  hardResetUSBJTAGSerialInvertedDTRWebUSB(): Promise<void>;
157
- /**
158
- * @name hardResetClassicWebUSB
159
- * Classic reset for WebUSB (Android)
160
- */
161
- hardResetClassicWebUSB(): Promise<void>;
162
- /**
163
- * @name hardResetUnixTightWebUSB
164
- * Unix Tight reset for WebUSB (Android) - sets DTR and RTS simultaneously
165
- */
166
- hardResetUnixTightWebUSB(): Promise<void>;
167
147
  /**
168
148
  * @name hardResetClassicLongDelayWebUSB
169
149
  * Classic reset with longer delays for WebUSB (Android)
@@ -214,10 +194,12 @@ export declare class ESPLoader extends EventTarget {
214
194
  */
215
195
  rtcWdtResetChipSpecific(): Promise<void>;
216
196
  /**
217
- * Helper: USB-based WDT reset
218
- * Returns true if WDT reset was performed, false otherwise
197
+ * Reset device from bootloader mode to firmware mode
198
+ * Automatically selects the correct reset strategy based on USB connection type
199
+ * @param clearForceDownloadFlag - If true, clears the force download boot flag (USB-OTG only)
200
+ * @returns true if port will change (USB-OTG), false otherwise
219
201
  */
220
- private tryUsbWdtReset;
202
+ resetToFirmwareMode(clearForceDownloadFlag?: boolean): Promise<boolean>;
221
203
  hardReset(bootloader?: boolean): Promise<void>;
222
204
  /**
223
205
  * @name macAddr
@@ -381,6 +363,22 @@ export declare class ESPLoader extends EventTarget {
381
363
  * @returns true if USB-JTAG or USB-OTG, false if external serial chip
382
364
  */
383
365
  detectUsbConnectionType(): Promise<boolean>;
366
+ getUsbMode(): Promise<{
367
+ mode: "uart" | "usb-jtag-serial" | "usb-otg";
368
+ uartNo: number;
369
+ }>;
370
+ /**
371
+ * Check if the current chip supports USB-JTAG or USB-OTG
372
+ * @returns true if chip has native USB support (JTAG or OTG)
373
+ */
374
+ supportsNativeUsb(): boolean;
375
+ /**
376
+ * @name _ensureStreamsReady
377
+ * After a hardware reset, ensure port streams are available.
378
+ * On WebUSB, recreates streams since they break after reset.
379
+ * On Web Serial, waits for streams to become available.
380
+ */
381
+ private _ensureStreamsReady;
384
382
  /**
385
383
  * @name enterConsoleMode
386
384
  * Prepare device for console mode by resetting to firmware
@@ -388,12 +386,6 @@ export declare class ESPLoader extends EventTarget {
388
386
  * @returns true if port was closed (USB-JTAG), false if port stays open (serial chip)
389
387
  */
390
388
  enterConsoleMode(): Promise<boolean>;
391
- /**
392
- * @name _resetToFirmwareIfNeeded
393
- * Reset device from bootloader to firmware when switching to console mode
394
- * Detects USB-JTAG/Serial and USB-OTG devices and performs appropriate reset
395
- * @returns true if reconnect was performed, false otherwise
396
- */
397
389
  /**
398
390
  * @name _clearForceDownloadBootIfNeeded
399
391
  * Read and clear the force download boot flag if it is set
@@ -402,6 +394,12 @@ export declare class ESPLoader extends EventTarget {
402
394
  * Returns true if the flag was cleared, false if it was already clear
403
395
  */
404
396
  private _clearForceDownloadBootIfNeeded;
397
+ /**
398
+ * @name _resetToFirmwareIfNeeded
399
+ * Reset device from bootloader to firmware when switching to console mode
400
+ * Detects USB-JTAG/Serial and USB-OTG devices and performs appropriate reset
401
+ * @returns true if reconnect was performed, false otherwise
402
+ */
405
403
  private _resetToFirmwareIfNeeded;
406
404
  /**
407
405
  * @name reconnectAndResume
@@ -437,6 +435,15 @@ export declare class ESPLoader extends EventTarget {
437
435
  * This is a hardware limitation - use isConsoleResetSupported() to check first.
438
436
  */
439
437
  resetInConsoleMode(): Promise<void>;
438
+ /**
439
+ * @name syncAndWdtReset
440
+ * Open a new bootloader port, sync with ROM (no stub, no reset strategies), and fire WDT reset.
441
+ * This is used for ESP32-S2 USB-OTG devices which require WDT reset to switch modes.
442
+ * After WDT reset the port will re-enumerate again.
443
+ * The user must select the new port after this method is called.
444
+ * @param newPort - The bootloader port selected by the user
445
+ */
446
+ syncAndWdtReset(newPort: SerialPort): Promise<void>;
440
447
  /**
441
448
  * @name drainInputBuffer
442
449
  * Actively drain the input buffer by reading data for a specified time.