tasmota-webserial-esptool 9.2.20 → 9.2.22

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: {
@@ -319,6 +319,11 @@ export declare const ESP32S31_SPI_MISO_DLEN_OFFS = 40;
319
319
  export declare const ESP32S31_SPI_W0_OFFS = 88;
320
320
  export declare const ESP32S31_UART_DATE_REG_ADDR: number;
321
321
  export declare const ESP32S31_BOOTLOADER_FLASH_OFFSET = 8192;
322
+ export declare const ESP32S31_DR_REG_LP_WDT_BASE = 545263616;
323
+ export declare const ESP32S31_RTC_CNTL_WDTCONFIG0_REG: number;
324
+ export declare const ESP32S31_RTC_CNTL_WDTCONFIG1_REG: number;
325
+ export declare const ESP32S31_RTC_CNTL_WDTWPROTECT_REG: number;
326
+ export declare const ESP32S31_RTC_CNTL_WDT_WKEY = 1356348065;
322
327
  export interface SpiFlashAddresses {
323
328
  regBase: number;
324
329
  baseFuse: number;
package/dist/const.js CHANGED
@@ -364,6 +364,12 @@ export const ESP32S31_SPI_MISO_DLEN_OFFS = 0x28;
364
364
  export const ESP32S31_SPI_W0_OFFS = 0x58;
365
365
  export const ESP32S31_UART_DATE_REG_ADDR = 0x2038a000 + 0x8c;
366
366
  export const ESP32S31_BOOTLOADER_FLASH_OFFSET = 0x2000;
367
+ // ESP32-S31 RTC Watchdog Timer registers (LP_WDT)
368
+ export const ESP32S31_DR_REG_LP_WDT_BASE = 0x20801000;
369
+ export const ESP32S31_RTC_CNTL_WDTCONFIG0_REG = ESP32S31_DR_REG_LP_WDT_BASE + 0x0000; // LP_WDT_RWDT_CONFIG0_REG
370
+ export const ESP32S31_RTC_CNTL_WDTCONFIG1_REG = ESP32S31_DR_REG_LP_WDT_BASE + 0x0004; // LP_WDT_RWDT_CONFIG1_REG
371
+ export const ESP32S31_RTC_CNTL_WDTWPROTECT_REG = ESP32S31_DR_REG_LP_WDT_BASE + 0x0018; // LP_WDT_RWDT_WPROTECT_REG
372
+ export const ESP32S31_RTC_CNTL_WDT_WKEY = 0x50d83aa1;
367
373
  export const SYNC_PACKET = toByteArray("\x07\x07\x12 UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU");
368
374
  export const CHIP_DETECT_MAGIC_REG_ADDR = 0x40001000;
369
375
  // Image Chip IDs (used by ESP32-C3 and later for chip detection)
@@ -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, ESP32-P4, and ESP32-S31
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, ESP32S31_RTC_CNTL_WDTWPROTECT_REG, ESP32S31_RTC_CNTL_WDTCONFIG0_REG, ESP32S31_RTC_CNTL_WDTCONFIG1_REG, ESP32S31_RTC_CNTL_WDT_WKEY, 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, ESP32-P4, and ESP32-S31
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;
@@ -1268,6 +1256,13 @@ export class ESPLoader extends EventTarget {
1268
1256
  WDTCONFIG1_REG = ESP32P4_RTC_CNTL_WDTCONFIG1_REG;
1269
1257
  WDT_WKEY = ESP32P4_RTC_CNTL_WDT_WKEY;
1270
1258
  }
1259
+ else if (this.chipFamily === CHIP_FAMILY_ESP32S31) {
1260
+ // S31 uses LP_WDT (Low Power Watchdog Timer)
1261
+ WDTWPROTECT_REG = ESP32S31_RTC_CNTL_WDTWPROTECT_REG;
1262
+ WDTCONFIG0_REG = ESP32S31_RTC_CNTL_WDTCONFIG0_REG;
1263
+ WDTCONFIG1_REG = ESP32S31_RTC_CNTL_WDTCONFIG1_REG;
1264
+ WDT_WKEY = ESP32S31_RTC_CNTL_WDT_WKEY;
1265
+ }
1271
1266
  else {
1272
1267
  throw new Error(`rtcWdtResetChipSpecific() is not supported for ${this.chipFamily}`);
1273
1268
  }
@@ -1308,13 +1303,13 @@ export class ESPLoader extends EventTarget {
1308
1303
  // Fall back to generic USB-JTAG/OTG handling
1309
1304
  usbMode = { mode: "usb-jtag-serial", uartNo: 0 };
1310
1305
  }
1311
- // Check if chip supports WDT reset
1312
1306
  // WDT reset is not needed for ESP32-C3
1313
1307
  // WDT reset is supported by: ESP32-S2, ESP32-S3, ESP32-P4
1314
1308
  // WDT reset is NOT supported by: ESP32-C5, ESP32-C6, ESP32-C61, ESP32-H2
1315
1309
  const supportsWdtReset = this.chipFamily === CHIP_FAMILY_ESP32S2 ||
1316
1310
  this.chipFamily === CHIP_FAMILY_ESP32S3 ||
1317
- this.chipFamily === CHIP_FAMILY_ESP32P4;
1311
+ this.chipFamily === CHIP_FAMILY_ESP32P4 ||
1312
+ this.chipFamily === CHIP_FAMILY_ESP32S31;
1318
1313
  if (!supportsWdtReset) {
1319
1314
  this.logger.debug(`${this.chipName} does not support WDT reset - using classic reset instead`);
1320
1315
  // Use classic reset for chips without WDT support
@@ -1421,53 +1416,66 @@ export class ESPLoader extends EventTarget {
1421
1416
  // Detect USB connection type to choose correct reset method
1422
1417
  const isUsbJtagOrOtg = await this.detectUsbConnectionType();
1423
1418
  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") {
1419
+ // USB-JTAG/OTG devices: Check if chip supports WDT reset
1420
+ // Only S2, S3, P4 support WDT reset correctly
1421
+ // C3, C5, C6, C61, H2 do NOT boot correctly after WDT reset
1422
+ const supportsWdtReset = this.chipFamily === CHIP_FAMILY_ESP32S2 ||
1423
+ this.chipFamily === CHIP_FAMILY_ESP32S3 ||
1424
+ this.chipFamily === CHIP_FAMILY_ESP32P4 ||
1425
+ this.chipFamily === CHIP_FAMILY_ESP32S31;
1426
+ if (supportsWdtReset) {
1427
+ this.logger.debug("USB-JTAG/OTG detected - using WDT reset");
1428
+ // Get USB mode details
1429
+ let usbMode;
1438
1430
  try {
1439
- const flagCleared = await this._clearForceDownloadBootIfNeeded();
1440
- if (flagCleared) {
1441
- this.logger.debug("Force download boot flag cleared");
1442
- }
1431
+ usbMode = await this.getUsbMode();
1432
+ this.logger.debug(`USB mode: ${usbMode.mode} (uartNo=${usbMode.uartNo})`);
1443
1433
  }
1444
1434
  catch (err) {
1445
- this.logger.debug(`Could not clear force download flag: ${err}`);
1435
+ this.logger.debug(`Could not get USB mode: ${err}`);
1436
+ usbMode = { mode: "usb-jtag-serial", uartNo: 0 };
1437
+ }
1438
+ // Clear force download flag for USB-OTG devices
1439
+ if (usbMode.mode === "usb-otg") {
1440
+ try {
1441
+ const flagCleared = await this._clearForceDownloadBootIfNeeded();
1442
+ if (flagCleared) {
1443
+ this.logger.debug("Force download boot flag cleared");
1444
+ }
1445
+ }
1446
+ catch (err) {
1447
+ this.logger.debug(`Could not clear force download flag: ${err}`);
1448
+ }
1446
1449
  }
1450
+ // Perform WDT reset
1451
+ await this.rtcWdtResetChipSpecific();
1452
+ this.logger.debug(`${this.chipName}: WDT reset to firmware complete`);
1453
+ return;
1454
+ }
1455
+ else {
1456
+ // C3, C5, C6, etc. - use classic reset (like external serial chips)
1457
+ this.logger.debug(`${this.chipName} does not support WDT reset - using classic reset instead`);
1447
1458
  }
1448
- // Perform WDT reset
1449
- await this.rtcWdtResetChipSpecific();
1450
- this.logger.debug(`${this.chipName}: WDT reset to firmware complete`);
1451
- return;
1452
1459
  }
1453
1460
  else {
1454
1461
  // External serial chip: Use classic reset
1455
1462
  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
- }
1463
+ }
1464
+ // Classic reset: used for external serial chips and USB-JTAG chips that do not support WDT reset
1465
+ if (this.isWebUSB()) {
1466
+ // WebUSB: Use longer delays for better compatibility
1467
+ await this.setRTSWebUSB(true); // EN->LOW
1468
+ await sleep(200);
1469
+ await this.setRTSWebUSB(false);
1470
+ await sleep(200);
1471
+ this.logger.debug("Hard reset to firmware (WebUSB).");
1472
+ }
1473
+ else {
1474
+ // Web Serial: Standard reset
1475
+ await this.setRTS(true); // EN->LOW
1476
+ await sleep(100);
1477
+ await this.setRTS(false);
1478
+ this.logger.debug("Hard reset to firmware.");
1471
1479
  }
1472
1480
  }
1473
1481
  await new Promise((resolve) => setTimeout(resolve, 1000));
@@ -1988,9 +1996,9 @@ export class ESPLoader extends EventTarget {
1988
1996
  // Restart Readloop
1989
1997
  this.readLoop();
1990
1998
  }
1991
- catch (_e) {
1992
- // this.logger.error(`Reconfigure port error: ${e}`);
1993
- // throw new Error(`Unable to change the baud rate to ${baud}: ${e}`);
1999
+ catch {
2000
+ // this.logger.error(`Reconfigure port error`);
2001
+ // throw new Error(`Unable to change the baud rate to ${baud}`);
1994
2002
  }
1995
2003
  finally {
1996
2004
  // Always reset flag, even on error or early return
@@ -2598,8 +2606,8 @@ export class ESPLoader extends EventTarget {
2598
2606
  try {
2599
2607
  await this._writeChain;
2600
2608
  }
2601
- catch (_err) {
2602
- // this.logger.debug(`Pending write error during disconnect: ${err}`);
2609
+ catch {
2610
+ // this.logger.debug("Pending write error during disconnect");
2603
2611
  }
2604
2612
  // Release persistent writer before closing
2605
2613
  if (this._writer) {
@@ -2607,8 +2615,8 @@ export class ESPLoader extends EventTarget {
2607
2615
  await this._writer.close();
2608
2616
  this._writer.releaseLock();
2609
2617
  }
2610
- catch (_err) {
2611
- // this.logger.debug(`Writer close/release error: ${err}`);
2618
+ catch {
2619
+ // this.logger.debug("Writer close/release error");
2612
2620
  }
2613
2621
  this._writer = undefined;
2614
2622
  }
@@ -2620,8 +2628,8 @@ export class ESPLoader extends EventTarget {
2620
2628
  await writer.close();
2621
2629
  writer.releaseLock();
2622
2630
  }
2623
- catch (_err) {
2624
- // this.logger.debug(`Direct writer close error: ${err}`);
2631
+ catch {
2632
+ // this.logger.debug("Direct writer close error");
2625
2633
  }
2626
2634
  }
2627
2635
  await new Promise((resolve) => {
@@ -2642,7 +2650,7 @@ export class ESPLoader extends EventTarget {
2642
2650
  try {
2643
2651
  this._reader.cancel();
2644
2652
  }
2645
- catch (_err) {
2653
+ catch {
2646
2654
  // Reader already released, resolve immediately
2647
2655
  clearTimeout(timeout);
2648
2656
  resolve(undefined);
@@ -2672,8 +2680,8 @@ export class ESPLoader extends EventTarget {
2672
2680
  try {
2673
2681
  await this._writeChain;
2674
2682
  }
2675
- catch (_err) {
2676
- // this.logger.debug(`Pending write error during release: ${err}`);
2683
+ catch {
2684
+ // this.logger.debug("Pending write error during release");
2677
2685
  }
2678
2686
  // Release writer
2679
2687
  if (this._writer) {
@@ -0,0 +1,8 @@
1
+ {
2
+ "entry": 788533248,
3
+ "text": "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",
4
+ "text_start": 788533248,
5
+ "data": "ECIAL0wiAS+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+qGgAvthoALwIbAC8uGwAvuBsAL2IbAC+MGgAv+hsAL3YcAC+cHAAvQhoAL4ocAC9CGgAvAh0ALxIdAC8WHQAvAhsAL24dAC+CHQAv",
6
+ "data_start": 788647348,
7
+ "bss_start": 788570112
8
+ }
@@ -4,8 +4,7 @@ export const getStubCode = async (chipFamily, chipRevision) => {
4
4
  let stubcode;
5
5
  // Chips without stub support yet
6
6
  if (chipFamily == CHIP_FAMILY_ESP32H4 ||
7
- chipFamily == CHIP_FAMILY_ESP32H21 ||
8
- chipFamily == CHIP_FAMILY_ESP32S31) {
7
+ chipFamily == CHIP_FAMILY_ESP32H21) {
9
8
  return null;
10
9
  }
11
10
  if (chipFamily == CHIP_FAMILY_ESP32) {
@@ -47,6 +46,9 @@ export const getStubCode = async (chipFamily, chipRevision) => {
47
46
  stubcode = await import("./esp32p4.json");
48
47
  }
49
48
  }
49
+ else if (chipFamily == CHIP_FAMILY_ESP32S31) {
50
+ stubcode = await import("./esp32s31.json");
51
+ }
50
52
  else {
51
53
  // Unknown chip family - no stub available
52
54
  return null;
@@ -0,0 +1 @@
1
+ var A=788533248,B="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",E=788533248,F="ECIAL0wiAS+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+OEwAvjhMAL44TAC+qGgAvthoALwIbAC8uGwAvuBsAL2IbAC+MGgAv+hsAL3YcAC+cHAAvQhoAL4ocAC9CGgAvAh0ALxIdAC8WHQAvAhsAL24dAC+CHQAv",Q=788647348,w=788570112,g={entry:A,text:B,text_start:E,data:F,data_start:Q,bss_start:w};export{w as bss_start,F as data,Q as data_start,g as default,A as entry,B as text,E as text_start};