~/Projects/esptool-js
git clone https://code.lsong.org/esptool-js
Commit
- Commit
- 20297c7523223ec2fb44bf3d126fe3c383fd8c9d
- Author
- Adwait Patankar <[email protected]>
- Date
- 2022-02-11 15:13:59 +0530 +0530
- Diffstat
ESPLoader.js | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++ index.js | 4 - webserial.js | 17 ++++-
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");