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 +8 -3
- package/dist/const.js +6 -0
- package/dist/esp_loader.d.ts +5 -3
- package/dist/esp_loader.js +79 -71
- package/dist/stubs/esp32s31.json +8 -0
- package/dist/stubs/index.js +4 -2
- package/dist/web/esp32s31-cyImlcoa.js +1 -0
- package/dist/web/index.js +1 -1
- package/js/modules/esp32s31-cyImlcoa.js +1 -0
- package/js/modules/esptool.js +1 -1
- package/package.json +20 -15
- package/src/const.ts +12 -3
- package/src/esp_loader.ts +93 -84
- package/src/stubs/esp32s31.json +8 -0
- package/src/stubs/index.ts +3 -2
package/dist/const.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export interface Logger {
|
|
2
|
-
log(msg: string, ...args:
|
|
3
|
-
error(msg: string, ...args:
|
|
4
|
-
debug(msg: string, ...args:
|
|
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)
|
package/dist/esp_loader.d.ts
CHANGED
|
@@ -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/
|
|
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-
|
|
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-
|
|
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
|
/**
|
package/dist/esp_loader.js
CHANGED
|
@@ -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,
|
|
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
|
|
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/
|
|
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-
|
|
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-
|
|
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:
|
|
1425
|
-
|
|
1426
|
-
//
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
this.
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
usbMode
|
|
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
|
-
|
|
1440
|
-
|
|
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
|
|
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
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
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
|
|
1992
|
-
// this.logger.error(`Reconfigure port error
|
|
1993
|
-
// throw new Error(`Unable to change the baud rate to ${baud}
|
|
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
|
|
2602
|
-
// this.logger.debug(
|
|
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
|
|
2611
|
-
// this.logger.debug(
|
|
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
|
|
2624
|
-
// this.logger.debug(
|
|
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
|
|
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
|
|
2676
|
-
// this.logger.debug(
|
|
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
|
+
}
|
package/dist/stubs/index.js
CHANGED
|
@@ -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};
|