Merge pull request #1149 from makermelissa/esptool
CircuitPython Installer is now functioning
This commit is contained in:
commit
6abf33b014
10 changed files with 975 additions and 603 deletions
|
|
@ -20,32 +20,32 @@ features:
|
||||||
- Breadboard-Friendly
|
- Breadboard-Friendly
|
||||||
---
|
---
|
||||||
|
|
||||||
- We've got a new machine here at Adafruit, it can uncover your deepest desires. Don't believe me? I'll turn it on right now to prove it to you! What, you want your very own soft serve ice cream machine? OK well, that's not something we can provide. But we can provide your *second*-deepest desire: an **ESP32-S*3* Feather board with a built in IPS TFT color display**. It's got all the delicious creamy goodness features of a Feather main board, the comforting warmth of an ESP32-S3 WiFi+BLE microcontroller, and the crispness of a 240x135 pixel color TFT display. All that and it will even plug in nicely into a breadboard, [terminal block wing](https://www.adafruit.com/product/2926), or [Feather Doubler](https://www.adafruit.com/product/2890) or even just stack on top of another wing.
|
We've got a new machine here at Adafruit, it can uncover your deepest desires. Don't believe me? I'll turn it on right now to prove it to you! What, you want your very own soft serve ice cream machine? OK well, that's not something we can provide. But we can provide your *second*-deepest desire: an **ESP32-S*3* Feather board with a built in IPS TFT color display**. It's got all the delicious creamy goodness features of a Feather main board, the comforting warmth of an ESP32-S3 WiFi+BLE microcontroller, and the crispness of a 240x135 pixel color TFT display. All that and it will even plug in nicely into a breadboard, [terminal block wing](https://www.adafruit.com/product/2926), or [Feather Doubler](https://www.adafruit.com/product/2890) or even just stack on top of another wing.
|
||||||
|
|
||||||
This Feather comes with native USB and **4 MB Flash + 2 MB of PSRAM**, so it is perfect for use with CircuitPython or Arduino with low-cost WiFi. Native USB means it can act like a keyboard or a disk drive. WiFi means it's awesome for IoT projects. And Feather means it works with the large community of Feather Wings for expandability.
|
This Feather comes with native USB and **4 MB Flash + 2 MB of PSRAM**, so it is perfect for use with CircuitPython or Arduino with low-cost WiFi. Native USB means it can act like a keyboard or a disk drive. WiFi means it's awesome for IoT projects. And Feather means it works with the large community of Feather Wings for expandability.
|
||||||
|
|
||||||
The ESP32-S3 is a highly-integrated, low-power, 2.4 GHz Wi-Fi/BLE System-on-Chip (SoC) solution that has built-in native USB as well as some other interesting new technologies like Time of Flight distance measurements and AI acceleration. With its state-of-the-art power and RF performance, this SoC is an ideal choice for a wide variety of application scenarios relating to the [Internet of Things (IoT)](https://www.adafruit.com/category/342), [wearable electronics](https://www.adafruit.com/category/65), and smart homes.
|
The ESP32-S3 is a highly-integrated, low-power, 2.4 GHz Wi-Fi/BLE System-on-Chip (SoC) solution that has built-in native USB as well as some other interesting new technologies like Time of Flight distance measurements and AI acceleration. With its state-of-the-art power and RF performance, this SoC is an ideal choice for a wide variety of application scenarios relating to the [Internet of Things (IoT)](https://www.adafruit.com/category/342), [wearable electronics](https://www.adafruit.com/category/65), and smart homes.
|
||||||
|
|
||||||
The Feather ESP32-S3 has a dual-core 240 MHz chip, so it is comparable to ESP32's dual-core. However, there is no Bluetooth **Classic** support, only Bluetooth LE. This chip is a great step up from the earlier ESP32-S2! This ESP32-S3 mini-module we are using on the Feather comes with 4 MB flash and 2 MB PSRAM, as well as lots of 512KB of SRAM so it's perfect for use with CircuitPython support or any time massive buffers are needed: for fast memory access use SRAM, for slower-but-roomier access use PSRAM. It's also great for use in ESP-IDF or with Arduino support.
|
The Feather ESP32-S3 has a dual-core 240 MHz chip, so it is comparable to ESP32's dual-core. However, there is no Bluetooth **Classic** support, only Bluetooth LE. This chip is a great step up from the earlier ESP32-S2! This ESP32-S3 mini-module we are using on the Feather comes with 4 MB flash and 2 MB PSRAM, as well as lots of 512KB of SRAM so it's perfect for use with CircuitPython support or any time massive buffers are needed: for fast memory access use SRAM, for slower-but-roomier access use PSRAM. It's also great for use in ESP-IDF or with Arduino support.
|
||||||
|
|
||||||
The color TFT is connected to the SPI pins and uses additional pins for control that are not exposed to the breakout pads. [It's the same display as you see here, with 240x135 pixels and is IPS](https://www.adafruit.com/product/4383) so you get bright color at any angle. The backlight is also connected to a separate pin so you can PWM the backlight up and down as desired.
|
The color TFT is connected to the SPI pins and uses additional pins for control that are not exposed to the breakout pads. [It's the same display as you see here, with 240x135 pixels and is IPS](https://www.adafruit.com/product/4383) so you get bright color at any angle. The backlight is also connected to a separate pin so you can PWM the backlight up and down as desired.
|
||||||
|
|
||||||
For low power usages, the Feather has a *second* low-dropout 3.3V regulator. The regulator is controlled with a GPIO pin on the enable line and can shut off power to the Stemma QT port and TFT. There is also a separate power pin for the NeoPixel that can be used to disable it for even lower quiescent power. With everything off and in deep sleep mode, the TFT feather uses about 100uA of current.
|
For low power usages, the Feather has a *second* low-dropout 3.3V regulator. The regulator is controlled with a GPIO pin on the enable line and can shut off power to the Stemma QT port and TFT. There is also a separate power pin for the NeoPixel that can be used to disable it for even lower quiescent power. With everything off and in deep sleep mode, the TFT feather uses about 100uA of current.
|
||||||
|
|
||||||
**Features:**
|
**Features:**
|
||||||
|
|
||||||
- **ESP32-S3 Dual Core 240MHz Tensilica processor** - the next generation of ESP32-Sx, with native USB so it can act like a keyboard/mouse, MIDI device, disk drive, etc!
|
- **ESP32-S3 Dual Core 240MHz Tensilica processor** - the next generation of ESP32-Sx, with native USB so it can act like a keyboard/mouse, MIDI device, disk drive, etc!
|
||||||
- **Mini module** has FCC/CE certification and comes with 4 MByte of Flash and 2 MByte of PSRAM - you can have huge data buffers
|
- **Mini module** has FCC/CE certification and comes with 4 MByte of Flash and 2 MByte of PSRAM - you can have huge data buffers
|
||||||
- **[Color 1.14" IPS TFT with 240x135 pixels](https://www.adafruit.com/product/4383)** - bright and colorful display with ST7789 chipset that can be viewed at any angle angle.
|
- **[Color 1.14" IPS TFT with 240x135 pixels](https://www.adafruit.com/product/4383)** - bright and colorful display with ST7789 chipset that can be viewed at any angle angle.
|
||||||
- **Power options** - USB type C **or** Lipoly battery
|
- **Power options** - USB type C **or** Lipoly battery
|
||||||
- **Built-in battery charging** when powered over USB-C
|
- **Built-in battery charging** when powered over USB-C
|
||||||
- **LiPoly battery monitor** - LC709203 chip actively monitors your battery for voltage and state of charge / percentage reporting over I2C
|
- **LiPoly battery monitor** - LC709203 chip actively monitors your battery for voltage and state of charge / percentage reporting over I2C
|
||||||
- **Reset and DFU** (BOOT0) buttons to get into the ROM bootloader (which is a USB serial port so you don't need a separate cable!)
|
- **Reset and DFU** (BOOT0) buttons to get into the ROM bootloader (which is a USB serial port so you don't need a separate cable!)
|
||||||
- **Serial debug output pin** (optional, for checking the hardware serial debug console)
|
- **Serial debug output pin** (optional, for checking the hardware serial debug console)
|
||||||
- **STEMMA QT** connector for I2C devices, with switchable power, so you can go into low power mode.
|
- **STEMMA QT** connector for I2C devices, with switchable power, so you can go into low power mode.
|
||||||
- **On/Charge/User** LEDs + status **NeoPixel** with pin-controlled power for low power usage
|
- **On/Charge/User** LEDs + status **NeoPixel** with pin-controlled power for low power usage
|
||||||
- **Low Power friendly**! In deep sleep mode, we can get down to 80~100uA of current draw from the Lipoly connection. Quiescent current is from the power regulator, ESP32-S2 chip, and Lipoly monitor. Turn off the NeoPixel and external I2C/TFT power for the lowest quiescent current draw.
|
- **Low Power friendly**! In deep sleep mode, we can get down to 80~100uA of current draw from the Lipoly connection. Quiescent current is from the power regulator, ESP32-S2 chip, and Lipoly monitor. Turn off the NeoPixel and external I2C/TFT power for the lowest quiescent current draw.
|
||||||
- **Works with Arduino or CircuitPython**
|
- **Works with Arduino or CircuitPython**
|
||||||
|
|
||||||
## Purchase
|
## Purchase
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,10 @@
|
||||||
"version": "v3.14.0"
|
"version": "v3.14.0"
|
||||||
},
|
},
|
||||||
"esp32s2": {
|
"esp32s2": {
|
||||||
"version": "0.12.0"
|
"version": "0.12.3"
|
||||||
},
|
},
|
||||||
"esp32s3": {
|
"esp32s3": {
|
||||||
"version": "0.12.0"
|
"version": "0.12.3"
|
||||||
},
|
},
|
||||||
"esp32c3": {},
|
"esp32c3": {},
|
||||||
"esp32": {},
|
"esp32": {},
|
||||||
|
|
|
||||||
|
|
@ -133,7 +133,7 @@
|
||||||
{{ extension }}file="{{ board_url }}/en_US/adafruit-circuitpython-{{ board_id }}-en_US-{{ version.version }}.{{ extension }}"
|
{{ extension }}file="{{ board_url }}/en_US/adafruit-circuitpython-{{ board_id }}-en_US-{{ version.version }}.{{ extension }}"
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% if bootloader_version and bootloader_id %}
|
{% if bootloader_version and bootloader_id %}
|
||||||
bootloader="https://github.com/adafruit/tinyuf2/releases/download/{{ bootloader_version }}/tinyuf2-{{ bootloader_id }}-{{ bootloader_version }}.zip"
|
bootloader="https://downloads.circuitpython.org/bootloaders/esp32/tinyuf2-{{ bootloader_id }}-{{ bootloader_version }}.zip"
|
||||||
bootloaderid="{{ bootloader_id }}"
|
bootloaderid="{{ bootloader_id }}"
|
||||||
{% endif %}
|
{% endif %}
|
||||||
version="{{ version.version }}"
|
version="{{ version.version }}"
|
||||||
|
|
@ -185,10 +185,8 @@
|
||||||
or if you have older code that depends on features only available in an older release.
|
or if you have older code that depends on features only available in an older release.
|
||||||
Otherwise we recommend using the latest stable release.
|
Otherwise we recommend using the latest stable release.
|
||||||
</p>
|
</p>
|
||||||
<div>
|
<div class="previous-versions-buttons">
|
||||||
<a class="download-button-unrecommended" href="https://adafruit-circuit-python.s3.amazonaws.com/index.html?prefix=bin/{{ board_id }}/">BROWSE S3<i class="fas fa-arrow-circle-right" aria-hidden="true"></i></a>
|
<a class="download-button-unrecommended" href="https://adafruit-circuit-python.s3.amazonaws.com/index.html?prefix=bin/{{ board_id }}/">BROWSE S3<i class="fas fa-arrow-circle-right" aria-hidden="true"></i></a>
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<a class="download-button-unrecommended" href="https://github.com/adafruit/circuitpython/releases">BROWSE GITHUB<i class="fab fa-github" aria-hidden="true"></i></a>
|
<a class="download-button-unrecommended" href="https://github.com/adafruit/circuitpython/releases">BROWSE GITHUB<i class="fab fa-github" aria-hidden="true"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
2
adabot
2
adabot
|
|
@ -1 +1 @@
|
||||||
Subproject commit 2415fa6b5c8e5bbb9a45d6ee4833d03a70bc25ae
|
Subproject commit a295390bb7c1a694cf64da74a5fe99d7dc51e334
|
||||||
|
|
@ -164,6 +164,18 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.previous-versions-buttons {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
a, button {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
&:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -42,6 +42,25 @@
|
||||||
|
|
||||||
.dialog-body {
|
.dialog-body {
|
||||||
margin-top: 24px;
|
margin-top: 24px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
|
||||||
|
ul.flow-menu {
|
||||||
|
list-style-type: none;
|
||||||
|
margin-left: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
padding-inline-start: 10px;
|
||||||
|
|
||||||
|
li {
|
||||||
|
a {
|
||||||
|
padding-left: 10px;
|
||||||
|
padding-right: 10px;
|
||||||
|
&:hover {
|
||||||
|
background: #3498db33;
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
p.centered {
|
p.centered {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
@ -51,6 +70,19 @@
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.field {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr auto;
|
||||||
|
grid-gap: 5px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
&:last-of-type {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
input[type="checkbox"] {
|
||||||
|
margin-right: 8px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.loader {
|
.loader {
|
||||||
display: block;
|
display: block;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
import {html, render} from 'https://unpkg.com/lit-html?module';
|
import {html, render} from 'https://unpkg.com/lit-html?module';
|
||||||
|
import {asyncAppend} from 'https://unpkg.com/lit-html/directives/async-append?module';
|
||||||
import * as esptoolPackage from "https://unpkg.com/esp-web-flasher@5.1.2/dist/web/index.js?module"
|
import * as esptoolPackage from "https://unpkg.com/esp-web-flasher@5.1.2/dist/web/index.js?module"
|
||||||
|
|
||||||
// TODO: Figure out how to make the Web Serial from ESPTool and Web Serial to communicate with CircuitPython not conflict
|
// TODO: Figure out how to make the Web Serial from ESPTool and Web Serial to communicate with CircuitPython not conflict
|
||||||
|
|
@ -29,6 +30,8 @@ import * as esptoolPackage from "https://unpkg.com/esp-web-flasher@5.1.2/dist/we
|
||||||
// because it's very integrated into the serial recieve and send code.
|
// because it's very integrated into the serial recieve and send code.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
export const ESP_ROM_BAUD = 115200;
|
||||||
|
|
||||||
export class InstallButton extends HTMLButtonElement {
|
export class InstallButton extends HTMLButtonElement {
|
||||||
static isSupported = 'serial' in navigator;
|
static isSupported = 'serial' in navigator;
|
||||||
static isAllowed = window.isSecureContext;
|
static isAllowed = window.isSecureContext;
|
||||||
|
|
@ -39,9 +42,8 @@ export class InstallButton extends HTMLButtonElement {
|
||||||
this.currentFlow = null;
|
this.currentFlow = null;
|
||||||
this.currentStep = 0;
|
this.currentStep = 0;
|
||||||
this.currentDialogElement = null;
|
this.currentDialogElement = null;
|
||||||
this.serial = null;
|
this.port = null;
|
||||||
this.espStub = null;
|
this.espStub = null;
|
||||||
this.mode = "";
|
|
||||||
this.dialogCssClass = "install-dialog";
|
this.dialogCssClass = "install-dialog";
|
||||||
this.connected = this.connectionStates.DISCONNECTED;
|
this.connected = this.connectionStates.DISCONNECTED;
|
||||||
}
|
}
|
||||||
|
|
@ -55,13 +57,13 @@ export class InstallButton extends HTMLButtonElement {
|
||||||
previousButton = {
|
previousButton = {
|
||||||
label: "Previous",
|
label: "Previous",
|
||||||
onClick: this.prevStep,
|
onClick: this.prevStep,
|
||||||
isEnabled: () => { return this.currentStep > 0 },
|
isEnabled: async () => { return this.currentStep > 0 },
|
||||||
}
|
}
|
||||||
|
|
||||||
nextButton = {
|
nextButton = {
|
||||||
label: "Next",
|
label: "Next",
|
||||||
onClick: this.nextStep,
|
onClick: this.nextStep,
|
||||||
isEnabled: () => { return this.currentStep < this.currentFlow.steps.length - 1; },
|
isEnabled: async () => { return this.currentStep < this.currentFlow.steps.length - 1; },
|
||||||
}
|
}
|
||||||
|
|
||||||
closeButton = {
|
closeButton = {
|
||||||
|
|
@ -100,9 +102,9 @@ export class InstallButton extends HTMLButtonElement {
|
||||||
template: (data) => html`
|
template: (data) => html`
|
||||||
<p>CircuitPython Installer for ${data.boardName}</p>
|
<p>CircuitPython Installer for ${data.boardName}</p>
|
||||||
<ul class="flow-menu">
|
<ul class="flow-menu">
|
||||||
${this.generateMenu(
|
${asyncAppend(this.generateMenu(
|
||||||
(flowId, flow) => html`<li><a href="#" @click=${this.runFlow.bind(this)} id="${flowId}">${flow.label.replace('[version]', this.releaseVersion)}</a></li>`
|
(flowId, flow) => html`<li><a href="#" @click=${this.runFlow.bind(this)} id="${flowId}">${flow.label.replace('[version]', this.releaseVersion)}</a></li>`
|
||||||
)}
|
))}
|
||||||
</ul>`,
|
</ul>`,
|
||||||
buttons: [this.closeButton],
|
buttons: [this.closeButton],
|
||||||
},
|
},
|
||||||
|
|
@ -128,8 +130,6 @@ export class InstallButton extends HTMLButtonElement {
|
||||||
this.toggleAttribute("install-unsupported", true);
|
this.toggleAttribute("install-unsupported", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.mode = this.getUrlParam("mode");
|
|
||||||
|
|
||||||
this.addEventListener("click", async (e) => {
|
this.addEventListener("click", async (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
// WebSerial feature detection
|
// WebSerial feature detection
|
||||||
|
|
@ -162,23 +162,23 @@ export class InstallButton extends HTMLButtonElement {
|
||||||
return paramValue;
|
return paramValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
enabledFlowCount() {
|
async enabledFlowCount() {
|
||||||
let enabledFlowCount = 0;
|
let enabledFlowCount = 0;
|
||||||
for (const [flowId, flow] of Object.entries(this.flows)) {
|
for (const [flowId, flow] of Object.entries(this.flows)) {
|
||||||
if (flow.isEnabled()) {
|
if (await flow.isEnabled()) {
|
||||||
enabledFlowCount++;
|
enabledFlowCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return enabledFlowCount;
|
return enabledFlowCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
* generateMenu(templateFunc) {
|
async * generateMenu(templateFunc) {
|
||||||
if (this.enabledFlowCount() == 0) {
|
if (await this.enabledFlowCount() == 0) {
|
||||||
yield html`<li>Coming soon. Check back later.</li>`;
|
yield html`<li>Coming soon. Check back later.</li>`;
|
||||||
//yield html`<li>No installable options available for this board.</li>`;
|
//yield html`<li>No installable options available for this board.</li>`;
|
||||||
}
|
}
|
||||||
for (const [flowId, flow] of Object.entries(this.flows)) {
|
for (const [flowId, flow] of Object.entries(this.flows)) {
|
||||||
if (flow.isEnabled()) {
|
if (await flow.isEnabled()) {
|
||||||
yield templateFunc(flowId, flow);
|
yield templateFunc(flowId, flow);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -256,7 +256,7 @@ export class InstallButton extends HTMLButtonElement {
|
||||||
await button.onUpdate.bind(this)(e);
|
await button.onUpdate.bind(this)(e);
|
||||||
}
|
}
|
||||||
if ("isEnabled" in button) {
|
if ("isEnabled" in button) {
|
||||||
e.target.disabled = !button.isEnabled.bind(this)();
|
e.target.disabled = !(await button.isEnabled.bind(this)());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -337,12 +337,15 @@ export class InstallButton extends HTMLButtonElement {
|
||||||
this.showError(text);
|
this.showError(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
logMsg(text) {
|
logMsg(text, showTrace = false) {
|
||||||
// TODO: Eventually add to an internal log that the user can bring up
|
// TODO: Eventually add to an internal log that the user can bring up
|
||||||
console.info(this.stripHtml(text));
|
console.info(this.stripHtml(text));
|
||||||
|
if (showTrace) {
|
||||||
|
console.trace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIConnected(connected) {
|
updateEspConnected(connected) {
|
||||||
if (Object.values(this.connectionStates).includes(connected)) {
|
if (Object.values(this.connectionStates).includes(connected)) {
|
||||||
this.connected = connected;
|
this.connected = connected;
|
||||||
this.updateButtons();
|
this.updateButtons();
|
||||||
|
|
@ -422,10 +425,10 @@ export class InstallButton extends HTMLButtonElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
async setBaudRateIfChipSupports(chipType, baud) {
|
async setBaudRateIfChipSupports(chipType, baud) {
|
||||||
if (baud == esptoolPackage.ESP_ROM_BAUD) { return } // already the default
|
if (baud == ESP_ROM_BAUD) { return } // already the default
|
||||||
|
|
||||||
if (chipType == esptoolPackage.CHIP_FAMILY_ESP32) { // only supports the default
|
if (chipType == esptoolPackage.CHIP_FAMILY_ESP32) { // only supports the default
|
||||||
this.logMsg("WARNING: ESP32 is having issues working at speeds faster than 115200. Continuing at 115200 for now...");
|
this.logMsg(`ESP32 Chip only works at 115200 instead of the preferred ${baud}. Staying at 115200...`);
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -437,4 +440,22 @@ export class InstallButton extends HTMLButtonElement {
|
||||||
await this.espStub.setBaudrate(baud);
|
await this.espStub.setBaudrate(baud);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async espHardReset(bootloader = false) {
|
||||||
|
if (this.espStub) {
|
||||||
|
await this.espStub.hardReset(bootloader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async espConnect(logger) {
|
||||||
|
// - Request a port and open a connection.
|
||||||
|
this.port = await navigator.serial.requestPort();
|
||||||
|
|
||||||
|
logger.log("Connecting...");
|
||||||
|
await this.port.open({ baudRate: ESP_ROM_BAUD });
|
||||||
|
|
||||||
|
logger.log("Connected successfully.");
|
||||||
|
|
||||||
|
return new esptoolPackage.ESPLoader(this.port, logger);
|
||||||
|
};
|
||||||
}
|
}
|
||||||
3
cpinstaller/src/boot.py
Normal file
3
cpinstaller/src/boot.py
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
import storage
|
||||||
|
|
||||||
|
storage.disable_usb_drive()
|
||||||
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue