Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions src/esploader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { ESPError } from "./error.js";
import { Data, deflate, Inflate } from "pako";
import { Transport, SerialOptions } from "./webserial.js";
import { ROM } from "./targets/rom.js";
import { ClassicReset, ResetStrategy, UsbJtagSerialReset } from "./reset.js";
import { ClassicReset, HardReset, ResetStrategy, UsbJtagSerialReset } from "./reset.js";
import { getStubJsonByChipName } from "./stubFlasher.js";

/* global SerialPort */
Expand Down Expand Up @@ -1542,11 +1542,11 @@ export class ESPLoader {

/**
* Perform a chip hard reset by setting RTS to LOW and then HIGH.
* @param {boolean} usesUsb Is the chip using USB
*/
async hardReset() {
await this.transport.setRTS(true); // EN->LOW
await this._sleep(100);
await this.transport.setRTS(false);
async hardReset(usesUsb = false) {
const hardReset = new HardReset(this.transport, usesUsb); // TODO add usbOTGLogic
await hardReset.reset();
}

/**
Expand Down
1 change: 1 addition & 0 deletions src/reset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ export class HardReset implements ResetStrategy {
}

async reset() {
await this.transport.setRTS(true);
if (this.usingUsbOtg) {
await sleep(200);
await this.transport.setRTS(false);
Expand Down
12 changes: 11 additions & 1 deletion src/targets/esp32c2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,12 @@ export class ESP32C2ROM extends ESP32C3ROM {
public SPI_MISO_DLEN_OFFS = 0x28;
public SPI_W0_OFFS = 0x58;

public RTCCNTL_BASE_REG = 0x60008000;
public RTC_CNTL_WDTCONFIG0_REG = this.RTCCNTL_BASE_REG + 0x0084;
public RTC_CNTL_WDTCONFIG1_REG = this.RTCCNTL_BASE_REG + 0x0088;
public RTC_CNTL_WDTWPROTECT_REG = this.RTCCNTL_BASE_REG + 0x009c;
public RTC_CNTL_WDT_WKEY = 0x50d83aa1;

public async getPkgVersion(loader: ESPLoader): Promise<number> {
const numWord = 1;
const block1Addr = this.EFUSE_BASE + 0x040;
Expand Down Expand Up @@ -61,7 +67,7 @@ export class ESP32C2ROM extends ESP32C3ROM {
return desc;
}

public async getChipFeatures(loader: ESPLoader) {
public async getChipFeatures() {
return ["Wi-Fi", "BLE"];
}

Expand Down Expand Up @@ -123,4 +129,8 @@ export class ESP32C2ROM extends ESP32C3ROM {
public getEraseSize(offset: number, size: number) {
return size;
}

public async hardReset(loader: ESPLoader) {
return await loader.hardReset();
}
}
97 changes: 81 additions & 16 deletions src/targets/esp32c3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
public IMAGE_CHIP_ID = 5;
public EFUSE_BASE = 0x60008800;
public MAC_EFUSE_REG = this.EFUSE_BASE + 0x044;
public UART_CLKDIV_REG = 0x3ff40014;
public UART_CLKDIV_MASK = 0xfffff;
public UART_DATE_REG_ADDR = 0x6000007c;

public CHIP_DETECT_MAGIC_VALUE = [0x6921506f, 0x1b31506f, 0x4881606f, 0x4361606f];

public FLASH_WRITE_SIZE = 0x400;
public BOOTLOADER_FLASH_OFFSET = 0;

Expand All @@ -29,10 +30,41 @@
public SPI_MISO_DLEN_OFFS = 0x28;
public SPI_W0_OFFS = 0x58;

public RTCCNTL_BASE_REG = 0x60008000;
public RTC_CNTL_SWD_CONF_REG = this.RTCCNTL_BASE_REG + 0x00ac;
public RTC_CNTL_SWD_AUTO_FEED_EN = 1 << 31;
public RTC_CNTL_SWD_WPROTECT_REG = this.RTCCNTL_BASE_REG + 0x00b0;
public RTC_CNTL_SWD_WKEY = 0x8f1d312a;

public RTC_CNTL_WDTCONFIG0_REG = this.RTCCNTL_BASE_REG + 0x0090;
public RTC_CNTL_WDTCONFIG1_REG = this.RTCCNTL_BASE_REG + 0x0094;
public RTC_CNTL_WDTWPROTECT_REG = this.RTCCNTL_BASE_REG + 0x00a8;
public RTC_CNTL_WDT_WKEY = 0x50d83aa1;

public UART_CLKDIV_REG = 0x60000014;
public EFUSE_BLOCK1_ADDR = this.EFUSE_BASE + 0x044;

public EFUSE_RD_REG_BASE = this.EFUSE_BASE + 0x030; // BLOCK0 read base address

public EFUSE_PURPOSE_KEY0_REG = this.EFUSE_BASE + 0x34;
public EFUSE_PURPOSE_KEY0_SHIFT = 24;
public EFUSE_PURPOSE_KEY1_REG = this.EFUSE_BASE + 0x34;
public EFUSE_PURPOSE_KEY1_SHIFT = 28;
public EFUSE_PURPOSE_KEY2_REG = this.EFUSE_BASE + 0x38;
public EFUSE_PURPOSE_KEY2_SHIFT = 0;
public EFUSE_PURPOSE_KEY3_REG = this.EFUSE_BASE + 0x38;
public EFUSE_PURPOSE_KEY3_SHIFT = 4;
public EFUSE_PURPOSE_KEY4_REG = this.EFUSE_BASE + 0x38;
public EFUSE_PURPOSE_KEY4_SHIFT = 8;
public EFUSE_PURPOSE_KEY5_REG = this.EFUSE_BASE + 0x38;
public EFUSE_PURPOSE_KEY5_SHIFT = 12;

public UARTDEV_BUF_NO = 0x3fcdf07c; // Variable in ROM .bss which indicates the port in use
public UARTDEV_BUF_NO_USB_JTAG_SERIAL = 3; // The above var when USB-JTAG/Serial is used

public async getPkgVersion(loader: ESPLoader): Promise<number> {
const numWord = 3;
const block1Addr = this.EFUSE_BASE + 0x044;
const addr = block1Addr + 4 * numWord;
const addr = this.EFUSE_BLOCK1_ADDR + 4 * numWord;
const word3 = await loader.readReg(addr);
const pkgVersion = (word3 >> 21) & 0x07;
return pkgVersion;
Expand All @@ -47,17 +79,30 @@
return ret;
}

public async getMajorChipVersion(loader: ESPLoader) {
const numWord = 5;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 24) & 0x03;
}

public async getMinorChipVersion(loader: ESPLoader) {
const hiNumWord = 5;
const hi = ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * hiNumWord)) >> 23) & 0x01;
const lowNumWord = 3;
const low = ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * lowNumWord)) >> 18) & 0x07;
return (hi << 3) + low;
}

public async getChipDescription(loader: ESPLoader) {
let desc: string;
const pkgVer = await this.getPkgVersion(loader);
if (pkgVer === 0) {
desc = "ESP32-C3";
} else {
desc = "unknown ESP32-C3";
}
const chip_rev = await this.getChipRevision(loader);
desc += " (revision " + chip_rev + ")";
return desc;
const chipDesc: { [key: number]: string } = {
0: "ESP32-C3 (QFN32)",
1: "ESP8685 (QFN28)",
2: "ESP32-C3 AZ (QFN32)",
3: "ESP8686 (QFN24)",
};
const chipIndex = await this.getPkgVersion(loader);
const majorRev = await this.getMajorChipVersion(loader);
const minorRev = await this.getMinorChipVersion(loader);
return `${chipDesc[chipIndex] || "unknown ESP32-C3"} (revision v${majorRev}.${minorRev})`;
}

public async getFlashCap(loader: ESPLoader): Promise<number> {
Expand All @@ -71,8 +116,7 @@

public async getFlashVendor(loader: ESPLoader): Promise<string> {
const numWord = 4;
const block1Addr = this.EFUSE_BASE + 0x044;
const addr = block1Addr + 4 * numWord;
const addr = this.EFUSE_BLOCK1_ADDR + 4 * numWord;
const registerValue = await loader.readReg(addr);
const vendorId = (registerValue >> 0) & 0x07;
const vendorMap: { [key: number]: string } = {
Expand Down Expand Up @@ -105,7 +149,7 @@
return features;
}

public async getCrystalFreq(loader: ESPLoader) {
public async getCrystalFreq(loader?: ESPLoader) {

Check warning on line 152 in src/targets/esp32c3.ts

View workflow job for this annotation

GitHub Actions / ci

'loader' is defined but never used
return 40;
}

Expand Down Expand Up @@ -145,4 +189,25 @@
public getEraseSize(offset: number, size: number) {
return size;
}

public async useUsbJTAGSerial(loader: ESPLoader) {
const reg = (await loader.readReg(this.UARTDEV_BUF_NO)) & 0xff;
return this.UARTDEV_BUF_NO_USB_JTAG_SERIAL === reg;
}

public async rtcWdtReset(loader: ESPLoader) {
await loader.writeReg(this.RTC_CNTL_WDTWPROTECT_REG, this.RTC_CNTL_WDT_WKEY); // unlock
await loader.writeReg(this.RTC_CNTL_WDTCONFIG1_REG, 5000); // set WDT timeout
await loader.writeReg(this.RTC_CNTL_WDTCONFIG0_REG, (1 << 31) | (5 << 28) | (1 << 8) | 2); // enable WDT
await loader.writeReg(this.RTC_CNTL_WDTWPROTECT_REG, 0); // lock
}

public async hardReset(loader: ESPLoader) {
const isUsingUsbJTAGSerial = await this.useUsbJTAGSerial(loader);
if (isUsingUsbJTAGSerial) {
await this.rtcWdtReset(loader);
} else {
loader.hardReset();
}
}
}
95 changes: 79 additions & 16 deletions src/targets/esp32c6.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { ESPLoader } from "../esploader.js";
import { ROM } from "./rom.js";
import { ESP32C3ROM } from "./esp32c3.js";

export class ESP32C6ROM extends ROM {
export class ESP32C6ROM extends ESP32C3ROM {
public CHIP_NAME = "ESP32-C6";
public IMAGE_CHIP_ID = 13;
public EFUSE_BASE = 0x600b0800;
Expand All @@ -11,7 +11,7 @@
public UART_DATE_REG_ADDR = 0x6000007c;

public FLASH_WRITE_SIZE = 0x400;
public BOOTLOADER_FLASH_OFFSET = 0;
public BOOTLOADER_FLASH_OFFSET = 0x0;

public FLASH_SIZES = {
"1MB": 0x00,
Expand All @@ -29,12 +29,65 @@
public SPI_MISO_DLEN_OFFS = 0x28;
public SPI_W0_OFFS = 0x58;

public UARTDEV_BUF_NO = 0x4087f580; // Variable in ROM .bss which indicates the port in use
public UARTDEV_BUF_NO_USB_JTAG_SERIAL = 3; // The above var when USB-JTAG/Serial is used

public DR_REG_LP_WDT_BASE = 0x600b1c00;

public RTC_CNTL_WDTCONFIG0_REG = this.DR_REG_LP_WDT_BASE + 0x0; // LP_WDT_RWDT_CONFIG0_REG
public RTC_CNTL_WDTCONFIG1_REG = this.DR_REG_LP_WDT_BASE + 0x0004; // LP_WDT_RWDT_CONFIG1_REG
public RTC_CNTL_WDTWPROTECT_REG = this.DR_REG_LP_WDT_BASE + 0x0018; // LP_WDT_RWDT_WPROTECT_REG

public RTC_CNTL_SWD_CONF_REG = this.DR_REG_LP_WDT_BASE + 0x001c; // LP_WDT_SWD_CONFIG_REG
public RTC_CNTL_SWD_AUTO_FEED_EN = 1 << 18;
public RTC_CNTL_SWD_WPROTECT_REG = this.DR_REG_LP_WDT_BASE + 0x0020; // LP_WDT_SWD_WPROTECT_REG
public RTC_CNTL_SWD_WKEY = 0x50d83aa1; // LP_WDT_SWD_WKEY, same as WDT key in this case

public IROM_MAP_START = 0x42000000;
public IROM_MAP_END = 0x42800000;
public DROM_MAP_START = 0x42800000;
public DROM_MAP_END = 0x43000000;

// Magic value for ESP32C6
CHIP_DETECT_MAGIC_VALUE = [0x2ce0806f];

EFUSE_BLOCK1_ADDR = this.EFUSE_BASE + 0x044;

EFUSE_RD_REG_BASE = this.EFUSE_BASE + 0x030; // BLOCK0 read base address

EFUSE_PURPOSE_KEY0_REG = this.EFUSE_BASE + 0x34;
EFUSE_PURPOSE_KEY0_SHIFT = 24;
EFUSE_PURPOSE_KEY1_REG = this.EFUSE_BASE + 0x34;
EFUSE_PURPOSE_KEY1_SHIFT = 28;
EFUSE_PURPOSE_KEY2_REG = this.EFUSE_BASE + 0x38;
EFUSE_PURPOSE_KEY2_SHIFT = 0;
EFUSE_PURPOSE_KEY3_REG = this.EFUSE_BASE + 0x38;
EFUSE_PURPOSE_KEY3_SHIFT = 4;
EFUSE_PURPOSE_KEY4_REG = this.EFUSE_BASE + 0x38;
EFUSE_PURPOSE_KEY4_SHIFT = 8;
EFUSE_PURPOSE_KEY5_REG = this.EFUSE_BASE + 0x38;
EFUSE_PURPOSE_KEY5_SHIFT = 12;

EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT_REG = this.EFUSE_RD_REG_BASE;
EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT = 1 << 20;

EFUSE_SPI_BOOT_CRYPT_CNT_REG = this.EFUSE_BASE + 0x034;
EFUSE_SPI_BOOT_CRYPT_CNT_MASK = 0x7 << 18;

EFUSE_SECURE_BOOT_EN_REG = this.EFUSE_BASE + 0x038;
EFUSE_SECURE_BOOT_EN_MASK = 1 << 20;

PURPOSE_VAL_XTS_AES128_KEY = 4;

SUPPORTS_ENCRYPTED_FLASH = true;

FLASH_ENCRYPTED_WRITE_ALIGN = 16;

public async getPkgVersion(loader: ESPLoader) {
const numWord = 3;
const block1Addr = this.EFUSE_BASE + 0x044;
const addr = block1Addr + 4 * numWord;
const addr = this.EFUSE_BLOCK1_ADDR + 4 * numWord;
const word3 = await loader.readReg(addr);
const pkgVersion = (word3 >> 21) & 0x07;
const pkgVersion = (word3 >> 24) & 0x07;
return pkgVersion;
}

Expand All @@ -47,24 +100,34 @@
return ret;
}

public async getMinorChipVersion(loader: ESPLoader) {
const numWord = 3;
const regValue = await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord);
return (regValue >> 18) & 0x0f;
}

public async getMajorChipVersion(loader: ESPLoader) {
const numWord = 3;
const regValue = await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord);
return (regValue >> 22) & 0x03;
}

public async getChipDescription(loader: ESPLoader) {
let desc: string;
const pkgVer = await this.getPkgVersion(loader);
if (pkgVer === 0) {
desc = "ESP32-C6";
} else {
desc = "unknown ESP32-C6";
}
const chipRev = await this.getChipRevision(loader);
desc += " (revision " + chipRev + ")";
return desc;
const chipDesc: { [key: number]: string } = {
0: "ESP32-C6 (QFN40)",
1: "ESP32-C6FH4 (QFN32)",
};
const majorRev = await this.getMajorChipVersion(loader);
const minorRev = await this.getMinorChipVersion(loader);
return `${chipDesc[pkgVer] || "unknown ESP32-C6"} (revision v${majorRev}.${minorRev})`;
}

public async getChipFeatures(loader: ESPLoader) {
public async getChipFeatures() {
return ["Wi-Fi 6", "BT 5", "IEEE802.15.4"];
}

public async getCrystalFreq(loader: ESPLoader) {

Check warning on line 130 in src/targets/esp32c6.ts

View workflow job for this annotation

GitHub Actions / ci

'loader' is defined but never used
return 40;
}

Expand Down
2 changes: 1 addition & 1 deletion src/targets/esp32c61.ts
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ export class ESP32C61ROM extends ESP32C6ROM {
return `${desc} (revision v${majorRev}.${minorRev})`;
}

public async getChipFeatures(loader: ESPLoader): Promise<string[]> {
public async getChipFeatures(): Promise<string[]> {
return ["WiFi 6", "BT 5"];
}

Expand Down
Loading
Loading