vs-code server

This commit is contained in:
2025-07-26 14:04:40 -04:00
parent 85c2166eaf
commit 0714b72f46
117 changed files with 50147 additions and 0 deletions

400
node_modules/esptool-js/lib/esploader.d.ts generated vendored Normal file
View File

@@ -0,0 +1,400 @@
import { Transport } from "./webserial.js";
import { ROM } from "./targets/rom.js";
import { ResetStrategy } from "./reset.js";
import { LoaderOptions } from "./types/loaderOptions.js";
import { FlashOptions } from "./types/flashOptions.js";
import { After, Before } from "./types/resetModes.js";
declare type FlashReadCallback = ((packet: Uint8Array, progress: number, totalSize: number) => void) | null;
export declare class ESPLoader {
ESP_RAM_BLOCK: number;
ESP_FLASH_BEGIN: number;
ESP_FLASH_DATA: number;
ESP_FLASH_END: number;
ESP_MEM_BEGIN: number;
ESP_MEM_END: number;
ESP_MEM_DATA: number;
ESP_WRITE_REG: number;
ESP_READ_REG: number;
ESP_SPI_ATTACH: number;
ESP_CHANGE_BAUDRATE: number;
ESP_FLASH_DEFL_BEGIN: number;
ESP_FLASH_DEFL_DATA: number;
ESP_FLASH_DEFL_END: number;
ESP_SPI_FLASH_MD5: number;
ESP_ERASE_FLASH: number;
ESP_ERASE_REGION: number;
ESP_READ_FLASH: number;
ESP_RUN_USER_CODE: number;
ESP_IMAGE_MAGIC: number;
ESP_CHECKSUM_MAGIC: number;
ROM_INVALID_RECV_MSG: number;
DEFAULT_TIMEOUT: number;
ERASE_REGION_TIMEOUT_PER_MB: number;
ERASE_WRITE_TIMEOUT_PER_MB: number;
MD5_TIMEOUT_PER_MB: number;
CHIP_ERASE_TIMEOUT: number;
FLASH_READ_TIMEOUT: number;
MAX_TIMEOUT: number;
CHIP_DETECT_MAGIC_REG_ADDR: number;
DETECTED_FLASH_SIZES: {
[key: number]: string;
};
DETECTED_FLASH_SIZES_NUM: {
[key: number]: number;
};
USB_JTAG_SERIAL_PID: number;
chip: ROM;
IS_STUB: boolean;
FLASH_WRITE_SIZE: number;
transport: Transport;
private baudrate;
private serialOptions?;
private terminal?;
private romBaudrate;
private debugLogging;
private syncStubDetected;
private resetConstructors;
/**
* Create a new ESPLoader to perform serial communication
* such as read/write flash memory and registers using a LoaderOptions object.
* @param {LoaderOptions} options - LoaderOptions object argument for ESPLoader.
* ```
* const myLoader = new ESPLoader({ transport: Transport, baudrate: number, terminal?: IEspLoaderTerminal });
* ```
*/
constructor(options: LoaderOptions);
_sleep(ms: number): Promise<unknown>;
/**
* Write to ESP Loader constructor's terminal with or without new line.
* @param {string} str - String to write.
* @param {boolean} withNewline - Add new line at the end ?
*/
write(str: string, withNewline?: boolean): void;
/**
* Write error message to ESP Loader constructor's terminal with or without new line.
* @param {string} str - String to write.
* @param {boolean} withNewline - Add new line at the end ?
*/
error(str: string, withNewline?: boolean): void;
/**
* Write information message to ESP Loader constructor's terminal with or without new line.
* @param {string} str - String to write.
* @param {boolean} withNewline - Add new line at the end ?
*/
info(str: string, withNewline?: boolean): void;
/**
* Write debug message to ESP Loader constructor's terminal with or without new line.
* @param {string} str - String to write.
* @param {boolean} withNewline - Add new line at the end ?
*/
debug(str: string, withNewline?: boolean): void;
/**
* Convert short integer to byte array
* @param {number} i - Number to convert.
* @returns {Uint8Array} Byte array.
*/
_shortToBytearray(i: number): Uint8Array;
/**
* Convert an integer to byte array
* @param {number} i - Number to convert.
* @returns {ROM} The chip ROM class related to given magic hex number.
*/
_intToByteArray(i: number): Uint8Array;
/**
* Convert a byte array to short integer.
* @param {number} i - Number to convert.
* @param {number} j - Number to convert.
* @returns {number} Return a short integer number.
*/
_byteArrayToShort(i: number, j: number): number;
/**
* Convert a byte array to integer.
* @param {number} i - Number to convert.
* @param {number} j - Number to convert.
* @param {number} k - Number to convert.
* @param {number} l - Number to convert.
* @returns {number} Return a integer number.
*/
_byteArrayToInt(i: number, j: number, k: number, l: number): number;
/**
* Append a buffer array after another buffer array
* @param {ArrayBuffer} buffer1 - First array buffer.
* @param {ArrayBuffer} buffer2 - magic hex number to select ROM.
* @returns {ArrayBufferLike} Return an array buffer.
*/
_appendBuffer(buffer1: ArrayBuffer, buffer2: ArrayBuffer): ArrayBufferLike;
/**
* Append a buffer array after another buffer array
* @param {Uint8Array} arr1 - First array buffer.
* @param {Uint8Array} arr2 - magic hex number to select ROM.
* @returns {Uint8Array} Return a 8 bit unsigned array.
*/
_appendArray(arr1: Uint8Array, arr2: Uint8Array): Uint8Array;
/**
* Convert a unsigned 8 bit integer array to byte string.
* @param {Uint8Array} u8Array - magic hex number to select ROM.
* @returns {string} Return the equivalent string.
*/
ui8ToBstr(u8Array: Uint8Array): string;
/**
* Convert a byte string to unsigned 8 bit integer array.
* @param {string} bStr - binary string input
* @returns {Uint8Array} Return a 8 bit unsigned integer array.
*/
bstrToUi8(bStr: string): Uint8Array;
/**
* Flush the serial input by raw read with 200 ms timeout.
*/
flushInput(): Promise<void>;
/**
* Use the device serial port read function with given timeout to create a valid packet.
* @param {number} op Operation number
* @param {number} timeout timeout number in milliseconds
* @returns {[number, Uint8Array]} valid response packet.
*/
readPacket(op?: number | null, timeout?: number): Promise<[number, Uint8Array]>;
/**
* Write a serial command to the chip
* @param {number} op - Operation number
* @param {Uint8Array} data - Unsigned 8 bit array
* @param {number} chk - channel number
* @param {boolean} waitResponse - wait for response ?
* @param {number} timeout - timeout number in milliseconds
* @returns {Promise<[number, Uint8Array]>} Return a number and a 8 bit unsigned integer array.
*/
command(op?: number | null, data?: Uint8Array, chk?: number, waitResponse?: boolean, timeout?: number): Promise<[number, Uint8Array]>;
/**
* Read a register from chip.
* @param {number} addr - Register address number
* @param {number} timeout - Timeout in milliseconds (Default: 3000ms)
* @returns {number} - Command number value
*/
readReg(addr: number, timeout?: number): Promise<number>;
/**
* Write a number value to register address in chip.
* @param {number} addr - Register address number
* @param {number} value - Number value to write in register
* @param {number} mask - Hex number for mask
* @param {number} delayUs Delay number
* @param {number} delayAfterUs Delay after previous delay
*/
writeReg(addr: number, value: number, mask?: number, delayUs?: number, delayAfterUs?: number): Promise<void>;
/**
* Sync chip by sending sync command.
* @returns {[number, Uint8Array]} Command result
*/
sync(): Promise<[number, Uint8Array]>;
/**
* Attempt to connect to the chip by sending a reset sequence and later a sync command.
* @param {string} mode - Reset mode to use
* @param {ResetStrategy} resetStrategy - Reset strategy class to use for connect
* @returns {string} - Returns 'success' or 'error' message.
*/
_connectAttempt(mode: string | undefined, resetStrategy: ResetStrategy | null): Promise<string>;
/**
* Constructs a sequence of reset strategies based on the OS,
* used ESP chip, external settings, and environment variables.
* Returns a tuple of one or more reset strategies to be tried sequentially.
* @param {string} mode - Reset mode to use
* @returns {ResetStrategy[]} - Array of reset strategies
*/
constructResetSequence(mode: Before): ResetStrategy[];
/**
* Perform a connection to chip.
* @param {string} mode - Reset mode to use. Example: 'default_reset' | 'no_reset'
* @param {number} attempts - Number of connection attempts
* @param {boolean} detecting - Detect the connected chip
*/
connect(mode?: Before, attempts?: number, detecting?: boolean): Promise<void>;
/**
* Connect and detect the existing chip.
* @param {string} mode Reset mode to use for connection.
*/
detectChip(mode?: Before): Promise<void>;
/**
* Execute the command and check the command response.
* @param {string} opDescription Command operation description.
* @param {number} op Command operation number
* @param {Uint8Array} data Command value
* @param {number} chk Checksum to use
* @param {number} timeout TImeout number in milliseconds (ms)
* @returns {number} Command result
*/
checkCommand(opDescription?: string, op?: number | null, data?: Uint8Array, chk?: number, timeout?: number): Promise<number | Uint8Array>;
/**
* Start downloading an application image to RAM
* @param {number} size Image size number
* @param {number} blocks Number of data blocks
* @param {number} blocksize Size of each data block
* @param {number} offset Image offset number
*/
memBegin(size: number, blocks: number, blocksize: number, offset: number): Promise<void>;
/**
* Get the checksum for given unsigned 8-bit array
* @param {Uint8Array} data Unsigned 8-bit integer array
* @param {number} state Initial checksum
* @returns {number} - Array checksum
*/
checksum(data: Uint8Array, state?: number): number;
/**
* Send a block of image to RAM
* @param {Uint8Array} buffer Unsigned 8-bit array
* @param {number} seq Sequence number
*/
memBlock(buffer: Uint8Array, seq: number): Promise<void>;
/**
* Leave RAM download mode and run application
* @param {number} entrypoint - Entrypoint number
*/
memFinish(entrypoint: number): Promise<void>;
/**
* Configure SPI flash pins
* @param {number} hspiArg - Argument for SPI attachment
*/
flashSpiAttach(hspiArg: number): Promise<void>;
/**
* Scale timeouts which are size-specific.
* @param {number} secondsPerMb Seconds per megabytes as number
* @param {number} sizeBytes Size bytes number
* @returns {number} - Scaled timeout for specified size.
*/
timeoutPerMb(secondsPerMb: number, sizeBytes: number): number;
/**
* Start downloading to Flash (performs an erase)
* @param {number} size Size to erase
* @param {number} offset Offset to erase
* @returns {number} Number of blocks (of size self.FLASH_WRITE_SIZE) to write.
*/
flashBegin(size: number, offset: number): Promise<number>;
/**
* Start downloading compressed data to Flash (performs an erase)
* @param {number} size Write size
* @param {number} compsize Compressed size
* @param {number} offset Offset for write
* @returns {number} Returns number of blocks (size self.FLASH_WRITE_SIZE) to write.
*/
flashDeflBegin(size: number, compsize: number, offset: number): Promise<number>;
/**
* Write block to flash, retry if fail
* @param {Uint8Array} data Unsigned 8-bit array data.
* @param {number} seq Sequence number
* @param {number} timeout Timeout in milliseconds (ms)
*/
flashBlock(data: Uint8Array, seq: number, timeout: number): Promise<void>;
/**
* Write block to flash, send compressed, retry if fail
* @param {Uint8Array} data Unsigned int 8-bit array data to write
* @param {number} seq Sequence number
* @param {number} timeout Timeout in milliseconds (ms)
*/
flashDeflBlock(data: Uint8Array, seq: number, timeout: number): Promise<void>;
/**
* Leave flash mode and run/reboot
* @param {boolean} reboot Reboot after leaving flash mode ?
*/
flashFinish(reboot?: boolean): Promise<void>;
/**
* Leave compressed flash mode and run/reboot
* @param {boolean} reboot Reboot after leaving flash mode ?
*/
flashDeflFinish(reboot?: boolean): Promise<void>;
/**
* Run an arbitrary SPI flash command.
*
* This function uses the "USR_COMMAND" functionality in the ESP
* SPI hardware, rather than the precanned commands supported by
* hardware. So the value of spiflashCommand is an actual command
* byte, sent over the wire.
*
* After writing command byte, writes 'data' to MOSI and then
* reads back 'readBits' of reply on MISO. Result is a number.
* @param {number} spiflashCommand Command to execute in SPI
* @param {Uint8Array} data Data to send
* @param {number} readBits Number of bits to read
* @returns {number} Register SPI_W0_REG value
*/
runSpiflashCommand(spiflashCommand: number, data: Uint8Array, readBits: number): Promise<number>;
/**
* Read flash id by executing the SPIFLASH_RDID flash command.
* @returns {Promise<number>} Register SPI_W0_REG value
*/
readFlashId(): Promise<number>;
/**
* Execute the erase flash command
* @returns {Promise<number | Uint8Array>} Erase flash command result
*/
eraseFlash(): Promise<number | Uint8Array>;
/**
* Convert a number or unsigned 8-bit array to hex string
* @param {number | Uint8Array } buffer Data to convert to hex string.
* @returns {string} A hex string
*/
toHex(buffer: number | Uint8Array): string;
/**
* Calculate the MD5 Checksum command
* @param {number} addr Address number
* @param {number} size Package size
* @returns {string} MD5 Checksum string
*/
flashMd5sum(addr: number, size: number): Promise<string>;
readFlash(addr: number, size: number, onPacketReceived?: FlashReadCallback): Promise<Uint8Array>;
/**
* Upload the flasher ROM bootloader (flasher stub) to the chip.
* @returns {ROM} The Chip ROM
*/
runStub(): Promise<ROM>;
/**
* Change the chip baudrate.
*/
changeBaud(): Promise<void>;
/**
* Execute the main function of ESPLoader.
* @param {string} mode Reset mode to use
* @returns {string} chip ROM
*/
main(mode?: Before): Promise<string>;
/**
* Get flash size bytes from flash size string.
* @param {string} flashSize Flash Size string
* @returns {number} Flash size bytes
*/
flashSizeBytes: (flashSize: string) => number;
/**
* Parse a given flash size string to a number
* @param {string} flsz Flash size to request
* @returns {number} Flash size number
*/
parseFlashSizeArg(flsz: string): number;
/**
* Update the image flash parameters with given arguments.
* @param {string} image binary image as string
* @param {number} address flash address number
* @param {string} flashSize Flash size string
* @param {string} flashMode Flash mode string
* @param {string} flashFreq Flash frequency string
* @returns {string} modified image string
*/
_updateImageFlashParams(image: string, address: number, flashSize: string, flashMode: string, flashFreq: string): string;
/**
* Write set of file images into given address based on given FlashOptions object.
* @param {FlashOptions} options FlashOptions to configure how and what to write into flash.
*/
writeFlash(options: FlashOptions): Promise<void>;
/**
* Read SPI flash manufacturer and device id.
*/
flashId(): Promise<void>;
getFlashSize(): Promise<number>;
/**
* Soft reset the device chip. Soft reset with run user code is the closest.
* @param {boolean} stayInBootloader Flag to indicate if to stay in bootloader
*/
softReset(stayInBootloader: boolean): Promise<void>;
/**
* Execute this function to execute after operation reset functions.
* @param {After} mode After operation mode. Default is 'hard_reset'.
* @param { boolean } usingUsbOtg For 'hard_reset' to specify if using USB-OTG
*/
after(mode?: After, usingUsbOtg?: boolean): Promise<void>;
}
export {};

1359
node_modules/esptool-js/lib/esploader.js generated vendored Normal file

File diff suppressed because it is too large Load Diff

9
node_modules/esptool-js/lib/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,9 @@
export { ESPLoader } from "./esploader.js";
export { ClassicReset, CustomReset, HardReset, UsbJtagSerialReset, validateCustomResetStringSequence, ResetConstructors, } from "./reset.js";
export { ROM } from "./targets/rom.js";
export { Transport, SerialOptions } from "./webserial.js";
export { decodeBase64Data, getStubJsonByChipName, Stub } from "./stubFlasher.js";
export { LoaderOptions } from "./types/loaderOptions.js";
export { FlashOptions } from "./types/flashOptions.js";
export { IEspLoaderTerminal } from "./types/loaderTerminal.js";
export { Before, After } from "./types/resetModes.js";

5
node_modules/esptool-js/lib/index.js generated vendored Normal file
View File

@@ -0,0 +1,5 @@
export { ESPLoader } from "./esploader.js";
export { ClassicReset, CustomReset, HardReset, UsbJtagSerialReset, validateCustomResetStringSequence, } from "./reset.js";
export { ROM } from "./targets/rom.js";
export { Transport } from "./webserial.js";
export { decodeBase64Data, getStubJsonByChipName } from "./stubFlasher.js";

149
node_modules/esptool-js/lib/reset.d.ts generated vendored Normal file
View File

@@ -0,0 +1,149 @@
import { Transport } from "./webserial.js";
/**
* Set of reset functions for ESP Loader connection.
* @interface ResetConstructors
*/
export interface ResetConstructors {
/**
* Execute a classic set of commands that will reset the chip.
* @param transport Transport class to perform serial communication.
* @param resetDelay Delay in milliseconds for reset.
*/
classicReset?: (transport: Transport, resetDelay: number) => ClassicReset;
/**
* Execute a set of commands for USB JTAG serial reset.
* @param transport Transport class to perform serial communication.
*/
usbJTAGSerialReset?: (transport: Transport) => UsbJtagSerialReset;
/**
* Execute a classic set of commands that will reset the chip.
* @param transport Transport class to perform serial communication.
* @param {boolean} usingUsbOtg is it using USB-OTG ?
*/
hardReset?: (transport: Transport, usingUsbOtg?: boolean) => HardReset;
/**
* Execute a custom set of commands that will reset the chip.
* @param transport Transport class to perform serial communication.
* @param {string} sequenceString Custom string sequence for reset strategy
*/
customReset?: (transport: Transport, sequenceString: string) => CustomReset;
}
/**
* Reset strategy class
*/
export interface ResetStrategy {
transport: Transport;
reset(): Promise<void>;
}
/**
* Execute a classic set of commands that will reset the chip.
*
* Commands (e.g. R0) are defined by a code (R) and an argument (0).
*
* The commands are:
*
* D: setDTR - 1=True / 0=False
*
* R: setRTS - 1=True / 0=False
*
* W: Wait (time delay) - positive integer number (miliseconds)
*
* "D0|R1|W100|D1|R0|W50|D0" represents the classic reset strategy
* @param {Transport} transport Transport class to perform serial communication.
* @param {number} resetDelay Delay in milliseconds for reset.
*/
export declare class ClassicReset implements ResetStrategy {
resetDelay: number;
transport: Transport;
constructor(transport: Transport, resetDelay: number);
reset(): Promise<void>;
}
/**
* Execute a set of commands for USB JTAG serial reset.
*
* Commands (e.g. R0) are defined by a code (R) and an argument (0).
*
* The commands are:
*
* D: setDTR - 1=True / 0=False
*
* R: setRTS - 1=True / 0=False
*
* W: Wait (time delay) - positive integer number (miliseconds)
* @param {Transport} transport Transport class to perform serial communication.
*/
export declare class UsbJtagSerialReset implements ResetStrategy {
transport: Transport;
constructor(transport: Transport);
reset(): Promise<void>;
}
/**
* Execute a set of commands that will hard reset the chip.
*
* Commands (e.g. R0) are defined by a code (R) and an argument (0).
*
* The commands are:
*
* D: setDTR - 1=True / 0=False
*
* R: setRTS - 1=True / 0=False
*
* W: Wait (time delay) - positive integer number (miliseconds)
* @param {Transport} transport Transport class to perform serial communication.
* @param {boolean} usingUsbOtg is it using USB-OTG ?
*/
export declare class HardReset implements ResetStrategy {
transport: Transport;
private usingUsbOtg;
constructor(transport: Transport, usingUsbOtg?: boolean);
reset(): Promise<void>;
}
/**
* Validate a sequence string based on the following format:
*
* Commands (e.g. R0) are defined by a code (R) and an argument (0).
*
* The commands are:
*
* D: setDTR - 1=True / 0=False
*
* R: setRTS - 1=True / 0=False
*
* W: Wait (time delay) - positive integer number (miliseconds)
* @param {string} seqStr Sequence string to validate
* @returns {boolean} Is the sequence string valid ?
*/
export declare function validateCustomResetStringSequence(seqStr: string): boolean;
/**
* Custom reset strategy defined with a string.
*
* The sequenceString input string consists of individual commands divided by "|".
*
* Commands (e.g. R0) are defined by a code (R) and an argument (0).
*
* The commands are:
*
* D: setDTR - 1=True / 0=False
*
* R: setRTS - 1=True / 0=False
*
* W: Wait (time delay) - positive integer number (miliseconds)
*
* "D0|R1|W100|D1|R0|W50|D0" represents the classic reset strategy
* @param {Transport} transport Transport class to perform serial communication.
* @param {string} sequenceString Custom string sequence for reset strategy
*/
export declare class CustomReset implements ResetStrategy {
transport: Transport;
private sequenceString;
constructor(transport: Transport, sequenceString: string);
reset(): Promise<void>;
}
declare const _default: {
ClassicReset: typeof ClassicReset;
CustomReset: typeof CustomReset;
HardReset: typeof HardReset;
UsbJtagSerialReset: typeof UsbJtagSerialReset;
validateCustomResetStringSequence: typeof validateCustomResetStringSequence;
};
export default _default;

198
node_modules/esptool-js/lib/reset.js generated vendored Normal file
View File

@@ -0,0 +1,198 @@
/**
* Sleep for ms milliseconds
* @param {number} ms Milliseconds to wait
* @returns {Promise<void>}
*/
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
/**
* Execute a classic set of commands that will reset the chip.
*
* Commands (e.g. R0) are defined by a code (R) and an argument (0).
*
* The commands are:
*
* D: setDTR - 1=True / 0=False
*
* R: setRTS - 1=True / 0=False
*
* W: Wait (time delay) - positive integer number (miliseconds)
*
* "D0|R1|W100|D1|R0|W50|D0" represents the classic reset strategy
* @param {Transport} transport Transport class to perform serial communication.
* @param {number} resetDelay Delay in milliseconds for reset.
*/
export class ClassicReset {
constructor(transport, resetDelay) {
this.resetDelay = resetDelay;
this.transport = transport;
}
async reset() {
await this.transport.setDTR(false);
await this.transport.setRTS(true);
await sleep(100);
await this.transport.setDTR(true);
await this.transport.setRTS(false);
await sleep(this.resetDelay);
await this.transport.setDTR(false);
}
}
/**
* Execute a set of commands for USB JTAG serial reset.
*
* Commands (e.g. R0) are defined by a code (R) and an argument (0).
*
* The commands are:
*
* D: setDTR - 1=True / 0=False
*
* R: setRTS - 1=True / 0=False
*
* W: Wait (time delay) - positive integer number (miliseconds)
* @param {Transport} transport Transport class to perform serial communication.
*/
export class UsbJtagSerialReset {
constructor(transport) {
this.transport = transport;
}
async reset() {
await this.transport.setRTS(false);
await this.transport.setDTR(false);
await sleep(100);
await this.transport.setDTR(true);
await this.transport.setRTS(false);
await sleep(100);
await this.transport.setRTS(true);
await this.transport.setDTR(false);
await this.transport.setRTS(true);
await sleep(100);
await this.transport.setRTS(false);
await this.transport.setDTR(false);
}
}
/**
* Execute a set of commands that will hard reset the chip.
*
* Commands (e.g. R0) are defined by a code (R) and an argument (0).
*
* The commands are:
*
* D: setDTR - 1=True / 0=False
*
* R: setRTS - 1=True / 0=False
*
* W: Wait (time delay) - positive integer number (miliseconds)
* @param {Transport} transport Transport class to perform serial communication.
* @param {boolean} usingUsbOtg is it using USB-OTG ?
*/
export class HardReset {
constructor(transport, usingUsbOtg = false) {
this.transport = transport;
this.usingUsbOtg = usingUsbOtg;
this.transport = transport;
}
async reset() {
if (this.usingUsbOtg) {
await sleep(200);
await this.transport.setRTS(false);
await sleep(200);
}
else {
await sleep(100);
await this.transport.setRTS(false);
}
}
}
/**
* Validate a sequence string based on the following format:
*
* Commands (e.g. R0) are defined by a code (R) and an argument (0).
*
* The commands are:
*
* D: setDTR - 1=True / 0=False
*
* R: setRTS - 1=True / 0=False
*
* W: Wait (time delay) - positive integer number (miliseconds)
* @param {string} seqStr Sequence string to validate
* @returns {boolean} Is the sequence string valid ?
*/
export function validateCustomResetStringSequence(seqStr) {
const commands = ["D", "R", "W"];
const commandsList = seqStr.split("|");
for (const cmd of commandsList) {
const code = cmd[0];
const arg = cmd.slice(1);
if (!commands.includes(code)) {
return false; // Invalid command code
}
if (code === "D" || code === "R") {
if (arg !== "0" && arg !== "1") {
return false; // Invalid argument for D and R commands
}
}
else if (code === "W") {
const delay = parseInt(arg);
if (isNaN(delay) || delay <= 0) {
return false; // Invalid argument for W command
}
}
}
return true; // All commands are valid
}
/**
* Custom reset strategy defined with a string.
*
* The sequenceString input string consists of individual commands divided by "|".
*
* Commands (e.g. R0) are defined by a code (R) and an argument (0).
*
* The commands are:
*
* D: setDTR - 1=True / 0=False
*
* R: setRTS - 1=True / 0=False
*
* W: Wait (time delay) - positive integer number (miliseconds)
*
* "D0|R1|W100|D1|R0|W50|D0" represents the classic reset strategy
* @param {Transport} transport Transport class to perform serial communication.
* @param {string} sequenceString Custom string sequence for reset strategy
*/
export class CustomReset {
constructor(transport, sequenceString) {
this.transport = transport;
this.sequenceString = sequenceString;
this.transport = transport;
}
async reset() {
const resetDictionary = {
D: async (arg) => await this.transport.setDTR(arg),
R: async (arg) => await this.transport.setRTS(arg),
W: async (delay) => await sleep(delay),
};
try {
const isValidSequence = validateCustomResetStringSequence(this.sequenceString);
if (!isValidSequence) {
return;
}
const cmds = this.sequenceString.split("|");
for (const cmd of cmds) {
const cmdKey = cmd[0];
const cmdVal = cmd.slice(1);
if (cmdKey === "W") {
await resetDictionary["W"](Number(cmdVal));
}
else if (cmdKey === "D" || cmdKey === "R") {
await resetDictionary[cmdKey](cmdVal === "1");
}
}
}
catch (error) {
throw new Error("Invalid custom reset sequence");
}
}
}
export default { ClassicReset, CustomReset, HardReset, UsbJtagSerialReset, validateCustomResetStringSequence };

22
node_modules/esptool-js/lib/stubFlasher.d.ts generated vendored Normal file
View File

@@ -0,0 +1,22 @@
export interface Stub {
bss_start?: number;
data: string;
decodedData: Uint8Array;
data_start: number;
entry: number;
text: string;
decodedText: Uint8Array;
text_start: number;
}
/**
* Import flash stub json for the given chip name.
* @param {string} chipName Name of chip to obtain flasher stub
* @returns {Stub} Stub information and decoded text and data
*/
export declare function getStubJsonByChipName(chipName: string): Promise<Stub | undefined>;
/**
* Convert a base 64 string to Uint8Array.
* @param {string} dataStr Base64 String to decode
* @returns {Uint8Array} Decoded Uint8Array
*/
export declare function decodeBase64Data(dataStr: string): Uint8Array;

69
node_modules/esptool-js/lib/stubFlasher.js generated vendored Normal file
View File

@@ -0,0 +1,69 @@
import atob from "atob-lite";
/**
* Import flash stub json for the given chip name.
* @param {string} chipName Name of chip to obtain flasher stub
* @returns {Stub} Stub information and decoded text and data
*/
export async function getStubJsonByChipName(chipName) {
let jsonStub;
switch (chipName) {
case "ESP32":
jsonStub = await import("./targets/stub_flasher/stub_flasher_32.json");
break;
case "ESP32-C2":
jsonStub = await import("./targets/stub_flasher/stub_flasher_32c2.json");
break;
case "ESP32-C3":
jsonStub = await import("./targets/stub_flasher/stub_flasher_32c3.json");
break;
case "ESP32-C5":
jsonStub = await import("./targets/stub_flasher/stub_flasher_32c5.json");
break;
case "ESP32-C6":
jsonStub = await import("./targets/stub_flasher/stub_flasher_32c6.json");
break;
case "ESP32-C61":
jsonStub = await import("./targets/stub_flasher/stub_flasher_32c61.json");
break;
case "ESP32-H2":
jsonStub = await import("./targets/stub_flasher/stub_flasher_32h2.json");
break;
case "ESP32-P4":
jsonStub = await import("./targets/stub_flasher/stub_flasher_32p4.json");
break;
case "ESP32-S2":
jsonStub = await import("./targets/stub_flasher/stub_flasher_32s2.json");
break;
case "ESP32-S3":
jsonStub = await import("./targets/stub_flasher/stub_flasher_32s3.json");
break;
case "ESP8266":
jsonStub = await import("./targets/stub_flasher/stub_flasher_8266.json");
break;
}
if (jsonStub) {
return {
bss_start: jsonStub.bss_start,
data: jsonStub.data,
data_start: jsonStub.data_start,
entry: jsonStub.entry,
text: jsonStub.text,
text_start: jsonStub.text_start,
decodedData: decodeBase64Data(jsonStub.data),
decodedText: decodeBase64Data(jsonStub.text),
};
}
return;
}
/**
* Convert a base 64 string to Uint8Array.
* @param {string} dataStr Base64 String to decode
* @returns {Uint8Array} Decoded Uint8Array
*/
export function decodeBase64Data(dataStr) {
const decoded = atob(dataStr);
const chardata = decoded.split("").map(function (x) {
return x.charCodeAt(0);
});
return new Uint8Array(chardata);
}

32
node_modules/esptool-js/lib/targets/esp32.d.ts generated vendored Normal file
View File

@@ -0,0 +1,32 @@
import { ESPLoader } from "../esploader.js";
import { ROM } from "./rom.js";
export declare class ESP32ROM extends ROM {
CHIP_NAME: string;
IMAGE_CHIP_ID: number;
EFUSE_RD_REG_BASE: number;
DR_REG_SYSCON_BASE: number;
UART_CLKDIV_REG: number;
UART_CLKDIV_MASK: number;
UART_DATE_REG_ADDR: number;
XTAL_CLK_DIVIDER: number;
FLASH_SIZES: {
[key: string]: number;
};
FLASH_WRITE_SIZE: number;
BOOTLOADER_FLASH_OFFSET: number;
SPI_REG_BASE: number;
SPI_USR_OFFS: number;
SPI_USR1_OFFS: number;
SPI_USR2_OFFS: number;
SPI_W0_OFFS: number;
SPI_MOSI_DLEN_OFFS: number;
SPI_MISO_DLEN_OFFS: number;
readEfuse(loader: ESPLoader, offset: number): Promise<number>;
getPkgVersion(loader: ESPLoader): Promise<number>;
getChipRevision(loader: ESPLoader): Promise<number>;
getChipDescription(loader: ESPLoader): Promise<string>;
getChipFeatures(loader: ESPLoader): Promise<string[]>;
getCrystalFreq(loader: ESPLoader): Promise<number>;
_d2h(d: number): string;
readMac(loader: ESPLoader): Promise<string>;
}

185
node_modules/esptool-js/lib/targets/esp32.js generated vendored Normal file
View File

@@ -0,0 +1,185 @@
import { ROM } from "./rom.js";
export class ESP32ROM extends ROM {
constructor() {
super(...arguments);
this.CHIP_NAME = "ESP32";
this.IMAGE_CHIP_ID = 0;
this.EFUSE_RD_REG_BASE = 0x3ff5a000;
this.DR_REG_SYSCON_BASE = 0x3ff66000;
this.UART_CLKDIV_REG = 0x3ff40014;
this.UART_CLKDIV_MASK = 0xfffff;
this.UART_DATE_REG_ADDR = 0x60000078;
this.XTAL_CLK_DIVIDER = 1;
this.FLASH_SIZES = {
"1MB": 0x00,
"2MB": 0x10,
"4MB": 0x20,
"8MB": 0x30,
"16MB": 0x40,
};
this.FLASH_WRITE_SIZE = 0x400;
this.BOOTLOADER_FLASH_OFFSET = 0x1000;
this.SPI_REG_BASE = 0x3ff42000;
this.SPI_USR_OFFS = 0x1c;
this.SPI_USR1_OFFS = 0x20;
this.SPI_USR2_OFFS = 0x24;
this.SPI_W0_OFFS = 0x80;
this.SPI_MOSI_DLEN_OFFS = 0x28;
this.SPI_MISO_DLEN_OFFS = 0x2c;
}
async readEfuse(loader, offset) {
const addr = this.EFUSE_RD_REG_BASE + 4 * offset;
loader.debug("Read efuse " + addr);
return await loader.readReg(addr);
}
async getPkgVersion(loader) {
const word3 = await this.readEfuse(loader, 3);
let pkgVersion = (word3 >> 9) & 0x07;
pkgVersion += ((word3 >> 2) & 0x1) << 3;
return pkgVersion;
}
async getChipRevision(loader) {
const word3 = await this.readEfuse(loader, 3);
const word5 = await this.readEfuse(loader, 5);
const apbCtlDate = await loader.readReg(this.DR_REG_SYSCON_BASE + 0x7c);
const revBit0 = (word3 >> 15) & 0x1;
const revBit1 = (word5 >> 20) & 0x1;
const revBit2 = (apbCtlDate >> 31) & 0x1;
if (revBit0 != 0) {
if (revBit1 != 0) {
if (revBit2 != 0) {
return 3;
}
else {
return 2;
}
}
else {
return 1;
}
}
return 0;
}
async getChipDescription(loader) {
const chipDesc = [
"ESP32-D0WDQ6",
"ESP32-D0WD",
"ESP32-D2WD",
"",
"ESP32-U4WDH",
"ESP32-PICO-D4",
"ESP32-PICO-V3-02",
];
let chipName = "";
const pkgVersion = await this.getPkgVersion(loader);
const chipRevision = await this.getChipRevision(loader);
const rev3 = chipRevision == 3;
const single_core = (await this.readEfuse(loader, 3)) & (1 << 0);
if (single_core != 0) {
chipDesc[0] = "ESP32-S0WDQ6";
chipDesc[1] = "ESP32-S0WD";
}
if (rev3) {
chipDesc[5] = "ESP32-PICO-V3";
}
if (pkgVersion >= 0 && pkgVersion <= 6) {
chipName = chipDesc[pkgVersion];
}
else {
chipName = "Unknown ESP32";
}
if (rev3 && (pkgVersion === 0 || pkgVersion === 1)) {
chipName += "-V3";
}
return chipName + " (revision " + chipRevision + ")";
}
async getChipFeatures(loader) {
const features = ["Wi-Fi"];
const word3 = await this.readEfuse(loader, 3);
const chipVerDisBt = word3 & (1 << 1);
if (chipVerDisBt === 0) {
features.push(" BT");
}
const chipVerDisAppCpu = word3 & (1 << 0);
if (chipVerDisAppCpu !== 0) {
features.push(" Single Core");
}
else {
features.push(" Dual Core");
}
const chipCpuFreqRated = word3 & (1 << 13);
if (chipCpuFreqRated !== 0) {
const chipCpuFreqLow = word3 & (1 << 12);
if (chipCpuFreqLow !== 0) {
features.push(" 160MHz");
}
else {
features.push(" 240MHz");
}
}
const pkgVersion = await this.getPkgVersion(loader);
if ([2, 4, 5, 6].indexOf(pkgVersion) !== -1) {
features.push(" Embedded Flash");
}
if (pkgVersion === 6) {
features.push(" Embedded PSRAM");
}
const word4 = await this.readEfuse(loader, 4);
const adcVref = (word4 >> 8) & 0x1f;
if (adcVref !== 0) {
features.push(" VRef calibration in efuse");
}
const blk3PartRes = (word3 >> 14) & 0x1;
if (blk3PartRes !== 0) {
features.push(" BLK3 partially reserved");
}
const word6 = await this.readEfuse(loader, 6);
const codingScheme = word6 & 0x3;
const codingSchemeArr = ["None", "3/4", "Repeat (UNSUPPORTED)", "Invalid"];
features.push(" Coding Scheme " + codingSchemeArr[codingScheme]);
return features;
}
async getCrystalFreq(loader) {
const uartDiv = (await loader.readReg(this.UART_CLKDIV_REG)) & this.UART_CLKDIV_MASK;
const etsXtal = (loader.transport.baudrate * uartDiv) / 1000000 / this.XTAL_CLK_DIVIDER;
let normXtal;
if (etsXtal > 33) {
normXtal = 40;
}
else {
normXtal = 26;
}
if (Math.abs(normXtal - etsXtal) > 1) {
loader.info("WARNING: Unsupported crystal in use");
}
return normXtal;
}
_d2h(d) {
const h = (+d).toString(16);
return h.length === 1 ? "0" + h : h;
}
async readMac(loader) {
let mac0 = await this.readEfuse(loader, 1);
mac0 = mac0 >>> 0;
let mac1 = await this.readEfuse(loader, 2);
mac1 = mac1 >>> 0;
const mac = new Uint8Array(6);
mac[0] = (mac1 >> 8) & 0xff;
mac[1] = mac1 & 0xff;
mac[2] = (mac0 >> 24) & 0xff;
mac[3] = (mac0 >> 16) & 0xff;
mac[4] = (mac0 >> 8) & 0xff;
mac[5] = mac0 & 0xff;
return (this._d2h(mac[0]) +
":" +
this._d2h(mac[1]) +
":" +
this._d2h(mac[2]) +
":" +
this._d2h(mac[3]) +
":" +
this._d2h(mac[4]) +
":" +
this._d2h(mac[5]));
}
}

37
node_modules/esptool-js/lib/targets/esp32c2.d.ts generated vendored Normal file
View File

@@ -0,0 +1,37 @@
import { ESPLoader } from "../esploader.js";
import { ESP32C3ROM } from "./esp32c3.js";
export declare class ESP32C2ROM extends ESP32C3ROM {
CHIP_NAME: string;
IMAGE_CHIP_ID: number;
EFUSE_BASE: number;
MAC_EFUSE_REG: number;
UART_CLKDIV_REG: number;
UART_CLKDIV_MASK: number;
UART_DATE_REG_ADDR: number;
XTAL_CLK_DIVIDER: number;
FLASH_WRITE_SIZE: number;
BOOTLOADER_FLASH_OFFSET: number;
FLASH_SIZES: {
"1MB": number;
"2MB": number;
"4MB": number;
"8MB": number;
"16MB": number;
};
SPI_REG_BASE: number;
SPI_USR_OFFS: number;
SPI_USR1_OFFS: number;
SPI_USR2_OFFS: number;
SPI_MOSI_DLEN_OFFS: number;
SPI_MISO_DLEN_OFFS: number;
SPI_W0_OFFS: number;
getPkgVersion(loader: ESPLoader): Promise<number>;
getChipRevision(loader: ESPLoader): Promise<number>;
getChipDescription(loader: ESPLoader): Promise<string>;
getChipFeatures(loader: ESPLoader): Promise<string[]>;
getCrystalFreq(loader: ESPLoader): Promise<number>;
changeBaudRate(loader: ESPLoader): Promise<void>;
_d2h(d: number): string;
readMac(loader: ESPLoader): Promise<string>;
getEraseSize(offset: number, size: number): number;
}

114
node_modules/esptool-js/lib/targets/esp32c2.js generated vendored Normal file
View File

@@ -0,0 +1,114 @@
import { ESP32C3ROM } from "./esp32c3.js";
export class ESP32C2ROM extends ESP32C3ROM {
constructor() {
super(...arguments);
this.CHIP_NAME = "ESP32-C2";
this.IMAGE_CHIP_ID = 12;
this.EFUSE_BASE = 0x60008800;
this.MAC_EFUSE_REG = this.EFUSE_BASE + 0x040;
this.UART_CLKDIV_REG = 0x60000014;
this.UART_CLKDIV_MASK = 0xfffff;
this.UART_DATE_REG_ADDR = 0x6000007c;
this.XTAL_CLK_DIVIDER = 1;
this.FLASH_WRITE_SIZE = 0x400;
this.BOOTLOADER_FLASH_OFFSET = 0;
this.FLASH_SIZES = {
"1MB": 0x00,
"2MB": 0x10,
"4MB": 0x20,
"8MB": 0x30,
"16MB": 0x40,
};
this.SPI_REG_BASE = 0x60002000;
this.SPI_USR_OFFS = 0x18;
this.SPI_USR1_OFFS = 0x1c;
this.SPI_USR2_OFFS = 0x20;
this.SPI_MOSI_DLEN_OFFS = 0x24;
this.SPI_MISO_DLEN_OFFS = 0x28;
this.SPI_W0_OFFS = 0x58;
}
async getPkgVersion(loader) {
const numWord = 1;
const block1Addr = this.EFUSE_BASE + 0x040;
const addr = block1Addr + 4 * numWord;
const word3 = await loader.readReg(addr);
const pkgVersion = (word3 >> 22) & 0x07;
return pkgVersion;
}
async getChipRevision(loader) {
const block1Addr = this.EFUSE_BASE + 0x040;
const numWord = 1;
const pos = 20;
const addr = block1Addr + 4 * numWord;
const ret = ((await loader.readReg(addr)) & (0x03 << pos)) >> pos;
return ret;
}
async getChipDescription(loader) {
let desc;
const pkgVer = await this.getPkgVersion(loader);
if (pkgVer === 0 || pkgVer === 1) {
desc = "ESP32-C2";
}
else {
desc = "unknown ESP32-C2";
}
const chip_rev = await this.getChipRevision(loader);
desc += " (revision " + chip_rev + ")";
return desc;
}
async getChipFeatures(loader) {
return ["Wi-Fi", "BLE"];
}
async getCrystalFreq(loader) {
const uartDiv = (await loader.readReg(this.UART_CLKDIV_REG)) & this.UART_CLKDIV_MASK;
const etsXtal = (loader.transport.baudrate * uartDiv) / 1000000 / this.XTAL_CLK_DIVIDER;
let normXtal;
if (etsXtal > 33) {
normXtal = 40;
}
else {
normXtal = 26;
}
if (Math.abs(normXtal - etsXtal) > 1) {
loader.info("WARNING: Unsupported crystal in use");
}
return normXtal;
}
async changeBaudRate(loader) {
const rom_with_26M_XTAL = await this.getCrystalFreq(loader);
if (rom_with_26M_XTAL === 26) {
loader.changeBaud();
}
}
_d2h(d) {
const h = (+d).toString(16);
return h.length === 1 ? "0" + h : h;
}
async readMac(loader) {
let mac0 = await loader.readReg(this.MAC_EFUSE_REG);
mac0 = mac0 >>> 0;
let mac1 = await loader.readReg(this.MAC_EFUSE_REG + 4);
mac1 = (mac1 >>> 0) & 0x0000ffff;
const mac = new Uint8Array(6);
mac[0] = (mac1 >> 8) & 0xff;
mac[1] = mac1 & 0xff;
mac[2] = (mac0 >> 24) & 0xff;
mac[3] = (mac0 >> 16) & 0xff;
mac[4] = (mac0 >> 8) & 0xff;
mac[5] = mac0 & 0xff;
return (this._d2h(mac[0]) +
":" +
this._d2h(mac[1]) +
":" +
this._d2h(mac[2]) +
":" +
this._d2h(mac[3]) +
":" +
this._d2h(mac[4]) +
":" +
this._d2h(mac[5]));
}
getEraseSize(offset, size) {
return size;
}
}

37
node_modules/esptool-js/lib/targets/esp32c3.d.ts generated vendored Normal file
View File

@@ -0,0 +1,37 @@
import { ESPLoader } from "../esploader.js";
import { ROM } from "./rom.js";
export declare class ESP32C3ROM extends ROM {
CHIP_NAME: string;
IMAGE_CHIP_ID: number;
EFUSE_BASE: number;
MAC_EFUSE_REG: number;
UART_CLKDIV_REG: number;
UART_CLKDIV_MASK: number;
UART_DATE_REG_ADDR: number;
FLASH_WRITE_SIZE: number;
BOOTLOADER_FLASH_OFFSET: number;
FLASH_SIZES: {
"1MB": number;
"2MB": number;
"4MB": number;
"8MB": number;
"16MB": number;
};
SPI_REG_BASE: number;
SPI_USR_OFFS: number;
SPI_USR1_OFFS: number;
SPI_USR2_OFFS: number;
SPI_MOSI_DLEN_OFFS: number;
SPI_MISO_DLEN_OFFS: number;
SPI_W0_OFFS: number;
getPkgVersion(loader: ESPLoader): Promise<number>;
getChipRevision(loader: ESPLoader): Promise<number>;
getChipDescription(loader: ESPLoader): Promise<string>;
getFlashCap(loader: ESPLoader): Promise<number>;
getFlashVendor(loader: ESPLoader): Promise<string>;
getChipFeatures(loader: ESPLoader): Promise<string[]>;
getCrystalFreq(loader: ESPLoader): Promise<number>;
_d2h(d: number): string;
readMac(loader: ESPLoader): Promise<string>;
getEraseSize(offset: number, size: number): number;
}

133
node_modules/esptool-js/lib/targets/esp32c3.js generated vendored Normal file
View File

@@ -0,0 +1,133 @@
import { ROM } from "./rom.js";
export class ESP32C3ROM extends ROM {
constructor() {
super(...arguments);
this.CHIP_NAME = "ESP32-C3";
this.IMAGE_CHIP_ID = 5;
this.EFUSE_BASE = 0x60008800;
this.MAC_EFUSE_REG = this.EFUSE_BASE + 0x044;
this.UART_CLKDIV_REG = 0x3ff40014;
this.UART_CLKDIV_MASK = 0xfffff;
this.UART_DATE_REG_ADDR = 0x6000007c;
this.FLASH_WRITE_SIZE = 0x400;
this.BOOTLOADER_FLASH_OFFSET = 0;
this.FLASH_SIZES = {
"1MB": 0x00,
"2MB": 0x10,
"4MB": 0x20,
"8MB": 0x30,
"16MB": 0x40,
};
this.SPI_REG_BASE = 0x60002000;
this.SPI_USR_OFFS = 0x18;
this.SPI_USR1_OFFS = 0x1c;
this.SPI_USR2_OFFS = 0x20;
this.SPI_MOSI_DLEN_OFFS = 0x24;
this.SPI_MISO_DLEN_OFFS = 0x28;
this.SPI_W0_OFFS = 0x58;
}
async getPkgVersion(loader) {
const numWord = 3;
const block1Addr = this.EFUSE_BASE + 0x044;
const addr = block1Addr + 4 * numWord;
const word3 = await loader.readReg(addr);
const pkgVersion = (word3 >> 21) & 0x07;
return pkgVersion;
}
async getChipRevision(loader) {
const block1Addr = this.EFUSE_BASE + 0x044;
const numWord = 3;
const pos = 18;
const addr = block1Addr + 4 * numWord;
const ret = ((await loader.readReg(addr)) & (0x7 << pos)) >> pos;
return ret;
}
async getChipDescription(loader) {
let desc;
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;
}
async getFlashCap(loader) {
const numWord = 3;
const block1Addr = this.EFUSE_BASE + 0x044;
const addr = block1Addr + 4 * numWord;
const registerValue = await loader.readReg(addr);
const flashCap = (registerValue >> 27) & 0x07;
return flashCap;
}
async getFlashVendor(loader) {
const numWord = 4;
const block1Addr = this.EFUSE_BASE + 0x044;
const addr = block1Addr + 4 * numWord;
const registerValue = await loader.readReg(addr);
const vendorId = (registerValue >> 0) & 0x07;
const vendorMap = {
1: "XMC",
2: "GD",
3: "FM",
4: "TT",
5: "ZBIT",
};
return vendorMap[vendorId] || "";
}
async getChipFeatures(loader) {
const features = ["Wi-Fi", "BLE"];
const flashMap = {
0: null,
1: "Embedded Flash 4MB",
2: "Embedded Flash 2MB",
3: "Embedded Flash 1MB",
4: "Embedded Flash 8MB",
};
const flashCap = await this.getFlashCap(loader);
const flashVendor = await this.getFlashVendor(loader);
const flash = flashMap[flashCap];
const flashDescription = flash !== undefined ? flash : "Unknown Embedded Flash";
if (flash !== null) {
features.push(`${flashDescription} (${flashVendor})`);
}
return features;
}
async getCrystalFreq(loader) {
return 40;
}
_d2h(d) {
const h = (+d).toString(16);
return h.length === 1 ? "0" + h : h;
}
async readMac(loader) {
let mac0 = await loader.readReg(this.MAC_EFUSE_REG);
mac0 = mac0 >>> 0;
let mac1 = await loader.readReg(this.MAC_EFUSE_REG + 4);
mac1 = (mac1 >>> 0) & 0x0000ffff;
const mac = new Uint8Array(6);
mac[0] = (mac1 >> 8) & 0xff;
mac[1] = mac1 & 0xff;
mac[2] = (mac0 >> 24) & 0xff;
mac[3] = (mac0 >> 16) & 0xff;
mac[4] = (mac0 >> 8) & 0xff;
mac[5] = mac0 & 0xff;
return (this._d2h(mac[0]) +
":" +
this._d2h(mac[1]) +
":" +
this._d2h(mac[2]) +
":" +
this._d2h(mac[3]) +
":" +
this._d2h(mac[4]) +
":" +
this._d2h(mac[5]));
}
getEraseSize(offset, size) {
return size;
}
}

70
node_modules/esptool-js/lib/targets/esp32c5.d.ts generated vendored Normal file
View File

@@ -0,0 +1,70 @@
import { ESPLoader } from "../esploader";
import { ESP32C6ROM } from "./esp32c6";
export declare class ESP32C5ROM extends ESP32C6ROM {
CHIP_NAME: string;
IMAGE_CHIP_ID: number;
BOOTLOADER_FLASH_OFFSET: number;
EFUSE_BASE: number;
EFUSE_BLOCK1_ADDR: number;
MAC_EFUSE_REG: number;
UART_CLKDIV_REG: number;
EFUSE_RD_REG_BASE: number;
EFUSE_PURPOSE_KEY0_REG: number;
EFUSE_PURPOSE_KEY0_SHIFT: number;
EFUSE_PURPOSE_KEY1_REG: number;
EFUSE_PURPOSE_KEY1_SHIFT: number;
EFUSE_PURPOSE_KEY2_REG: number;
EFUSE_PURPOSE_KEY2_SHIFT: number;
EFUSE_PURPOSE_KEY3_REG: number;
EFUSE_PURPOSE_KEY3_SHIFT: number;
EFUSE_PURPOSE_KEY4_REG: number;
EFUSE_PURPOSE_KEY4_SHIFT: number;
EFUSE_PURPOSE_KEY5_REG: number;
EFUSE_PURPOSE_KEY5_SHIFT: number;
EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT_REG: number;
EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT: number;
EFUSE_SPI_BOOT_CRYPT_CNT_REG: number;
EFUSE_SPI_BOOT_CRYPT_CNT_MASK: number;
EFUSE_SECURE_BOOT_EN_REG: number;
EFUSE_SECURE_BOOT_EN_MASK: number;
IROM_MAP_START: number;
IROM_MAP_END: number;
DROM_MAP_START: number;
DROM_MAP_END: number;
PCR_SYSCLK_CONF_REG: number;
PCR_SYSCLK_XTAL_FREQ_V: number;
PCR_SYSCLK_XTAL_FREQ_S: number;
XTAL_CLK_DIVIDER: number;
UARTDEV_BUF_NO: number;
CHIP_DETECT_MAGIC_VALUE: number[];
FLASH_FREQUENCY: {
"80m": number;
"40m": number;
"20m": number;
};
MEMORY_MAP: (string | number)[][];
UF2_FAMILY_ID: number;
EFUSE_MAX_KEY: number;
KEY_PURPOSES: {
0: string;
1: string;
2: string;
3: string;
4: string;
5: string;
6: string;
7: string;
8: string;
9: string;
10: string;
11: string;
12: string;
};
getPkgVersion(loader: ESPLoader): Promise<number>;
getMinorChipVersion(loader: ESPLoader): Promise<number>;
getMajorChipVersion(loader: ESPLoader): Promise<number>;
getChipDescription(loader: ESPLoader): Promise<string>;
getChipFeatures(loader: ESPLoader): Promise<string[]>;
getCrystalFreq(loader: ESPLoader): Promise<number>;
getCrystalFreqRomExpect(loader: ESPLoader): Promise<number>;
}

129
node_modules/esptool-js/lib/targets/esp32c5.js generated vendored Normal file
View File

@@ -0,0 +1,129 @@
import { ESP32C6ROM } from "./esp32c6";
export class ESP32C5ROM extends ESP32C6ROM {
constructor() {
super(...arguments);
this.CHIP_NAME = "ESP32-C5";
this.IMAGE_CHIP_ID = 23;
this.BOOTLOADER_FLASH_OFFSET = 0x2000;
this.EFUSE_BASE = 0x600b4800;
this.EFUSE_BLOCK1_ADDR = this.EFUSE_BASE + 0x044;
this.MAC_EFUSE_REG = this.EFUSE_BASE + 0x044;
this.UART_CLKDIV_REG = 0x60000014;
this.EFUSE_RD_REG_BASE = this.EFUSE_BASE + 0x030; // BLOCK0 read base address
this.EFUSE_PURPOSE_KEY0_REG = this.EFUSE_BASE + 0x34;
this.EFUSE_PURPOSE_KEY0_SHIFT = 24;
this.EFUSE_PURPOSE_KEY1_REG = this.EFUSE_BASE + 0x34;
this.EFUSE_PURPOSE_KEY1_SHIFT = 28;
this.EFUSE_PURPOSE_KEY2_REG = this.EFUSE_BASE + 0x38;
this.EFUSE_PURPOSE_KEY2_SHIFT = 0;
this.EFUSE_PURPOSE_KEY3_REG = this.EFUSE_BASE + 0x38;
this.EFUSE_PURPOSE_KEY3_SHIFT = 4;
this.EFUSE_PURPOSE_KEY4_REG = this.EFUSE_BASE + 0x38;
this.EFUSE_PURPOSE_KEY4_SHIFT = 8;
this.EFUSE_PURPOSE_KEY5_REG = this.EFUSE_BASE + 0x38;
this.EFUSE_PURPOSE_KEY5_SHIFT = 12;
this.EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT_REG = this.EFUSE_RD_REG_BASE;
this.EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT = 1 << 20;
this.EFUSE_SPI_BOOT_CRYPT_CNT_REG = this.EFUSE_BASE + 0x034;
this.EFUSE_SPI_BOOT_CRYPT_CNT_MASK = 0x7 << 18;
this.EFUSE_SECURE_BOOT_EN_REG = this.EFUSE_BASE + 0x038;
this.EFUSE_SECURE_BOOT_EN_MASK = 1 << 20;
this.IROM_MAP_START = 0x42000000;
this.IROM_MAP_END = 0x42800000;
this.DROM_MAP_START = 0x42800000;
this.DROM_MAP_END = 0x43000000;
this.PCR_SYSCLK_CONF_REG = 0x60096110;
this.PCR_SYSCLK_XTAL_FREQ_V = 0x7f << 24;
this.PCR_SYSCLK_XTAL_FREQ_S = 24;
this.XTAL_CLK_DIVIDER = 1;
this.UARTDEV_BUF_NO = 0x4085f51c; // Variable in ROM .bss which indicates the port in use
// Magic value for ESP32C5
this.CHIP_DETECT_MAGIC_VALUE = [0x1101406f, 0x63e1406f, 0x5fd1406f];
this.FLASH_FREQUENCY = {
"80m": 0xf,
"40m": 0x0,
"20m": 0x2,
};
this.MEMORY_MAP = [
[0x00000000, 0x00010000, "PADDING"],
[0x42800000, 0x43000000, "DROM"],
[0x40800000, 0x40860000, "DRAM"],
[0x40800000, 0x40860000, "BYTE_ACCESSIBLE"],
[0x4003a000, 0x40040000, "DROM_MASK"],
[0x40000000, 0x4003a000, "IROM_MASK"],
[0x42000000, 0x42800000, "IROM"],
[0x40800000, 0x40860000, "IRAM"],
[0x50000000, 0x50004000, "RTC_IRAM"],
[0x50000000, 0x50004000, "RTC_DRAM"],
[0x600fe000, 0x60100000, "MEM_INTERNAL2"],
];
this.UF2_FAMILY_ID = 0xf71c0343;
this.EFUSE_MAX_KEY = 5;
this.KEY_PURPOSES = {
0: "USER/EMPTY",
1: "ECDSA_KEY",
2: "XTS_AES_256_KEY_1",
3: "XTS_AES_256_KEY_2",
4: "XTS_AES_128_KEY",
5: "HMAC_DOWN_ALL",
6: "HMAC_DOWN_JTAG",
7: "HMAC_DOWN_DIGITAL_SIGNATURE",
8: "HMAC_UP",
9: "SECURE_BOOT_DIGEST0",
10: "SECURE_BOOT_DIGEST1",
11: "SECURE_BOOT_DIGEST2",
12: "KM_INIT_KEY",
};
}
async getPkgVersion(loader) {
const numWord = 2;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 26) & 0x07;
}
async getMinorChipVersion(loader) {
const numWord = 2;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 0) & 0x0f;
}
async getMajorChipVersion(loader) {
const numWord = 2;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 4) & 0x03;
}
async getChipDescription(loader) {
const pkgVer = await this.getPkgVersion(loader);
let desc;
if (pkgVer === 0) {
desc = "ESP32-C5";
}
else {
desc = "unknown ESP32-C5";
}
const majorRev = await this.getMajorChipVersion(loader);
const minorRev = await this.getMinorChipVersion(loader);
return `${desc} (revision v${majorRev}.${minorRev})`;
}
async getChipFeatures(loader) {
return ["Wi-Fi 6 (dual-band)", "BT 5 (LE)"];
}
async getCrystalFreq(loader) {
// The crystal detection algorithm of ESP32/ESP8266
// works for ESP32-C5 as well.
const uartDiv = (await loader.readReg(this.UART_CLKDIV_REG)) & this.UART_CLKDIV_MASK;
const etsXtal = (loader.transport.baudrate * uartDiv) / 1000000 / this.XTAL_CLK_DIVIDER;
let normXtal;
if (etsXtal > 45) {
normXtal = 48;
}
else if (etsXtal > 33) {
normXtal = 40;
}
else {
normXtal = 26;
}
if (Math.abs(normXtal - etsXtal) > 1) {
loader.info("WARNING: Unsupported crystal in use");
}
return normXtal;
}
async getCrystalFreqRomExpect(loader) {
return (((await loader.readReg(this.PCR_SYSCLK_CONF_REG)) & this.PCR_SYSCLK_XTAL_FREQ_V) >> this.PCR_SYSCLK_XTAL_FREQ_S);
}
}

36
node_modules/esptool-js/lib/targets/esp32c6.d.ts generated vendored Normal file
View File

@@ -0,0 +1,36 @@
import { ESPLoader } from "../esploader.js";
import { ROM } from "./rom.js";
export declare class ESP32C6ROM extends ROM {
CHIP_NAME: string;
IMAGE_CHIP_ID: number;
EFUSE_BASE: number;
EFUSE_BLOCK1_ADDR: number;
MAC_EFUSE_REG: number;
UART_CLKDIV_REG: number;
UART_CLKDIV_MASK: number;
UART_DATE_REG_ADDR: number;
FLASH_WRITE_SIZE: number;
BOOTLOADER_FLASH_OFFSET: number;
FLASH_SIZES: {
"1MB": number;
"2MB": number;
"4MB": number;
"8MB": number;
"16MB": number;
};
SPI_REG_BASE: number;
SPI_USR_OFFS: number;
SPI_USR1_OFFS: number;
SPI_USR2_OFFS: number;
SPI_MOSI_DLEN_OFFS: number;
SPI_MISO_DLEN_OFFS: number;
SPI_W0_OFFS: number;
getPkgVersion(loader: ESPLoader): Promise<number>;
getChipRevision(loader: ESPLoader): Promise<number>;
getChipDescription(loader: ESPLoader): Promise<string>;
getChipFeatures(loader: ESPLoader): Promise<string[]>;
getCrystalFreq(loader: ESPLoader): Promise<number>;
_d2h(d: number): string;
readMac(loader: ESPLoader): Promise<string>;
getEraseSize(offset: number, size: number): number;
}

96
node_modules/esptool-js/lib/targets/esp32c6.js generated vendored Normal file
View File

@@ -0,0 +1,96 @@
import { ROM } from "./rom.js";
export class ESP32C6ROM extends ROM {
constructor() {
super(...arguments);
this.CHIP_NAME = "ESP32-C6";
this.IMAGE_CHIP_ID = 13;
this.EFUSE_BASE = 0x600b0800;
this.EFUSE_BLOCK1_ADDR = this.EFUSE_BASE + 0x044;
this.MAC_EFUSE_REG = this.EFUSE_BASE + 0x044;
this.UART_CLKDIV_REG = 0x3ff40014;
this.UART_CLKDIV_MASK = 0xfffff;
this.UART_DATE_REG_ADDR = 0x6000007c;
this.FLASH_WRITE_SIZE = 0x400;
this.BOOTLOADER_FLASH_OFFSET = 0;
this.FLASH_SIZES = {
"1MB": 0x00,
"2MB": 0x10,
"4MB": 0x20,
"8MB": 0x30,
"16MB": 0x40,
};
this.SPI_REG_BASE = 0x60002000;
this.SPI_USR_OFFS = 0x18;
this.SPI_USR1_OFFS = 0x1c;
this.SPI_USR2_OFFS = 0x20;
this.SPI_MOSI_DLEN_OFFS = 0x24;
this.SPI_MISO_DLEN_OFFS = 0x28;
this.SPI_W0_OFFS = 0x58;
}
async getPkgVersion(loader) {
const numWord = 3;
const block1Addr = this.EFUSE_BASE + 0x044;
const addr = block1Addr + 4 * numWord;
const word3 = await loader.readReg(addr);
const pkgVersion = (word3 >> 21) & 0x07;
return pkgVersion;
}
async getChipRevision(loader) {
const block1Addr = this.EFUSE_BASE + 0x044;
const numWord = 3;
const pos = 18;
const addr = block1Addr + 4 * numWord;
const ret = ((await loader.readReg(addr)) & (0x7 << pos)) >> pos;
return ret;
}
async getChipDescription(loader) {
let desc;
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;
}
async getChipFeatures(loader) {
return ["Wi-Fi 6", "BT 5", "IEEE802.15.4"];
}
async getCrystalFreq(loader) {
return 40;
}
_d2h(d) {
const h = (+d).toString(16);
return h.length === 1 ? "0" + h : h;
}
async readMac(loader) {
let mac0 = await loader.readReg(this.MAC_EFUSE_REG);
mac0 = mac0 >>> 0;
let mac1 = await loader.readReg(this.MAC_EFUSE_REG + 4);
mac1 = (mac1 >>> 0) & 0x0000ffff;
const mac = new Uint8Array(6);
mac[0] = (mac1 >> 8) & 0xff;
mac[1] = mac1 & 0xff;
mac[2] = (mac0 >> 24) & 0xff;
mac[3] = (mac0 >> 16) & 0xff;
mac[4] = (mac0 >> 8) & 0xff;
mac[5] = mac0 & 0xff;
return (this._d2h(mac[0]) +
":" +
this._d2h(mac[1]) +
":" +
this._d2h(mac[2]) +
":" +
this._d2h(mac[3]) +
":" +
this._d2h(mac[4]) +
":" +
this._d2h(mac[5]));
}
getEraseSize(offset, size) {
return size;
}
}

62
node_modules/esptool-js/lib/targets/esp32c61.d.ts generated vendored Normal file
View File

@@ -0,0 +1,62 @@
import { ESPLoader } from "../esploader";
import { ESP32C6ROM } from "./esp32c6";
export declare class ESP32C61ROM extends ESP32C6ROM {
CHIP_NAME: string;
IMAGE_CHIP_ID: number;
CHIP_DETECT_MAGIC_VALUE: number[];
UART_DATE_REG_ADDR: number;
EFUSE_BASE: number;
EFUSE_BLOCK1_ADDR: number;
MAC_EFUSE_REG: number;
EFUSE_RD_REG_BASE: number;
EFUSE_PURPOSE_KEY0_REG: number;
EFUSE_PURPOSE_KEY0_SHIFT: number;
EFUSE_PURPOSE_KEY1_REG: number;
EFUSE_PURPOSE_KEY1_SHIFT: number;
EFUSE_PURPOSE_KEY2_REG: number;
EFUSE_PURPOSE_KEY2_SHIFT: number;
EFUSE_PURPOSE_KEY3_REG: number;
EFUSE_PURPOSE_KEY3_SHIFT: number;
EFUSE_PURPOSE_KEY4_REG: number;
EFUSE_PURPOSE_KEY4_SHIFT: number;
EFUSE_PURPOSE_KEY5_REG: number;
EFUSE_PURPOSE_KEY5_SHIFT: number;
EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT_REG: number;
EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT: number;
EFUSE_SPI_BOOT_CRYPT_CNT_REG: number;
EFUSE_SPI_BOOT_CRYPT_CNT_MASK: number;
EFUSE_SECURE_BOOT_EN_REG: number;
EFUSE_SECURE_BOOT_EN_MASK: number;
FLASH_FREQUENCY: {
"80m": number;
"40m": number;
"20m": number;
};
MEMORY_MAP: (string | number)[][];
UF2_FAMILY_ID: number;
EFUSE_MAX_KEY: number;
KEY_PURPOSES: {
0: string;
1: string;
2: string;
3: string;
4: string;
5: string;
6: string;
7: string;
8: string;
9: string;
10: string;
11: string;
12: string;
13: string;
14: string;
15: string;
};
getPkgVersion(loader: ESPLoader): Promise<number>;
getMinorChipVersion(loader: ESPLoader): Promise<number>;
getMajorChipVersion(loader: ESPLoader): Promise<number>;
getChipDescription(loader: ESPLoader): Promise<string>;
getChipFeatures(loader: ESPLoader): Promise<string[]>;
readMac(loader: ESPLoader): Promise<string>;
}

122
node_modules/esptool-js/lib/targets/esp32c61.js generated vendored Normal file
View File

@@ -0,0 +1,122 @@
import { ESP32C6ROM } from "./esp32c6";
export class ESP32C61ROM extends ESP32C6ROM {
constructor() {
super(...arguments);
this.CHIP_NAME = "ESP32-C61";
this.IMAGE_CHIP_ID = 20;
this.CHIP_DETECT_MAGIC_VALUE = [0x33f0206f, 0x2421606f];
this.UART_DATE_REG_ADDR = 0x60000000 + 0x7c;
this.EFUSE_BASE = 0x600b4800;
this.EFUSE_BLOCK1_ADDR = this.EFUSE_BASE + 0x044;
this.MAC_EFUSE_REG = this.EFUSE_BASE + 0x044;
this.EFUSE_RD_REG_BASE = this.EFUSE_BASE + 0x030; // BLOCK0 read base address
this.EFUSE_PURPOSE_KEY0_REG = this.EFUSE_BASE + 0x34;
this.EFUSE_PURPOSE_KEY0_SHIFT = 0;
this.EFUSE_PURPOSE_KEY1_REG = this.EFUSE_BASE + 0x34;
this.EFUSE_PURPOSE_KEY1_SHIFT = 4;
this.EFUSE_PURPOSE_KEY2_REG = this.EFUSE_BASE + 0x34;
this.EFUSE_PURPOSE_KEY2_SHIFT = 8;
this.EFUSE_PURPOSE_KEY3_REG = this.EFUSE_BASE + 0x34;
this.EFUSE_PURPOSE_KEY3_SHIFT = 12;
this.EFUSE_PURPOSE_KEY4_REG = this.EFUSE_BASE + 0x34;
this.EFUSE_PURPOSE_KEY4_SHIFT = 16;
this.EFUSE_PURPOSE_KEY5_REG = this.EFUSE_BASE + 0x34;
this.EFUSE_PURPOSE_KEY5_SHIFT = 20;
this.EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT_REG = this.EFUSE_RD_REG_BASE;
this.EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT = 1 << 20;
this.EFUSE_SPI_BOOT_CRYPT_CNT_REG = this.EFUSE_BASE + 0x030;
this.EFUSE_SPI_BOOT_CRYPT_CNT_MASK = 0x7 << 23;
this.EFUSE_SECURE_BOOT_EN_REG = this.EFUSE_BASE + 0x034;
this.EFUSE_SECURE_BOOT_EN_MASK = 1 << 26;
this.FLASH_FREQUENCY = {
"80m": 0xf,
"40m": 0x0,
"20m": 0x2,
};
this.MEMORY_MAP = [
[0x00000000, 0x00010000, "PADDING"],
[0x41800000, 0x42000000, "DROM"],
[0x40800000, 0x40860000, "DRAM"],
[0x40800000, 0x40860000, "BYTE_ACCESSIBLE"],
[0x4004ac00, 0x40050000, "DROM_MASK"],
[0x40000000, 0x4004ac00, "IROM_MASK"],
[0x41000000, 0x41800000, "IROM"],
[0x40800000, 0x40860000, "IRAM"],
[0x50000000, 0x50004000, "RTC_IRAM"],
[0x50000000, 0x50004000, "RTC_DRAM"],
[0x600fe000, 0x60100000, "MEM_INTERNAL2"],
];
this.UF2_FAMILY_ID = 0x77d850c4;
this.EFUSE_MAX_KEY = 5;
this.KEY_PURPOSES = {
0: "USER/EMPTY",
1: "ECDSA_KEY",
2: "XTS_AES_256_KEY_1",
3: "XTS_AES_256_KEY_2",
4: "XTS_AES_128_KEY",
5: "HMAC_DOWN_ALL",
6: "HMAC_DOWN_JTAG",
7: "HMAC_DOWN_DIGITAL_SIGNATURE",
8: "HMAC_UP",
9: "SECURE_BOOT_DIGEST0",
10: "SECURE_BOOT_DIGEST1",
11: "SECURE_BOOT_DIGEST2",
12: "KM_INIT_KEY",
13: "XTS_AES_256_KEY_1_PSRAM",
14: "XTS_AES_256_KEY_2_PSRAM",
15: "XTS_AES_128_KEY_PSRAM",
};
}
async getPkgVersion(loader) {
const numWord = 2;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 26) & 0x07;
}
async getMinorChipVersion(loader) {
const numWord = 2;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 0) & 0x0f;
}
async getMajorChipVersion(loader) {
const numWord = 2;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 4) & 0x03;
}
async getChipDescription(loader) {
const pkgVer = await this.getPkgVersion(loader);
let desc;
if (pkgVer === 0) {
desc = "ESP32-C61";
}
else {
desc = "unknown ESP32-C61";
}
const majorRev = await this.getMajorChipVersion(loader);
const minorRev = await this.getMinorChipVersion(loader);
return `${desc} (revision v${majorRev}.${minorRev})`;
}
async getChipFeatures(loader) {
return ["WiFi 6", "BT 5"];
}
async readMac(loader) {
let mac0 = await loader.readReg(this.MAC_EFUSE_REG);
mac0 = mac0 >>> 0;
let mac1 = await loader.readReg(this.MAC_EFUSE_REG + 4);
mac1 = (mac1 >>> 0) & 0x0000ffff;
const mac = new Uint8Array(6);
mac[0] = (mac1 >> 8) & 0xff;
mac[1] = mac1 & 0xff;
mac[2] = (mac0 >> 24) & 0xff;
mac[3] = (mac0 >> 16) & 0xff;
mac[4] = (mac0 >> 8) & 0xff;
mac[5] = mac0 & 0xff;
return (this._d2h(mac[0]) +
":" +
this._d2h(mac[1]) +
":" +
this._d2h(mac[2]) +
":" +
this._d2h(mac[3]) +
":" +
this._d2h(mac[4]) +
":" +
this._d2h(mac[5]));
}
}

41
node_modules/esptool-js/lib/targets/esp32h2.d.ts generated vendored Normal file
View File

@@ -0,0 +1,41 @@
import { ESPLoader } from "../esploader.js";
import { ROM } from "./rom.js";
export declare class ESP32H2ROM extends ROM {
CHIP_NAME: string;
IMAGE_CHIP_ID: number;
EFUSE_BASE: number;
EFUSE_BLOCK1_ADDR: number;
MAC_EFUSE_REG: number;
UART_CLKDIV_REG: number;
UART_CLKDIV_MASK: number;
UART_DATE_REG_ADDR: number;
FLASH_WRITE_SIZE: number;
BOOTLOADER_FLASH_OFFSET: number;
FLASH_SIZES: {
"1MB": number;
"2MB": number;
"4MB": number;
"8MB": number;
"16MB": number;
};
SPI_REG_BASE: number;
SPI_USR_OFFS: number;
SPI_USR1_OFFS: number;
SPI_USR2_OFFS: number;
SPI_MOSI_DLEN_OFFS: number;
SPI_MISO_DLEN_OFFS: number;
SPI_W0_OFFS: number;
USB_RAM_BLOCK: number;
UARTDEV_BUF_NO_USB: number;
UARTDEV_BUF_NO: number;
getPkgVersion(loader: ESPLoader): Promise<number>;
getMinorChipVersion(loader: ESPLoader): Promise<number>;
getMajorChipVersion(loader: ESPLoader): Promise<number>;
getChipDescription(loader: ESPLoader): Promise<string>;
getChipFeatures(loader: ESPLoader): Promise<string[]>;
getCrystalFreq(loader: ESPLoader): Promise<number>;
_d2h(d: number): string;
postConnect(loader: ESPLoader): Promise<void>;
readMac(loader: ESPLoader): Promise<string>;
getEraseSize(offset: number, size: number): number;
}

103
node_modules/esptool-js/lib/targets/esp32h2.js generated vendored Normal file
View File

@@ -0,0 +1,103 @@
import { ROM } from "./rom.js";
export class ESP32H2ROM extends ROM {
constructor() {
super(...arguments);
this.CHIP_NAME = "ESP32-H2";
this.IMAGE_CHIP_ID = 16;
this.EFUSE_BASE = 0x600b0800;
this.EFUSE_BLOCK1_ADDR = this.EFUSE_BASE + 0x044;
this.MAC_EFUSE_REG = this.EFUSE_BASE + 0x044;
this.UART_CLKDIV_REG = 0x3ff40014;
this.UART_CLKDIV_MASK = 0xfffff;
this.UART_DATE_REG_ADDR = 0x6000007c;
this.FLASH_WRITE_SIZE = 0x400;
this.BOOTLOADER_FLASH_OFFSET = 0x0;
this.FLASH_SIZES = {
"1MB": 0x00,
"2MB": 0x10,
"4MB": 0x20,
"8MB": 0x30,
"16MB": 0x40,
};
this.SPI_REG_BASE = 0x60002000;
this.SPI_USR_OFFS = 0x18;
this.SPI_USR1_OFFS = 0x1c;
this.SPI_USR2_OFFS = 0x20;
this.SPI_MOSI_DLEN_OFFS = 0x24;
this.SPI_MISO_DLEN_OFFS = 0x28;
this.SPI_W0_OFFS = 0x58;
this.USB_RAM_BLOCK = 0x800;
this.UARTDEV_BUF_NO_USB = 3;
this.UARTDEV_BUF_NO = 0x3fcef14c;
}
async getPkgVersion(loader) {
const numWord = 4;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 0) & 0x07;
}
async getMinorChipVersion(loader) {
const numWord = 3;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 18) & 0x07;
}
async getMajorChipVersion(loader) {
const numWord = 3;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 21) & 0x03;
}
async getChipDescription(loader) {
const pkgVer = await this.getPkgVersion(loader);
let desc;
if (pkgVer === 0) {
desc = "ESP32-H2";
}
else {
desc = "unknown ESP32-H2";
}
const majorRev = await this.getMajorChipVersion(loader);
const minorRev = await this.getMinorChipVersion(loader);
return `${desc} (revision v${majorRev}.${minorRev})`;
}
async getChipFeatures(loader) {
return ["BT 5 (LE)", "IEEE802.15.4", "Single Core", "96MHz"];
}
async getCrystalFreq(loader) {
// ESP32H2 XTAL is fixed to 32MHz
return 32;
}
_d2h(d) {
const h = (+d).toString(16);
return h.length === 1 ? "0" + h : h;
}
async postConnect(loader) {
const bufNo = (await loader.readReg(this.UARTDEV_BUF_NO)) & 0xff;
loader.debug("In _post_connect " + bufNo);
if (bufNo == this.UARTDEV_BUF_NO_USB) {
loader.ESP_RAM_BLOCK = this.USB_RAM_BLOCK;
}
}
async readMac(loader) {
let mac0 = await loader.readReg(this.MAC_EFUSE_REG);
mac0 = mac0 >>> 0;
let mac1 = await loader.readReg(this.MAC_EFUSE_REG + 4);
mac1 = (mac1 >>> 0) & 0x0000ffff;
const mac = new Uint8Array(6);
mac[0] = (mac1 >> 8) & 0xff;
mac[1] = mac1 & 0xff;
mac[2] = (mac0 >> 24) & 0xff;
mac[3] = (mac0 >> 16) & 0xff;
mac[4] = (mac0 >> 8) & 0xff;
mac[5] = mac0 & 0xff;
return (this._d2h(mac[0]) +
":" +
this._d2h(mac[1]) +
":" +
this._d2h(mac[2]) +
":" +
this._d2h(mac[3]) +
":" +
this._d2h(mac[4]) +
":" +
this._d2h(mac[5]));
}
getEraseSize(offset, size) {
return size;
}
}

78
node_modules/esptool-js/lib/targets/esp32p4.d.ts generated vendored Normal file
View File

@@ -0,0 +1,78 @@
import { ESPLoader } from "../esploader.js";
import { ESP32ROM } from "./esp32.js";
export declare class ESP32P4ROM extends ESP32ROM {
CHIP_NAME: string;
IMAGE_CHIP_ID: number;
IROM_MAP_START: number;
IROM_MAP_END: number;
DROM_MAP_START: number;
DROM_MAP_END: number;
BOOTLOADER_FLASH_OFFSET: number;
CHIP_DETECT_MAGIC_VALUE: number[];
UART_DATE_REG_ADDR: number;
EFUSE_BASE: number;
EFUSE_BLOCK1_ADDR: number;
MAC_EFUSE_REG: number;
SPI_REG_BASE: number;
SPI_USR_OFFS: number;
SPI_USR1_OFFS: number;
SPI_USR2_OFFS: number;
SPI_MOSI_DLEN_OFFS: number;
SPI_MISO_DLEN_OFFS: number;
SPI_W0_OFFS: number;
EFUSE_RD_REG_BASE: number;
EFUSE_PURPOSE_KEY0_REG: number;
EFUSE_PURPOSE_KEY0_SHIFT: number;
EFUSE_PURPOSE_KEY1_REG: number;
EFUSE_PURPOSE_KEY1_SHIFT: number;
EFUSE_PURPOSE_KEY2_REG: number;
EFUSE_PURPOSE_KEY2_SHIFT: number;
EFUSE_PURPOSE_KEY3_REG: number;
EFUSE_PURPOSE_KEY3_SHIFT: number;
EFUSE_PURPOSE_KEY4_REG: number;
EFUSE_PURPOSE_KEY4_SHIFT: number;
EFUSE_PURPOSE_KEY5_REG: number;
EFUSE_PURPOSE_KEY5_SHIFT: number;
EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT_REG: number;
EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT: number;
EFUSE_SPI_BOOT_CRYPT_CNT_REG: number;
EFUSE_SPI_BOOT_CRYPT_CNT_MASK: number;
EFUSE_SECURE_BOOT_EN_REG: number;
EFUSE_SECURE_BOOT_EN_MASK: number;
PURPOSE_VAL_XTS_AES256_KEY_1: number;
PURPOSE_VAL_XTS_AES256_KEY_2: number;
PURPOSE_VAL_XTS_AES128_KEY: number;
SUPPORTS_ENCRYPTED_FLASH: boolean;
FLASH_ENCRYPTED_WRITE_ALIGN: number;
MEMORY_MAP: (string | number)[][];
UF2_FAMILY_ID: number;
EFUSE_MAX_KEY: number;
KEY_PURPOSES: {
0: string;
1: string;
2: string;
3: string;
4: string;
5: string;
6: string;
7: string;
8: string;
9: string;
10: string;
11: string;
12: string;
};
getPkgVersion(loader: ESPLoader): Promise<number>;
getMinorChipVersion(loader: ESPLoader): Promise<number>;
getMajorChipVersion(loader: ESPLoader): Promise<number>;
getChipDescription(loader: ESPLoader): Promise<string>;
getChipFeatures(loader: ESPLoader): Promise<string[]>;
getCrystalFreq(loader: ESPLoader): Promise<number>;
getFlashVoltage(loader: ESPLoader): Promise<void>;
overrideVddsdio(loader: ESPLoader): Promise<void>;
readMac(loader: ESPLoader): Promise<string>;
getFlashCryptConfig(loader: ESPLoader): Promise<void>;
getSecureBootEnabled(laoder: ESPLoader): Promise<number>;
getKeyBlockPurpose(loader: ESPLoader, keyBlock: number): Promise<number | undefined>;
isFlashEncryptionKeyValid(loader: ESPLoader): Promise<boolean>;
}

181
node_modules/esptool-js/lib/targets/esp32p4.js generated vendored Normal file
View File

@@ -0,0 +1,181 @@
import { ESP32ROM } from "./esp32.js";
export class ESP32P4ROM extends ESP32ROM {
constructor() {
super(...arguments);
this.CHIP_NAME = "ESP32-P4";
this.IMAGE_CHIP_ID = 18;
this.IROM_MAP_START = 0x40000000;
this.IROM_MAP_END = 0x4c000000;
this.DROM_MAP_START = 0x40000000;
this.DROM_MAP_END = 0x4c000000;
this.BOOTLOADER_FLASH_OFFSET = 0x2000; // First 2 sectors are reserved for FE purposes
this.CHIP_DETECT_MAGIC_VALUE = [0x0, 0x0addbad0];
this.UART_DATE_REG_ADDR = 0x500ca000 + 0x8c;
this.EFUSE_BASE = 0x5012d000;
this.EFUSE_BLOCK1_ADDR = this.EFUSE_BASE + 0x044;
this.MAC_EFUSE_REG = this.EFUSE_BASE + 0x044;
this.SPI_REG_BASE = 0x5008d000; // SPIMEM1
this.SPI_USR_OFFS = 0x18;
this.SPI_USR1_OFFS = 0x1c;
this.SPI_USR2_OFFS = 0x20;
this.SPI_MOSI_DLEN_OFFS = 0x24;
this.SPI_MISO_DLEN_OFFS = 0x28;
this.SPI_W0_OFFS = 0x58;
this.EFUSE_RD_REG_BASE = this.EFUSE_BASE + 0x030; // BLOCK0 read base address
this.EFUSE_PURPOSE_KEY0_REG = this.EFUSE_BASE + 0x34;
this.EFUSE_PURPOSE_KEY0_SHIFT = 24;
this.EFUSE_PURPOSE_KEY1_REG = this.EFUSE_BASE + 0x34;
this.EFUSE_PURPOSE_KEY1_SHIFT = 28;
this.EFUSE_PURPOSE_KEY2_REG = this.EFUSE_BASE + 0x38;
this.EFUSE_PURPOSE_KEY2_SHIFT = 0;
this.EFUSE_PURPOSE_KEY3_REG = this.EFUSE_BASE + 0x38;
this.EFUSE_PURPOSE_KEY3_SHIFT = 4;
this.EFUSE_PURPOSE_KEY4_REG = this.EFUSE_BASE + 0x38;
this.EFUSE_PURPOSE_KEY4_SHIFT = 8;
this.EFUSE_PURPOSE_KEY5_REG = this.EFUSE_BASE + 0x38;
this.EFUSE_PURPOSE_KEY5_SHIFT = 12;
this.EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT_REG = this.EFUSE_RD_REG_BASE;
this.EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT = 1 << 20;
this.EFUSE_SPI_BOOT_CRYPT_CNT_REG = this.EFUSE_BASE + 0x034;
this.EFUSE_SPI_BOOT_CRYPT_CNT_MASK = 0x7 << 18;
this.EFUSE_SECURE_BOOT_EN_REG = this.EFUSE_BASE + 0x038;
this.EFUSE_SECURE_BOOT_EN_MASK = 1 << 20;
this.PURPOSE_VAL_XTS_AES256_KEY_1 = 2;
this.PURPOSE_VAL_XTS_AES256_KEY_2 = 3;
this.PURPOSE_VAL_XTS_AES128_KEY = 4;
this.SUPPORTS_ENCRYPTED_FLASH = true;
this.FLASH_ENCRYPTED_WRITE_ALIGN = 16;
this.MEMORY_MAP = [
[0x00000000, 0x00010000, "PADDING"],
[0x40000000, 0x4c000000, "DROM"],
[0x4ff00000, 0x4ffa0000, "DRAM"],
[0x4ff00000, 0x4ffa0000, "BYTE_ACCESSIBLE"],
[0x4fc00000, 0x4fc20000, "DROM_MASK"],
[0x4fc00000, 0x4fc20000, "IROM_MASK"],
[0x40000000, 0x4c000000, "IROM"],
[0x4ff00000, 0x4ffa0000, "IRAM"],
[0x50108000, 0x50110000, "RTC_IRAM"],
[0x50108000, 0x50110000, "RTC_DRAM"],
[0x600fe000, 0x60100000, "MEM_INTERNAL2"],
];
this.UF2_FAMILY_ID = 0x3d308e94;
this.EFUSE_MAX_KEY = 5;
this.KEY_PURPOSES = {
0: "USER/EMPTY",
1: "ECDSA_KEY",
2: "XTS_AES_256_KEY_1",
3: "XTS_AES_256_KEY_2",
4: "XTS_AES_128_KEY",
5: "HMAC_DOWN_ALL",
6: "HMAC_DOWN_JTAG",
7: "HMAC_DOWN_DIGITAL_SIGNATURE",
8: "HMAC_UP",
9: "SECURE_BOOT_DIGEST0",
10: "SECURE_BOOT_DIGEST1",
11: "SECURE_BOOT_DIGEST2",
12: "KM_INIT_KEY",
};
}
async getPkgVersion(loader) {
const numWord = 2;
const addr = this.EFUSE_BLOCK1_ADDR + 4 * numWord;
const registerValue = await loader.readReg(addr);
return (registerValue >> 27) & 0x07;
}
async getMinorChipVersion(loader) {
const numWord = 2;
const addr = this.EFUSE_BLOCK1_ADDR + 4 * numWord;
const registerValue = await loader.readReg(addr);
return (registerValue >> 0) & 0x0f;
}
async getMajorChipVersion(loader) {
const numWord = 2;
const addr = this.EFUSE_BLOCK1_ADDR + 4 * numWord;
const registerValue = await loader.readReg(addr);
return (registerValue >> 4) & 0x03;
}
async getChipDescription(loader) {
const pkgVersion = await this.getPkgVersion(loader);
const chipName = pkgVersion === 0 ? "ESP32-P4" : "unknown ESP32-P4";
const majorRev = await this.getMajorChipVersion(loader);
const minorRev = await this.getMinorChipVersion(loader);
return `${chipName} (revision v${majorRev}.${minorRev})`;
}
async getChipFeatures(loader) {
return ["High-Performance MCU"];
}
async getCrystalFreq(loader) {
return 40; // ESP32P4 XTAL is fixed to 40MHz
}
async getFlashVoltage(loader) {
return;
}
async overrideVddsdio(loader) {
loader.debug("VDD_SDIO overrides are not supported for ESP32-P4");
}
async readMac(loader) {
let mac0 = await loader.readReg(this.MAC_EFUSE_REG);
mac0 = mac0 >>> 0;
let mac1 = await loader.readReg(this.MAC_EFUSE_REG + 4);
mac1 = (mac1 >>> 0) & 0x0000ffff;
const mac = new Uint8Array(6);
mac[0] = (mac1 >> 8) & 0xff;
mac[1] = mac1 & 0xff;
mac[2] = (mac0 >> 24) & 0xff;
mac[3] = (mac0 >> 16) & 0xff;
mac[4] = (mac0 >> 8) & 0xff;
mac[5] = mac0 & 0xff;
return (this._d2h(mac[0]) +
":" +
this._d2h(mac[1]) +
":" +
this._d2h(mac[2]) +
":" +
this._d2h(mac[3]) +
":" +
this._d2h(mac[4]) +
":" +
this._d2h(mac[5]));
}
async getFlashCryptConfig(loader) {
return; // doesn't exist on ESP32-P4
}
async getSecureBootEnabled(laoder) {
const registerValue = await laoder.readReg(this.EFUSE_SECURE_BOOT_EN_REG);
return registerValue & this.EFUSE_SECURE_BOOT_EN_MASK;
}
async getKeyBlockPurpose(loader, keyBlock) {
if (keyBlock < 0 || keyBlock > this.EFUSE_MAX_KEY) {
loader.debug(`Valid key block numbers must be in range 0-${this.EFUSE_MAX_KEY}`);
return;
}
const regShiftDictionary = [
[this.EFUSE_PURPOSE_KEY0_REG, this.EFUSE_PURPOSE_KEY0_SHIFT],
[this.EFUSE_PURPOSE_KEY1_REG, this.EFUSE_PURPOSE_KEY1_SHIFT],
[this.EFUSE_PURPOSE_KEY2_REG, this.EFUSE_PURPOSE_KEY2_SHIFT],
[this.EFUSE_PURPOSE_KEY3_REG, this.EFUSE_PURPOSE_KEY3_SHIFT],
[this.EFUSE_PURPOSE_KEY4_REG, this.EFUSE_PURPOSE_KEY4_SHIFT],
[this.EFUSE_PURPOSE_KEY5_REG, this.EFUSE_PURPOSE_KEY5_SHIFT],
];
const [reg, shift] = regShiftDictionary[keyBlock];
const registerValue = await loader.readReg(reg);
return (registerValue >> shift) & 0xf;
}
async isFlashEncryptionKeyValid(loader) {
const purposes = [];
for (let i = 0; i <= this.EFUSE_MAX_KEY; i++) {
const purpose = await this.getKeyBlockPurpose(loader, i);
purposes.push(purpose);
}
const isXtsAes128Key = purposes.find((p) => p === this.PURPOSE_VAL_XTS_AES128_KEY);
if (typeof isXtsAes128Key !== undefined) {
return true;
}
const isXtsAes256Key1 = purposes.find((p) => p === this.PURPOSE_VAL_XTS_AES256_KEY_1);
const isXtsAes256Key2 = purposes.find((p) => p === this.PURPOSE_VAL_XTS_AES256_KEY_2);
if (typeof isXtsAes256Key1 !== undefined && typeof isXtsAes256Key2 !== undefined) {
return true;
}
return false;
}
}

111
node_modules/esptool-js/lib/targets/esp32s2.d.ts generated vendored Normal file
View File

@@ -0,0 +1,111 @@
import { ESPLoader } from "../esploader.js";
import { ROM } from "./rom.js";
export declare class ESP32S2ROM extends ROM {
CHIP_NAME: string;
IMAGE_CHIP_ID: number;
IROM_MAP_START: number;
IROM_MAP_END: number;
DROM_MAP_START: number;
DROM_MAP_END: number;
CHIP_DETECT_MAGIC_VALUE: number[];
SPI_REG_BASE: number;
SPI_USR_OFFS: number;
SPI_USR1_OFFS: number;
SPI_USR2_OFFS: number;
SPI_MOSI_DLEN_OFFS: number;
SPI_MISO_DLEN_OFFS: number;
SPI_W0_OFFS: number;
SPI_ADDR_REG_MSB: boolean;
MAC_EFUSE_REG: number;
UART_CLKDIV_REG: number;
SUPPORTS_ENCRYPTED_FLASH: boolean;
FLASH_ENCRYPTED_WRITE_ALIGN: number;
EFUSE_BASE: number;
EFUSE_RD_REG_BASE: number;
EFUSE_BLOCK1_ADDR: number;
EFUSE_BLOCK2_ADDR: number;
EFUSE_PURPOSE_KEY0_REG: number;
EFUSE_PURPOSE_KEY0_SHIFT: number;
EFUSE_PURPOSE_KEY1_REG: number;
EFUSE_PURPOSE_KEY1_SHIFT: number;
EFUSE_PURPOSE_KEY2_REG: number;
EFUSE_PURPOSE_KEY2_SHIFT: number;
EFUSE_PURPOSE_KEY3_REG: number;
EFUSE_PURPOSE_KEY3_SHIFT: number;
EFUSE_PURPOSE_KEY4_REG: number;
EFUSE_PURPOSE_KEY4_SHIFT: number;
EFUSE_PURPOSE_KEY5_REG: number;
EFUSE_PURPOSE_KEY5_SHIFT: number;
EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT_REG: number;
EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT: number;
EFUSE_SPI_BOOT_CRYPT_CNT_REG: number;
EFUSE_SPI_BOOT_CRYPT_CNT_MASK: number;
EFUSE_SECURE_BOOT_EN_REG: number;
EFUSE_SECURE_BOOT_EN_MASK: number;
EFUSE_RD_REPEAT_DATA3_REG: number;
EFUSE_RD_REPEAT_DATA3_REG_FLASH_TYPE_MASK: number;
PURPOSE_VAL_XTS_AES256_KEY_1: number;
PURPOSE_VAL_XTS_AES256_KEY_2: number;
PURPOSE_VAL_XTS_AES128_KEY: number;
UARTDEV_BUF_NO: number;
UARTDEV_BUF_NO_USB_OTG: number;
USB_RAM_BLOCK: number;
GPIO_STRAP_REG: number;
GPIO_STRAP_SPI_BOOT_MASK: number;
GPIO_STRAP_VDDSPI_MASK: number;
RTC_CNTL_OPTION1_REG: number;
RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK: number;
RTCCNTL_BASE_REG: number;
RTC_CNTL_WDTCONFIG0_REG: number;
RTC_CNTL_WDTCONFIG1_REG: number;
RTC_CNTL_WDTWPROTECT_REG: number;
RTC_CNTL_WDT_WKEY: number;
MEMORY_MAP: (string | number)[][];
EFUSE_VDD_SPI_REG: number;
VDD_SPI_XPD: number;
VDD_SPI_TIEH: number;
VDD_SPI_FORCE: number;
UF2_FAMILY_ID: number;
EFUSE_MAX_KEY: number;
KEY_PURPOSES: {
0: string;
1: string;
2: string;
3: string;
4: string;
5: string;
6: string;
7: string;
8: string;
9: string;
10: string;
11: string;
};
UART_CLKDIV_MASK: number;
UART_DATE_REG_ADDR: number;
FLASH_WRITE_SIZE: number;
BOOTLOADER_FLASH_OFFSET: number;
FLASH_SIZES: {
"1MB": number;
"2MB": number;
"4MB": number;
"8MB": number;
"16MB": number;
};
getPkgVersion(loader: ESPLoader): Promise<number>;
getMinorChipVersion(loader: ESPLoader): Promise<number>;
getMajorChipVersion(loader: ESPLoader): Promise<number>;
getFlashVersion(loader: ESPLoader): Promise<number>;
getChipDescription(loader: ESPLoader): Promise<string>;
getFlashCap(loader: ESPLoader): Promise<number>;
getPsramVersion(loader: ESPLoader): Promise<number>;
getPsramCap(loader: ESPLoader): Promise<number>;
getBlock2Version(loader: ESPLoader): Promise<number>;
getChipFeatures(loader: ESPLoader): Promise<string[]>;
getCrystalFreq(loader: ESPLoader): Promise<number>;
_d2h(d: number): string;
readMac(loader: ESPLoader): Promise<string>;
getEraseSize(offset: number, size: number): number;
usingUsbOtg(loader: ESPLoader): Promise<boolean>;
postConnect(loader: ESPLoader): Promise<void>;
}

239
node_modules/esptool-js/lib/targets/esp32s2.js generated vendored Normal file
View File

@@ -0,0 +1,239 @@
import { ROM } from "./rom.js";
export class ESP32S2ROM extends ROM {
constructor() {
super(...arguments);
this.CHIP_NAME = "ESP32-S2";
this.IMAGE_CHIP_ID = 2;
this.IROM_MAP_START = 0x40080000;
this.IROM_MAP_END = 0x40b80000;
this.DROM_MAP_START = 0x3f000000;
this.DROM_MAP_END = 0x3f3f0000;
this.CHIP_DETECT_MAGIC_VALUE = [0x000007c6];
this.SPI_REG_BASE = 0x3f402000;
this.SPI_USR_OFFS = 0x18;
this.SPI_USR1_OFFS = 0x1c;
this.SPI_USR2_OFFS = 0x20;
this.SPI_MOSI_DLEN_OFFS = 0x24;
this.SPI_MISO_DLEN_OFFS = 0x28;
this.SPI_W0_OFFS = 0x58;
this.SPI_ADDR_REG_MSB = false;
this.MAC_EFUSE_REG = 0x3f41a044; // ESP32-S2 has special block for MAC efuses
this.UART_CLKDIV_REG = 0x3f400014;
this.SUPPORTS_ENCRYPTED_FLASH = true;
this.FLASH_ENCRYPTED_WRITE_ALIGN = 16;
// todo: use espefuse APIs to get this info
this.EFUSE_BASE = 0x3f41a000;
this.EFUSE_RD_REG_BASE = this.EFUSE_BASE + 0x030; // BLOCK0 read base address
this.EFUSE_BLOCK1_ADDR = this.EFUSE_BASE + 0x044;
this.EFUSE_BLOCK2_ADDR = this.EFUSE_BASE + 0x05c;
this.EFUSE_PURPOSE_KEY0_REG = this.EFUSE_BASE + 0x34;
this.EFUSE_PURPOSE_KEY0_SHIFT = 24;
this.EFUSE_PURPOSE_KEY1_REG = this.EFUSE_BASE + 0x34;
this.EFUSE_PURPOSE_KEY1_SHIFT = 28;
this.EFUSE_PURPOSE_KEY2_REG = this.EFUSE_BASE + 0x38;
this.EFUSE_PURPOSE_KEY2_SHIFT = 0;
this.EFUSE_PURPOSE_KEY3_REG = this.EFUSE_BASE + 0x38;
this.EFUSE_PURPOSE_KEY3_SHIFT = 4;
this.EFUSE_PURPOSE_KEY4_REG = this.EFUSE_BASE + 0x38;
this.EFUSE_PURPOSE_KEY4_SHIFT = 8;
this.EFUSE_PURPOSE_KEY5_REG = this.EFUSE_BASE + 0x38;
this.EFUSE_PURPOSE_KEY5_SHIFT = 12;
this.EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT_REG = this.EFUSE_RD_REG_BASE;
this.EFUSE_DIS_DOWNLOAD_MANUAL_ENCRYPT = 1 << 19;
this.EFUSE_SPI_BOOT_CRYPT_CNT_REG = this.EFUSE_BASE + 0x034;
this.EFUSE_SPI_BOOT_CRYPT_CNT_MASK = 0x7 << 18;
this.EFUSE_SECURE_BOOT_EN_REG = this.EFUSE_BASE + 0x038;
this.EFUSE_SECURE_BOOT_EN_MASK = 1 << 20;
this.EFUSE_RD_REPEAT_DATA3_REG = this.EFUSE_BASE + 0x3c;
this.EFUSE_RD_REPEAT_DATA3_REG_FLASH_TYPE_MASK = 1 << 9;
this.PURPOSE_VAL_XTS_AES256_KEY_1 = 2;
this.PURPOSE_VAL_XTS_AES256_KEY_2 = 3;
this.PURPOSE_VAL_XTS_AES128_KEY = 4;
this.UARTDEV_BUF_NO = 0x3ffffd14; // Variable in ROM .bss which indicates the port in use
this.UARTDEV_BUF_NO_USB_OTG = 2; // Value of the above indicating that USB-OTG is in use
this.USB_RAM_BLOCK = 0x800; // Max block size USB-OTG is used
this.GPIO_STRAP_REG = 0x3f404038;
this.GPIO_STRAP_SPI_BOOT_MASK = 1 << 3; // Not download mode
this.GPIO_STRAP_VDDSPI_MASK = 1 << 4;
this.RTC_CNTL_OPTION1_REG = 0x3f408128;
this.RTC_CNTL_FORCE_DOWNLOAD_BOOT_MASK = 0x1; // Is download mode forced over USB?
this.RTCCNTL_BASE_REG = 0x3f408000;
this.RTC_CNTL_WDTCONFIG0_REG = this.RTCCNTL_BASE_REG + 0x0094;
this.RTC_CNTL_WDTCONFIG1_REG = this.RTCCNTL_BASE_REG + 0x0098;
this.RTC_CNTL_WDTWPROTECT_REG = this.RTCCNTL_BASE_REG + 0x00ac;
this.RTC_CNTL_WDT_WKEY = 0x50d83aa1;
this.MEMORY_MAP = [
[0x00000000, 0x00010000, "PADDING"],
[0x3f000000, 0x3ff80000, "DROM"],
[0x3f500000, 0x3ff80000, "EXTRAM_DATA"],
[0x3ff9e000, 0x3ffa0000, "RTC_DRAM"],
[0x3ff9e000, 0x40000000, "BYTE_ACCESSIBLE"],
[0x3ff9e000, 0x40072000, "MEM_INTERNAL"],
[0x3ffb0000, 0x40000000, "DRAM"],
[0x40000000, 0x4001a100, "IROM_MASK"],
[0x40020000, 0x40070000, "IRAM"],
[0x40070000, 0x40072000, "RTC_IRAM"],
[0x40080000, 0x40800000, "IROM"],
[0x50000000, 0x50002000, "RTC_DATA"],
];
this.EFUSE_VDD_SPI_REG = this.EFUSE_BASE + 0x34;
this.VDD_SPI_XPD = 1 << 4;
this.VDD_SPI_TIEH = 1 << 5;
this.VDD_SPI_FORCE = 1 << 6;
this.UF2_FAMILY_ID = 0xbfdd4eee;
this.EFUSE_MAX_KEY = 5;
this.KEY_PURPOSES = {
0: "USER/EMPTY",
1: "RESERVED",
2: "XTS_AES_256_KEY_1",
3: "XTS_AES_256_KEY_2",
4: "XTS_AES_128_KEY",
5: "HMAC_DOWN_ALL",
6: "HMAC_DOWN_JTAG",
7: "HMAC_DOWN_DIGITAL_SIGNATURE",
8: "HMAC_UP",
9: "SECURE_BOOT_DIGEST0",
10: "SECURE_BOOT_DIGEST1",
11: "SECURE_BOOT_DIGEST2",
};
this.UART_CLKDIV_MASK = 0xfffff;
this.UART_DATE_REG_ADDR = 0x60000078;
this.FLASH_WRITE_SIZE = 0x400;
this.BOOTLOADER_FLASH_OFFSET = 0x1000;
this.FLASH_SIZES = {
"1MB": 0x00,
"2MB": 0x10,
"4MB": 0x20,
"8MB": 0x30,
"16MB": 0x40,
};
}
async getPkgVersion(loader) {
const numWord = 4;
const addr = this.EFUSE_BLOCK1_ADDR + 4 * numWord;
const word = await loader.readReg(addr);
const pkgVersion = (word >> 0) & 0x0f;
return pkgVersion;
}
async getMinorChipVersion(loader) {
const hiNumWord = 3;
const hi = ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * hiNumWord)) >> 20) & 0x01;
const lowNumWord = 4;
const low = ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * lowNumWord)) >> 4) & 0x07;
return (hi << 3) + low;
}
async getMajorChipVersion(loader) {
const numWord = 3;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 18) & 0x03;
}
async getFlashVersion(loader) {
const numWord = 3;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 21) & 0x0f;
}
async getChipDescription(loader) {
const chipDesc = {
0: "ESP32-S2",
1: "ESP32-S2FH2",
2: "ESP32-S2FH4",
102: "ESP32-S2FNR2",
100: "ESP32-S2R2",
};
const chipIndex = (await this.getFlashCap(loader)) + (await this.getPsramCap(loader)) * 100;
const majorRev = await this.getMajorChipVersion(loader);
const minorRev = await this.getMinorChipVersion(loader);
return `${chipDesc[chipIndex] || "unknown ESP32-S2"} (revision v${majorRev}.${minorRev})`;
}
async getFlashCap(loader) {
return await this.getFlashVersion(loader);
}
async getPsramVersion(loader) {
const numWord = 3;
const addr = this.EFUSE_BLOCK1_ADDR + 4 * numWord;
const registerValue = await loader.readReg(addr);
const psramCap = (registerValue >> 28) & 0x0f;
return psramCap;
}
async getPsramCap(loader) {
return await this.getPsramVersion(loader);
}
async getBlock2Version(loader) {
const numWord = 4;
const addr = this.EFUSE_BLOCK2_ADDR + 4 * numWord;
const registerValue = await loader.readReg(addr);
const block2Ver = (registerValue >> 4) & 0x07;
return block2Ver;
}
async getChipFeatures(loader) {
const features = ["Wi-Fi"];
const flashMap = {
0: "No Embedded Flash",
1: "Embedded Flash 2MB",
2: "Embedded Flash 4MB",
};
const flashCap = await this.getFlashCap(loader);
const flashDescription = flashMap[flashCap] || "Unknown Embedded Flash";
features.push(flashDescription);
const psramMap = {
0: "No Embedded Flash",
1: "Embedded PSRAM 2MB",
2: "Embedded PSRAM 4MB",
};
const psramCap = await this.getPsramCap(loader);
const psramDescription = psramMap[psramCap] || "Unknown Embedded PSRAM";
features.push(psramDescription);
const block2VersionMap = {
0: "No calibration in BLK2 of efuse",
1: "ADC and temperature sensor calibration in BLK2 of efuse V1",
2: "ADC and temperature sensor calibration in BLK2 of efuse V2",
};
const block2Ver = await this.getBlock2Version(loader);
const block2VersionDescription = block2VersionMap[block2Ver] || "Unknown Calibration in BLK2";
features.push(block2VersionDescription);
return features;
}
async getCrystalFreq(loader) {
return 40;
}
_d2h(d) {
const h = (+d).toString(16);
return h.length === 1 ? "0" + h : h;
}
async readMac(loader) {
let mac0 = await loader.readReg(this.MAC_EFUSE_REG);
mac0 = mac0 >>> 0;
let mac1 = await loader.readReg(this.MAC_EFUSE_REG + 4);
mac1 = (mac1 >>> 0) & 0x0000ffff;
const mac = new Uint8Array(6);
mac[0] = (mac1 >> 8) & 0xff;
mac[1] = mac1 & 0xff;
mac[2] = (mac0 >> 24) & 0xff;
mac[3] = (mac0 >> 16) & 0xff;
mac[4] = (mac0 >> 8) & 0xff;
mac[5] = mac0 & 0xff;
return (this._d2h(mac[0]) +
":" +
this._d2h(mac[1]) +
":" +
this._d2h(mac[2]) +
":" +
this._d2h(mac[3]) +
":" +
this._d2h(mac[4]) +
":" +
this._d2h(mac[5]));
}
getEraseSize(offset, size) {
return size;
}
async usingUsbOtg(loader) {
const uartNo = (await loader.readReg(this.UARTDEV_BUF_NO)) & 0xff;
return uartNo === this.UARTDEV_BUF_NO_USB_OTG;
}
async postConnect(loader) {
const usingUsbOtg = await this.usingUsbOtg(loader);
loader.debug("In _post_connect using USB OTG ?" + usingUsbOtg);
if (usingUsbOtg) {
loader.ESP_RAM_BLOCK = this.USB_RAM_BLOCK;
}
}
}

51
node_modules/esptool-js/lib/targets/esp32s3.d.ts generated vendored Normal file
View File

@@ -0,0 +1,51 @@
import { ESPLoader } from "../esploader.js";
import { ROM } from "./rom.js";
export declare class ESP32S3ROM extends ROM {
CHIP_NAME: string;
IMAGE_CHIP_ID: number;
EFUSE_BASE: number;
MAC_EFUSE_REG: number;
EFUSE_BLOCK1_ADDR: number;
EFUSE_BLOCK2_ADDR: number;
UART_CLKDIV_REG: number;
UART_CLKDIV_MASK: number;
UART_DATE_REG_ADDR: number;
FLASH_WRITE_SIZE: number;
BOOTLOADER_FLASH_OFFSET: number;
FLASH_SIZES: {
"1MB": number;
"2MB": number;
"4MB": number;
"8MB": number;
"16MB": number;
};
SPI_REG_BASE: number;
SPI_USR_OFFS: number;
SPI_USR1_OFFS: number;
SPI_USR2_OFFS: number;
SPI_MOSI_DLEN_OFFS: number;
SPI_MISO_DLEN_OFFS: number;
SPI_W0_OFFS: number;
USB_RAM_BLOCK: number;
UARTDEV_BUF_NO_USB: number;
UARTDEV_BUF_NO: number;
getChipDescription(loader: ESPLoader): Promise<string>;
getPkgVersion(loader: ESPLoader): Promise<number>;
getRawMinorChipVersion(loader: ESPLoader): Promise<number>;
getMinorChipVersion(loader: ESPLoader): Promise<number>;
getRawMajorChipVersion(loader: ESPLoader): Promise<number>;
getMajorChipVersion(loader: ESPLoader): Promise<number>;
getBlkVersionMajor(loader: ESPLoader): Promise<number>;
getBlkVersionMinor(loader: ESPLoader): Promise<number>;
isEco0(loader: ESPLoader, minorRaw: number): Promise<boolean>;
getFlashCap(loader: ESPLoader): Promise<number>;
getFlashVendor(loader: ESPLoader): Promise<string>;
getPsramCap(loader: ESPLoader): Promise<number>;
getPsramVendor(loader: ESPLoader): Promise<string>;
getChipFeatures(loader: ESPLoader): Promise<string[]>;
getCrystalFreq(loader: ESPLoader): Promise<number>;
_d2h(d: number): string;
postConnect(loader: ESPLoader): Promise<void>;
readMac(loader: ESPLoader): Promise<string>;
getEraseSize(offset: number, size: number): number;
}

201
node_modules/esptool-js/lib/targets/esp32s3.js generated vendored Normal file
View File

@@ -0,0 +1,201 @@
import { ROM } from "./rom.js";
export class ESP32S3ROM extends ROM {
constructor() {
super(...arguments);
this.CHIP_NAME = "ESP32-S3";
this.IMAGE_CHIP_ID = 9;
this.EFUSE_BASE = 0x60007000;
this.MAC_EFUSE_REG = this.EFUSE_BASE + 0x044;
this.EFUSE_BLOCK1_ADDR = this.EFUSE_BASE + 0x44;
this.EFUSE_BLOCK2_ADDR = this.EFUSE_BASE + 0x5c;
this.UART_CLKDIV_REG = 0x60000014;
this.UART_CLKDIV_MASK = 0xfffff;
this.UART_DATE_REG_ADDR = 0x60000080;
this.FLASH_WRITE_SIZE = 0x400;
this.BOOTLOADER_FLASH_OFFSET = 0x0;
this.FLASH_SIZES = {
"1MB": 0x00,
"2MB": 0x10,
"4MB": 0x20,
"8MB": 0x30,
"16MB": 0x40,
};
this.SPI_REG_BASE = 0x60002000;
this.SPI_USR_OFFS = 0x18;
this.SPI_USR1_OFFS = 0x1c;
this.SPI_USR2_OFFS = 0x20;
this.SPI_MOSI_DLEN_OFFS = 0x24;
this.SPI_MISO_DLEN_OFFS = 0x28;
this.SPI_W0_OFFS = 0x58;
this.USB_RAM_BLOCK = 0x800;
this.UARTDEV_BUF_NO_USB = 3;
this.UARTDEV_BUF_NO = 0x3fcef14c;
}
async getChipDescription(loader) {
const majorRev = await this.getMajorChipVersion(loader);
const minorRev = await this.getMinorChipVersion(loader);
const pkgVersion = await this.getPkgVersion(loader);
const chipName = {
0: "ESP32-S3 (QFN56)",
1: "ESP32-S3-PICO-1 (LGA56)",
};
return `${chipName[pkgVersion] || "unknown ESP32-S3"} (revision v${majorRev}.${minorRev})`;
}
async getPkgVersion(loader) {
const numWord = 3;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 21) & 0x07;
}
async getRawMinorChipVersion(loader) {
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;
}
async getMinorChipVersion(loader) {
const minorRaw = await this.getRawMinorChipVersion(loader);
if (await this.isEco0(loader, minorRaw)) {
return 0;
}
return this.getRawMinorChipVersion(loader);
}
async getRawMajorChipVersion(loader) {
const numWord = 5;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 24) & 0x03;
}
async getMajorChipVersion(loader) {
const minorRaw = await this.getRawMinorChipVersion(loader);
if (await this.isEco0(loader, minorRaw)) {
return 0;
}
return this.getRawMajorChipVersion(loader);
}
async getBlkVersionMajor(loader) {
const numWord = 4;
return ((await loader.readReg(this.EFUSE_BLOCK2_ADDR + 4 * numWord)) >> 0) & 0x03;
}
async getBlkVersionMinor(loader) {
const numWord = 3;
return ((await loader.readReg(this.EFUSE_BLOCK1_ADDR + 4 * numWord)) >> 24) & 0x07;
}
async isEco0(loader, minorRaw) {
// Workaround: The major version field was allocated to other purposes
// when block version is v1.1.
// Luckily only chip v0.0 have this kind of block version and efuse usage.
return ((minorRaw & 0x7) === 0 &&
(await this.getBlkVersionMajor(loader)) === 1 &&
(await this.getBlkVersionMinor(loader)) === 1);
}
async getFlashCap(loader) {
const numWord = 3;
const block1Addr = this.EFUSE_BASE + 0x044;
const addr = block1Addr + 4 * numWord;
const registerValue = await loader.readReg(addr);
const flashCap = (registerValue >> 27) & 0x07;
return flashCap;
}
async getFlashVendor(loader) {
const numWord = 4;
const block1Addr = this.EFUSE_BASE + 0x044;
const addr = block1Addr + 4 * numWord;
const registerValue = await loader.readReg(addr);
const vendorId = (registerValue >> 0) & 0x07;
const vendorMap = {
1: "XMC",
2: "GD",
3: "FM",
4: "TT",
5: "BY",
};
return vendorMap[vendorId] || "";
}
async getPsramCap(loader) {
const numWord = 4;
const block1Addr = this.EFUSE_BASE + 0x044;
const addr = block1Addr + 4 * numWord;
const registerValue = await loader.readReg(addr);
const psramCap = (registerValue >> 3) & 0x03;
return psramCap;
}
async getPsramVendor(loader) {
const numWord = 4;
const block1Addr = this.EFUSE_BASE + 0x044;
const addr = block1Addr + 4 * numWord;
const registerValue = await loader.readReg(addr);
const vendorId = (registerValue >> 7) & 0x03;
const vendorMap = {
1: "AP_3v3",
2: "AP_1v8",
};
return vendorMap[vendorId] || "";
}
async getChipFeatures(loader) {
const features = ["Wi-Fi", "BLE"];
const flashMap = {
0: null,
1: "Embedded Flash 8MB",
2: "Embedded Flash 4MB",
};
const flashCap = await this.getFlashCap(loader);
const flashVendor = await this.getFlashVendor(loader);
const flash = flashMap[flashCap];
const flashDescription = flash !== undefined ? flash : "Unknown Embedded Flash";
if (flash !== null) {
features.push(`${flashDescription} (${flashVendor})`);
}
const psramMap = {
0: null,
1: "Embedded PSRAM 8MB",
2: "Embedded PSRAM 2MB",
};
const psramCap = await this.getPsramCap(loader);
const psramVendor = await this.getPsramVendor(loader);
const psram = psramMap[psramCap];
const psramDescription = psram !== undefined ? psram : "Unknown Embedded PSRAM";
if (psram !== null) {
features.push(`${psramDescription} (${psramVendor})`);
}
return features;
}
async getCrystalFreq(loader) {
return 40;
}
_d2h(d) {
const h = (+d).toString(16);
return h.length === 1 ? "0" + h : h;
}
async postConnect(loader) {
const bufNo = (await loader.readReg(this.UARTDEV_BUF_NO)) & 0xff;
loader.debug("In _post_connect " + bufNo);
if (bufNo == this.UARTDEV_BUF_NO_USB) {
loader.ESP_RAM_BLOCK = this.USB_RAM_BLOCK;
}
}
async readMac(loader) {
let mac0 = await loader.readReg(this.MAC_EFUSE_REG);
mac0 = mac0 >>> 0;
let mac1 = await loader.readReg(this.MAC_EFUSE_REG + 4);
mac1 = (mac1 >>> 0) & 0x0000ffff;
const mac = new Uint8Array(6);
mac[0] = (mac1 >> 8) & 0xff;
mac[1] = mac1 & 0xff;
mac[2] = (mac0 >> 24) & 0xff;
mac[3] = (mac0 >> 16) & 0xff;
mac[4] = (mac0 >> 8) & 0xff;
mac[5] = mac0 & 0xff;
return (this._d2h(mac[0]) +
":" +
this._d2h(mac[1]) +
":" +
this._d2h(mac[2]) +
":" +
this._d2h(mac[3]) +
":" +
this._d2h(mac[4]) +
":" +
this._d2h(mac[5]));
}
getEraseSize(offset, size) {
return size;
}
}

38
node_modules/esptool-js/lib/targets/esp8266.d.ts generated vendored Normal file
View File

@@ -0,0 +1,38 @@
import { ESPLoader } from "../esploader.js";
import { ROM } from "./rom.js";
export declare class ESP8266ROM extends ROM {
CHIP_NAME: string;
CHIP_DETECT_MAGIC_VALUE: number[];
EFUSE_RD_REG_BASE: number;
UART_CLKDIV_REG: number;
UART_CLKDIV_MASK: number;
XTAL_CLK_DIVIDER: number;
FLASH_WRITE_SIZE: number;
BOOTLOADER_FLASH_OFFSET: number;
UART_DATE_REG_ADDR: number;
FLASH_SIZES: {
"512KB": number;
"256KB": number;
"1MB": number;
"2MB": number;
"4MB": number;
"2MB-c1": number;
"4MB-c1": number;
"8MB": number;
"16MB": number;
};
SPI_REG_BASE: number;
SPI_USR_OFFS: number;
SPI_USR1_OFFS: number;
SPI_USR2_OFFS: number;
SPI_MOSI_DLEN_OFFS: number;
SPI_MISO_DLEN_OFFS: number;
SPI_W0_OFFS: number;
readEfuse(loader: ESPLoader, offset: number): Promise<number>;
getChipDescription(loader: ESPLoader): Promise<"ESP8285" | "ESP8266EX">;
getChipFeatures: (loader: ESPLoader) => Promise<string[]>;
getCrystalFreq(loader: ESPLoader): Promise<number>;
_d2h(d: number): string;
readMac(loader: ESPLoader): Promise<string>;
getEraseSize(offset: number, size: number): number;
}

118
node_modules/esptool-js/lib/targets/esp8266.js generated vendored Normal file
View File

@@ -0,0 +1,118 @@
import { ROM } from "./rom.js";
export class ESP8266ROM extends ROM {
constructor() {
super(...arguments);
this.CHIP_NAME = "ESP8266";
this.CHIP_DETECT_MAGIC_VALUE = [0xfff0c101];
this.EFUSE_RD_REG_BASE = 0x3ff00050;
this.UART_CLKDIV_REG = 0x60000014;
this.UART_CLKDIV_MASK = 0xfffff;
this.XTAL_CLK_DIVIDER = 2;
this.FLASH_WRITE_SIZE = 0x4000;
// NOT IMPLEMENTED, SETTING EMPTY VALUE
this.BOOTLOADER_FLASH_OFFSET = 0;
this.UART_DATE_REG_ADDR = 0;
this.FLASH_SIZES = {
"512KB": 0x00,
"256KB": 0x10,
"1MB": 0x20,
"2MB": 0x30,
"4MB": 0x40,
"2MB-c1": 0x50,
"4MB-c1": 0x60,
"8MB": 0x80,
"16MB": 0x90,
};
this.SPI_REG_BASE = 0x60000200;
this.SPI_USR_OFFS = 0x1c;
this.SPI_USR1_OFFS = 0x20;
this.SPI_USR2_OFFS = 0x24;
this.SPI_MOSI_DLEN_OFFS = 0; // not in esp8266
this.SPI_MISO_DLEN_OFFS = 0; // not in esp8266
this.SPI_W0_OFFS = 0x40;
this.getChipFeatures = async (loader) => {
const features = ["WiFi"];
if ((await this.getChipDescription(loader)) == "ESP8285")
features.push("Embedded Flash");
return features;
};
}
async readEfuse(loader, offset) {
const addr = this.EFUSE_RD_REG_BASE + 4 * offset;
loader.debug("Read efuse " + addr);
return await loader.readReg(addr);
}
async getChipDescription(loader) {
const efuse3 = await this.readEfuse(loader, 2);
const efuse0 = await this.readEfuse(loader, 0);
const is8285 = ((efuse0 & (1 << 4)) | (efuse3 & (1 << 16))) != 0; // One or the other efuse bit is set for ESP8285
return is8285 ? "ESP8285" : "ESP8266EX";
}
async getCrystalFreq(loader) {
const uartDiv = (await loader.readReg(this.UART_CLKDIV_REG)) & this.UART_CLKDIV_MASK;
const etsXtal = (loader.transport.baudrate * uartDiv) / 1000000 / this.XTAL_CLK_DIVIDER;
let normXtal;
if (etsXtal > 33) {
normXtal = 40;
}
else {
normXtal = 26;
}
if (Math.abs(normXtal - etsXtal) > 1) {
loader.info("WARNING: Detected crystal freq " +
etsXtal +
"MHz is quite different to normalized freq " +
normXtal +
"MHz. Unsupported crystal in use?");
}
return normXtal;
}
_d2h(d) {
const h = (+d).toString(16);
return h.length === 1 ? "0" + h : h;
}
async readMac(loader) {
let mac0 = await this.readEfuse(loader, 0);
mac0 = mac0 >>> 0;
let mac1 = await this.readEfuse(loader, 1);
mac1 = mac1 >>> 0;
let mac3 = await this.readEfuse(loader, 3);
mac3 = mac3 >>> 0;
const mac = new Uint8Array(6);
if (mac3 != 0) {
mac[0] = (mac3 >> 16) & 0xff;
mac[1] = (mac3 >> 8) & 0xff;
mac[2] = mac3 & 0xff;
}
else if (((mac1 >> 16) & 0xff) == 0) {
mac[0] = 0x18;
mac[1] = 0xfe;
mac[2] = 0x34;
}
else if (((mac1 >> 16) & 0xff) == 1) {
mac[0] = 0xac;
mac[1] = 0xd0;
mac[2] = 0x74;
}
else {
loader.error("Unknown OUI");
}
mac[3] = (mac1 >> 8) & 0xff;
mac[4] = mac1 & 0xff;
mac[5] = (mac0 >> 24) & 0xff;
return (this._d2h(mac[0]) +
":" +
this._d2h(mac[1]) +
":" +
this._d2h(mac[2]) +
":" +
this._d2h(mac[3]) +
":" +
this._d2h(mac[4]) +
":" +
this._d2h(mac[5]));
}
getEraseSize(offset, size) {
return size;
}
}

83
node_modules/esptool-js/lib/targets/rom.d.ts generated vendored Normal file
View File

@@ -0,0 +1,83 @@
import { ESPLoader } from "../esploader.js";
/**
* Represents a chip ROM with basic registers field and abstract functions.
*/
export declare abstract class ROM {
/**
* Read ESP32 eFuse.
* @param {ESPLoader} loader - Loader class to communicate with chip.
* @param {number} offset - Offset to start erase.
* @returns {number} The eFuse number.
*/
protected readEfuse?(loader: ESPLoader, offset: number): Promise<number>;
/**
* Get the package version number.
* @param {ESPLoader} loader - Loader class to communicate with chip.
* @returns {number} The package version number.
*/
protected getPkgVersion?(loader: ESPLoader): Promise<number>;
/**
* Get the chip revision number.
* @param {ESPLoader} loader - Loader class to communicate with chip.
* @returns {number} The chip revision number.
*/
protected getChipRevision?(loader: ESPLoader): Promise<number>;
/**
* Get the chip description.
* @param {ESPLoader} loader - Loader class to communicate with chip.
* @returns {string} The chip description as string.
*/
abstract getChipDescription(loader: ESPLoader): Promise<string>;
/**
* Get the chip features.
* @param {ESPLoader} loader - Loader class to communicate with chip.
* @returns {string} The chip features as string.
*/
abstract getChipFeatures(loader: ESPLoader): Promise<string[]>;
/**
* Get the crystal frequency for the chip.
* @param {ESPLoader} loader - Loader class to communicate with chip.
* @returns {string} The crystal frequency as number.
*/
abstract getCrystalFreq(loader: ESPLoader): Promise<number>;
/**
* Convert a number to hex string.
* @param {number} d - Number to convert to hex string.
* @returns {string} The hex string.
*/
abstract _d2h(d: number): string;
/**
* Get the chip mac address.
* @param {ESPLoader} loader - Loader class to communicate with chip.
* @returns {string} The mac address string.
*/
abstract readMac(loader: ESPLoader): Promise<string>;
/**
* Function to be executed after chip connection
* @param {ESPLoader} loader - Loader class to communicate with chip.
*/
postConnect?(loader: ESPLoader): Promise<void>;
/**
* Get the chip erase size.
* @param {number} offset - Offset to start erase.
* @param {number} size - Size to erase.
* @returns {number} The erase size of the chip as number.
*/
getEraseSize(offset: number, size: number): number;
abstract FLASH_SIZES: {
[key: string]: number;
};
abstract BOOTLOADER_FLASH_OFFSET: number;
abstract CHIP_NAME: string;
abstract FLASH_WRITE_SIZE: number;
abstract SPI_MOSI_DLEN_OFFS: number;
abstract SPI_MISO_DLEN_OFFS: number;
abstract SPI_REG_BASE: number;
abstract SPI_USR_OFFS: number;
abstract SPI_USR1_OFFS: number;
abstract SPI_USR2_OFFS: number;
abstract SPI_W0_OFFS: number;
abstract UART_CLKDIV_MASK: number;
abstract UART_CLKDIV_REG: number;
abstract UART_DATE_REG_ADDR: number;
}

14
node_modules/esptool-js/lib/targets/rom.js generated vendored Normal file
View File

@@ -0,0 +1,14 @@
/**
* Represents a chip ROM with basic registers field and abstract functions.
*/
export class ROM {
/**
* Get the chip erase size.
* @param {number} offset - Offset to start erase.
* @param {number} size - Size to erase.
* @returns {number} The erase size of the chip as number.
*/
getEraseSize(offset, size) {
return size;
}
}

View File

@@ -0,0 +1,8 @@
{
"entry": 1074521580,
"text": "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",
"text_start": 1074520064,
"data": "DMD8P+znC0B/6AtAZ+0LQAbpC0Cf6AtABukLQGXpC0CC6gtA9OoLQJ3qC0CV5wtAGuoLQHTqC0CI6QtAGOsLQLDpC0AY6wtAbegLQMroC0AG6QtAZekLQIXoC0DI6wtAKe0LQLjmC0BL7QtAuOYLQLjmC0C45gtAuOYLQLjmC0C45gtAuOYLQLjmC0Bv6wtAuOYLQEnsC0Ap7QtA",
"data_start": 1073605544,
"bss_start": 1073528832
}

View File

@@ -0,0 +1,8 @@
{
"entry": 1077413304,
"text": "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",
"text_start": 1077411840,
"data": "DEDKP+AIOEAsCThAhAk4QFIKOEC+CjhAbAo4QKgHOEAOCjhATgo4QJgJOEBYBzhAzAk4QFgHOEC6CDhA/gg4QCwJOECECThAzAg4QBIIOEBCCDhAyAg4QBYNOEAsCThA1gs4QMoMOECkBjhA9Aw4QKQGOECkBjhApAY4QKQGOECkBjhApAY4QKQGOECkBjhAcgs4QKQGOEDyCzhAygw4QA==",
"data_start": 1070295976,
"bss_start": 1070219264
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,8 @@
{
"entry": 1341195918,
"text": "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",
"text_start": 1341194240,
"data": "EAD1TwYK8U9WCvFPrgrxT4QL8U/wC/FPngvxT9QI8U9AC/FPgAvxT8IK8U+ECPFP9grxT4QI8U/gCfFPJgrxT1YK8U+uCvFP8gnxTzgJ8U9oCfFP7gnxT0AO8U9WCvFPCA3xTwAO8U/EB/FPJA7xT8QH8U/EB/FPxAfxT8QH8U/EB/FPxAfxT8QH8U/EB/FPpAzxT8QH8U8mDfFPAA7xTw==",
"data_start": 1341533100,
"bss_start": 1341456384
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

11
node_modules/esptool-js/lib/types/error.d.ts generated vendored Normal file
View File

@@ -0,0 +1,11 @@
/**
* Represents a Espressif chip error.
*/
declare class ESPError extends Error {
}
/**
* Represents a Espressif timeout chip error.
*/
declare class TimeoutError extends ESPError {
}
export { ESPError, TimeoutError };

11
node_modules/esptool-js/lib/types/error.js generated vendored Normal file
View File

@@ -0,0 +1,11 @@
/**
* Represents a Espressif chip error.
*/
class ESPError extends Error {
}
/**
* Represents a Espressif timeout chip error.
*/
class TimeoutError extends ESPError {
}
export { ESPError, TimeoutError };

49
node_modules/esptool-js/lib/types/flashOptions.d.ts generated vendored Normal file
View File

@@ -0,0 +1,49 @@
/**
* Options for flashing a device with firmware.
* @interface FlashOptions
*/
export interface FlashOptions {
/**
* An array of file objects representing the data to be flashed.
* @type {Array<{ data: string; address: number }>}
*/
fileArray: {
data: string;
address: number;
}[];
/**
* The size of the flash memory to be used.
* @type {string}
*/
flashSize: string;
/**
* The flash mode to be used (e.g., QIO, QOUT, DIO, DOUT).
* @type {string}
*/
flashMode: string;
/**
* The flash frequency to be used (e.g., 40MHz, 80MHz).
* @type {string}
*/
flashFreq: string;
/**
* Flag indicating whether to erase all existing data in the flash memory before flashing.
* @type {boolean}
*/
eraseAll: boolean;
/**
* Flag indicating whether to compress the data before flashing.
* @type {boolean}
*/
compress: boolean;
/**
* A function to report the progress of the flashing operation (optional).
* @type {(fileIndex: number, written: number, total: number) => void}
*/
reportProgress?: (fileIndex: number, written: number, total: number) => void;
/**
* A function to calculate the MD5 hash of the firmware image (optional).
* @type {(image: string) => string}
*/
calculateMD5Hash?: (image: string) => string;
}

1
node_modules/esptool-js/lib/types/flashOptions.js generated vendored Normal file
View File

@@ -0,0 +1 @@
export {};

54
node_modules/esptool-js/lib/types/loaderOptions.d.ts generated vendored Normal file
View File

@@ -0,0 +1,54 @@
/// <reference types="w3c-web-serial" />
import { ResetConstructors } from "../reset";
import { Transport } from "../webserial";
import { IEspLoaderTerminal } from "./loaderTerminal";
/**
* Options to configure ESPLoader.
* @interface LoaderOptions
*/
export interface LoaderOptions {
/**
* The transport mechanism to communicate with the device.
* @type {Transport}
*/
transport: Transport;
/**
* The port to initialize the transport class.
* @type {SerialPort}
*/
port?: SerialPort;
/**
* Set of options for SerialPort class.
* @type {Transport}
*/
serialOptions?: SerialOptions;
/**
* The baud rate to be used for communication with the device.
* @type {number}
*/
baudrate: number;
/**
* An optional terminal interface to interact with the loader during the process.
* @type {IEspLoaderTerminal}
*/
terminal?: IEspLoaderTerminal;
/**
* The baud rate to be used during the initial ROM communication with the device.
* @type {number}
*/
romBaudrate: number;
/**
* Flag indicating whether to enable debug logging for the loader (optional).
* @type {boolean}
*/
debugLogging?: boolean;
/**
* Reset functions for connection. If undefined will use default ones.
* @type {ResetConstructors}
*/
resetConstructors?: ResetConstructors;
/**
* Indicate if trace messages should be enabled or not.
*/
enableTracing?: boolean;
}

1
node_modules/esptool-js/lib/types/loaderOptions.js generated vendored Normal file
View File

@@ -0,0 +1 @@
export {};

22
node_modules/esptool-js/lib/types/loaderTerminal.d.ts generated vendored Normal file
View File

@@ -0,0 +1,22 @@
/**
* A wrapper around your implementation of a terminal by
* implementing the clean, write and writeLine methods
* which are called by the ESPLoader class.
* @interface IEspLoaderTerminal
*/
export interface IEspLoaderTerminal {
/**
* Execute a terminal clean command.
*/
clean: () => void;
/**
* Write a string of data that include a line terminator.
* @param {string} data - The string to write with line terminator.
*/
writeLine: (data: string) => void;
/**
* Write a string of data.
* @param {string} data - The string to write.
*/
write: (data: string) => void;
}

1
node_modules/esptool-js/lib/types/loaderTerminal.js generated vendored Normal file
View File

@@ -0,0 +1 @@
export {};

8
node_modules/esptool-js/lib/types/resetModes.d.ts generated vendored Normal file
View File

@@ -0,0 +1,8 @@
/**
* Reset modes that can be used before connection to chip
*/
export declare type Before = "default_reset" | "usb_reset" | "no_reset" | "no_reset_no_sync";
/**
* Reset modes that can be used after operation is finished.
*/
export declare type After = "hard_reset" | "soft_reset" | "no_reset" | "no_reset_stub";

1
node_modules/esptool-js/lib/types/resetModes.js generated vendored Normal file
View File

@@ -0,0 +1 @@
export {};

8
node_modules/esptool-js/lib/util.d.ts generated vendored Normal file
View File

@@ -0,0 +1,8 @@
/**
* Pad to the next alignment boundary
* @param {Uint8Array} data Uint8Array data to pad
* @param {number} alignment Alignment boundary to fulfill
* @param {number} padCharacter Character to fill with
* @returns {Uint8Array} Padded UInt8Array image
*/
export declare function padTo(data: Uint8Array, alignment: number, padCharacter?: number): Uint8Array;

18
node_modules/esptool-js/lib/util.js generated vendored Normal file
View File

@@ -0,0 +1,18 @@
/**
* Pad to the next alignment boundary
* @param {Uint8Array} data Uint8Array data to pad
* @param {number} alignment Alignment boundary to fulfill
* @param {number} padCharacter Character to fill with
* @returns {Uint8Array} Padded UInt8Array image
*/
export function padTo(data, alignment, padCharacter = 0xff) {
const padMod = data.length % alignment;
if (padMod !== 0) {
const padding = new Uint8Array(alignment - padMod).fill(padCharacter);
const paddedData = new Uint8Array(data.length + padding.length);
paddedData.set(data);
paddedData.set(padding, data.length);
return paddedData;
}
return data;
}

154
node_modules/esptool-js/lib/webserial.d.ts generated vendored Normal file
View File

@@ -0,0 +1,154 @@
/// <reference types="w3c-web-serial" />
/**
* Options for device serialPort.
* @interface SerialOptions
*
* Note: According to the documentation of the Web Serial API, 'baudRate' is a
* 'required' field as part of serial options. However, we are currently
* maintaining 'baudRate' as a separate parameter outside the options
* dictionary, and it is effectively used in the code. For now, we are
* keeping it optional in the dictionary to avoid conflicts.
*/
export interface SerialOptions {
/**
* A positive, non-zero value indicating the baud rate at which serial communication should be established.
* @type {number | undefined}
*/
baudRate?: number | undefined;
/**
* The number of data bits per frame. Either 7 or 8.
* @type {number | undefined}
*/
dataBits?: number | undefined;
/**
* The number of stop bits at the end of a frame. Either 1 or 2.
* @type {number | undefined}
*/
stopBits?: number | undefined;
/**
* The parity mode: none, even or odd
* @type {ParityType | undefined}
*/
parity?: ParityType | undefined;
/**
* A positive, non-zero value indicating the size of the read and write buffers that should be created.
* @type {number | undefined}
*/
bufferSize?: number | undefined;
/**
* The flow control mode: none or hardware.
* @type {FlowControlType | undefined}
*/
flowControl?: FlowControlType | undefined;
}
/**
* Wrapper class around Webserial API to communicate with the serial device.
* @param {typeof import("w3c-web-serial").SerialPort} device - Requested device prompted by the browser.
*
* ```
* const port = await navigator.serial.requestPort();
* ```
*/
declare class Transport {
device: SerialPort;
tracing: boolean;
slipReaderEnabled: boolean;
baudrate: number;
private traceLog;
private lastTraceTime;
private reader;
private buffer;
constructor(device: SerialPort, tracing?: boolean, enableSlipReader?: boolean);
/**
* Request the serial device vendor ID and Product ID as string.
* @returns {string} Return the device VendorID and ProductID from SerialPortInfo as formatted string.
*/
getInfo(): string;
/**
* Request the serial device product id from SerialPortInfo.
* @returns {number | undefined} Return the product ID.
*/
getPid(): number | undefined;
/**
* Format received or sent data for tracing output.
* @param {string} message Message to format as trace line.
*/
trace(message: string): void;
returnTrace(): Promise<void>;
hexify(s: Uint8Array): string;
hexConvert(uint8Array: Uint8Array, autoSplit?: boolean): string;
/**
* Format data packet using the Serial Line Internet Protocol (SLIP).
* @param {Uint8Array} data Binary unsigned 8 bit array data to format.
* @returns {Uint8Array} Formatted unsigned 8 bit data array.
*/
slipWriter(data: Uint8Array): Uint8Array;
/**
* Write binary data to device using the WebSerial device writable stream.
* @param {Uint8Array} data 8 bit unsigned data array to write to device.
*/
write(data: Uint8Array): Promise<void>;
/**
* Append a buffer array after another buffer array
* @param {Uint8Array} arr1 - First array buffer.
* @param {Uint8Array} arr2 - magic hex number to select ROM.
* @returns {Uint8Array} Return a 8 bit unsigned array.
*/
appendArray(arr1: Uint8Array, arr2: Uint8Array): Uint8Array;
private readLoop;
newRead(numBytes: number, timeout: number): Promise<Uint8Array>;
flushInput(): Promise<void>;
flushOutput(): Promise<void>;
inWaiting(): number;
/**
* Detect if the data read from device is a Fatal or Guru meditation error.
* @param {Uint8Array} input Data read from device
*/
private detectPanicHandler;
private SLIP_END;
private SLIP_ESC;
private SLIP_ESC_END;
private SLIP_ESC_ESC;
/**
* Take a data array and return the first well formed packet after
* replacing the escape sequence. Reads at least 8 bytes.
* @param {number} timeout Timeout read data.
* @yields {Uint8Array} Formatted packet using SLIP escape sequences.
*/
read(timeout: number): AsyncGenerator<Uint8Array>;
/**
* Read from serial device without slip formatting.
* @yields {Uint8Array} The next number in the Fibonacci sequence.
*/
rawRead(): AsyncGenerator<Uint8Array>;
_DTR_state: boolean;
/**
* Send the RequestToSend (RTS) signal to given state
* # True for EN=LOW, chip in reset and False EN=HIGH, chip out of reset
* @param {boolean} state Boolean state to set the signal
*/
setRTS(state: boolean): Promise<void>;
/**
* Send the dataTerminalReady (DTS) signal to given state
* # True for IO0=LOW, chip in reset and False IO0=HIGH
* @param {boolean} state Boolean state to set the signal
*/
setDTR(state: boolean): Promise<void>;
/**
* Connect to serial device using the Webserial open method.
* @param {number} baud Number baud rate for serial connection. Default is 115200.
* @param {typeof import("w3c-web-serial").SerialOptions} serialOptions Serial Options for WebUSB SerialPort class.
*/
connect(baud?: number, serialOptions?: SerialOptions): Promise<void>;
sleep(ms: number): Promise<unknown>;
/**
* Wait for a given timeout ms for serial device unlock.
* @param {number} timeout Timeout time in milliseconds (ms) to sleep
*/
waitForUnlock(timeout: number): Promise<void>;
/**
* Disconnect from serial device by running SerialPort.close() after streams unlock.
*/
disconnect(): Promise<void>;
}
export { Transport };

383
node_modules/esptool-js/lib/webserial.js generated vendored Normal file
View File

@@ -0,0 +1,383 @@
/* global SerialPort, ParityType, FlowControlType */
/**
* Wrapper class around Webserial API to communicate with the serial device.
* @param {typeof import("w3c-web-serial").SerialPort} device - Requested device prompted by the browser.
*
* ```
* const port = await navigator.serial.requestPort();
* ```
*/
class Transport {
constructor(device, tracing = false, enableSlipReader = true) {
this.device = device;
this.tracing = tracing;
this.slipReaderEnabled = false;
this.baudrate = 0;
this.traceLog = "";
this.lastTraceTime = Date.now();
this.buffer = new Uint8Array(0);
this.SLIP_END = 0xc0;
this.SLIP_ESC = 0xdb;
this.SLIP_ESC_END = 0xdc;
this.SLIP_ESC_ESC = 0xdd;
this._DTR_state = false;
this.slipReaderEnabled = enableSlipReader;
}
/**
* Request the serial device vendor ID and Product ID as string.
* @returns {string} Return the device VendorID and ProductID from SerialPortInfo as formatted string.
*/
getInfo() {
const info = this.device.getInfo();
return info.usbVendorId && info.usbProductId
? `WebSerial VendorID 0x${info.usbVendorId.toString(16)} ProductID 0x${info.usbProductId.toString(16)}`
: "";
}
/**
* Request the serial device product id from SerialPortInfo.
* @returns {number | undefined} Return the product ID.
*/
getPid() {
return this.device.getInfo().usbProductId;
}
/**
* Format received or sent data for tracing output.
* @param {string} message Message to format as trace line.
*/
trace(message) {
const delta = Date.now() - this.lastTraceTime;
const prefix = `TRACE ${delta.toFixed(3)}`;
const traceMessage = `${prefix} ${message}`;
console.log(traceMessage);
this.traceLog += traceMessage + "\n";
}
async returnTrace() {
try {
await navigator.clipboard.writeText(this.traceLog);
console.log("Text copied to clipboard!");
}
catch (err) {
console.error("Failed to copy text:", err);
}
}
hexify(s) {
return Array.from(s)
.map((byte) => byte.toString(16).padStart(2, "0"))
.join("")
.padEnd(16, " ");
}
hexConvert(uint8Array, autoSplit = true) {
if (autoSplit && uint8Array.length > 16) {
let result = "";
let s = uint8Array;
while (s.length > 0) {
const line = s.slice(0, 16);
const asciiLine = String.fromCharCode(...line)
.split("")
.map((c) => (c === " " || (c >= " " && c <= "~" && c !== " ") ? c : "."))
.join("");
s = s.slice(16);
result += `\n ${this.hexify(line.slice(0, 8))} ${this.hexify(line.slice(8))} | ${asciiLine}`;
}
return result;
}
else {
return this.hexify(uint8Array);
}
}
/**
* Format data packet using the Serial Line Internet Protocol (SLIP).
* @param {Uint8Array} data Binary unsigned 8 bit array data to format.
* @returns {Uint8Array} Formatted unsigned 8 bit data array.
*/
slipWriter(data) {
const outData = [];
outData.push(0xc0);
for (let i = 0; i < data.length; i++) {
if (data[i] === 0xdb) {
outData.push(0xdb, 0xdd);
}
else if (data[i] === 0xc0) {
outData.push(0xdb, 0xdc);
}
else {
outData.push(data[i]);
}
}
outData.push(0xc0);
return new Uint8Array(outData);
}
/**
* Write binary data to device using the WebSerial device writable stream.
* @param {Uint8Array} data 8 bit unsigned data array to write to device.
*/
async write(data) {
const outData = this.slipWriter(data);
if (this.device.writable) {
const writer = this.device.writable.getWriter();
if (this.tracing) {
console.log("Write bytes");
this.trace(`Write ${outData.length} bytes: ${this.hexConvert(outData)}`);
}
await writer.write(outData);
writer.releaseLock();
}
}
/**
* Append a buffer array after another buffer array
* @param {Uint8Array} arr1 - First array buffer.
* @param {Uint8Array} arr2 - magic hex number to select ROM.
* @returns {Uint8Array} Return a 8 bit unsigned array.
*/
appendArray(arr1, arr2) {
const combined = new Uint8Array(arr1.length + arr2.length);
combined.set(arr1);
combined.set(arr2, arr1.length);
return combined;
}
// Asynchronous generator to yield incoming data chunks
async *readLoop(timeout) {
if (!this.reader)
return;
try {
while (true) {
const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error("Read timeout exceeded")), timeout));
// Await the race between the timeout and the reader read
const result = await Promise.race([this.reader.read(), timeoutPromise]);
// If a timeout occurs, result will be null; otherwise, it will have { value, done }
if (result === null)
break;
const { value, done } = result;
if (done || !value)
break;
yield value; // Yield each data chunk
}
}
catch (error) {
console.error("Error reading from serial port:", error);
}
finally {
this.buffer = new Uint8Array(0);
}
}
// Read a specific number of bytes
async newRead(numBytes, timeout) {
if (this.buffer.length >= numBytes) {
const output = this.buffer.slice(0, numBytes);
this.buffer = this.buffer.slice(numBytes); // Remove the returned data from buffer
return output;
}
while (this.buffer.length < numBytes) {
const readLoop = this.readLoop(timeout);
const { value, done } = await readLoop.next();
if (done || !value) {
break;
}
// Append the newly read data to the buffer
this.buffer = this.appendArray(this.buffer, value);
}
// Return as much data as possible
const output = this.buffer.slice(0, numBytes);
this.buffer = this.buffer.slice(numBytes);
return output;
}
async flushInput() {
var _a;
if (this.reader && !(await this.reader.closed)) {
await this.reader.cancel();
this.reader.releaseLock();
this.reader = (_a = this.device.readable) === null || _a === void 0 ? void 0 : _a.getReader();
}
}
async flushOutput() {
var _a, _b;
this.buffer = new Uint8Array(0);
await ((_a = this.device.writable) === null || _a === void 0 ? void 0 : _a.getWriter().close());
(_b = this.device.writable) === null || _b === void 0 ? void 0 : _b.getWriter().releaseLock();
}
// `inWaiting` returns the count of bytes in the buffer
inWaiting() {
return this.buffer.length;
}
/**
* Detect if the data read from device is a Fatal or Guru meditation error.
* @param {Uint8Array} input Data read from device
*/
detectPanicHandler(input) {
const guruMeditationRegex = /G?uru Meditation Error: (?:Core \d panic'ed \(([a-zA-Z ]*)\))?/;
const fatalExceptionRegex = /F?atal exception \(\d+\): (?:([a-zA-Z ]*)?.*epc)?/;
const inputString = new TextDecoder("utf-8").decode(input);
const match = inputString.match(guruMeditationRegex) || inputString.match(fatalExceptionRegex);
if (match) {
const cause = match[1] || match[2];
const msg = `Guru Meditation Error detected${cause ? ` (${cause})` : ""}`;
throw new Error(msg);
}
}
/**
* Take a data array and return the first well formed packet after
* replacing the escape sequence. Reads at least 8 bytes.
* @param {number} timeout Timeout read data.
* @yields {Uint8Array} Formatted packet using SLIP escape sequences.
*/
async *read(timeout) {
var _a;
if (!this.reader) {
this.reader = (_a = this.device.readable) === null || _a === void 0 ? void 0 : _a.getReader();
}
let partialPacket = null;
let isEscaping = false;
let successfulSlip = false;
while (true) {
const waitingBytes = this.inWaiting();
const readBytes = await this.newRead(waitingBytes > 0 ? waitingBytes : 1, timeout);
if (!readBytes || readBytes.length === 0) {
const msg = partialPacket === null
? successfulSlip
? "Serial data stream stopped: Possible serial noise or corruption."
: "No serial data received."
: `Packet content transfer stopped`;
this.trace(msg);
throw new Error(msg);
}
this.trace(`Read ${readBytes.length} bytes: ${this.hexConvert(readBytes)}`);
let i = 0; // Track position in readBytes
while (i < readBytes.length) {
const byte = readBytes[i++];
if (partialPacket === null) {
if (byte === this.SLIP_END) {
partialPacket = new Uint8Array(0); // Start of a new packet
}
else {
this.trace(`Read invalid data: ${this.hexConvert(readBytes)}`);
const remainingData = await this.newRead(this.inWaiting(), timeout);
this.trace(`Remaining data in serial buffer: ${this.hexConvert(remainingData)}`);
this.detectPanicHandler(new Uint8Array([...readBytes, ...(remainingData || [])]));
throw new Error(`Invalid head of packet (0x${byte.toString(16)}): Possible serial noise or corruption.`);
}
}
else if (isEscaping) {
isEscaping = false;
if (byte === this.SLIP_ESC_END) {
partialPacket = this.appendArray(partialPacket, new Uint8Array([this.SLIP_END]));
}
else if (byte === this.SLIP_ESC_ESC) {
partialPacket = this.appendArray(partialPacket, new Uint8Array([this.SLIP_ESC]));
}
else {
this.trace(`Read invalid data: ${this.hexConvert(readBytes)}`);
const remainingData = await this.newRead(this.inWaiting(), timeout);
this.trace(`Remaining data in serial buffer: ${this.hexConvert(remainingData)}`);
this.detectPanicHandler(new Uint8Array([...readBytes, ...(remainingData || [])]));
throw new Error(`Invalid SLIP escape (0xdb, 0x${byte.toString(16)})`);
}
}
else if (byte === this.SLIP_ESC) {
isEscaping = true;
}
else if (byte === this.SLIP_END) {
this.trace(`Received full packet: ${this.hexConvert(partialPacket)}`);
this.buffer = this.appendArray(this.buffer, readBytes.slice(i));
yield partialPacket;
partialPacket = null;
successfulSlip = true;
}
else {
partialPacket = this.appendArray(partialPacket, new Uint8Array([byte]));
}
}
}
}
/**
* Read from serial device without slip formatting.
* @yields {Uint8Array} The next number in the Fibonacci sequence.
*/
async *rawRead() {
if (!this.reader)
return;
try {
while (true) {
const { value, done } = await this.reader.read();
if (done || !value)
break;
if (this.tracing) {
console.log("Raw Read bytes");
this.trace(`Read ${value.length} bytes: ${this.hexConvert(value)}`);
}
yield value; // Yield each data chunk
}
}
catch (error) {
console.error("Error reading from serial port:", error);
}
finally {
this.buffer = new Uint8Array(0);
}
}
/**
* Send the RequestToSend (RTS) signal to given state
* # True for EN=LOW, chip in reset and False EN=HIGH, chip out of reset
* @param {boolean} state Boolean state to set the signal
*/
async setRTS(state) {
await this.device.setSignals({ requestToSend: state });
// # Work-around for adapters on Windows using the usbser.sys driver:
// # generate a dummy change to DTR so that the set-control-line-state
// # request is sent with the updated RTS state and the same DTR state
// Referenced to esptool.py
await this.setDTR(this._DTR_state);
}
/**
* Send the dataTerminalReady (DTS) signal to given state
* # True for IO0=LOW, chip in reset and False IO0=HIGH
* @param {boolean} state Boolean state to set the signal
*/
async setDTR(state) {
this._DTR_state = state;
await this.device.setSignals({ dataTerminalReady: state });
}
/**
* Connect to serial device using the Webserial open method.
* @param {number} baud Number baud rate for serial connection. Default is 115200.
* @param {typeof import("w3c-web-serial").SerialOptions} serialOptions Serial Options for WebUSB SerialPort class.
*/
async connect(baud = 115200, serialOptions = {}) {
var _a;
await this.device.open({
baudRate: baud,
dataBits: serialOptions === null || serialOptions === void 0 ? void 0 : serialOptions.dataBits,
stopBits: serialOptions === null || serialOptions === void 0 ? void 0 : serialOptions.stopBits,
bufferSize: serialOptions === null || serialOptions === void 0 ? void 0 : serialOptions.bufferSize,
parity: serialOptions === null || serialOptions === void 0 ? void 0 : serialOptions.parity,
flowControl: serialOptions === null || serialOptions === void 0 ? void 0 : serialOptions.flowControl,
});
this.baudrate = baud;
this.reader = (_a = this.device.readable) === null || _a === void 0 ? void 0 : _a.getReader();
}
async sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
/**
* Wait for a given timeout ms for serial device unlock.
* @param {number} timeout Timeout time in milliseconds (ms) to sleep
*/
async waitForUnlock(timeout) {
while ((this.device.readable && this.device.readable.locked) ||
(this.device.writable && this.device.writable.locked)) {
await this.sleep(timeout);
}
}
/**
* Disconnect from serial device by running SerialPort.close() after streams unlock.
*/
async disconnect() {
var _a, _b;
if ((_a = this.device.readable) === null || _a === void 0 ? void 0 : _a.locked) {
await ((_b = this.reader) === null || _b === void 0 ? void 0 : _b.cancel());
}
await this.waitForUnlock(400);
await this.device.close();
this.reader = undefined;
}
}
export { Transport };