diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 3521f20..3689298 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -13,7 +13,7 @@ jobs: node-version: '14.x' registry-url: 'https://registry.npmjs.org' - name: Install dependencies and build 🔧 - run: npm install && npm run build + run: npm ci && npm run build - name: Run tests run: npm run test - name: Package .vsix diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..520ef4b Binary files /dev/null and b/favicon.ico differ diff --git a/index.js b/index.js index 4e12ff7..8899043 100644 --- a/index.js +++ b/index.js @@ -17,7 +17,7 @@ const table = document.getElementById('fileTable'); const alertDiv = document.getElementById('alertDiv'); // import { Transport } from './cp210x-webusb.js' -import esptooljs from "./bundle.js"; +import * as esptooljs from "./bundle.js"; const ESPLoader = esptooljs.ESPLoader; const Transport = esptooljs.Transport; @@ -78,16 +78,16 @@ function _sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } -function terminalClearFn() { - term.clear(); -} - -function terminalWrite(data) { - term.write(data); -} - -function terminalWriteLn(data) { - term.writeln(data); +let espLoaderTerminal = { + clean() { + term.clear(); + }, + writeLine(data) { + term.writeln(data); + }, + write(data) { + term.write(data) + } } connectButton.onclick = async () => { @@ -101,7 +101,7 @@ connectButton.onclick = async () => { } try { - esploader = new ESPLoader(transport, baudrates.value, terminalClearFn, terminalWriteLn, terminalWrite); + esploader = new ESPLoader(transport, baudrates.value, espLoaderTerminal); connected = true; chip = await esploader.main_fn(); diff --git a/package-lock.json b/package-lock.json index 29b89d1..0b7d989 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "crypto-js": "^4.0.0", "pako": "^2.1.0", + "tslib": "^2.4.1", "xterm": "^4.13.0" }, "devDependencies": { @@ -3333,10 +3334,9 @@ } }, "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -3353,6 +3353,12 @@ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -5982,10 +5988,9 @@ } }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" }, "tsutils": { "version": "3.21.0", @@ -5994,6 +5999,14 @@ "dev": true, "requires": { "tslib": "^1.8.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } } }, "type-check": { diff --git a/package.json b/package.json index 16a1d28..a331c34 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "dependencies": { "crypto-js": "^4.0.0", "pako": "^2.1.0", + "tslib": "^2.4.1", "xterm": "^4.13.0" }, "devDependencies": { diff --git a/src/espLoader.ts b/src/espLoader.ts index 13033cc..e2ddd0d 100644 --- a/src/espLoader.ts +++ b/src/espLoader.ts @@ -17,12 +17,18 @@ const MAGIC_TO_CHIP: { [key: number]: ROM } = { 0xfff0c101: new ESP8266ROM(), }; -interface ESPBinFile { +export interface ESPBinFile { data: string; address: number; } -class ESPLoader { +export interface IEspLoaderTerminal { + clean: () => void; + writeLine: (data: string) => void; + write: (data: string) => void; +} + +export class ESPLoader { ESP_RAM_BLOCK = 0x1800; ESP_FLASH_BEGIN = 0x02; ESP_FLASH_DATA = 0x03; @@ -76,17 +82,14 @@ class ESPLoader { constructor( public transport: Transport, private baudrate: number, - private terminalCleanFn: () => void, - private terminalWriteLineFn: (data: string) => void, - private terminalWriteFn: (data: string) => void, + private terminal: IEspLoaderTerminal, private rom_baudrate = 115200, ) { this.IS_STUB = false; - this.chip = new ESP32ROM(); + this.chip = null; this.FLASH_WRITE_SIZE = 0x4000; - - if (this.terminalCleanFn) { - this.terminalCleanFn(); + if (this.terminal) { + this.terminal.clean(); } this.log("esptool.js v0.1-dev"); @@ -98,16 +101,16 @@ class ESPLoader { } log(str: string) { - if (this.terminalWriteLineFn) { - this.terminalWriteLineFn(str); + if (this.terminal) { + this.terminal.writeLine(str); } else { // eslint-disable-next-line no-console console.log(str); } } write_char(str: string) { - if (this.terminalWriteFn) { - this.terminalWriteFn(str); + if (this.terminal) { + this.terminal.write(str); } else { // eslint-disable-next-line no-console console.log(str); @@ -1004,5 +1007,3 @@ class ESPLoader { } } } - -export default ESPLoader; diff --git a/src/index.ts b/src/index.ts index 2bc03a1..2f01753 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,4 +1,2 @@ -import ESPLoader from "./espLoader"; -import { Transport } from "./webserial"; - -export default { ESPLoader, Transport }; +export { IEspLoaderTerminal, ESPLoader } from "./esploader"; +export { Transport } from "./webserial"; diff --git a/src/targets/esp32.ts b/src/targets/esp32.ts index 7464844..5a314c4 100644 --- a/src/targets/esp32.ts +++ b/src/targets/esp32.ts @@ -1,4 +1,4 @@ -import ESPLoader from "../espLoader"; +import { ESPLoader } from "../esploader"; import { ROM } from "./rom"; export default class ESP32ROM extends ROM { @@ -96,20 +96,20 @@ export default class ESP32ROM extends ROM { "YjiDW+mNANzr1LUT2ElJKyOShBjc24Bubh7Lmjp/Eifg5awjAiP9ZbJfx620qNfq" + "wqvdldrZOj9LCYJ8mer+L0DR4a0UDQAA"; - public read_efuse = async (loader: ESPLoader, offset: number) => { + public async read_efuse(loader: ESPLoader, offset: number) { const addr = this.EFUSE_RD_REG_BASE + 4 * offset; loader.log("Read efuse " + addr); return await loader.read_reg(addr); }; - public get_pkg_version = async (loader: ESPLoader) => { + public async get_pkg_version(loader: ESPLoader) { const word3 = await this.read_efuse(loader, 3); let pkg_version = (word3 >> 9) & 0x07; pkg_version += ((word3 >> 2) & 0x1) << 3; return pkg_version; }; - public get_chip_revision = async (loader: ESPLoader) => { + public async get_chip_revision(loader: ESPLoader) { const word3 = await this.read_efuse(loader, 3); const word5 = await this.read_efuse(loader, 5); const apb_ctl_date = await loader.read_reg(this.DR_REG_SYSCON_BASE + 0x7c); @@ -131,7 +131,7 @@ export default class ESP32ROM extends ROM { return 0; }; - public get_chip_description = async (loader: ESPLoader) => { + public async get_chip_description(loader: ESPLoader) { const chip_desc = [ "ESP32-D0WDQ6", "ESP32-D0WD", @@ -166,7 +166,7 @@ export default class ESP32ROM extends ROM { return chip_name + " (revision " + chip_revision + ")"; }; - public get_chip_features = async (loader: ESPLoader) => { + public async get_chip_features(loader: ESPLoader) { const features = ["Wi-Fi"]; const word3 = await this.read_efuse(loader, 3); @@ -220,7 +220,7 @@ export default class ESP32ROM extends ROM { return features; }; - public get_crystal_freq = async (loader: ESPLoader) => { + public async get_crystal_freq(loader: ESPLoader) { const uart_div = (await loader.read_reg(this.UART_CLKDIV_REG)) & this.UART_CLKDIV_MASK; const ets_xtal = (loader.transport.baudrate * uart_div) / 1000000 / this.XTAL_CLK_DIVIDER; let norm_xtal; @@ -240,7 +240,7 @@ export default class ESP32ROM extends ROM { return h.length === 1 ? "0" + h : h; } - public read_mac = async (loader: ESPLoader) => { + public async read_mac(loader: ESPLoader) { let mac0 = await this.read_efuse(loader, 1); mac0 = mac0 >>> 0; let mac1 = await this.read_efuse(loader, 2); diff --git a/src/targets/esp32c3.ts b/src/targets/esp32c3.ts index edd1fab..9967e7f 100644 --- a/src/targets/esp32c3.ts +++ b/src/targets/esp32c3.ts @@ -1,4 +1,4 @@ -import ESPLoader from "../espLoader"; +import { ESPLoader } from "../esploader"; import { ROM } from "./rom"; export default class ESP32C3ROM extends ROM { @@ -94,7 +94,7 @@ export default class ESP32C3ROM extends ROM { "pnltVv+9jvHXkU4sXKfxG0NqhL7U68N6/PpKeyfjl0o+XMA5N/wc9+g6UfWl9s83" + "J279YCuxbUpfYBg26DI+z0jM/CCTyLqft1P4h/4HprTSLAwNAAA="; - public get_pkg_version = async (loader: ESPLoader) => { + public async get_pkg_version(loader: ESPLoader) { const num_word = 3; const block1_addr = this.EFUSE_BASE + 0x044; const addr = block1_addr + 4 * num_word; @@ -103,7 +103,7 @@ export default class ESP32C3ROM extends ROM { return pkg_version; }; - public get_chip_revision = async (loader: ESPLoader) => { + public async get_chip_revision(loader: ESPLoader) { const block1_addr = this.EFUSE_BASE + 0x044; const num_word = 3; const pos = 18; @@ -112,7 +112,7 @@ export default class ESP32C3ROM extends ROM { return ret; }; - public get_chip_description = async (loader: ESPLoader) => { + public async get_chip_description(loader: ESPLoader) { let desc; const pkg_ver = await this.get_pkg_version(loader); if (pkg_ver === 0) { @@ -125,11 +125,11 @@ export default class ESP32C3ROM extends ROM { return desc; }; - public get_chip_features = async (loader: ESPLoader) => { + public async get_chip_features(loader: ESPLoader) { return ["Wi-Fi"]; }; - public get_crystal_freq = async (loader: ESPLoader) => { + public async get_crystal_freq(loader: ESPLoader) { return 40; }; @@ -138,7 +138,7 @@ export default class ESP32C3ROM extends ROM { return h.length === 1 ? "0" + h : h; } - public read_mac = async (loader: ESPLoader) => { + public async read_mac(loader: ESPLoader) { let mac0 = await loader.read_reg(this.MAC_EFUSE_REG); mac0 = mac0 >>> 0; let mac1 = await loader.read_reg(this.MAC_EFUSE_REG + 4); @@ -166,7 +166,7 @@ export default class ESP32C3ROM extends ROM { ); }; - public get_erase_size = function (offset: number, size: number) { + public get_erase_size(offset: number, size: number) { return size; }; } diff --git a/src/targets/esp32s2.ts b/src/targets/esp32s2.ts index 61acd83..9812c58 100644 --- a/src/targets/esp32s2.ts +++ b/src/targets/esp32s2.ts @@ -1,4 +1,4 @@ -import ESPLoader from "../espLoader"; +import { ESPLoader } from "../esploader"; import { ROM } from "./rom"; export default class ESP32S2ROM extends ROM { @@ -104,7 +104,7 @@ export default class ESP32S2ROM extends ROM { "5lUGBV+inIf/Am8w8EfhMoci6RMleHnQiuD71XzwevARlL/cmi84gg9/L+TC1aFI" + "PhaAOeuxgvFPCyIcXl5oXscBJKBdOTgbirB0QdA+obr/HyfMWQisDwAA"; - public get_pkg_version = async (loader: ESPLoader) => { + public async get_pkg_version(loader: ESPLoader) { const num_word = 3; const block1_addr = this.EFUSE_BASE + 0x044; const addr = block1_addr + 4 * num_word; @@ -113,7 +113,7 @@ export default class ESP32S2ROM extends ROM { return pkg_version; }; - public get_chip_description = async (loader: ESPLoader) => { + public async get_chip_description(loader: ESPLoader) { const chip_desc = ["ESP32-S2", "ESP32-S2FH16", "ESP32-S2FH32"]; const pkg_ver = await this.get_pkg_version(loader); if (pkg_ver >= 0 && pkg_ver <= 2) { @@ -123,7 +123,7 @@ export default class ESP32S2ROM extends ROM { } }; - public get_chip_features = async (loader: ESPLoader) => { + public async get_chip_features(loader: ESPLoader) { const features = ["Wi-Fi"]; const pkg_ver = await this.get_pkg_version(loader); if (pkg_ver == 1) { @@ -143,14 +143,14 @@ export default class ESP32S2ROM extends ROM { return features; }; - public get_crystal_freq = async (loader: ESPLoader) => { + public async get_crystal_freq(loader: ESPLoader) { return 40; }; public _d2h(d: number) { const h = (+d).toString(16); return h.length === 1 ? "0" + h : h; } - public read_mac = async (loader: ESPLoader) => { + public async read_mac(loader: ESPLoader) { let mac0 = await loader.read_reg(this.MAC_EFUSE_REG); mac0 = mac0 >>> 0; let mac1 = await loader.read_reg(this.MAC_EFUSE_REG + 4); @@ -178,7 +178,7 @@ export default class ESP32S2ROM extends ROM { ); }; - public override get_erase_size(offset: number, size: number) { + public get_erase_size(offset: number, size: number) { return size; } } diff --git a/src/targets/esp32s3.ts b/src/targets/esp32s3.ts index c621fab..fe38ea9 100644 --- a/src/targets/esp32s3.ts +++ b/src/targets/esp32s3.ts @@ -1,4 +1,4 @@ -import ESPLoader from "../espLoader"; +import { ESPLoader } from "../esploader"; import { ROM } from "./rom"; export default class ESP32S3ROM extends ROM { @@ -119,13 +119,13 @@ export default class ESP32S3ROM extends ROM { "A6EOOkSXLzPI/0905+E35NsMZL5N2dQx7VQhTldrENTvyi1fQDWenT4lm8tQK+l3" + "KW+3NnXYMAdbYwkNHP1ZTgd8RtiVeVq1Sv50vbRlrKlDTZc48SKV/f8Zky2A"; - public get_chip_description = async (loader: ESPLoader) => { + public async get_chip_description(loader: ESPLoader) { return "ESP32-S3"; }; - public get_chip_features = async (loader: ESPLoader) => { + public async get_chip_features(loader: ESPLoader) { return ["Wi-Fi", "BLE"]; }; - public get_crystal_freq = async (loader: ESPLoader) => { + public async get_crystal_freq(loader: ESPLoader) { return 40; }; public _d2h(d: number) { @@ -133,7 +133,7 @@ export default class ESP32S3ROM extends ROM { return h.length === 1 ? "0" + h : h; } - public _post_connect = async (loader: ESPLoader) => { + public async _post_connect(loader: ESPLoader) { const buf_no = (await loader.read_reg(this.UARTDEV_BUF_NO)) & 0xff; console.log("In _post_connect " + buf_no); if (buf_no == this.UARTDEV_BUF_NO_USB) { @@ -141,7 +141,7 @@ export default class ESP32S3ROM extends ROM { } }; - public read_mac = async (loader: ESPLoader) => { + public async read_mac(loader: ESPLoader) { let mac0 = await loader.read_reg(this.MAC_EFUSE_REG); mac0 = mac0 >>> 0; let mac1 = await loader.read_reg(this.MAC_EFUSE_REG + 4); @@ -169,7 +169,7 @@ export default class ESP32S3ROM extends ROM { ); }; - public get_erase_size = function (offset: number, size: number) { + public get_erase_size(offset: number, size: number) { return size; }; } diff --git a/src/targets/esp8266.ts b/src/targets/esp8266.ts index e0ad876..716af2f 100644 --- a/src/targets/esp8266.ts +++ b/src/targets/esp8266.ts @@ -1,4 +1,4 @@ -import ESPLoader from "../espLoader"; +import { ESPLoader } from "../esploader"; import { ROM } from "./rom"; export default class ESP8266ROM extends ROM { @@ -185,13 +185,13 @@ export default class ESP8266ROM extends ROM { "J4beSjfPH4hJ+tFtSdkibccBEOH+kJSrSew2MdSz8C5GWch459cfjuMcT0Pvo0yI" + "bcqT/wWthFLmqB8AAA=="; - public read_efuse = async (loader: ESPLoader, offset: number) => { + public async read_efuse(loader: ESPLoader, offset: number) { const addr = this.EFUSE_RD_REG_BASE + 4 * offset; console.log("Read efuse " + addr); return await loader.read_reg(addr); }; - public get_chip_description = async (loader: ESPLoader) => { + public async get_chip_description(loader: ESPLoader) { const efuse3 = await this.read_efuse(loader, 2); const efuse0 = await this.read_efuse(loader, 0); @@ -205,7 +205,7 @@ export default class ESP8266ROM extends ROM { return features; }; - public get_crystal_freq = async (loader: ESPLoader) => { + public async get_crystal_freq(loader: ESPLoader) { const uart_div = (await loader.read_reg(this.UART_CLKDIV_REG)) & this.UART_CLKDIV_MASK; const ets_xtal = (loader.transport.baudrate * uart_div) / 1000000 / this.XTAL_CLK_DIVIDER; let norm_xtal; @@ -231,7 +231,7 @@ export default class ESP8266ROM extends ROM { return h.length === 1 ? "0" + h : h; } - public read_mac = async (loader: ESPLoader) => { + public async read_mac(loader: ESPLoader) { let mac0 = await this.read_efuse(loader, 0); mac0 = mac0 >>> 0; let mac1 = await this.read_efuse(loader, 1); @@ -275,7 +275,7 @@ export default class ESP8266ROM extends ROM { ); }; - public get_erase_size = function (offset: number, size: number) { + public get_erase_size(offset: number, size: number) { return size; }; } diff --git a/src/targets/rom.ts b/src/targets/rom.ts index 4d6c3b6..b055ed3 100644 --- a/src/targets/rom.ts +++ b/src/targets/rom.ts @@ -1,24 +1,4 @@ -import ESPLoader from "../espLoader"; - -export enum FLASH_SIZES { - "1MB" = 0x00, - "2MB" = 0x10, - "4MB" = 0x20, - "8MB" = 0x30, - "16MB" = 0x40, -} - -export enum ESP8266_FLASH_SIZES { - "512KB" = 0x00, - "256KB" = 0x10, - "1MB" = 0x20, - "2MB" = 0x30, - "4MB" = 0x40, - "2MB-c1" = 0x50, - "4MB-c1" = 0x60, - "8MB" = 0x80, - "16MB" = 0x90, -} +import { ESPLoader } from "../esploader"; export abstract class ROM { // abstract read_efuse(loader: ESPLoader, offset: number): Promise; //esp32 @@ -43,13 +23,7 @@ export abstract class ROM { return size; } - FLASH_SIZES: { [key: string]: number } = { - "1MB": 0x00, - "2MB": 0x10, - "4MB": 0x20, - "8MB": 0x30, - "16MB": 0x40, - }; + abstract FLASH_SIZES: { [key: string]: number }; abstract BOOTLOADER_FLASH_OFFSET: number; abstract CHIP_NAME: string; diff --git a/tsconfig.json b/tsconfig.json index 0186fa6..46d7e86 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,13 @@ { "compilerOptions": { - "module": "commonjs", - "target": "ES5", + "module": "ES2020", + "target": "ES2019", "declaration": true, "allowSyntheticDefaultImports": true, "outDir": "./lib", "moduleResolution": "node", - "lib": ["ES2020", "DOM"] + "lib": ["ES2020", "DOM"], + "importHelpers": true }, "include": ["src/**/*"] } \ No newline at end of file