diff --git a/README.md b/README.md index c6e8d305..ea13ab8f 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# ESPHome Web: JavaScript SDK for ESPHome +# ESP Web Tools Allow flashing ESPHome or other ESP-based firmwares via the browser. Will automatically detect the board type and select a supported firmware. ```html - +> ``` Manifest definition: @@ -37,10 +37,10 @@ Manifest definition: Allows for optionally passing an attribute to trigger an erase before installation. ```html - +> ``` All attributes can also be set via properties (`manifest`, `eraseFirst`) diff --git a/example.html b/index.html similarity index 67% rename from example.html rename to index.html index 710afe45..464017dc 100644 --- a/example.html +++ b/index.html @@ -16,14 +16,22 @@

ESPHome Web is a set of tools to allow working with ESP devices in the browser.

-

To flash the XX firmware, connect an ESP to your computer and hit the button:

- To flash the ESPHome firmware, connect an ESP to your computer and hit the button:

+
+ >

Note, this only works in desktop Chrome and Edge. Android support has not been implemented yet.

This works by combining Web Serial with a manifest which describes the firmware. It will automatically detect the type of the connected ESP device and find the right firmware files in the manifest.

+ diff --git a/package-lock.json b/package-lock.json index 5c1940b8..8094c46d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@material/mwc-circular-progress": "^0.21.0", "@material/mwc-dialog": "^0.21.0", "@material/mwc-textfield": "^0.21.0", + "esp-web-flasher": "^1.0.0", "lit": "^2.0.0-rc.2", "tslib": "^2.2.0" }, @@ -791,6 +792,14 @@ "node": ">=0.8.0" } }, + "node_modules/esp-web-flasher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esp-web-flasher/-/esp-web-flasher-1.0.0.tgz", + "integrity": "sha512-WzmO/LQJEgeddwoFAb4GI/cDia/r80Le1iMvHNMGetscQXvQGeV7HRkmWlr3e4BBYxAgtA8Zi86GLfdh8qG8YA==", + "dependencies": { + "tslib": "^2.2.0" + } + }, "node_modules/estree-walker": { "version": "1.0.1", "dev": true, @@ -2137,6 +2146,14 @@ "version": "1.0.5", "dev": true }, + "esp-web-flasher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esp-web-flasher/-/esp-web-flasher-1.0.0.tgz", + "integrity": "sha512-WzmO/LQJEgeddwoFAb4GI/cDia/r80Le1iMvHNMGetscQXvQGeV7HRkmWlr3e4BBYxAgtA8Zi86GLfdh8qG8YA==", + "requires": { + "tslib": "^2.2.0" + } + }, "estree-walker": { "version": "1.0.1", "dev": true diff --git a/package.json b/package.json index d730753a..21a1176a 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,8 @@ { - "name": "esphome-web", + "name": "esp-web-tools", "version": "0.0.1", - "description": "Web tools for ESPHome", - "main": "dist/flash-button.js", + "description": "Web tools for ESP devices", + "main": "dist/install-button.js", "repository": "https://github.com/esphome/web", "author": "ESPHome maintainers", "license": "Apache-2.0", @@ -26,6 +26,7 @@ "@material/mwc-circular-progress": "^0.21.0", "@material/mwc-dialog": "^0.21.0", "@material/mwc-textfield": "^0.21.0", + "esp-web-flasher": "^1.0.0", "lit": "^2.0.0-rc.2", "tslib": "^2.2.0" } diff --git a/src/const.ts b/src/const.ts index 7be423e2..402ed2c2 100644 --- a/src/const.ts +++ b/src/const.ts @@ -1,3 +1,17 @@ +import { connect } from "esp-web-flasher"; + +type AsyncReturnType any> = T extends ( + ...args: any +) => Promise + ? U + : T extends (...args: any) => infer U + ? U + : any; + +// Waiting for esp-web-flash >1.0.0 release which will include this type +export type ESPLoader = AsyncReturnType; +export type Logger = Parameters[0]; + export interface Build { chipFamily: "ESP32" | "ESP8266"; improv: boolean; diff --git a/src/install-button.ts b/src/install-button.ts index 65b600ba..41a16626 100644 --- a/src/install-button.ts +++ b/src/install-button.ts @@ -49,4 +49,4 @@ class InstallButton extends HTMLElement { } } -customElements.define("esphome-web-install-button", InstallButton); +customElements.define("esp-web-install-button", InstallButton); diff --git a/src/start-flash.ts b/src/start-flash.ts index f75d9cc2..e5e4da0d 100644 --- a/src/start-flash.ts +++ b/src/start-flash.ts @@ -1,10 +1,8 @@ import { html } from "lit"; -import { connect } from "./vendor/esptool"; -import type { Logger } from "./vendor/esptool/const"; -import type { ESPLoader } from "./vendor/esptool/esp_loader"; -import { Build, Manifest } from "./const"; +import { connect } from "esp-web-flasher"; +import { Build, ESPLoader, Manifest, Logger } from "./const"; import "./flash-log"; -import { getChipFamilyName } from "./util"; +import { getChipFamilyName, sleep } from "./util"; export const startFlash = async ( logger: Logger, @@ -123,7 +121,10 @@ export const startFlash = async ( } } - logEl.removeRow("preparing"); + logEl.addRow({ + id: "preparing", + content: `Ready to install`, + }); if (eraseFirst) { logEl.addRow({ @@ -132,7 +133,12 @@ export const startFlash = async ( }); } - let lastPct = -1; + let lastPct = 0; + + logEl.addRow({ + id: "write", + content: html`Writing progress: ${lastPct}%`, + }); for (const part of build.parts) { await espStub.flashData( @@ -152,6 +158,7 @@ export const startFlash = async ( ); } + await sleep(100); await esploader.softReset(); const doImprov = diff --git a/src/util.ts b/src/util.ts index d4bff6f5..936abcd5 100644 --- a/src/util.ts +++ b/src/util.ts @@ -2,8 +2,8 @@ import { CHIP_FAMILY_ESP32, CHIP_FAMILY_ESP32S2, CHIP_FAMILY_ESP8266, -} from "./vendor/esptool"; -import { ESPLoader } from "./vendor/esptool/esp_loader"; +} from "esp-web-flasher"; +import { ESPLoader } from "./const"; export const getChipFamilyName = (esploader: ESPLoader) => { switch (esploader.chipFamily) { @@ -17,3 +17,6 @@ export const getChipFamilyName = (esploader: ESPLoader) => { return "Unknown Chip"; } }; + +export const sleep = (time: number) => + new Promise((resolve) => setTimeout(resolve, time)); diff --git a/src/vendor/esptool/LICENSE.md b/src/vendor/esptool/LICENSE.md deleted file mode 100644 index de9887da..00000000 --- a/src/vendor/esptool/LICENSE.md +++ /dev/null @@ -1,9 +0,0 @@ -MIT License - -Copyright (c) 2020 Melissa LeBlanc-Williams for Adafruit Industries - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/src/vendor/esptool/README.md b/src/vendor/esptool/README.md deleted file mode 100644 index 560f77b5..00000000 --- a/src/vendor/esptool/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Adafruit WebSerial ESPTool - -Forked from -https://github.com/adafruit/Adafruit_WebSerial_ESPTool/blob/d9704c87bd8b533af18f23b3d853d48c1cb5e104/js/script.js diff --git a/src/vendor/esptool/const.ts b/src/vendor/esptool/const.ts deleted file mode 100644 index 2f4926ca..00000000 --- a/src/vendor/esptool/const.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { toByteArray } from "./util"; - -export interface Logger { - log(msg: string, ...args: any[]): void; - error(msg: string, ...args: any[]): void; - debug(msg: string, ...args: any[]): void; -} -export const baudRates = [921600, 115200, 230400, 460800]; -export const flashSizes = { - "512KB": 0x00, - "256KB": 0x10, - "1MB": 0x20, - "2MB": 0x30, - "4MB": 0x40, - "2MB-c1": 0x50, - "4MB-c1": 0x60, - "8MB": 0x80, - "16MB": 0x90, -}; - -export const FLASH_WRITE_SIZE = 0x200; -export const ESP32S2_FLASH_WRITE_SIZE = 0x400; -export const FLASH_SECTOR_SIZE = 0x1000; // Flash sector size, minimum unit of erase. -export const ESP_ROM_BAUD = 115200; - -export const SYNC_PACKET = toByteArray( - "\x07\x07\x12 UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU" -); -export const CHIP_DETECT_MAGIC_REG_ADDR = 0x40001000; -export const CHIP_FAMILY_ESP8266 = 0x8266; -export const CHIP_FAMILY_ESP32 = 0x32; -export const CHIP_FAMILY_ESP32S2 = 0x3252; -export type ChipFamily = - | typeof CHIP_FAMILY_ESP8266 - | typeof CHIP_FAMILY_ESP32 - | typeof CHIP_FAMILY_ESP32S2; - -export const ESP32_DATAREGVALUE = 0x15122500; -export const ESP8266_DATAREGVALUE = 0x00062000; -export const ESP32S2_DATAREGVALUE = 0x500; - -// Commands supported by ESP8266 ROM bootloader -export const ESP_FLASH_BEGIN = 0x02; -export const ESP_FLASH_DATA = 0x03; -export const ESP_FLASH_END = 0x04; -export const ESP_MEM_BEGIN = 0x05; -export const ESP_MEM_END = 0x06; -export const ESP_MEM_DATA = 0x07; -export const ESP_SYNC = 0x08; -export const ESP_WRITE_REG = 0x09; -export const ESP_READ_REG = 0x0a; - -export const ESP_ERASE_FLASH = 0xd0; -export const ESP_ERASE_REGION = 0xd1; - -export const ESP_SPI_SET_PARAMS = 0x0b; -export const ESP_SPI_ATTACH = 0x0d; -export const ESP_CHANGE_BAUDRATE = 0x0f; -export const ESP_SPI_FLASH_MD5 = 0x13; -export const ESP_CHECKSUM_MAGIC = 0xef; - -export const ROM_INVALID_RECV_MSG = 0x05; - -export const USB_RAM_BLOCK = 0x800; -export const ESP_RAM_BLOCK = 0x1800; - -// Timeouts -export const DEFAULT_TIMEOUT = 3000; -export const CHIP_ERASE_TIMEOUT = 600000; // timeout for full chip erase in ms -export const MAX_TIMEOUT = CHIP_ERASE_TIMEOUT * 2; // longest any command can run in ms -export const SYNC_TIMEOUT = 100; // timeout for syncing with bootloader in ms -export const ERASE_REGION_TIMEOUT_PER_MB = 30000; // timeout (per megabyte) for erasing a region in ms -export const MEM_END_ROM_TIMEOUT = 50; - -/** - * @name slipEncode - * Take an array buffer and return back a new array where - * 0xdb is replaced with 0xdb 0xdd and 0xc0 is replaced with 0xdb 0xdc - */ - -/** - * @name timeoutPerMb - * Scales timeouts which are size-specific - */ -export const timeoutPerMb = (secondsPerMb: number, sizeBytes: number) => { - let result = Math.floor(secondsPerMb * (sizeBytes / 0x1e6)); - if (result < DEFAULT_TIMEOUT) { - return DEFAULT_TIMEOUT; - } - return result; -}; diff --git a/src/vendor/esptool/esp_loader.ts b/src/vendor/esptool/esp_loader.ts deleted file mode 100644 index 4c3aa7f5..00000000 --- a/src/vendor/esptool/esp_loader.ts +++ /dev/null @@ -1,835 +0,0 @@ -import { - CHIP_FAMILY_ESP32, - CHIP_FAMILY_ESP32S2, - CHIP_FAMILY_ESP8266, - MAX_TIMEOUT, - Logger, - DEFAULT_TIMEOUT, - ERASE_REGION_TIMEOUT_PER_MB, - ESP32S2_DATAREGVALUE, - ESP32S2_FLASH_WRITE_SIZE, - ESP32_DATAREGVALUE, - ESP8266_DATAREGVALUE, - ESP_CHANGE_BAUDRATE, - ESP_CHECKSUM_MAGIC, - ESP_FLASH_BEGIN, - ESP_FLASH_DATA, - ESP_FLASH_END, - ESP_MEM_BEGIN, - ESP_MEM_DATA, - ESP_MEM_END, - ESP_READ_REG, - ESP_SPI_ATTACH, - ESP_SPI_SET_PARAMS, - ESP_SYNC, - FLASH_SECTOR_SIZE, - FLASH_WRITE_SIZE, - MEM_END_ROM_TIMEOUT, - ROM_INVALID_RECV_MSG, - SYNC_PACKET, - SYNC_TIMEOUT, - USB_RAM_BLOCK, - ChipFamily, - ESP_ERASE_FLASH, - CHIP_ERASE_TIMEOUT, - timeoutPerMb, -} from "./const"; -import { getStubCode } from "./stubs"; -import { pack, sleep, slipEncode, toHex, unpack } from "./util"; - -export class ESPLoader extends EventTarget { - chipFamily!: ChipFamily; - chipName: string | null = null; - _efuses = new Array(4).fill(0); - _flashsize = 4 * 1024 * 1024; - debug = false; - IS_STUB = false; - connected = true; - - __inputBuffer?: number[]; - private _reader?: ReadableStreamDefaultReader; - - constructor( - public port: SerialPort, - public logger: Logger, - private _parent?: ESPLoader - ) { - super(); - } - - private get _inputBuffer(): number[] { - return this._parent ? this._parent._inputBuffer : this.__inputBuffer!; - } - - /** - * @name chipType - * ESP32 or ESP8266 based on which chip type we're talking to - */ - async initialize() { - await this.softReset(); - - if (!this._parent) { - this.__inputBuffer = []; - // Don't await this promise so it doesn't block rest of method. - this.readLoop(); - } - await this.sync(); - - // Determine chip family - let datareg = await this.readRegister(0x60000078); - if (datareg == ESP32_DATAREGVALUE) { - this.chipFamily = CHIP_FAMILY_ESP32; - } else if (datareg == ESP8266_DATAREGVALUE) { - this.chipFamily = CHIP_FAMILY_ESP8266; - } else if (datareg == ESP32S2_DATAREGVALUE) { - this.chipFamily = CHIP_FAMILY_ESP32S2; - } else { - throw "Unknown Chip."; - } - - // Read the OTP data for this chip and store into this.efuses array - let baseAddr: number; - if (this.chipFamily == CHIP_FAMILY_ESP8266) { - baseAddr = 0x3ff00050; - } else if (this.chipFamily == CHIP_FAMILY_ESP32) { - baseAddr = 0x6001a000; - } else if (this.chipFamily == CHIP_FAMILY_ESP32S2) { - baseAddr = 0x6001a000; - } - for (let i = 0; i < 4; i++) { - this._efuses[i] = await this.readRegister(baseAddr! + 4 * i); - } - - // The specific name of the chip, e.g. ESP8266EX, to the best - // of our ability to determine without a stub bootloader. - if (this.chipFamily == CHIP_FAMILY_ESP32) { - this.chipName = "ESP32"; - } - if (this.chipFamily == CHIP_FAMILY_ESP32S2) { - this.chipName = "ESP32-S2"; - } - if (this.chipFamily == CHIP_FAMILY_ESP8266) { - if (this._efuses[0] & (1 << 4) || this._efuses[2] & (1 << 16)) { - this.chipName = "ESP8285"; - } else { - this.chipName = "ESP8266EX"; - } - } - } - - /** - * @name readLoop - * Reads data from the input stream and places it in the inputBuffer - */ - async readLoop() { - this._reader = this.port.readable!.getReader(); - - try { - while (true) { - const { value, done } = await this._reader.read(); - if (done) { - this._reader.releaseLock(); - break; - } - if (!value || value.length === 0) { - continue; - } - this._inputBuffer.push(...Array.from(value)); - } - } catch (err) { - // Disconnected! - this.connected = false; - this.dispatchEvent(new Event("disconnect")); - } - } - - async softReset() { - this.logger.log("Try soft reset."); - await this.port.setSignals({ - dataTerminalReady: false, - requestToSend: true, - }); - await this.port.setSignals({ - dataTerminalReady: true, - requestToSend: false, - }); - await new Promise((resolve) => setTimeout(resolve, 1000)); - } - - /** - * @name macAddr - * The MAC address burned into the OTP memory of the ESP chip - */ - macAddr() { - let macAddr = new Array(6).fill(0); - let mac0 = this._efuses[0]; - let mac1 = this._efuses[1]; - let mac2 = this._efuses[2]; - let mac3 = this._efuses[3]; - let oui; - if (this.chipFamily == CHIP_FAMILY_ESP8266) { - if (mac3 != 0) { - oui = [(mac3 >> 16) & 0xff, (mac3 >> 8) & 0xff, mac3 & 0xff]; - } else if (((mac1 >> 16) & 0xff) == 0) { - oui = [0x18, 0xfe, 0x34]; - } else if (((mac1 >> 16) & 0xff) == 1) { - oui = [0xac, 0xd0, 0x74]; - } else { - throw "Couldnt determine OUI"; - } - - macAddr[0] = oui[0]; - macAddr[1] = oui[1]; - macAddr[2] = oui[2]; - macAddr[3] = (mac1 >> 8) & 0xff; - macAddr[4] = mac1 & 0xff; - macAddr[5] = (mac0 >> 24) & 0xff; - } else if (this.chipFamily == CHIP_FAMILY_ESP32) { - macAddr[0] = (mac2 >> 8) & 0xff; - macAddr[1] = mac2 & 0xff; - macAddr[2] = (mac1 >> 24) & 0xff; - macAddr[3] = (mac1 >> 16) & 0xff; - macAddr[4] = (mac1 >> 8) & 0xff; - macAddr[5] = mac1 & 0xff; - } else if (this.chipFamily == CHIP_FAMILY_ESP32S2) { - macAddr[0] = (mac2 >> 8) & 0xff; - macAddr[1] = mac2 & 0xff; - macAddr[2] = (mac1 >> 24) & 0xff; - macAddr[3] = (mac1 >> 16) & 0xff; - macAddr[4] = (mac1 >> 8) & 0xff; - macAddr[5] = mac1 & 0xff; - } else { - throw "Unknown chip family"; - } - return macAddr; - } - - /** - * @name readRegister - * Read a register within the ESP chip RAM, returns a 4-element list - */ - async readRegister(reg: number) { - if (this.debug) { - this.logger.debug("Reading Register", reg); - } - let packet = pack("I", reg); - let register = (await this.checkCommand(ESP_READ_REG, packet))[0]; - return unpack("I", register!)[0]; - } - - /** - * @name checkCommand - * Send a command packet, check that the command succeeded and - * return a tuple with the value and data. - * See the ESP Serial Protocol for more details on what value/data are - */ - async checkCommand( - opcode: number, - buffer: number[], - checksum = 0, - timeout = DEFAULT_TIMEOUT - ) { - timeout = Math.min(timeout, MAX_TIMEOUT); - await this.sendCommand(opcode, buffer, checksum); - let [value, data] = await this.getResponse(opcode, timeout); - - if (data === null) { - throw "Didn't get enough status bytes"; - } - - let statusLen = 0; - - if (this.IS_STUB || this.chipFamily == CHIP_FAMILY_ESP8266) { - statusLen = 2; - } else if ( - [CHIP_FAMILY_ESP32, CHIP_FAMILY_ESP32S2].includes(this.chipFamily) - ) { - statusLen = 4; - } else { - if ([2, 4].includes(data.length)) { - statusLen = data.length; - } - } - - if (data.length < statusLen) { - throw "Didn't get enough status bytes"; - } - let status = data.slice(-statusLen, data.length); - data = data.slice(0, -statusLen); - if (this.debug) { - this.logger.debug("status", status); - this.logger.debug("value", value); - this.logger.debug("data", data); - } - if (status[0] == 1) { - if (status[1] == ROM_INVALID_RECV_MSG) { - throw "Invalid (unsupported) command " + toHex(opcode); - } else { - throw "Command failure error code " + toHex(status[1]); - } - } - return [value, data]; - } - - /** - * @name sendCommand - * Send a slip-encoded, checksummed command over the UART, - * does not check response - */ - async sendCommand(opcode: number, buffer: number[], checksum = 0) { - //debugMsg("Running Send Command"); - this._inputBuffer.length = 0; // Reset input buffer - let packet = [0xc0, 0x00]; // direction - packet.push(opcode); - packet = packet.concat(pack("H", buffer.length)); - packet = packet.concat(slipEncode(pack("I", checksum))); - packet = packet.concat(slipEncode(buffer)); - packet.push(0xc0); - if (this.debug) { - this.logger.debug( - "Writing " + - packet.length + - " byte" + - (packet.length == 1 ? "" : "s") + - ":", - packet - ); - } - await this.writeToStream(packet); - } - - /** - * @name getResponse - * Read response data and decodes the slip packet, then parses - * out the value/data and returns as a tuple of (value, data) where - * each is a list of bytes - */ - async getResponse(opcode: number, timeout = DEFAULT_TIMEOUT) { - let reply: number[] = []; - let packetLength = 0; - let escapedByte = false; - let stamp = Date.now(); - while (Date.now() - stamp < timeout) { - if (this._inputBuffer.length > 0) { - let c = this._inputBuffer.shift()!; - if (c == 0xdb) { - escapedByte = true; - } else if (escapedByte) { - if (c == 0xdd) { - reply.push(0xdc); - } else if (c == 0xdc) { - reply.push(0xc0); - } else { - reply = reply.concat([0xdb, c]); - } - escapedByte = false; - } else { - reply.push(c); - } - } else { - await sleep(10); - } - if (reply.length > 0 && reply[0] != 0xc0) { - // packets must start with 0xC0 - reply.shift(); - } - if (reply.length > 1 && reply[1] != 0x01) { - reply.shift(); - } - if (reply.length > 2 && reply[2] != opcode) { - reply.shift(); - } - if (reply.length > 4) { - // get the length - packetLength = reply[3] + (reply[4] << 8); - } - if (reply.length == packetLength + 10) { - break; - } - } - - // Check to see if we have a complete packet. If not, we timed out. - if (reply.length != packetLength + 10) { - this.logger.log("Timed out after " + timeout + " milliseconds"); - return [null, null]; - } - if (this.debug) { - this.logger.debug( - "Reading " + - reply.length + - " byte" + - (reply.length == 1 ? "" : "s") + - ":", - reply - ); - } - let value = reply.slice(5, 9); - let data = reply.slice(9, -1); - if (this.debug) { - this.logger.debug("value:", value, "data:", data); - } - return [value, data]; - } - - /** - * @name read - * Read response data and decodes the slip packet. - * Keeps reading until we hit the timeout or get - * a packet closing byte - */ - async readBuffer(timeout = DEFAULT_TIMEOUT) { - let reply: number[] = []; - // let packetLength = 0; - let escapedByte = false; - let stamp = Date.now(); - while (Date.now() - stamp < timeout) { - if (this._inputBuffer.length > 0) { - let c = this._inputBuffer.shift()!; - if (c == 0xdb) { - escapedByte = true; - } else if (escapedByte) { - if (c == 0xdd) { - reply.push(0xdc); - } else if (c == 0xdc) { - reply.push(0xc0); - } else { - reply = reply.concat([0xdb, c]); - } - escapedByte = false; - } else { - reply.push(c); - } - } else { - await sleep(10); - } - if (reply.length > 0 && reply[0] != 0xc0) { - // packets must start with 0xC0 - reply.shift(); - } - if (reply.length > 1 && reply[reply.length - 1] == 0xc0) { - break; - } - } - - // Check to see if we have a complete packet. If not, we timed out. - if (reply.length < 2) { - this.logger.log("Timed out after " + timeout + " milliseconds"); - return null; - } - if (this.debug) { - this.logger.debug( - "Reading " + - reply.length + - " byte" + - (reply.length == 1 ? "" : "s") + - ":", - reply - ); - } - let data = reply.slice(1, -1); - if (this.debug) { - this.logger.debug("data:", data); - } - return data; - } - - /** - * @name checksum - * Calculate checksum of a blob, as it is defined by the ROM - */ - checksum(data: number[], state = ESP_CHECKSUM_MAGIC) { - for (let b of data) { - state ^= b; - } - return state; - } - - async setBaudrate(baud: number) { - if (this.chipFamily == CHIP_FAMILY_ESP8266) { - this.logger.log("Baud rate can only change on ESP32 and ESP32-S2"); - } else { - this.logger.log("Attempting to change baud rate to " + baud + "..."); - try { - let buffer = pack(" 1 && data[0] == 0 && data[1] == 0) { - return true; - } - } - return false; - } - - /** - * @name getFlashWriteSize - * Get the Flash write size based on the chip - */ - getFlashWriteSize() { - if (this.chipFamily == CHIP_FAMILY_ESP32S2) { - return ESP32S2_FLASH_WRITE_SIZE; - } - return FLASH_WRITE_SIZE; - } - - /** - * @name flashData - * Program a full, uncompressed binary file into SPI Flash at - * a given offset. If an ESP32 and md5 string is passed in, will also - * verify memory. ESP8266 does not have checksum memory verification in - * ROM - */ - async flashData( - binaryData: ArrayBuffer, - updateProgress: (bytesWritten: number) => void, - offset = 0 - ) { - let filesize = binaryData.byteLength; - this.logger.log("\nWriting data with filesize:" + filesize); - await this.flashBegin(filesize, offset); - let block = []; - let seq = 0; - let written = 0; - // let address = offset; - let position = 0; - let stamp = Date.now(); - let flashWriteSize = this.getFlashWriteSize(); - - while (filesize - position > 0) { - /*logMsg( - "Writing at " + toHex(address + seq * flashWriteSize, 8) + "... (" + percentage + " %)" - );*/ - if (filesize - position >= flashWriteSize) { - block = Array.from( - new Uint8Array(binaryData, position, flashWriteSize) - ); - } else { - // Pad the last block - block = Array.from( - new Uint8Array(binaryData, position, filesize - position) - ); - block = block.concat( - new Array(flashWriteSize - block.length).fill(0xff) - ); - } - await this.flashBlock(block, seq, 2000); - seq += 1; - written += block.length; - position += flashWriteSize; - updateProgress(written); - } - this.logger.log( - "Took " + (Date.now() - stamp) + "ms to write " + filesize + " bytes" - ); - } - - /** - * @name flashBlock - * Send one block of data to program into SPI Flash memory - */ - async flashBlock(data: number[], seq: number, timeout = 100) { - await this.checkCommand( - ESP_FLASH_DATA, - pack(" { - const stub = await getStubCode(this.chipFamily); - - // We're transferring over USB, right? - let ramBlock = USB_RAM_BLOCK; - - // Upload - this.logger.log("Uploading stub..."); - for (let field of ["text", "data"]) { - if (Object.keys(stub).includes(field)) { - let offset = stub[field + "_start"]; - let length = stub[field].length; - let blocks = Math.floor((length + ramBlock - 1) / ramBlock); - await this.memBegin(length, blocks, ramBlock, offset); - for (let seq of Array(blocks).keys()) { - let fromOffs = seq * ramBlock; - let toOffs = fromOffs + ramBlock; - if (toOffs > length) { - toOffs = length; - } - await this.memBlock(stub[field].slice(fromOffs, toOffs), seq); - } - } - } - this.logger.log("Running stub..."); - await this.memFinish(stub["entry"]); - - const p = await this.readBuffer(100); - const pChar = String.fromCharCode(...p!); - - if (pChar != "OHAI") { - throw "Failed to start stub. Unexpected response: " + pChar; - } - this.logger.log("Stub is now running..."); - const espStubLoader = new EspStubLoader(this.port, this.logger, this); - return espStubLoader; - } - - async writeToStream(data: number[]) { - const writer = this.port.writable!.getWriter(); - await writer.write(new Uint8Array(data)); - try { - writer.releaseLock(); - } catch (err) { - console.error("Ignoring release lock error", err); - } - } - - async disconnect() { - if (this._parent) { - await this._parent.disconnect(); - return; - } - if (this._reader) { - await this._reader.cancel(); - } - await this.port.writable!.getWriter().close(); - await this.port.close(); - } -} - -class EspStubLoader extends ESPLoader { - /* - The Stubloader has commands that run on the uploaded Stub Code in RAM - rather than built in commands. - */ - IS_STUB = true; - - /** - * @name memBegin (592) - * Start downloading an application image to RAM - */ - async memBegin( - size: number, - blocks: number, - blocksize: number, - offset: number - ): Promise { - let stub = await getStubCode(this.chipFamily); - let load_start = offset; - let load_end = offset + size; - console.log(load_start, load_end); - console.log( - stub.data_start, - stub.data.length, - stub.text_start, - stub.text.length - ); - for (let [start, end] of [ - [stub.data_start, stub.data_start + stub.data.length], - [stub.text_start, stub.text_start + stub.text.length], - ]) { - if (load_start < end && load_end > start) { - throw ( - "Software loader is resident at " + - toHex(start, 8) + - "-" + - toHex(end, 8) + - ". " + - "Can't load binary at overlapping address range " + - toHex(load_start, 8) + - "-" + - toHex(load_end, 8) + - ". " + - "Try changing the binary loading address." - ); - } - } - } - - /** - * @name getEraseSize - * depending on flash chip model the erase may take this long (maybe longer!) - */ - async eraseFlash() { - await this.checkCommand(ESP_ERASE_FLASH, [], 0, CHIP_ERASE_TIMEOUT); - } -} diff --git a/src/vendor/esptool/index.ts b/src/vendor/esptool/index.ts deleted file mode 100644 index 318589a3..00000000 --- a/src/vendor/esptool/index.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ESP_ROM_BAUD, Logger } from "./const"; -import { ESPLoader } from "./esp_loader"; - -export { - CHIP_FAMILY_ESP32, - CHIP_FAMILY_ESP32S2, - CHIP_FAMILY_ESP8266, -} from "./const"; - -export const connect = async (logger: Logger) => { - // - Request a port and open a connection. - const port = await navigator.serial.requestPort(); - - logger.log("Connecting..."); - // - Wait for the port to open.toggleUIConnected - await port.open({ baudRate: ESP_ROM_BAUD }); - - // const signals = await port.getSignals(); - - logger.log("Connected successfully."); - - return new ESPLoader(port, logger); -}; diff --git a/src/vendor/esptool/stubs/esp32.json b/src/vendor/esptool/stubs/esp32.json deleted file mode 100644 index 97ba659a..00000000 --- a/src/vendor/esptool/stubs/esp32.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "text": "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", - "text_start": 1074520064, - "entry": 1074521496, - "data": "CMD8Pw==", - "data_start": 1073605544 -} \ No newline at end of file diff --git a/src/vendor/esptool/stubs/esp32s2.json b/src/vendor/esptool/stubs/esp32s2.json deleted file mode 100644 index 832d7b34..00000000 --- a/src/vendor/esptool/stubs/esp32s2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "text": "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", - "text_start": 1073905664, - "entry": 1073907516, - "data": "CAD9Pw==", - "data_start": 1073622004 -} \ No newline at end of file diff --git a/src/vendor/esptool/stubs/esp8266.json b/src/vendor/esptool/stubs/esp8266.json deleted file mode 100644 index 4aae6b9b..00000000 --- a/src/vendor/esptool/stubs/esp8266.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "text": "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", - "text_start": 1074847744, - "entry": 1074847748, - "data": "CIH+PwUFBAACAwcAAwMLAFHnEECH5xBAtecQQFToEEAF9xBAuugQQBDpEEBc6RBABfcQQCLqEECf6hBAYOsQQAX3EEAF9xBA+OsQQAX3EEDX7hBAn+8QQNjvEEAF9xBABfcQQHXwEEAF9xBAW/EQQAHyEEBA8xBA//MQQND0EEAF9xBABfcQQAX3EEAF9xBA/vUQQAX3EED09hBAL+0QQCfoEEBC9RBAS+oQQJjpEEAF9xBAiPYQQM/2EEAF9xBABfcQQAX3EEAF9xBABfcQQAX3EEAF9xBABfcQQMDpEED/6RBAWvUQQAEAAAACAAAAAwAAAAQAAAAFAAAABwAAAAkAAAANAAAAEQAAABkAAAAhAAAAMQAAAEEAAABhAAAAgQAAAMEAAAABAQAAgQEAAAECAAABAwAAAQQAAAEGAAABCAAAAQwAAAEQAAABGAAAASAAAAEwAAABQAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAgAAAAIAAAADAAAAAwAAAAQAAAAEAAAABQAAAAUAAAAGAAAABgAAAAcAAAAHAAAACAAAAAgAAAAJAAAACQAAAAoAAAAKAAAACwAAAAsAAAAMAAAADAAAAA0AAAANAAAAAAAAAAAAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAACgAAAAsAAAANAAAADwAAABEAAAATAAAAFwAAABsAAAAfAAAAIwAAACsAAAAzAAAAOwAAAEMAAABTAAAAYwAAAHMAAACDAAAAowAAAMMAAADjAAAAAgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAQAAAAEAAAABAAAAAgAAAAIAAAACAAAAAgAAAAMAAAADAAAAAwAAAAMAAAAEAAAABAAAAAQAAAAEAAAABQAAAAUAAAAFAAAABQAAAAAAAAAAAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AAQEAAAEAAAAEAAAA", - "data_start": 1073720488 -} \ No newline at end of file diff --git a/src/vendor/esptool/stubs/index.ts b/src/vendor/esptool/stubs/index.ts deleted file mode 100644 index 06e5804c..00000000 --- a/src/vendor/esptool/stubs/index.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { - ChipFamily, - CHIP_FAMILY_ESP32, - CHIP_FAMILY_ESP32S2, - CHIP_FAMILY_ESP8266, -} from "../const"; -import { toByteArray } from "../util"; - -interface LoadedStub { - text: string; - data: string; - text_start: number; - entry: number; - data_start: number; -} - -interface Stub { - text: number[]; - data: number[]; - text_start: number; - entry: number; - data_start: number; -} - -export const getStubCode = async (chipFamily: ChipFamily): Promise => { - let stubcode!: LoadedStub; - - if (chipFamily == CHIP_FAMILY_ESP32) { - stubcode = await import("./esp32.json"); - } else if (chipFamily == CHIP_FAMILY_ESP32S2) { - stubcode = await import("./esp32s2.json"); - } else if (chipFamily == CHIP_FAMILY_ESP8266) { - stubcode = await import("./esp8266.json"); - } - - // Base64 decode the text and data - return { - ...stubcode, - text: toByteArray(atob(stubcode.text)), - data: toByteArray(atob(stubcode.data)), - }; -}; diff --git a/src/vendor/esptool/util.ts b/src/vendor/esptool/util.ts deleted file mode 100644 index dff85d72..00000000 --- a/src/vendor/esptool/util.ts +++ /dev/null @@ -1,107 +0,0 @@ -export const slipEncode = (buffer: number[]): number[] => { - let encoded: number[] = []; - for (let byte of buffer) { - if (byte == 0xdb) { - encoded = encoded.concat([0xdb, 0xdd]); - } else if (byte == 0xc0) { - encoded = encoded.concat([0xdb, 0xdc]); - } else { - encoded.push(byte); - } - } - return encoded; -}; - -/** - * @name toByteArray - * Convert a string to a byte array - */ -export const toByteArray = (str: string): number[] => { - let byteArray: number[] = []; - for (let i = 0; i < str.length; i++) { - let charcode = str.charCodeAt(i); - if (charcode <= 0xff) { - byteArray.push(charcode); - } - } - return byteArray; -}; - -export const pack = (format: string, ...data: number[]) => { - // let format = args[0]; - let pointer = 0; - // let data = args.slice(1); - if (format.replace(/[<>]/, "").length != data.length) { - throw new Error("Pack format to Argument count mismatch"); - } - let bytes: number[] = []; - let littleEndian = true; - - const pushBytes = (value: number, byteCount: number) => { - for (let i = 0; i < byteCount; i++) { - if (littleEndian) { - bytes.push((value >> (i * 8)) & 0xff); - } else { - bytes.push((value >> ((byteCount - i) * 8)) & 0xff); - } - } - }; - - for (let i = 0; i < format.length; i++) { - if (format[i] == "<") { - littleEndian = true; - } else if (format[i] == ">") { - littleEndian = false; - } else if (format[i] == "B") { - pushBytes(data[pointer], 1); - pointer++; - } else if (format[i] == "H") { - pushBytes(data[pointer], 2); - pointer++; - } else if (format[i] == "I") { - pushBytes(data[pointer], 4); - pointer++; - } else { - throw new Error(`Unhandled character "${format[i]}" in pack format`); - } - } - - return bytes; -}; - -export const unpack = (format: string, bytes: number[]) => { - let pointer = 0; - let data = []; - for (let c of format) { - if (c == "B") { - data.push(bytes[pointer] & 0xff); - pointer += 1; - } else if (c == "H") { - data.push((bytes[pointer] & 0xff) | ((bytes[pointer + 1] & 0xff) << 8)); - pointer += 2; - } else if (c == "I") { - data.push( - (bytes[pointer] & 0xff) | - ((bytes[pointer + 1] & 0xff) << 8) | - ((bytes[pointer + 2] & 0xff) << 16) | - ((bytes[pointer + 3] & 0xff) << 24) - ); - pointer += 4; - } else { - throw new Error(`Unhandled character "${c}" in unpack format`); - } - } - return data; -}; - -export const toHex = (value: number, size = 2) => { - return "0x" + value.toString(16).toUpperCase().padStart(size, "0"); -}; - -export const sleep = (ms: number) => - new Promise((resolve) => setTimeout(resolve, ms)); - -export const formatMacAddr = (macAddr: number[]) => - macAddr - .map((value) => value.toString(16).toUpperCase().padStart(2, "0")) - .join(":");