Skip to content

Commit

Permalink
ports/esp32: Add automatic bootloader handling for S2 and S3.
Browse files Browse the repository at this point in the history
Enables support for the ESP standard DTR/RTS based reboot to bootloader.

Switches from OTG to Serial/Jtag mode to
workaround issue discussed in:
espressif/arduino-esp32#6762

Signed-off-by: Andrew Leech <[email protected]>
  • Loading branch information
pi-anl committed Jun 4, 2024
1 parent 6c65318 commit 92e43f9
Show file tree
Hide file tree
Showing 17 changed files with 53 additions and 14 deletions.
1 change: 0 additions & 1 deletion ports/esp32/boards/ESP32_GENERIC_S3/sdkconfig.board
Original file line number Diff line number Diff line change
@@ -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
Expand Down
1 change: 0 additions & 1 deletion ports/esp32/boards/UM_FEATHERS2/sdkconfig.board
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
CONFIG_ESPTOOLPY_FLASHFREQ_80M=y
CONFIG_ESPTOOLPY_AFTER_NORESET=y

CONFIG_SPIRAM_MEMTEST=

Expand Down
1 change: 0 additions & 1 deletion ports/esp32/boards/UM_FEATHERS2NEO/sdkconfig.board
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
1 change: 0 additions & 1 deletion ports/esp32/boards/UM_FEATHERS3/sdkconfig.board
Original file line number Diff line number Diff line change
@@ -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=
Expand Down
1 change: 0 additions & 1 deletion ports/esp32/boards/UM_NANOS3/sdkconfig.board
Original file line number Diff line number Diff line change
@@ -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
Expand Down
1 change: 0 additions & 1 deletion ports/esp32/boards/UM_PROS3/sdkconfig.board
Original file line number Diff line number Diff line change
@@ -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=
Expand Down
1 change: 0 additions & 1 deletion ports/esp32/boards/UM_TINYS2/sdkconfig.board
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
1 change: 0 additions & 1 deletion ports/esp32/boards/UM_TINYS3/sdkconfig.board
Original file line number Diff line number Diff line change
@@ -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
Expand Down
1 change: 0 additions & 1 deletion ports/esp32/boards/UM_TINYWATCHS3/sdkconfig.board
Original file line number Diff line number Diff line change
@@ -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
Expand Down
17 changes: 17 additions & 0 deletions ports/esp32/modmachine.c
Original file line number Diff line number Diff line change
Expand Up @@ -222,8 +222,25 @@ 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_ESP32S2
#include "esp32s2/rom/usb/usb_dc.h"
#include "esp32s2/rom/usb/usb_persist.h"
#include "esp32s2/rom/usb/chip_usb_dw_wrapper.h"
#elif 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();
#endif
usb_dc_prepare_persist();
chip_usb_set_persist_flags(USBDC_BOOT_DFU);
REG_WRITE(RTC_CNTL_OPTION1_REG, RTC_CNTL_FORCE_DOWNLOAD_BOOT);
mp_hal_delay_ms(100);
esp_restart();
}
#endif
Expand Down
3 changes: 2 additions & 1 deletion ports/esp32/mpconfigport.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@

#if MICROPY_HW_ENABLE_USBDEV
#define MICROPY_SCHEDULER_STATIC_NODES (1)
#define MICROPY_HW_ESP_AUTOMATIC_BOOTLOADER (1)

// Enable USB-CDC serial port
#ifndef MICROPY_HW_USB_CDC
Expand Down Expand Up @@ -291,7 +292,7 @@ void *esp_native_code_commit(void *, size_t, void *);
extern void mp_handle_pending(bool); \
mp_handle_pending(true); \
MICROPY_PY_SOCKET_EVENTS_HANDLER \
MICROPY_HW_USBDEV_TASK_HOOK \
MICROPY_HW_USBDEV_TASK_HOOK \
asm ("waiti 0"); \
} while (0);
#endif
Expand Down
12 changes: 12 additions & 0 deletions ports/esp32/usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,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];
Expand Down
1 change: 1 addition & 0 deletions ports/esp32/usb.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion ports/renesas-ra/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ when invoking `make`.
* Protocol buffer compiler
Building for the `ARDUINO_PORTENTA_C33` board will build the `esp_hosted` driver, that depends
on the Protocol Buffer Compiler being installed. On Debian/Ubuntu, this can be installed with
`sudo apt-get install protobuf-compiler`.
`sudo apt-get install protobuf-c-compiler`.

* Obtain submodules
First the submodules must be obtained using:
Expand Down
2 changes: 1 addition & 1 deletion ports/renesas-ra/boards/EK_RA4W1/mpconfigboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
#define MICROPY_HW_ENABLE_ADC (1)
#define MICROPY_HW_HAS_FLASH (1)
#define MICROPY_HW_ENABLE_INTERNAL_FLASH_STORAGE (1)

#define MICROPY_HW_ENABLE_USBDEV (0)
// board config

// UART
Expand Down
1 change: 0 additions & 1 deletion ports/renesas-ra/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,6 @@
#include "shared/readline/readline.h"
#include "shared/runtime/pyexec.h"
#include "shared/runtime/softtimer.h"
#include "shared/tinyusb/mp_usbd.h"
#include "lib/oofatfs/ff.h"
#include "lib/littlefs/lfs1.h"
#include "lib/littlefs/lfs1_util.h"
Expand Down
20 changes: 19 additions & 1 deletion shared/tinyusb/mp_usbd_cdc.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ void tud_sof_cb(uint32_t frame_count) {
}
}

#if MICROPY_HW_USB_CDC_1200BPS_TOUCH
#if MICROPY_HW_USB_CDC_1200BPS_TOUCH || MICROPY_HW_ESP_AUTOMATIC_BOOTLOADER
static mp_sched_node_t mp_bootloader_sched_node;

static void usbd_cdc_run_bootloader_task(mp_sched_node_t *node) {
Expand All @@ -148,6 +148,13 @@ static void usbd_cdc_run_bootloader_task(mp_sched_node_t *node) {
}
#endif

#if MICROPY_HW_ESP_AUTOMATIC_BOOTLOADER
static struct {
bool dtr : 1;
bool rts : 1;
} prev_line_state = {0};
#endif

void
#if MICROPY_HW_USB_EXTERNAL_TINYUSB
mp_usbd_line_state_cb
Expand All @@ -163,6 +170,17 @@ tud_cdc_line_state_cb
cdc_connected_flush_delay = (tud_speed_get() == TUSB_SPEED_HIGH) ? 128 : 16;
tud_sof_cb_enable(true);
}

#if MICROPY_HW_ESP_AUTOMATIC_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.
Expand Down

0 comments on commit 92e43f9

Please sign in to comment.