esp32tool 1.3.4 → 1.3.6

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/const.d.ts CHANGED
@@ -277,6 +277,16 @@ export declare const ESP32P4_GPIO_STRAP_REG = 1343094840;
277
277
  export declare const ESP32P4_GPIO_STRAP_SPI_BOOT_MASK = 8;
278
278
  export declare const ESP32P4_RTC_CNTL_OPTION1_REG = 1343291400;
279
279
  export declare const ESP32P4_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK = 4;
280
+ export declare const ESP32P4_DR_REG_LPAON_BASE = 1343291392;
281
+ export declare const ESP32P4_DR_REG_PMU_BASE: number;
282
+ export declare const ESP32P4_DR_REG_LP_SYS_BASE: number;
283
+ export declare const ESP32P4_LP_SYSTEM_REG_ANA_XPD_PAD_GROUP_REG: number;
284
+ export declare const ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG: number;
285
+ export declare const ESP32P4_PMU_ANA_0P1A_EN_CUR_LIM_0: number;
286
+ export declare const ESP32P4_PMU_EXT_LDO_P0_0P1A_REG: number;
287
+ export declare const ESP32P4_PMU_0P1A_TARGET0_0: number;
288
+ export declare const ESP32P4_PMU_0P1A_FORCE_TIEH_SEL_0: number;
289
+ export declare const ESP32P4_PMU_DATE_REG: number;
280
290
  export declare const ESP32S31_SPI_REG_BASE = 542113792;
281
291
  export declare const ESP32S31_BASEFUSEADDR = 544296960;
282
292
  export declare const ESP32S31_EFUSE_BLOCK1_ADDR: number;
package/dist/const.js CHANGED
@@ -318,6 +318,17 @@ export const ESP32P4_GPIO_STRAP_REG = 0x500e0038;
318
318
  export const ESP32P4_GPIO_STRAP_SPI_BOOT_MASK = 0x8; // Not download mode
319
319
  export const ESP32P4_RTC_CNTL_OPTION1_REG = 0x50110008;
320
320
  export const ESP32P4_RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK = 0x4; // Is download mode forced over USB?
321
+ // Flash power-on related registers and bits needed for ECO6 (Rev 301)
322
+ export const ESP32P4_DR_REG_LPAON_BASE = 0x50110000;
323
+ export const ESP32P4_DR_REG_PMU_BASE = ESP32P4_DR_REG_LPAON_BASE + 0x5000;
324
+ export const ESP32P4_DR_REG_LP_SYS_BASE = ESP32P4_DR_REG_LPAON_BASE + 0x0;
325
+ export const ESP32P4_LP_SYSTEM_REG_ANA_XPD_PAD_GROUP_REG = ESP32P4_DR_REG_LP_SYS_BASE + 0x10c;
326
+ export const ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG = ESP32P4_DR_REG_PMU_BASE + 0x1bc;
327
+ export const ESP32P4_PMU_ANA_0P1A_EN_CUR_LIM_0 = 1 << 27;
328
+ export const ESP32P4_PMU_EXT_LDO_P0_0P1A_REG = ESP32P4_DR_REG_PMU_BASE + 0x1b8;
329
+ export const ESP32P4_PMU_0P1A_TARGET0_0 = 0xff << 23;
330
+ export const ESP32P4_PMU_0P1A_FORCE_TIEH_SEL_0 = 1 << 7;
331
+ export const ESP32P4_PMU_DATE_REG = ESP32P4_DR_REG_PMU_BASE + 0x3fc;
321
332
  export const ESP32S31_SPI_REG_BASE = 0x20500000;
322
333
  export const ESP32S31_BASEFUSEADDR = 0x20715000;
323
334
  export const ESP32S31_EFUSE_BLOCK1_ADDR = ESP32S31_BASEFUSEADDR + 0x044;
@@ -88,6 +88,12 @@ export declare class ESPLoader extends EventTarget {
88
88
  * Get chip revision for ESP32-P4
89
89
  */
90
90
  getChipRevision(): Promise<number>;
91
+ /**
92
+ * Power on the flash chip for ESP32-P4 Rev 301 (ECO6)
93
+ * The flash chip is powered off by default on ECO6, when the default flash
94
+ * voltage changed from 1.8V to 3.3V. This is to prevent damage to 1.8V flash chips.
95
+ */
96
+ powerOnFlash(): Promise<void>;
91
97
  /**
92
98
  * Get security info including chip ID (ESP32-C3 and later)
93
99
  */
@@ -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, ESP32P4_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, 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, } 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, ESP32P4_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, 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, } from "./const";
3
3
  import { getStubCode } from "./stubs";
4
4
  import { hexFormatter, sleep, slipEncode, toHex } from "./util";
5
5
  import { deflate } from "pako";
@@ -345,6 +345,10 @@ export class ESPLoader extends EventTarget {
345
345
  await this.connectWithResetStrategies();
346
346
  // Detect chip type
347
347
  await this.detectChip();
348
+ // Power on flash for ESP32-P4 Rev 301 (must be done before loading stub)
349
+ if (this.chipFamily === CHIP_FAMILY_ESP32P4 && this.chipRevision === 301) {
350
+ await this.powerOnFlash();
351
+ }
348
352
  // Detect if device is using USB-JTAG/Serial or USB-OTG (not external serial chip)
349
353
  // This is needed to determine the correct reset strategy for console mode
350
354
  try {
@@ -460,6 +464,42 @@ export class ESPLoader extends EventTarget {
460
464
  }
461
465
  return 0;
462
466
  }
467
+ /**
468
+ * Power on the flash chip for ESP32-P4 Rev 301 (ECO6)
469
+ * The flash chip is powered off by default on ECO6, when the default flash
470
+ * voltage changed from 1.8V to 3.3V. This is to prevent damage to 1.8V flash chips.
471
+ */
472
+ async powerOnFlash() {
473
+ if (this.chipFamily !== CHIP_FAMILY_ESP32P4) {
474
+ return; // Only needed for ESP32-P4
475
+ }
476
+ if (this.chipRevision !== 301) {
477
+ return; // Only needed for Rev 301 (ECO6)
478
+ }
479
+ this.logger.debug("Powering on flash for ESP32-P4 Rev 301 (ECO6)");
480
+ // Power up pad group
481
+ await this.writeRegister(ESP32P4_LP_SYSTEM_REG_ANA_XPD_PAD_GROUP_REG, 1);
482
+ await sleep(10); // 0.01 seconds
483
+ // Flash power up sequence
484
+ const pmuAnaReg = await this.readRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG);
485
+ await this.writeRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG, pmuAnaReg | ESP32P4_PMU_ANA_0P1A_EN_CUR_LIM_0);
486
+ const pmuReg = await this.readRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG);
487
+ await this.writeRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG, pmuReg | ESP32P4_PMU_0P1A_FORCE_TIEH_SEL_0);
488
+ const pmuDateReg = await this.readRegister(ESP32P4_PMU_DATE_REG);
489
+ await this.writeRegister(ESP32P4_PMU_DATE_REG, pmuDateReg | (3 << 0));
490
+ await sleep(0.05); // 0.00005 seconds = 0.05 ms
491
+ const pmuAnaReg2 = await this.readRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG);
492
+ await this.writeRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_ANA_REG, pmuAnaReg2 & ~ESP32P4_PMU_ANA_0P1A_EN_CUR_LIM_0);
493
+ const pmuReg2 = await this.readRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG);
494
+ await this.writeRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG, pmuReg2 & ~ESP32P4_PMU_0P1A_TARGET0_0);
495
+ // Update eFuse voltage to PMU
496
+ const pmuReg3 = await this.readRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG);
497
+ await this.writeRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG, pmuReg3 | 0x80);
498
+ const pmuReg4 = await this.readRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG);
499
+ await this.writeRegister(ESP32P4_PMU_EXT_LDO_P0_0P1A_REG, pmuReg4 & ~ESP32P4_PMU_0P1A_FORCE_TIEH_SEL_0);
500
+ await sleep(2); // 0.0018 seconds = 1.8 ms, rounded to 2ms
501
+ this.logger.debug("Flash powered on successfully");
502
+ }
463
503
  /**
464
504
  * Get security info including chip ID (ESP32-C3 and later)
465
505
  */
@@ -1318,21 +1358,17 @@ export class ESPLoader extends EventTarget {
1318
1358
  const wdtResetUsed = await this.tryUsbWdtReset("ESP32-S2");
1319
1359
  if (wdtResetUsed)
1320
1360
  return;
1321
- }
1322
- else if (this.chipFamily === CHIP_FAMILY_ESP32S3) {
1323
- const wdtResetUsed = await this.tryUsbWdtReset("ESP32-S3");
1324
- if (wdtResetUsed)
1325
- return;
1361
+ // } else if (this.chipFamily === CHIP_FAMILY_ESP32S3) {
1362
+ // const wdtResetUsed = await this.tryUsbWdtReset("ESP32-S3");
1363
+ // if (wdtResetUsed) return;
1326
1364
  }
1327
1365
  else if (this.chipFamily === CHIP_FAMILY_ESP32P4) {
1328
1366
  const wdtResetUsed = await this.tryUsbWdtReset("ESP32-P4");
1329
1367
  if (wdtResetUsed)
1330
1368
  return;
1331
- }
1332
- else if (this.chipFamily === CHIP_FAMILY_ESP32C3) {
1333
- const wdtResetUsed = await this.tryUsbWdtReset("ESP32-C3");
1334
- if (wdtResetUsed)
1335
- return;
1369
+ // } else if (this.chipFamily === CHIP_FAMILY_ESP32C3) {
1370
+ // const wdtResetUsed = await this.tryUsbWdtReset("ESP32-C3");
1371
+ // if (wdtResetUsed) return;
1336
1372
  }
1337
1373
  else if (this.chipFamily === CHIP_FAMILY_ESP32C5) {
1338
1374
  const wdtResetUsed = await this.tryUsbWdtReset("ESP32-C5");
@@ -2301,6 +2337,7 @@ export class ESPLoader extends EventTarget {
2301
2337
  return await this.checkCommand(ESP_MEM_END, data, 0, timeout);
2302
2338
  }
2303
2339
  async runStub(skipFlashDetection = false) {
2340
+ this.logger.debug(`Loading stub for ${this.chipName}, revision: ${this.chipRevision}`);
2304
2341
  const stub = await getStubCode(this.chipFamily, this.chipRevision);
2305
2342
  // No stub available for this chip, return ROM loader
2306
2343
  if (stub === null) {
@@ -2911,6 +2948,11 @@ export class ESPLoader extends EventTarget {
2911
2948
  if (!this.port.writable || !this.port.readable) {
2912
2949
  throw new Error("Port not ready after reconnect");
2913
2950
  }
2951
+ // Power on flash for ESP32-P4 Rev 301 (must be done before loading stub)
2952
+ if (this.chipFamily === CHIP_FAMILY_ESP32P4 &&
2953
+ this.chipRevision === 301) {
2954
+ await this.powerOnFlash();
2955
+ }
2914
2956
  // Load stub
2915
2957
  const stubLoader = await this.runStub(true);
2916
2958
  this.logger.debug("Stub loaded");