tasmota-webserial-esptool 9.2.20 → 9.2.21

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.
package/dist/const.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export interface Logger {
2
- log(msg: string, ...args: any[]): void;
3
- error(msg: string, ...args: any[]): void;
4
- debug(msg: string, ...args: any[]): void;
2
+ log(msg: string, ...args: unknown[]): void;
3
+ error(msg: string, ...args: unknown[]): void;
4
+ debug(msg: string, ...args: unknown[]): void;
5
5
  }
6
6
  export declare const baudRates: number[];
7
7
  export declare const FLASH_SIZES: {
@@ -182,15 +182,17 @@ export declare class ESPLoader extends EventTarget {
182
182
  connectWithResetStrategies(): Promise<void>;
183
183
  /**
184
184
  * @name watchdogReset
185
- * Watchdog reset for ESP32-S2/S3/C3 with USB-OTG or USB-JTAG/Serial
185
+ * Watchdog reset for ESP32-S2/S3/P4 with USB-OTG or USB-JTAG/Serial
186
186
  * Uses RTC watchdog timer to reset the chip - works when DTR/RTS signals are not available
187
187
  * This is an alias for rtcWdtResetChipSpecific() for backwards compatibility
188
+ * Note: ESP32-C3, ESP32-C5, ESP32-C6 do NOT boot correctly after WDT reset
188
189
  */
189
190
  watchdogReset(): Promise<void>;
190
191
  /**
191
- * RTC watchdog timer reset for ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C5, ESP32-C6, and ESP32-P4
192
+ * RTC watchdog timer reset for ESP32-S2, ESP32-S3, and ESP32-P4
192
193
  * Uses specific registers for each chip family
193
- * Note: ESP32-H2 does NOT support WDT reset
194
+ * Note: ESP32-C3 does NOT boot correctly after WDT reset
195
+ * Note: ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2 do NOT support WDT reset (no usable RTC WDT path)
194
196
  */
195
197
  rtcWdtResetChipSpecific(): Promise<void>;
196
198
  /**
@@ -1,5 +1,5 @@
1
1
  /// <reference types="@types/w3c-web-serial" />
2
- import { CHIP_FAMILY_ESP32, CHIP_FAMILY_ESP32S2, CHIP_FAMILY_ESP32S3, CHIP_FAMILY_ESP32C2, CHIP_FAMILY_ESP32C3, CHIP_FAMILY_ESP32C5, CHIP_FAMILY_ESP32C6, CHIP_FAMILY_ESP32C61, CHIP_FAMILY_ESP32H2, CHIP_FAMILY_ESP32H4, CHIP_FAMILY_ESP32H21, CHIP_FAMILY_ESP32P4, CHIP_FAMILY_ESP32S31, CHIP_FAMILY_ESP8266, MAX_TIMEOUT, DEFAULT_TIMEOUT, ERASE_REGION_TIMEOUT_PER_MB, ESP_CHANGE_BAUDRATE, ESP_CHECKSUM_MAGIC, ESP_FLASH_BEGIN, ESP_FLASH_DATA, ESP_FLASH_END, ESP_MEM_BEGIN, ESP_MEM_DATA, ESP_MEM_END, ESP_READ_REG, ESP_WRITE_REG, ESP_SPI_ATTACH, ESP_SYNC, ESP_GET_SECURITY_INFO, FLASH_SECTOR_SIZE, FLASH_WRITE_SIZE, STUB_FLASH_WRITE_SIZE, MEM_END_ROM_TIMEOUT, ROM_INVALID_RECV_MSG, SYNC_PACKET, SYNC_TIMEOUT, USB_RAM_BLOCK, ESP_ERASE_FLASH, ESP_ERASE_REGION, ESP_READ_FLASH, CHIP_ERASE_TIMEOUT, FLASH_READ_TIMEOUT, timeoutPerMb, ESP_ROM_BAUD, USB_JTAG_SERIAL_PID, ESP_FLASH_DEFL_BEGIN, ESP_FLASH_DEFL_DATA, ESP_FLASH_DEFL_END, getSpiFlashAddresses, DETECTED_FLASH_SIZES, CHIP_DETECT_MAGIC_REG_ADDR, CHIP_DETECT_MAGIC_VALUES, CHIP_ID_TO_INFO, ESP32_BASEFUSEADDR, ESP32_APB_CTL_DATE_ADDR, ESP32S2_EFUSE_BLOCK1_ADDR, ESP32S3_EFUSE_BLOCK1_ADDR, ESP32C2_EFUSE_BLOCK2_ADDR, ESP32C5_EFUSE_BLOCK1_ADDR, ESP32C6_EFUSE_BLOCK1_ADDR, ESP32C61_EFUSE_BLOCK1_ADDR, ESP32H2_EFUSE_BLOCK1_ADDR, ESP32P4_EFUSE_BLOCK1_ADDR, ESP32S31_EFUSE_BLOCK1_ADDR, SlipReadError, ESP32S2_RTC_CNTL_WDTWPROTECT_REG, ESP32S2_RTC_CNTL_WDTCONFIG0_REG, ESP32S2_RTC_CNTL_WDTCONFIG1_REG, ESP32S2_RTC_CNTL_WDT_WKEY, ESP32S2_RTC_CNTL_OPTION1_REG, ESP32S2_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK, ESP32S3_RTC_CNTL_WDTWPROTECT_REG, ESP32S3_RTC_CNTL_WDTCONFIG0_REG, ESP32S3_RTC_CNTL_WDTCONFIG1_REG, ESP32S3_RTC_CNTL_WDT_WKEY, ESP32S3_RTC_CNTL_OPTION1_REG, ESP32S3_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK, ESP32C3_EFUSE_RD_MAC_SPI_SYS_3_REG, ESP32C3_EFUSE_RD_MAC_SPI_SYS_5_REG, ESP32C3_RTC_CNTL_WDTWPROTECT_REG, ESP32C3_RTC_CNTL_WDTCONFIG0_REG, ESP32C3_RTC_CNTL_WDTCONFIG1_REG, ESP32C3_RTC_CNTL_WDT_WKEY, ESP32C5_C6_RTC_CNTL_WDTWPROTECT_REG, ESP32C5_C6_RTC_CNTL_WDTCONFIG0_REG, ESP32C5_C6_RTC_CNTL_WDTCONFIG1_REG, ESP32C5_C6_RTC_CNTL_WDT_WKEY, ESP32C5_UART_CLKDIV_REG, ESP32C5_PCR_SYSCLK_CONF_REG, ESP32C5_PCR_SYSCLK_XTAL_FREQ_V, ESP32C5_PCR_SYSCLK_XTAL_FREQ_S, ESP32P4_RTC_CNTL_WDTWPROTECT_REG, ESP32P4_RTC_CNTL_WDTCONFIG0_REG, ESP32P4_RTC_CNTL_WDTCONFIG1_REG, ESP32P4_RTC_CNTL_WDT_WKEY, ESP32P4_RTC_CNTL_OPTION1_REG, ESP32P4_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK, ESP32P4_LP_SYSTEM_REG_ANA_XPD_PAD_GROUP_REG, ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG, ESP32P4_PMU_ANA_0P1A_EN_CUR_LIM_0, ESP32P4_PMU_EXT_LDO_P0_0P1A_REG, ESP32P4_PMU_0P1A_TARGET0_0, ESP32P4_PMU_0P1A_FORCE_TIEH_SEL_0, ESP32P4_PMU_DATE_REG, ESP32S2_UARTDEV_BUF_NO, ESP32S2_UARTDEV_BUF_NO_USB_OTG, ESP32S3_UARTDEV_BUF_NO, ESP32S3_UARTDEV_BUF_NO_USB_OTG, ESP32S3_UARTDEV_BUF_NO_USB_JTAG_SERIAL, ESP32C3_UARTDEV_BUF_NO_USB_JTAG_SERIAL, ESP32C3_BUF_UART_NO_OFFSET, ESP32C5_UARTDEV_BUF_NO, ESP32C5_UARTDEV_BUF_NO_USB_JTAG_SERIAL, ESP32C6_UARTDEV_BUF_NO, ESP32C6_UARTDEV_BUF_NO_USB_JTAG_SERIAL, ESP32C61_UARTDEV_BUF_NO_REV_LE2, ESP32C61_UARTDEV_BUF_NO_REV_GT2, ESP32C61_UARTDEV_BUF_NO_USB_JTAG_SERIAL_REV_LE2, ESP32C61_UARTDEV_BUF_NO_USB_JTAG_SERIAL_REV_GT2, ESP32H2_UARTDEV_BUF_NO, ESP32H2_UARTDEV_BUF_NO_USB_JTAG_SERIAL, ESP32H4_UARTDEV_BUF_NO, ESP32H4_UARTDEV_BUF_NO_USB_JTAG_SERIAL, ESP32P4_UARTDEV_BUF_NO_REV0, ESP32P4_UARTDEV_BUF_NO_REV300, ESP32P4_UARTDEV_BUF_NO_USB_OTG, ESP32P4_UARTDEV_BUF_NO_USB_JTAG_SERIAL, } from "./const";
2
+ import { CHIP_FAMILY_ESP32, CHIP_FAMILY_ESP32S2, CHIP_FAMILY_ESP32S3, CHIP_FAMILY_ESP32C2, CHIP_FAMILY_ESP32C3, CHIP_FAMILY_ESP32C5, CHIP_FAMILY_ESP32C6, CHIP_FAMILY_ESP32C61, CHIP_FAMILY_ESP32H2, CHIP_FAMILY_ESP32H4, CHIP_FAMILY_ESP32H21, CHIP_FAMILY_ESP32P4, CHIP_FAMILY_ESP32S31, CHIP_FAMILY_ESP8266, MAX_TIMEOUT, DEFAULT_TIMEOUT, ERASE_REGION_TIMEOUT_PER_MB, ESP_CHANGE_BAUDRATE, ESP_CHECKSUM_MAGIC, ESP_FLASH_BEGIN, ESP_FLASH_DATA, ESP_FLASH_END, ESP_MEM_BEGIN, ESP_MEM_DATA, ESP_MEM_END, ESP_READ_REG, ESP_WRITE_REG, ESP_SPI_ATTACH, ESP_SYNC, ESP_GET_SECURITY_INFO, FLASH_SECTOR_SIZE, FLASH_WRITE_SIZE, STUB_FLASH_WRITE_SIZE, MEM_END_ROM_TIMEOUT, ROM_INVALID_RECV_MSG, SYNC_PACKET, SYNC_TIMEOUT, USB_RAM_BLOCK, ESP_ERASE_FLASH, ESP_ERASE_REGION, ESP_READ_FLASH, CHIP_ERASE_TIMEOUT, FLASH_READ_TIMEOUT, timeoutPerMb, ESP_ROM_BAUD, USB_JTAG_SERIAL_PID, ESP_FLASH_DEFL_BEGIN, ESP_FLASH_DEFL_DATA, ESP_FLASH_DEFL_END, getSpiFlashAddresses, DETECTED_FLASH_SIZES, CHIP_DETECT_MAGIC_REG_ADDR, CHIP_DETECT_MAGIC_VALUES, CHIP_ID_TO_INFO, ESP32_BASEFUSEADDR, ESP32_APB_CTL_DATE_ADDR, ESP32S2_EFUSE_BLOCK1_ADDR, ESP32S3_EFUSE_BLOCK1_ADDR, ESP32C2_EFUSE_BLOCK2_ADDR, ESP32C5_EFUSE_BLOCK1_ADDR, ESP32C6_EFUSE_BLOCK1_ADDR, ESP32C61_EFUSE_BLOCK1_ADDR, ESP32H2_EFUSE_BLOCK1_ADDR, ESP32P4_EFUSE_BLOCK1_ADDR, ESP32S31_EFUSE_BLOCK1_ADDR, SlipReadError, ESP32S2_RTC_CNTL_WDTWPROTECT_REG, ESP32S2_RTC_CNTL_WDTCONFIG0_REG, ESP32S2_RTC_CNTL_WDTCONFIG1_REG, ESP32S2_RTC_CNTL_WDT_WKEY, ESP32S2_RTC_CNTL_OPTION1_REG, ESP32S2_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK, ESP32S3_RTC_CNTL_WDTWPROTECT_REG, ESP32S3_RTC_CNTL_WDTCONFIG0_REG, ESP32S3_RTC_CNTL_WDTCONFIG1_REG, ESP32S3_RTC_CNTL_WDT_WKEY, ESP32S3_RTC_CNTL_OPTION1_REG, ESP32S3_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK, ESP32C3_EFUSE_RD_MAC_SPI_SYS_3_REG, ESP32C3_EFUSE_RD_MAC_SPI_SYS_5_REG, ESP32C5_UART_CLKDIV_REG, ESP32C5_PCR_SYSCLK_CONF_REG, ESP32C5_PCR_SYSCLK_XTAL_FREQ_V, ESP32C5_PCR_SYSCLK_XTAL_FREQ_S, ESP32P4_RTC_CNTL_WDTWPROTECT_REG, ESP32P4_RTC_CNTL_WDTCONFIG0_REG, ESP32P4_RTC_CNTL_WDTCONFIG1_REG, ESP32P4_RTC_CNTL_WDT_WKEY, ESP32P4_RTC_CNTL_OPTION1_REG, ESP32P4_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK, ESP32P4_LP_SYSTEM_REG_ANA_XPD_PAD_GROUP_REG, ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG, ESP32P4_PMU_ANA_0P1A_EN_CUR_LIM_0, ESP32P4_PMU_EXT_LDO_P0_0P1A_REG, ESP32P4_PMU_0P1A_TARGET0_0, ESP32P4_PMU_0P1A_FORCE_TIEH_SEL_0, ESP32P4_PMU_DATE_REG, ESP32S2_UARTDEV_BUF_NO, ESP32S2_UARTDEV_BUF_NO_USB_OTG, ESP32S3_UARTDEV_BUF_NO, ESP32S3_UARTDEV_BUF_NO_USB_OTG, ESP32S3_UARTDEV_BUF_NO_USB_JTAG_SERIAL, ESP32C3_UARTDEV_BUF_NO_USB_JTAG_SERIAL, ESP32C3_BUF_UART_NO_OFFSET, ESP32C5_UARTDEV_BUF_NO, ESP32C5_UARTDEV_BUF_NO_USB_JTAG_SERIAL, ESP32C6_UARTDEV_BUF_NO, ESP32C6_UARTDEV_BUF_NO_USB_JTAG_SERIAL, ESP32C61_UARTDEV_BUF_NO_REV_LE2, ESP32C61_UARTDEV_BUF_NO_REV_GT2, ESP32C61_UARTDEV_BUF_NO_USB_JTAG_SERIAL_REV_LE2, ESP32C61_UARTDEV_BUF_NO_USB_JTAG_SERIAL_REV_GT2, ESP32H2_UARTDEV_BUF_NO, ESP32H2_UARTDEV_BUF_NO_USB_JTAG_SERIAL, ESP32H4_UARTDEV_BUF_NO, ESP32H4_UARTDEV_BUF_NO_USB_JTAG_SERIAL, ESP32P4_UARTDEV_BUF_NO_REV0, ESP32P4_UARTDEV_BUF_NO_REV300, ESP32P4_UARTDEV_BUF_NO_USB_OTG, ESP32P4_UARTDEV_BUF_NO_USB_JTAG_SERIAL, } from "./const";
3
3
  import { getStubCode } from "./stubs";
4
4
  import { hexFormatter, padTo, sleep, slipEncode, toHex } from "./util";
5
5
  import { deflate } from "pako";
@@ -1186,7 +1186,7 @@ export class ESPLoader extends EventTarget {
1186
1186
  this.logger.debug(`Connected CDC/JTAG successfully with ${strategy.name} reset.`);
1187
1187
  return;
1188
1188
  }
1189
- catch (_error) {
1189
+ catch {
1190
1190
  throw new Error("Sync timeout or abandoned");
1191
1191
  }
1192
1192
  }
@@ -1217,17 +1217,19 @@ export class ESPLoader extends EventTarget {
1217
1217
  }
1218
1218
  /**
1219
1219
  * @name watchdogReset
1220
- * Watchdog reset for ESP32-S2/S3/C3 with USB-OTG or USB-JTAG/Serial
1220
+ * Watchdog reset for ESP32-S2/S3/P4 with USB-OTG or USB-JTAG/Serial
1221
1221
  * Uses RTC watchdog timer to reset the chip - works when DTR/RTS signals are not available
1222
1222
  * This is an alias for rtcWdtResetChipSpecific() for backwards compatibility
1223
+ * Note: ESP32-C3, ESP32-C5, ESP32-C6 do NOT boot correctly after WDT reset
1223
1224
  */
1224
1225
  async watchdogReset() {
1225
1226
  await this.rtcWdtResetChipSpecific();
1226
1227
  }
1227
1228
  /**
1228
- * RTC watchdog timer reset for ESP32-S2, ESP32-S3, ESP32-C3, ESP32-C5, ESP32-C6, and ESP32-P4
1229
+ * RTC watchdog timer reset for ESP32-S2, ESP32-S3, and ESP32-P4
1229
1230
  * Uses specific registers for each chip family
1230
- * Note: ESP32-H2 does NOT support WDT reset
1231
+ * Note: ESP32-C3 does NOT boot correctly after WDT reset
1232
+ * Note: ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2 do NOT support WDT reset (no usable RTC WDT path)
1231
1233
  */
1232
1234
  async rtcWdtResetChipSpecific() {
1233
1235
  this.logger.debug("Hard resetting with watchdog timer...");
@@ -1247,20 +1249,6 @@ export class ESPLoader extends EventTarget {
1247
1249
  WDTCONFIG1_REG = ESP32S3_RTC_CNTL_WDTCONFIG1_REG;
1248
1250
  WDT_WKEY = ESP32S3_RTC_CNTL_WDT_WKEY;
1249
1251
  }
1250
- else if (this.chipFamily === CHIP_FAMILY_ESP32C3) {
1251
- WDTWPROTECT_REG = ESP32C3_RTC_CNTL_WDTWPROTECT_REG;
1252
- WDTCONFIG0_REG = ESP32C3_RTC_CNTL_WDTCONFIG0_REG;
1253
- WDTCONFIG1_REG = ESP32C3_RTC_CNTL_WDTCONFIG1_REG;
1254
- WDT_WKEY = ESP32C3_RTC_CNTL_WDT_WKEY;
1255
- }
1256
- else if (this.chipFamily === CHIP_FAMILY_ESP32C5 ||
1257
- this.chipFamily === CHIP_FAMILY_ESP32C6) {
1258
- // C5 and C6 use LP_WDT (Low Power Watchdog Timer)
1259
- WDTWPROTECT_REG = ESP32C5_C6_RTC_CNTL_WDTWPROTECT_REG;
1260
- WDTCONFIG0_REG = ESP32C5_C6_RTC_CNTL_WDTCONFIG0_REG;
1261
- WDTCONFIG1_REG = ESP32C5_C6_RTC_CNTL_WDTCONFIG1_REG;
1262
- WDT_WKEY = ESP32C5_C6_RTC_CNTL_WDT_WKEY;
1263
- }
1264
1252
  else if (this.chipFamily === CHIP_FAMILY_ESP32P4) {
1265
1253
  // P4 uses LP_WDT (Low Power Watchdog Timer)
1266
1254
  WDTWPROTECT_REG = ESP32P4_RTC_CNTL_WDTWPROTECT_REG;
@@ -1308,7 +1296,6 @@ export class ESPLoader extends EventTarget {
1308
1296
  // Fall back to generic USB-JTAG/OTG handling
1309
1297
  usbMode = { mode: "usb-jtag-serial", uartNo: 0 };
1310
1298
  }
1311
- // Check if chip supports WDT reset
1312
1299
  // WDT reset is not needed for ESP32-C3
1313
1300
  // WDT reset is supported by: ESP32-S2, ESP32-S3, ESP32-P4
1314
1301
  // WDT reset is NOT supported by: ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2
@@ -1421,53 +1408,65 @@ export class ESPLoader extends EventTarget {
1421
1408
  // Detect USB connection type to choose correct reset method
1422
1409
  const isUsbJtagOrOtg = await this.detectUsbConnectionType();
1423
1410
  if (isUsbJtagOrOtg) {
1424
- // USB-JTAG/OTG devices: Use WDT reset
1425
- this.logger.debug("USB-JTAG/OTG detected - using WDT reset");
1426
- // Get USB mode details
1427
- let usbMode;
1428
- try {
1429
- usbMode = await this.getUsbMode();
1430
- this.logger.debug(`USB mode: ${usbMode.mode} (uartNo=${usbMode.uartNo})`);
1431
- }
1432
- catch (err) {
1433
- this.logger.debug(`Could not get USB mode: ${err}`);
1434
- usbMode = { mode: "usb-jtag-serial", uartNo: 0 };
1435
- }
1436
- // Clear force download flag for USB-OTG devices
1437
- if (usbMode.mode === "usb-otg") {
1411
+ // USB-JTAG/OTG devices: Check if chip supports WDT reset
1412
+ // Only S2, S3, P4 support WDT reset correctly
1413
+ // C3, C5, C6, C61, H2 do NOT boot correctly after WDT reset
1414
+ const supportsWdtReset = this.chipFamily === CHIP_FAMILY_ESP32S2 ||
1415
+ this.chipFamily === CHIP_FAMILY_ESP32S3 ||
1416
+ this.chipFamily === CHIP_FAMILY_ESP32P4;
1417
+ if (supportsWdtReset) {
1418
+ this.logger.debug("USB-JTAG/OTG detected - using WDT reset");
1419
+ // Get USB mode details
1420
+ let usbMode;
1438
1421
  try {
1439
- const flagCleared = await this._clearForceDownloadBootIfNeeded();
1440
- if (flagCleared) {
1441
- this.logger.debug("Force download boot flag cleared");
1442
- }
1422
+ usbMode = await this.getUsbMode();
1423
+ this.logger.debug(`USB mode: ${usbMode.mode} (uartNo=${usbMode.uartNo})`);
1443
1424
  }
1444
1425
  catch (err) {
1445
- this.logger.debug(`Could not clear force download flag: ${err}`);
1426
+ this.logger.debug(`Could not get USB mode: ${err}`);
1427
+ usbMode = { mode: "usb-jtag-serial", uartNo: 0 };
1428
+ }
1429
+ // Clear force download flag for USB-OTG devices
1430
+ if (usbMode.mode === "usb-otg") {
1431
+ try {
1432
+ const flagCleared = await this._clearForceDownloadBootIfNeeded();
1433
+ if (flagCleared) {
1434
+ this.logger.debug("Force download boot flag cleared");
1435
+ }
1436
+ }
1437
+ catch (err) {
1438
+ this.logger.debug(`Could not clear force download flag: ${err}`);
1439
+ }
1446
1440
  }
1441
+ // Perform WDT reset
1442
+ await this.rtcWdtResetChipSpecific();
1443
+ this.logger.debug(`${this.chipName}: WDT reset to firmware complete`);
1444
+ return;
1445
+ }
1446
+ else {
1447
+ // C3, C5, C6, etc. - use classic reset (like external serial chips)
1448
+ this.logger.debug(`${this.chipName} does not support WDT reset - using classic reset instead`);
1447
1449
  }
1448
- // Perform WDT reset
1449
- await this.rtcWdtResetChipSpecific();
1450
- this.logger.debug(`${this.chipName}: WDT reset to firmware complete`);
1451
- return;
1452
1450
  }
1453
1451
  else {
1454
1452
  // External serial chip: Use classic reset
1455
1453
  this.logger.debug("External serial chip detected - using classic reset");
1456
- if (this.isWebUSB()) {
1457
- // WebUSB: Use longer delays for better compatibility
1458
- await this.setRTSWebUSB(true); // EN->LOW
1459
- await sleep(200);
1460
- await this.setRTSWebUSB(false);
1461
- await sleep(200);
1462
- this.logger.debug("Hard reset to firmware (WebUSB).");
1463
- }
1464
- else {
1465
- // Web Serial: Standard reset
1466
- await this.setRTS(true); // EN->LOW
1467
- await sleep(100);
1468
- await this.setRTS(false);
1469
- this.logger.debug("Hard reset to firmware.");
1470
- }
1454
+ }
1455
+ // Classic reset: used for external serial chips and USB-JTAG chips that do not support WDT reset
1456
+ if (this.isWebUSB()) {
1457
+ // WebUSB: Use longer delays for better compatibility
1458
+ await this.setRTSWebUSB(true); // EN->LOW
1459
+ await sleep(200);
1460
+ await this.setRTSWebUSB(false);
1461
+ await sleep(200);
1462
+ this.logger.debug("Hard reset to firmware (WebUSB).");
1463
+ }
1464
+ else {
1465
+ // Web Serial: Standard reset
1466
+ await this.setRTS(true); // EN->LOW
1467
+ await sleep(100);
1468
+ await this.setRTS(false);
1469
+ this.logger.debug("Hard reset to firmware.");
1471
1470
  }
1472
1471
  }
1473
1472
  await new Promise((resolve) => setTimeout(resolve, 1000));
@@ -1988,9 +1987,9 @@ export class ESPLoader extends EventTarget {
1988
1987
  // Restart Readloop
1989
1988
  this.readLoop();
1990
1989
  }
1991
- catch (_e) {
1992
- // this.logger.error(`Reconfigure port error: ${e}`);
1993
- // throw new Error(`Unable to change the baud rate to ${baud}: ${e}`);
1990
+ catch {
1991
+ // this.logger.error(`Reconfigure port error`);
1992
+ // throw new Error(`Unable to change the baud rate to ${baud}`);
1994
1993
  }
1995
1994
  finally {
1996
1995
  // Always reset flag, even on error or early return
@@ -2598,8 +2597,8 @@ export class ESPLoader extends EventTarget {
2598
2597
  try {
2599
2598
  await this._writeChain;
2600
2599
  }
2601
- catch (_err) {
2602
- // this.logger.debug(`Pending write error during disconnect: ${err}`);
2600
+ catch {
2601
+ // this.logger.debug("Pending write error during disconnect");
2603
2602
  }
2604
2603
  // Release persistent writer before closing
2605
2604
  if (this._writer) {
@@ -2607,8 +2606,8 @@ export class ESPLoader extends EventTarget {
2607
2606
  await this._writer.close();
2608
2607
  this._writer.releaseLock();
2609
2608
  }
2610
- catch (_err) {
2611
- // this.logger.debug(`Writer close/release error: ${err}`);
2609
+ catch {
2610
+ // this.logger.debug("Writer close/release error");
2612
2611
  }
2613
2612
  this._writer = undefined;
2614
2613
  }
@@ -2620,8 +2619,8 @@ export class ESPLoader extends EventTarget {
2620
2619
  await writer.close();
2621
2620
  writer.releaseLock();
2622
2621
  }
2623
- catch (_err) {
2624
- // this.logger.debug(`Direct writer close error: ${err}`);
2622
+ catch {
2623
+ // this.logger.debug("Direct writer close error");
2625
2624
  }
2626
2625
  }
2627
2626
  await new Promise((resolve) => {
@@ -2642,7 +2641,7 @@ export class ESPLoader extends EventTarget {
2642
2641
  try {
2643
2642
  this._reader.cancel();
2644
2643
  }
2645
- catch (_err) {
2644
+ catch {
2646
2645
  // Reader already released, resolve immediately
2647
2646
  clearTimeout(timeout);
2648
2647
  resolve(undefined);
@@ -2672,8 +2671,8 @@ export class ESPLoader extends EventTarget {
2672
2671
  try {
2673
2672
  await this._writeChain;
2674
2673
  }
2675
- catch (_err) {
2676
- // this.logger.debug(`Pending write error during release: ${err}`);
2674
+ catch {
2675
+ // this.logger.debug("Pending write error during release");
2677
2676
  }
2678
2677
  // Release writer
2679
2678
  if (this._writer) {