@@ -532,8 +532,33 @@ static void IRAM_ATTR usb_persist_shutdown_handler(void)
532
532
if (usb_persist_enabled ) {
533
533
chip_usb_set_persist_flags (USBDC_PERSIST_ENA );
534
534
} 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
535
559
periph_module_reset (PERIPH_USB_MODULE );
536
560
periph_module_enable (PERIPH_USB_MODULE );
561
+ #endif
537
562
}
538
563
REG_WRITE (RTC_CNTL_OPTION1_REG , RTC_CNTL_FORCE_DOWNLOAD_BOOT );
539
564
} else if (usb_persist_mode == RESTART_BOOTLOADER_DFU ) {
0 commit comments