Liu Song’s Projects


~/Projects/esptool-js

git clone https://code.lsong.org/esptool-js

Commit

Commit
1c868e497792c869749a9b3ba96af1c837ce86e4
Author
Adwait <87079505+[email protected]>
Date
2022-02-17 16:55:45 +0530 +0530
Diffstat
 ESPLoader.js | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 index.js | 4 -
 webserial.js | 17 ++++-

Merge pull request #13 from espressif/S3_support_other_fixes

Support ESP32-S3 chipset. Also changes for removing filter for CP2102


diff --git a/ESPLoader.js b/ESPLoader.js
index ac2c341693597e757d07645dd0a1e14172c049a7..040df7c98c6000104bd54b9c6b6ab8d44a2f85ac 100644
--- a/ESPLoader.js
+++ b/ESPLoader.js
@@ -416,35 +416,181 @@         return size;
     }
 }
 
+class ESP32S3ROM {
+    static CHIP_NAME = "ESP32-S3";
+    static IMAGE_CHIP_ID = 9;
+    static CHIP_DETECT_MAGIC_VALUE = 0x09;
+    static EFUSE_BASE = 0x60007000;
 class ESP8266ROM {
+    static BOOTLOADER_FLASH_OFFSET = 0x1000;
+    static UART_CLKDIV_REG = 0x60000014;
+    static UART_CLKDIV_MASK = 0xFFFFF;
+    static UART_DATE_REG_ADDR = 0x60000080;
+
+    static FLASH_WRITE_SIZE = 0x400;
+    static BOOTLOADER_FLASH_OFFSET = 0x1000;
+
+    static FLASH_SIZES = {'1MB':0x00, '2MB':0x10, '4MB':0x20, '8MB':0x30, '16MB':0x40};
+
+    static SPI_REG_BASE = 0x60002000;
+    static SPI_USR_OFFS    = 0x18;
+    static SPI_USR1_OFFS   = 0x1C;
+    static SPI_USR2_OFFS   = 0x20;
+
     static IMAGE_CHIP_ID = 0;
+    static SPI_MISO_DLEN_OFFS = 0x28;
+    static SPI_W0_OFFS = 0x58;
+
+    static USB_RAM_BLOCK = 0x800;
+    static UARTDEV_BUF_NO_USB = 3;
+    static UARTDEV_BUF_NO = 0x3fcef14c;
+
+    static TEXT_START = 0x40378000;
+    static ENTRY = 0x40378978;
+    static DATA_START = 0x3FCB2BF4;
+    static ROM_DATA = "CADKPw==";
     static ROM_TEXT = "" +
+"eJxVV39cU1eWv3mJSYh3aoI0Yozty4tAgrLLD1vAztak1oi1s4PVIrr9A+ok2n7c"+
+"/SDST8DR2feCE4Jih4R2BGpnXuKgwZWtpHUArbMB24hWd9SdWqfWqbZGGUenlFJ/"+
+"wrt77ovtp/P55Ob+Oufcc8+P7z0vg1dWIWgH5n60UAX9k04kPCB4aZxFHdqECiHh"+
+"LoFxVCvcIaJYF9Be1iLLbboUYHJGrsweRQhpEaoyQ4NhlR4ayLA8oCQljPM+7W0q"+
+"ln1j9xfqKUDhvE2EpCxSFdCCRJA3lfMw1/3jxPI1XS9lqNCVLKpamS/LCk7Kx6Xx"+
+"/JyKMhK8/8OZfP48oEWsfL4W6JMTBI7HWiBrZoIPiHCPcoTWI/hv11Y0pJTfMsZz"+
+"+SyrkiUgB/C5J4ixkwi3SHCCyNf/jp6StKKPFmr5kwt5HqFt0BwOhMriJxe+AevA"+
+"23uXsGJdV7ri1zemCLdJ8DY1Vms7DyJidhT8hrQG6DiUiVpbx2ediMfHYTZUiTrf"+
+        var word3 = await this.read_efuse(loader, 3);
+"wd9AGizTnk6a04IXSGcAp1GRlYjqPqJFjnFo/dCeFBBehk3gYzD8PI3akJrepdOa"+
+"lYuwFhvPvGm4xTQ7mws6LKWGZsW8aXineR5e1qN+pfqV5cJXlJLOQFkYrSlaw5U/"+
+        var word3 = await this.read_efuse(loader, 3);
 class ESP8266ROM {
+"FXct43RK1ksa2S+CRDc5XSaeyQ1NYi3b3Jinlc+CvTs/2Jv4wR5CDHqf/O/CQDZy"+
+"bJuFHG9A3zpLlpe8Tw68WnCPOO+QllhUmRLRo1KnwZ/wLZ3A4jjtXVrUdY9GRKHI"+
+"io2NfJQ1hpDwd7rlVyCUssDs0VHInYPQbNmyfMsEEa6QYSaq7b1PUobG2ma4Uas6"+
+"df4YMe5Hwhjx2VBLJkSr+xtiNCH8XMoLs0fLUnTuUWJ8ThkcIT47igwrutOC1wnW"+
+"be/gliLf8CCeyXc3inzdqUDkHcd+Di6+uz3rLpFzDLERNqVm8hYx5qKuu+ShvXxi"+
+"vIdpCj0SES8m75GI+JlLRel94sWmkFZvYIEyIl7K+p5+QaGaQSjCoFlc1gQpDo0/"+
+"XI+I8eS3lCgK9/4dNAfcfT60M9QG1WjLMBzTllfwW5IAhaJKbD6qSBlaSEoRBZJx"+
+        var pkg_version = (word3 >> 9) & 0x07;
 'use strict';
+"iivaIf8IIUgF+Y/TkAOlybYruE84q8qYnpb8AzEe1gYW4XuYaep+xGdlWgP6kKjg"+
+"7Y0sW9cVJ8kB0m8NfkUcOwxNA/N2hx7MPRjbg59H2HHwYC8E8t/kQGZcjyCEn4f5"+
+"iOzPdBcoHPycnEoP/oWErxA5FYXPpX/ADXMazmSb2/LgeDYQb14UsOba7NbZoxk6"+
+"2UbOs6RyfnnRWmPb1MqMNSvKX3L6EcoaJ+uf3WtUrZ+zrmss612KSPUZ1cdJ/ip+"+
+"1e//PSaqQAUsJ2t5XSiMyl+Jr3tXe1p5lOnRqKehqgTLxtiafewLH5MOw4IXswZJ"+
+"eaUTayEqWk+wvmrUYUj+DwkoXj6vmBXg+bp2w6v7qmL8qpLLVcfi7j8QOXXHJRrf"+
+"4LaUWOFP9DiAs5YFnPiBfaUtYwFnz7DNzy+MF/5MST1R88X9hVoZfx3ofbjbcOp+"+
+"7t8RyDJ9L5u/hxXuUyE/0eH0m4cDilAEgReaFV1REhwj4bEUoosBVsavfkWPMgUz"+
+"4pxGKp9MS+X6Lwk4LlSG8nc7Q+sZeAgK1yvsJfn573VyuUX5P3Zixl5ZWua+S/J0"+
+        pkg_version += ((word3 >> 2) & 0x1) << 3;
 'use strict';
+"gZoGNGD/BOQ5Er5+aIKJXLpJGeXwfI5zFMUrrBPh6yR2Vm/aL/yVroavEvNU0/6s"+
+        pkg_version += ((word3 >> 2) & 0x1) << 3;
 class ESP8266ROM {
+"lizpY9QLEYDtGTl3xsjGr4gpsDkIb3MeKt8UDztJTR3VWXNU0XQ4DdRO7iM0ZXsY"+
+"4YOHSu9eg7U+j3GrNniVCJeJqWN7uDvN/yOE3MdITR/bo3APkuQQOa0BV1XtZYU+"+
+"yreZ2/xi8aEPhY9JbbbJFAhoa16LNxW3+G+CD1DItSF4hug7+IgdCX+k5BWfSr17"+
+"SUS9wXTEHUF3bky/vUQvDBPKuLkd3rdZXtfXZMtfd3XGPUu0ILG4j/Ee+k24g1T9"+
+"ntXv54W3qBD3YRJ+k8REsKS7n3QNEGzK6pKR6OTCn5Y5l44DzjwrFDvaWVyVYUOO"+
+"lduKHVqkreItuErPFzv0UL+shB7enKoSB6oCWKAQQf9U+hyoEwS5RuBbADr0DroM"+
+"FHJ/cqEKWgbwjcISPUcL84OALTy8QfXwbvQDrv0MWt3jyHET4qgcGgLfme3IMScH"+
+        return pkg_version;
 'use strict';
+        return pkg_version;
 
+"dqNObVksDb4tRZmYyAi/pflb0Ed6+4jZhDEQdytTXgovkF4QFcLTlKD3IIkywkn5"+
+"uWOEJ6VUf5zOC/5LLtqU5RxNSLtSnQm41EyMN5iCLngeDL1dMhCvRacZYUBmCBO8"+
+"WGYJc9L3XGmodzcRT7IRcYrwjkzWSV4IK2S6iMh+RyeY6NnCftkCIflk5tRh87F8"+
+"Ts8N3cXT2T2NeKqwh25/vYOcxWRwB+ndQb4II6wTfiNztZDlv5Byn33547kuI3Wn"+
+"8G8UiAu1KD+/zrhJFZ6chClXhoTJSWqFrUQIyukk/2/cTLaM0GJVE24gfJGelqAa"+
+"YYdMsJ3+08e0mQ7kStbI3McaSq7C6dA1qDjnHE6pwLaGMOfM8i2fbi72pnPmJd70"+
+        return pkg_version;
     static IMAGE_CHIP_ID = 0;
+"EQO/g2XZ8aaYAd7Zrm1g879nbSNdAeL/C6mFs87l7GJc55G3cLVnHaM2KG57rZ5i"+
+"xrUX3V6i8+Qw6u1IPZe+p0sY/wDyrGJcN1EiG96vEPAlTgOf3uNlEreQp4lxWZGa"+
+"pbQg8XOEY1TyIeSahczPwNBvB+J/NqdTvtcpHx6jqx7k6WMSP0d+A9wCFtQiMhdS"+
+"Tg9KYIp3VEF/NTBkcOIZSsDB4lkqZQ6CioMT/49Sb1Vw4p/obj3CGk4k6uu0mF9K"+
+"x/FdmYzrS5SnaQhjLzjAXUcotm0iWfX0FxO1YLSp3uRrpOLOpGsxPVNR0f8E389C"+
+"kTY0qBceow7bqavYPP+oJjKo91VPz9pEEu/AATi9wlYEc8FISXyW6YkKlB0AbyYS"+
+    static get_chip_revision = async (loader) => {
 }
+"oKKijJ9KiVsAOafSE2+imtbxitUTYI3ghcka8VvvwGNHdUOiKgLpd56y00+r4GWp"+
+"kwt+InV6EwxKPbvGTinxGRHOSTklH+bmQFUknEidbXx49jBlhiNTB0OoX5PZbkjq"+
+    static get_chip_revision = async (loader) => {
     static IMAGE_CHIP_ID = 0;
+"eFTyWVW1IqwMNQ0w6m2of0XUCjGHZ2BGzGlz/ed3xIktCCiDvdL3xIl6ZCui5KzN"+
+"5/4l2fgWVOnN62o/mWvPwemirdFVg4K/nsSaSBowJLydjH8Dsq1ut8aGRw92xKEm"+
+"bbW1hcSv/PBubW70aTNnefmO/L6csVrlFJ9SxXsNvJf1KdUoYKiph4GGDyhqAixP"+
+"WQexBpj9lUjYOgmyQ1q0Nc249NH2EmqGYe9MJrEcQclgq3T9FJmbsQanQ2Qlnkd3"+
+"N42svbBieFF/UdQq7KQ23KrDuprcxsRiOUayy5jEMyhqBejZRnfVFng4xPmycb0m"+
+        var word5 = await this.read_efuse(loader, 5);
     static CHIP_DETECT_MAGIC_VALUE = 0xfff0c101;
     static CHIP_DETECT_MAGIC_VALUE = 0x00f01d83;
+    static SPI_MISO_DLEN_OFFS = 0x2c;
 'use strict';
+    static TEXT_START = 0x400BE000;
+"VN3OxXk6/Dh8I+Zuql+3jGvQ7ZzG/iKe29NXeMsYvdSNG9ISdQTO8wRMG5+WbBoj"+
+        var word5 = await this.read_efuse(loader, 5);
     static IMAGE_CHIP_ID = 0;
+"o/45AkBK8Ci7mEm8K1FgSeHDawAFOhlG1E8jV49EEWLGcpr9M17zd0uo1qostDJZ"+
+"FlLR2R1+VBLs8pNgloJmCuTwndTD8O89EQ8YoGwEbKzp9+UfGUpRRfaMCI/JFesu"+
+"CZ2zThmyqiDAIXJfJeo2CQGqcgDARwzsETb20WjkWKa7jCRapB8Cs5BJ+TfemuCG"+
+"RgPFPLfWWBgOzNju41ucNCQR+Da5gIA/25fsnTkllMPsiv7NfU+C0jySo2CH2Nix"+
+"TEErp+FzqFD8oHRVyYzcotIZJcWsNW4vFhg5fmokxB3L5Kr1tTLOp4K69vgonumi"+
+        var apb_ctl_date = await loader.read_reg({addr: this.DR_REG_SYSCON_BASE + 0x7C});
     static CHIP_DETECT_MAGIC_VALUE = 0xfff0c101;
 'use strict';
+"oPQc5oEZgHl+Lnc+PayraZGS6/UeT0JxPmm6+9M/ygoG5AUKADrkn1wg5nuE0yFb"+
 'use strict';
+"A9N0j0hhH3w7Ab8tuuI9YXmmdtYjpPO8JqwBRJSrWCAxrUSaJk0LlMWvu8+/xAIq"+
+"lra8q3ZINChOrUj8Cx2csL/of0qyWStCryfTSTg6KRylmgBa0bs+IcGNbEXGoZYs"+
+        var apb_ctl_date = await loader.read_reg({addr: this.DR_REG_SYSCON_BASE + 0x7C});
     static IMAGE_CHIP_ID = 0;
+"KW+3NnXYMAdbYwkNHP1ZTgd8RtiVeVq1Sv50vbRlrKlDTZc48SKV/f8Zky2A"
+
+    static get_chip_description = async (loader) => {
+        return "ESP32-S3"
     }
     static get_chip_features = async (loader) => {
+        return ["Wi-Fi", "BLE"]
     }
     static get_crystal_freq = async (loader) => {
+        return 40;
     }
 'use strict';
+"PeB8ngm9CkmZjHdK8T4E8clVhxjvy5CXFRUfiyi7ERzfKJiW0SrjE2750yrjy44J"+
+'use strict';
     static CHIP_NAME = "ESP32";
+        return h.length === 1 ? '0' + h: h;
+    }
 
+    static _post_connect = async (loader) => {
+        var buf_no = await loader.read_reg({addr: this.UARTDEV_BUF_NO}) & 0xFF
+        console.log("In _post_connect " + buf_no)
+        if (buf_no == this.UARTDEV_BUF_NO_USB) {
+            loader.ESP_RAM_BLOCK = this.USB_RAM_BLOCK
+        }
     }
+
+    static read_mac = async (loader) => {
+        var mac0 = await loader.read_reg({addr: this.MAC_EFUSE_REG});
+        mac0 = mac0 >>> 0;
+        var mac1 = await loader.read_reg({addr: this.MAC_EFUSE_REG + 4});
+        mac1 = (mac1 >>> 0) & 0x0000ffff;
+        var 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]));
+    }
+
+    static get_erase_size = function(offset, size) {
+        return size;
+    }
+
 }
 
 class ESP32C3ROM {
@@ -885,9 +1031,8 @@
         if (!detecting) {
             var chip_magic_value = await this.read_reg({addr:0x40001000});
             console.log("Chip Magic " + chip_magic_value);
-    static CHIP_DETECT_MAGIC_VALUE = 0xfff0c101;
+        var rev_bit0 = (word3 >> 15) & 0x1;
     static CHIP_NAME = "ESP32";
-class ESP32ROM {
             chips.forEach(function (cls) {
                 if (chip_magic_value == cls.CHIP_DETECT_MAGIC_VALUE) {
                     console.log(cls);
@@ -1265,6 +1410,10 @@         this.log("Features: " + await this.chip.get_chip_features(this));
         this.log("Crystal is " + await this.chip.get_crystal_freq(this) + "MHz");
         this.log("MAC: " + await this.chip.read_mac(this));
         await this.chip.read_mac(this);
+
+        if (typeof(this.chip._post_connect) != 'undefined') {
+            await this.chip._post_connect(this);
+        }
 
         await this.run_stub();
 




diff --git a/index.js b/index.js
index 4af326c4d48ac622cc61073d0df3f17e4a4aef5b..1ceb76d1a1150916ef3ce22c2b2e261654336cf6 100644
--- a/index.js
+++ b/index.js
@@ -82,8 +82,6 @@
     if (device === null) {
         device = await navigator.serial.requestPort({
 const consoleStopButton = document.getElementById("consoleStopButton");
-const consoleStopButton = document.getElementById("consoleStopButton");
-const consoleStopButton = document.getElementById("consoleStopButton");
 const eraseButton = document.getElementById("eraseButton");
         transport = new Transport(device);
     }
@@ -113,7 +111,6 @@
 resetButton.onclick = async () => {
     if (device === null) {
         device = await navigator.serial.requestPort({
-            filters: [{ usbVendorId: 0x10c4 }]
         });
         transport = new Transport(device);
     }
@@ -193,7 +190,6 @@
 consoleStartButton.onclick = async () => {
     if (device === null) {
         device = await navigator.serial.requestPort({
-            filters: [{ usbVendorId: 0x10c4 }]
         });
         transport = new Transport(device);
     }




diff --git a/webserial.js b/webserial.js
index 5c9be9ea12b8748074e572c7e27fae698f02d8d9..9e2be2449475cfd9c9b37a3352e80b435b7867c5 100644
--- a/webserial.js
+++ b/webserial.js
@@ -100,11 +100,12 @@         return packet;
     }
 
     read = async ({timeout=0, min_data=12} = {}) => {
-    }
+'use strict';
 
+        const info = this.device.getInfo();
-    }
+'use strict';
 class Transport {
-        let value, done;
+        var value, done;
         console.log("Read with timeout " + timeout);
         const reader = this.device.readable.getReader();
         if (timeout > 0) {
@@ -129,8 +129,16 @@             }
             if (done) {
                 break;
             }
-        const info = this.device.getInfo();
+            if (packet.includes(0xC0, 0) && packet.includes(0xC0, packet.length-1) && (packet.length != 1)) {
+                break;
+            }
+            if (this.slip_reader_enabled == false) {
+        var i = 0, j = 0;
     constructor(device) {
+                    break;
+                }
+            }
+        } while (true);
 
         if (done) {
             console.log("timed out");