Skip to content

Commit 2d51d0e

Browse files
committed
Update esp32-hal-tinyusb.c
1 parent 17be328 commit 2d51d0e

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

cores/esp32/esp32-hal-tinyusb.c

+25
Original file line numberDiff line numberDiff line change
@@ -532,8 +532,33 @@ static void IRAM_ATTR usb_persist_shutdown_handler(void)
532532
if (usb_persist_enabled) {
533533
chip_usb_set_persist_flags(USBDC_PERSIST_ENA);
534534
} else {
535+
#if CONFIG_IDF_TARGET_ESP32S3
536+
/*
537+
* This currently does not work!
538+
* Integrated CDC+JTAG refuses to communicate, once into Download mode
539+
*/
540+
// Disable USB-OTG
541+
periph_module_reset(PERIPH_USB_MODULE);
542+
//periph_module_enable(PERIPH_USB_MODULE);
543+
periph_module_disable(PERIPH_USB_MODULE);
544+
// Switch to hardware CDC+JTAG
545+
REG_CLR_BIT(RTC_CNTL_USB_CONF_REG, (RTC_CNTL_SW_HW_USB_PHY_SEL|RTC_CNTL_SW_USB_PHY_SEL));
546+
// Release GPIO pins from CDC+JTAG
547+
CLEAR_PERI_REG_MASK(USB_SERIAL_JTAG_CONF0_REG, USB_SERIAL_JTAG_USB_PAD_ENABLE);
548+
// Force the host to re-enumerate (BUS_RESET)
549+
pinMode(USBPHY_DM_NUM, OUTPUT_OPEN_DRAIN);
550+
pinMode(USBPHY_DP_NUM, OUTPUT_OPEN_DRAIN);
551+
digitalWrite(USBPHY_DM_NUM, LOW);
552+
digitalWrite(USBPHY_DP_NUM, LOW);
553+
delay(20);
554+
// Connect GPIOs to integrated CDC+JTAG
555+
SET_PERI_REG_MASK(USB_SERIAL_JTAG_CONF0_REG, USB_SERIAL_JTAG_USB_PAD_ENABLE);
556+
// Do not use external PHY
557+
CLEAR_PERI_REG_MASK(USB_SERIAL_JTAG_CONF0_REG, USB_SERIAL_JTAG_PHY_SEL);
558+
#else
535559
periph_module_reset(PERIPH_USB_MODULE);
536560
periph_module_enable(PERIPH_USB_MODULE);
561+
#endif
537562
}
538563
REG_WRITE(RTC_CNTL_OPTION1_REG, RTC_CNTL_FORCE_DOWNLOAD_BOOT);
539564
} else if (usb_persist_mode == RESTART_BOOTLOADER_DFU) {

0 commit comments

Comments
 (0)