esp32: Add automatic bootloader handling for S2 and S3.
Enables support for the ESP standard DTR/RTS based reboot to bootloader. Switches from OTG to Serial/Jtag mode to workaround issue discussed in: https://github.com/espressif/arduino-esp32/issues/6762 Signed-off-by: Andrew Leech <andrew@alelec.net>
This commit is contained in:
parent
641f60045f
commit
5ae622ef7b
@ -1,6 +1,5 @@
|
||||
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
|
||||
CONFIG_ESPTOOLPY_AFTER_NORESET=y
|
||||
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
|
||||
|
@ -1,6 +1,5 @@
|
||||
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
|
||||
CONFIG_ESPTOOLPY_AFTER_NORESET=y
|
||||
|
||||
CONFIG_SPIRAM_MEMTEST=
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
|
||||
CONFIG_ESPTOOLPY_AFTER_NORESET=y
|
||||
|
||||
# LWIP
|
||||
CONFIG_LWIP_LOCAL_HOSTNAME="UMFeatherS2Neo"
|
||||
|
@ -1,6 +1,5 @@
|
||||
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
|
||||
CONFIG_ESPTOOLPY_AFTER_NORESET=y
|
||||
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=
|
||||
|
@ -1,6 +1,5 @@
|
||||
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
|
||||
CONFIG_ESPTOOLPY_AFTER_NORESET=y
|
||||
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
|
||||
|
@ -1,6 +1,5 @@
|
||||
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
|
||||
CONFIG_ESPTOOLPY_AFTER_NORESET=y
|
||||
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=
|
||||
|
@ -1,6 +1,5 @@
|
||||
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
|
||||
CONFIG_ESPTOOLPY_AFTER_NORESET=y
|
||||
|
||||
# LWIP
|
||||
CONFIG_LWIP_LOCAL_HOSTNAME="UMTinyS2"
|
||||
|
@ -1,6 +1,5 @@
|
||||
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
|
||||
CONFIG_ESPTOOLPY_AFTER_NORESET=y
|
||||
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
|
||||
|
@ -1,6 +1,5 @@
|
||||
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
|
||||
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
|
||||
CONFIG_ESPTOOLPY_AFTER_NORESET=y
|
||||
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_4MB=
|
||||
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
|
||||
|
@ -222,7 +222,19 @@ static mp_int_t mp_machine_reset_cause(void) {
|
||||
|
||||
#if MICROPY_ESP32_USE_BOOTLOADER_RTC
|
||||
#include "soc/rtc_cntl_reg.h"
|
||||
#include "usb.h"
|
||||
#if CONFIG_IDF_TARGET_ESP32S3
|
||||
#include "esp32s3/rom/usb/usb_dc.h"
|
||||
#include "esp32s3/rom/usb/usb_persist.h"
|
||||
#include "esp32s3/rom/usb/chip_usb_dw_wrapper.h"
|
||||
#endif
|
||||
|
||||
NORETURN static void machine_bootloader_rtc(void) {
|
||||
#if CONFIG_IDF_TARGET_ESP32S3
|
||||
usb_usj_mode();
|
||||
usb_dc_prepare_persist();
|
||||
chip_usb_set_persist_flags(USBDC_BOOT_DFU);
|
||||
#endif
|
||||
REG_WRITE(RTC_CNTL_OPTION1_REG, RTC_CNTL_FORCE_DOWNLOAD_BOOT);
|
||||
esp_restart();
|
||||
}
|
||||
|
@ -199,7 +199,8 @@
|
||||
#endif
|
||||
|
||||
#if MICROPY_HW_ENABLE_USBDEV
|
||||
#define MICROPY_SCHEDULER_STATIC_NODES (1)
|
||||
#define MICROPY_SCHEDULER_STATIC_NODES (1)
|
||||
#define MICROPY_HW_USB_CDC_DTR_RTS_BOOTLOADER (1)
|
||||
|
||||
#ifndef MICROPY_HW_USB_VID
|
||||
#define USB_ESPRESSIF_VID 0x303A
|
||||
|
@ -57,6 +57,18 @@ void usb_init(void) {
|
||||
|
||||
}
|
||||
|
||||
#if CONFIG_IDF_TARGET_ESP32S3
|
||||
void usb_usj_mode(void) {
|
||||
// Switch the USB PHY back to Serial/Jtag mode, disabling OTG support
|
||||
// This should be run before jumping to bootloader.
|
||||
usb_del_phy(phy_hdl);
|
||||
usb_phy_config_t phy_conf = {
|
||||
.controller = USB_PHY_CTRL_SERIAL_JTAG,
|
||||
};
|
||||
usb_new_phy(&phy_conf, &phy_hdl);
|
||||
}
|
||||
#endif
|
||||
|
||||
void mp_usbd_port_get_serial_number(char *serial_buf) {
|
||||
// use factory default MAC as serial ID
|
||||
uint8_t mac[8];
|
||||
|
@ -29,5 +29,6 @@
|
||||
#define MICROPY_HW_USB_CDC_TX_TIMEOUT_MS (500)
|
||||
|
||||
void usb_init(void);
|
||||
void usb_usj_mode(void);
|
||||
|
||||
#endif // MICROPY_INCLUDED_ESP32_USB_H
|
||||
|
@ -138,9 +138,12 @@ void tud_sof_cb(uint32_t frame_count) {
|
||||
|
||||
#endif
|
||||
|
||||
#if MICROPY_HW_ENABLE_USBDEV && (MICROPY_HW_USB_CDC_1200BPS_TOUCH || MICROPY_HW_USB_CDC)
|
||||
#if MICROPY_HW_ENABLE_USBDEV && ( \
|
||||
MICROPY_HW_USB_CDC_1200BPS_TOUCH || \
|
||||
MICROPY_HW_USB_CDC || \
|
||||
MICROPY_HW_USB_CDC_DTR_RTS_BOOTLOADER)
|
||||
|
||||
#if MICROPY_HW_USB_CDC_1200BPS_TOUCH
|
||||
#if MICROPY_HW_USB_CDC_1200BPS_TOUCH || MICROPY_HW_USB_CDC_DTR_RTS_BOOTLOADER
|
||||
static mp_sched_node_t mp_bootloader_sched_node;
|
||||
|
||||
static void usbd_cdc_run_bootloader_task(mp_sched_node_t *node) {
|
||||
@ -149,6 +152,13 @@ static void usbd_cdc_run_bootloader_task(mp_sched_node_t *node) {
|
||||
}
|
||||
#endif
|
||||
|
||||
#if MICROPY_HW_USB_CDC_DTR_RTS_BOOTLOADER
|
||||
static struct {
|
||||
bool dtr : 1;
|
||||
bool rts : 1;
|
||||
} prev_line_state = {0};
|
||||
#endif
|
||||
|
||||
void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) {
|
||||
#if MICROPY_HW_USB_CDC && !MICROPY_EXCLUDE_SHARED_TINYUSB_USBD_CDC
|
||||
if (dtr) {
|
||||
@ -159,6 +169,15 @@ void tud_cdc_line_state_cb(uint8_t itf, bool dtr, bool rts) {
|
||||
tud_sof_cb_enable(true);
|
||||
}
|
||||
#endif
|
||||
#if MICROPY_HW_USB_CDC_DTR_RTS_BOOTLOADER
|
||||
if (dtr && !rts) {
|
||||
if (prev_line_state.rts && !prev_line_state.dtr) {
|
||||
mp_sched_schedule_node(&mp_bootloader_sched_node, usbd_cdc_run_bootloader_task);
|
||||
}
|
||||
}
|
||||
prev_line_state.rts = rts;
|
||||
prev_line_state.dtr = dtr;
|
||||
#endif
|
||||
#if MICROPY_HW_USB_CDC_1200BPS_TOUCH
|
||||
if (dtr == false && rts == false) {
|
||||
// Device is disconnected.
|
||||
|
@ -31,6 +31,12 @@
|
||||
#define MICROPY_HW_USB_CDC_TX_TIMEOUT (500)
|
||||
#endif
|
||||
|
||||
// This is typically only enabled on esp32
|
||||
// parts which have an internal usb peripheral.
|
||||
#ifndef MICROPY_HW_USB_CDC_DTR_RTS_BOOTLOADER
|
||||
#define MICROPY_HW_USB_CDC_DTR_RTS_BOOTLOADER (0)
|
||||
#endif
|
||||
|
||||
uintptr_t mp_usbd_cdc_poll_interfaces(uintptr_t poll_flags);
|
||||
void tud_cdc_rx_cb(uint8_t itf);
|
||||
mp_uint_t mp_usbd_cdc_tx_strn(const char *str, mp_uint_t len);
|
||||
|
Loading…
Reference in New Issue
Block a user