@@ -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